refactor(desktop): migrate experimental settings onto the design system
D32 of the design-system migration (Desktop stack, base feature/desktop-d30-plan-template-editor, #3409; D31 has no PR, it is covered by D82).
What
Settings › Experimental (apps/desktop/src/renderer/settings/experimental-page.tsx) moves onto @luke/ui:
- Each experiment's card is
SettingsSection, replacing the desktop'sSettingsGroup. - The signed-out note is the caption
Textin the subtle tone, replacing a.settings-noteparagraph.
These parts were already on the design system and are unchanged:
- the switch rows (
SwitchRowoverSettingsRow/Switch) - Video calls' Avatar row (the shared schema rows from F40)
- the empty state (
EmptyState)
Send feedback stays an inline press among the row's description words. The barrel has no inline-link button, and a quiet Button there would be a redesign. Its .settings-detail-act rule is shared with Coding agents' Fast access link.
No caller here imported @luke/ui/compat. No selector became unused: SettingsGroup, .settings-card and .settings-note still have other callers.
Visible changes
None. At 1280×840 the before and after captures match pixel for pixel in both themes, for the populated page and the signed-out note.
Tests
experimental-page.test.tskeeps all six behaviour tests: the switch writes, Send feedback per experiment, the empty state, the signed-out note, and Video calls' avatar showing and hiding. The one change is in "Video calls off": it counted cards by the retired.settings-cardclass and now counts the cards'sections.pnpm check:affectedexits 0.
Evidence
Captured on Linux with headless Chrome at 1280×840, using #3405's method. A throwaway, uncommitted test rendered the real ExperimentalPage inside SettingsPage, with Video calls and Factory on. That markup was framed with the built desktop stylesheet.
| Light | Dark | |
|---|---|---|
| Before | ![]() | ![]() |
| After | ![]() | ![]() |
| Signed out (after) | ![]() | ![]() |
The empty state isn't captured. Every build ships experiments, so no fixture reaches it, and this PR doesn't touch it.
Not verified on a Mac
- glyph and type rendering in SF Pro
- the page's scroll and drag strip in the real window
🤖 Generated with Claude Code





