diff --git a/CLAUDE.md b/CLAUDE.md index e6792be6..19c968b0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -260,6 +260,8 @@ Frontend JS modules have `@fileoverview` with `@dependency`/`@loadorder` tags. L **Per-device vs synced settings**: the `displayKeys` set in settings-ui.js is a **client-side merge policy**, not a wire filter. A display key seeds from the server only when localStorage has no value for it, which is what prevents one device overwriting another; `showPlanUsageLimits` is additionally `delete`d from the incoming payload outright. Separately, `SettingsUpdateSchema` is `.strict()` and simply **does not declare** `skin`, `showFileViewerButton`, `showCronButton`, `webglRendererEnabled`, `localEchoEnabled`, `cjkInputEnabled`, or `extendedKeyboardBar`, so sending one of those is a validation error. The rest (`showResponseViewer`, `showPlanUsageLimits`, `language`, and most `show*` keys) ARE in the schema and do persist server-side; they are per-device by client policy only. ⚠️ Adding a new per-device setting means deciding **both** questions: membership in `displayKeys`, and presence in the schema. +**App Settings modal** (`#appSettingsModal`): a left rail that is a **table of contents over ONE scrolling document**, not a tab switcher. Every section stays mounted (`.set-section`, ids `settings-terminal|appearance|layout|models|clis|notifications|voice|shortcuts|system`), the rail follows the scroll, and `switchSettingsTab(id)` keeps its historical name but SCROLLS instead of hiding. Phones swap the rail for the sticky `#appSettingsJump` pill (compact layout at ≤860px in mobile.css). ⚠️ **The load/save contract is `getElementById` by id**: `openAppSettings()`/`saveAppSettings()` read every control by a fixed id, so moving a control between sections is free but renaming or dropping one silently stops it loading or saving. `test/app-settings-structure.test.ts` is the static guard. ⚠️ Model cards (`#appSettingsModelCards`) and the effort segment are **views over hidden ` - -
- Interface Language - -
- - -
Appearance
-
- Skin - -
-
-
- Entrance Animations - How new tabs, panes and agent windows arrive -
- -
-
- WebGL Renderer - -
- -
Input
-
-
- Wheel Scrolls Local History - Plain wheel/trackpad pages the terminal scrollback -
- -
-
-
- Local Echo - Instant typing feedback with local echo -
- -
-
-
- CJK Input - Dedicated IME input field for CJK languages -
- -
- -
-
- Extended Keyboard Bar - Extra keys: Tab, Esc, arrows, Ctrl+O -
- -
-
-
- Gesture Control (beta) - Camera hand-tracking overlay (applied on reload) -
- -
- - -
Header Displays
-
- Plan Usage Limits - -
-
- Font Controls - -
-
- System Stats - -
-
- Lifecycle Log - -
-
- Response Viewer - -
-
- File Viewer - -
-
- Attachments Button - -
-
- Multi-monitor Button - -
-
- Session Manager Button - -
-
- Away Digest Button - -
-
- Cron Button - -
-
- Redraw Terminal Button - -
- - -
Phone
-
- Overview Home Screen - -
- - -
Tab Bar
-
- Tall Tabs (Name + Folder) - -
-
- Pop-out Button on Tabs - -
- - -
Panels
-
- Monitor - -
-
- Project Insights - -
-
- File Browser - -
-
- Subagents - -
-
- Approvals Inbox - -
-
- Read My Mind - -
-
- Ultracode Agents - -
-
- Ultracode Floating Windows - -
- - -
Subagent Options
-
- Enable Tracking - -
-
- Active Tab Only - -
- - -
Image Watcher
-
- Enable Globally - -
- - -
Remote Access
-
- Cloudflare Tunnel - -
- - - - -
Updates
-
- Current Version - — -
-
- Check for Updates - -
- - - - - - - - - - - - - - - - - - - - - - - -