Skip to content

feat(settings): grouped cards, short subtexts and Find a setting, with the shared rows in the core (#134) - #135

Merged
Maxaubert merged 2 commits into
mainfrom
feat/134-settings-grouped-cards
Oct 5, 2026
Merged

Maxaubert merged 2 commits into
mainfrom
feat/134-settings-grouped-cards

Conversation

@Maxaubert

Copy link
Copy Markdown
Owner

Closes #134. PR 1 of the approved plan (docs/superpowers/specs/2026-10-05-settings-redesign-design.md, section 3.1). Owner: "can you mock up some new settings pages ... grouped cards ... both apps"; approved 2026-10-05 with Q1 to Q6 as recommended and the PT mockup with "build it".

What changed

Prism Terminal's Settings, on grouped cards. Rail with Find a setting; pages Appearance, Terminal, Agents, Dictation, and About at the bottom. Every row is an icon tile, a label and ONE short subtext (at most eight plain words), the control at the right; rows sit in sectioned panels.

  • Appearance: Window (Tab width, Show title bar, Panel edges), Theme (Terminal theme with Save changes, the wall, Background colour, Accent colour, Acrylic terminal background).
  • Terminal: Shell (Default shell), Opening terminals (Folder for new tabs, Add to the Explorer menu), Text (Terminal font, Terminal text size), Command help.
  • Agents: Tab marks (Agent working indicator, the finished, asks and fails marks, Count marked tabs on the taskbar), Claude Code (Exact status from Claude Code), Mark colours (the three colours, with the same Save changes as the theme row, Q3).
  • Dictation: Use dictation, Listening, While dictating, Speech models ("Shared by both apps"), GPU acceleration (NVIDIA only). Live state is said in the subtext (no model yet, a refused microphone, a model that picks its own language, failures, slow without GPU).
  • About: the app icon, one line, Version.
  • Find a setting: every word must prefix-match the label, subtext, section, page or hidden keywords (case and accents folded), label matches first. A result opens its page, scrolls the row to the centre, flashes it and puts the keyboard on its control. Keyboard: Down from the field, Up and Down, Enter, Escape clears. The status line exists only while a query is typed.
  • Chosen rail page is a grey --p-hover-hi fill, never the accent. Focus in the new rows is a fill and a lighter edge (Prism #272, Q1). Dropdown menus in rows blur and cast no shadow. Below 760px of the frame the rail is icons and the field opens over the pane.
  • Show title bar is a switch over the same shown / hidden values. No storage key changed (snapshot tests on both the core lists and appOptions.ts).

The core change is ADDITIVE (spec 3.0 and 3.2), so the automatic Prism bump stays green:

  • New: core/renderer/settings/layout/ (SettingsFrame, SettingsSection, SettingRow, SettingBlock, icons, pure search, flash), sections/ (Shell, Text, Theme, Tab marks, Claude Code, Mark colours, Command help, Dictation page), coreIndex.ts, sectionIds.ts.
  • Extracted, shared by old and new layouts: theme/ThemeWall.tsx, theme/useTermSetup.ts, theme/palette.ts, dictation/useDictationState.ts, dictation/parts.tsx, dictation/items.ts.
  • Kept exported and drawing as before: Pref, ThemeHead, ROWS, TerminalAppearanceSettings, AgentIndicatorSetting, AttentionSettings, ShellSetting, HelpSetting, DictationSettings (removed in PR 3 once Prism has moved).
  • Lists gain flat section, icon, sub, keywords fields and the new labels; their ORDER is unchanged; no entry holds a brace (Prism's gate reads them as text; a core test holds it).
  • settingsCopy.ts: subTooLong, labelProblem, settingsListCopy added BESIDE copyProblem and settingsDescriptions, which are unchanged.
  • Shared data Prism will show at once: the catalogue's model notes and the download failure texts are now the short versions (spec 3.0, step 2).
  • Core 0.24.0 to 0.25.0, app 0.30.0 to 0.31.0.

Prism bump check (spec 3.2)

Prism origin/main 47ece4e (0.87.0, pinned to core-v0.24.0), cloned to the session scratchpad, prism-term-core pointed at this branch's core/ (file:), npm install:

  • npm run typecheck: 0 errors
  • vitest run: 154 files passed, 1 skipped; 1928 tests passed, 2 skipped

Prism's e2e was not run.

Gates

  • npm run typecheck: clean
  • npm run lint: 0 errors, 12 warnings (the same pre-existing react-refresh warnings as main, in fields.tsx and TerminalPanel.tsx)
  • npm test: 90 files, 1350 tests passed
  • Full npm run e2e: 49 scenarios, 865 checks, 1 fail: quitManyShells (exit 0xC0000005, known flaky, Quit with many shells: rare access violation (0xC0000005) under load #133); it passed on its own rerun (9/9). An earlier full run had updateWindow fail only because the version was bumped mid-run against an older build (passes after rebuild), and colourPicker fail on a real gap (the theme editor step needed Appearance), fixed.
  • New e2e: settingsLook (contrast on Pitch, Paper and acrylic, grey rail, Save the only accent button, 900 and 1600px, the narrow rail), settingsSearch (every indexed row found by its label and opened, keyboard only, Escape, No results), settingsKeys. options rewritten: the three core lists shown, order per section, one panel per section, own rows a closed list from appOptions.ts, layout measured (58px rows, 32px tiles, panel radius, 60px hairline, no overlapping controls). 24 scenarios reach rows through gotoPref.

Screenshots (looked at beside the mockup)

.e2e-shots/settings-{appearance,terminal,agents,dictation,about}-{dark,light}.png, settings-appearance-dirty.png, settings-appearance-acrylic.png, settings-narrow.png, settings-narrow-search.png, settings-search.png, settings-search-empty.png, theme-wall.png.

Deviations from the mockup

  • Subtext ink is the dim ink mixed 28% towards the text, and the warning amber is deeper on light themes (light-dark()): the mockup's colours read 3.9:1 and 4.0:1 on Paper's panel, under the spec's 4.5:1.
  • The microphone meter's track shows while idle as in the mockup, but the live meter ([data-mic-meter]) still appears only during a test.
  • Agent colours keep the Reset link and [data-follow-theme] (as briefed); the colour editor and picker are unchanged.

Not done here

  • Install of the branch build for hands-on testing (task 1.10) was skipped: installing closes running PrismTerminal processes, which this run may not close. Hands-on list in spec 3.5.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

Maxaubert and others added 2 commits October 5, 2026 13:56
…h the shared rows in the core (#134)

The core gains the settings layout (frame with rail and Find a setting,
sections, rows, blocks, icons, search, flash) and the terminal sections
built on it, additively: the old components stay exported and draw as
before, and the option lists keep their order, so Prism's bump stays green.
Prism Terminal's page moves onto it: Appearance, Terminal, Agents,
Dictation, About. No storage key changes. Core 0.25.0, app 0.31.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t
… controls named by label (#134)

The find field wore data-owns-escape always. Prism's App yields its Escape to
any element wearing it, so once Prism mounts the frame (PR 2) Escape would
stop working there for good; spec 1.3 says only an empty field lets Escape
through, so the mark is now worn only while the field holds text.

A segmented control's buttons were named only by their options ("Dynamic"),
so a screen reader never heard which setting they set (spec 1.3). A row's
control slot is now a group named by the row's label.

settingsSearch asserts both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t
@Maxaubert
Maxaubert merged commit 9d62abe into main Oct 5, 2026
2 checks passed
@Maxaubert
Maxaubert deleted the feat/134-settings-grouped-cards branch October 5, 2026 17:53
github-actions Bot pushed a commit that referenced this pull request Oct 5, 2026
…h the shared rows in the core (#134) (#135)

* feat(settings): grouped cards, short subtexts and Find a setting, with the shared rows in the core (#134)

The core gains the settings layout (frame with rail and Find a setting,
sections, rows, blocks, icons, search, flash) and the terminal sections
built on it, additively: the old components stay exported and draw as
before, and the option lists keep their order, so Prism's bump stays green.
Prism Terminal's page moves onto it: Appearance, Terminal, Agents,
Dictation, About. No storage key changes. Core 0.25.0, app 0.31.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

* fix(settings): find field claims Escape only while it holds text; row controls named by label (#134)

The find field wore data-owns-escape always. Prism's App yields its Escape to
any element wearing it, so once Prism mounts the frame (PR 2) Escape would
stop working there for good; spec 1.3 says only an empty field lets Escape
through, so the mark is now worn only while the field holds text.

A segmented control's buttons were named only by their options ("Dynamic"),
so a screen reader never heard which setting they set (spec 1.3). A row's
control slot is now a group named by the row's label.

settingsSearch asserts both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Settings: grouped cards, short subtexts and Find a setting (both apps, PT first)

1 participant