fix(ui): NATIVE-CINNY LAW — replace emoji with folds icons in settings
- Notification profile presets (P5-27) used literal emoji (🎮/💼/🌙) instead of folds Icons → Gaming=Ball, Work=Monitor, Sleep=BellMute. - Permissions "Powers" list used ✅/❌ text emoji for has/no-power → folds Icons.Check / Icons.Cross (colored via the row). Reviewed the rest of the UI: seasonal-theme picker emoji kept (folds has no holiday-icon equivalents; a distinctly-Lotus visual feature), soundboard clip emoji kept (user-chosen clip identity), URL-preview brand glyphs + upstream device-verification emoji + keyboard key-symbols left as-is. (Also records the F2 URL-preview decision: keep default-on.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -82,7 +82,7 @@ Tier-2 bug-hunt (desktop/native, crypto/session/infra, messaging data) by 3 para
|
|||||||
|
|
||||||
**⚠️ FLAGGED — product decision (not auto-changed):**
|
**⚠️ FLAGGED — product decision (not auto-changed):**
|
||||||
|
|
||||||
- **F2:** URL previews **default ON in encrypted rooms** (`settings.ts encUrlPreview: true`) → the homeserver fetches every link in an E2EE message (leaks E2EE link URLs to the server). This is the deliberate Lotus "URL Preview Default in Encrypted Rooms" feature — most clients default it OFF for privacy. **Your call whether to flip the default to `false`.**
|
- **F2 — DECIDED (keep ON, 2026-07):** URL previews stay **default ON in encrypted rooms** (`settings.ts encUrlPreview: true`) per user preference — the deliberate Lotus "URL Preview Default in Encrypted Rooms" feature. (Trade-off acknowledged: the homeserver fetches links from E2EE messages; users can turn it off per-room.)
|
||||||
|
|
||||||
**Won't-fix / by-design:** M7 (scheduledMessages clamps a past target to 1s — intentional + unit-tested; the modal already guards ≥60s).
|
**Won't-fix / by-design:** M7 (scheduledMessages clamps a past target to 1s — intentional + unit-tested; the modal already guards ≥60s).
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import {
|
|||||||
Button,
|
Button,
|
||||||
Chip,
|
Chip,
|
||||||
Text,
|
Text,
|
||||||
|
Icon,
|
||||||
|
Icons,
|
||||||
RectCords,
|
RectCords,
|
||||||
PopOut,
|
PopOut,
|
||||||
Menu,
|
Menu,
|
||||||
@@ -75,15 +77,16 @@ function PeekPermissions({ powerLevels, power, permissionGroups, children }: Pee
|
|||||||
const hasPower = requiredPower <= power;
|
const hasPower = requiredPower <= power;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Text
|
<Box
|
||||||
key={itemIndex}
|
key={itemIndex}
|
||||||
size="T200"
|
as="span"
|
||||||
style={{
|
alignItems="Center"
|
||||||
color: hasPower ? undefined : color.Critical.Main,
|
gap="100"
|
||||||
}}
|
style={{ color: hasPower ? undefined : color.Critical.Main }}
|
||||||
>
|
>
|
||||||
{hasPower ? '✅' : '❌'} {item.name}
|
<Icon size="50" src={hasPower ? Icons.Check : Icons.Cross} />
|
||||||
</Text>
|
<Text size="T200">{item.name}</Text>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useAtomValue, useSetAtom } from 'jotai';
|
import { useAtomValue, useSetAtom } from 'jotai';
|
||||||
import { Box, Button, Text, IconButton, Icon, Icons, Scroll, config, toRem } from 'folds';
|
import { Box, Button, Text, IconButton, Icon, Icons, IconSrc, Scroll, config, toRem } from 'folds';
|
||||||
import { Page, PageContent, PageHeader } from '../../../components/page';
|
import { Page, PageContent, PageHeader } from '../../../components/page';
|
||||||
import { SystemNotification } from './SystemNotification';
|
import { SystemNotification } from './SystemNotification';
|
||||||
import { AllMessagesNotifications } from './AllMessages';
|
import { AllMessagesNotifications } from './AllMessages';
|
||||||
@@ -14,13 +14,13 @@ import { settingsAtom, Settings } from '../../../state/settings';
|
|||||||
|
|
||||||
const PRESETS: Array<{
|
const PRESETS: Array<{
|
||||||
label: string;
|
label: string;
|
||||||
emoji: string;
|
icon: IconSrc;
|
||||||
description: string;
|
description: string;
|
||||||
patch: Partial<Settings>;
|
patch: Partial<Settings>;
|
||||||
}> = [
|
}> = [
|
||||||
{
|
{
|
||||||
label: 'Gaming',
|
label: 'Gaming',
|
||||||
emoji: '🎮',
|
icon: Icons.Ball,
|
||||||
description: 'Notifications on, sounds off',
|
description: 'Notifications on, sounds off',
|
||||||
patch: {
|
patch: {
|
||||||
showNotifications: true,
|
showNotifications: true,
|
||||||
@@ -32,7 +32,7 @@ const PRESETS: Array<{
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Work',
|
label: 'Work',
|
||||||
emoji: '💼',
|
icon: Icons.Monitor,
|
||||||
description: 'All notifications and sounds on',
|
description: 'All notifications and sounds on',
|
||||||
patch: {
|
patch: {
|
||||||
showNotifications: true,
|
showNotifications: true,
|
||||||
@@ -44,7 +44,7 @@ const PRESETS: Array<{
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Sleep',
|
label: 'Sleep',
|
||||||
emoji: '🌙',
|
icon: Icons.BellMute,
|
||||||
description: 'All notifications off',
|
description: 'All notifications off',
|
||||||
patch: {
|
patch: {
|
||||||
showNotifications: false,
|
showNotifications: false,
|
||||||
@@ -83,7 +83,7 @@ function NotificationPresets() {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Box direction="Column" alignItems="Center" gap="100">
|
<Box direction="Column" alignItems="Center" gap="100">
|
||||||
<span style={{ fontSize: toRem(24) }}>{preset.emoji}</span>
|
<Icon size="400" src={preset.icon} />
|
||||||
<Text size="T300" style={{ fontWeight: config.fontWeight.W600 }}>
|
<Text size="T300" style={{ fontWeight: config.fontWeight.W600 }}>
|
||||||
{preset.label}
|
{preset.label}
|
||||||
</Text>
|
</Text>
|
||||||
|
|||||||
Reference in New Issue
Block a user