import { useStore } from '@nanostores/react' import { triggerHaptic } from '@/lib/haptics' import { Check, Palette } from '@/lib/icons' import { cn } from '@/lib/utils' import { $toolViewMode, setToolViewMode } from '@/store/tool-view' import { useTheme } from '@/themes/context' import { BUILTIN_THEMES } from '@/themes/presets' import { MODE_OPTIONS } from './constants' import { prettyName } from './helpers' import { Pill, SectionHeading, SettingsContent } from './primitives' function ThemePreview({ name }: { name: string }) { const t = BUILTIN_THEMES[name] if (!t) { return null } const c = t.colors return (
) } export function AppearanceSettings() { const { themeName, mode, availableThemes, setTheme, setMode } = useTheme() const toolViewMode = useStore($toolViewMode) const activeTheme = availableThemes.find(t => t.name === themeName) return (

These are desktop-only display preferences. Mode controls brightness; theme controls the accent palette and chat surface styling.

Color Mode
Pick a fixed mode or let Hermes follow your system setting.
{prettyName(mode)}
{MODE_OPTIONS.map(({ id, label, description, icon: Icon }) => { const active = mode === id return ( ) })}
Tool Call Display
Product hides raw tool payloads; Technical shows full input/output.
{toolViewMode === 'technical' ? 'Technical' : 'Product'}
{( [ { id: 'product', label: 'Product', description: 'Human-friendly tool activity with concise summaries.' }, { id: 'technical', label: 'Technical', description: 'Include raw tool args/results and low-level details.' } ] as const ).map(option => { const active = toolViewMode === option.id return ( ) })}
Theme
Desktop palettes only. The selected mode is applied on top.
{activeTheme && {activeTheme.label}}
{availableThemes.map(theme => { const active = themeName === theme.name return ( ) })}
) }