From 2b762c53640f42fc0c10c6ede94adad62fd5d17e Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Wed, 3 Jun 2026 22:06:23 -0500 Subject: [PATCH] style(desktop): de-box appearance options into flat rows + bare theme swatches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Color Mode and Tool Call Display become flat radio-style rows (no tile border/fill, no inner icon box, no filled check badge — just a subtle active bg and a check). Theme drops its outer card wrapper so only the preview swatch shows, with a primary ring marking the active palette. --- .../src/app/settings/appearance-settings.tsx | 154 +++++++++--------- 1 file changed, 76 insertions(+), 78 deletions(-) diff --git a/apps/desktop/src/app/settings/appearance-settings.tsx b/apps/desktop/src/app/settings/appearance-settings.tsx index 8bf208b5ad9..86cbf718c73 100644 --- a/apps/desktop/src/app/settings/appearance-settings.tsx +++ b/apps/desktop/src/app/settings/appearance-settings.tsx @@ -2,7 +2,7 @@ import { useStore } from '@nanostores/react' import type { ReactNode } from 'react' import { triggerHaptic } from '@/lib/haptics' -import { Check } from '@/lib/icons' +import { Check, type IconComponent } from '@/lib/icons' import { cn } from '@/lib/utils' import { $toolViewMode, setToolViewMode } from '@/store/tool-view' import { useTheme } from '@/themes/context' @@ -66,6 +66,40 @@ function SectionHead({ title, description, pill }: { title: string; description: ) } +function OptionRow({ + icon: Icon, + label, + description, + active, + onClick +}: { + icon?: IconComponent + label: string + description: string + active: boolean + onClick: () => void +}) { + return ( + + ) +} + export function AppearanceSettings() { const { themeName, mode, availableThemes, setTheme, setMode } = useTheme() const toolViewMode = useStore($toolViewMode) @@ -85,40 +119,20 @@ export function AppearanceSettings() { pill={{prettyName(mode)}} title="Color Mode" /> -
- {MODE_OPTIONS.map(({ id, label, description, icon: Icon }) => { - const active = mode === id - - return ( - - ) - })} +
+ {MODE_OPTIONS.map(({ id, label, description, icon }) => ( + { + triggerHaptic('crisp') + setMode(id) + }} + /> + ))}
@@ -128,7 +142,7 @@ export function AppearanceSettings() { pill={{toolViewMode === 'technical' ? 'Technical' : 'Product'}} title="Tool Call Display" /> -
+
{( [ { @@ -142,36 +156,18 @@ export function AppearanceSettings() { description: 'Include raw tool args/results and low-level details.' } ] as const - ).map(option => { - const active = toolViewMode === option.id - - return ( - - ) - })} + ).map(option => ( + { + triggerHaptic('selection') + setToolViewMode(option.id) + }} + /> + ))}
@@ -181,16 +177,13 @@ export function AppearanceSettings() { pill={activeTheme ? {activeTheme.label} : undefined} title="Theme" /> -
+
{availableThemes.map(theme => { const active = themeName === theme.name return ( )