()
| 1118 | } |
| 1119 | |
| 1120 | function AppearanceTab() { |
| 1121 | const { theme, setTheme, showMagic, setShowMagic } = useStore() |
| 1122 | |
| 1123 | const themes: { id: Theme; name: string; preview: string; emoji: string }[] = [ |
| 1124 | { id: 'matrix', name: 'Matrix', preview: 'bg-matrix-bg border-matrix-primary', emoji: '◉' }, |
| 1125 | { id: 'hacker', name: 'Hacker', preview: 'bg-hacker-bg border-hacker-primary', emoji: '△' }, |
| 1126 | { id: 'glyph', name: 'Glyph', preview: 'bg-glyph-bg border-glyph-primary', emoji: '◈' }, |
| 1127 | { id: 'minimal', name: 'Minimal', preview: 'bg-minimal-bg border-minimal-primary', emoji: '◯' } |
| 1128 | ] |
| 1129 | |
| 1130 | return ( |
| 1131 | <div className="space-y-4"> |
| 1132 | <div> |
| 1133 | <h3 className="text-lg font-semibold mb-2">Theme</h3> |
| 1134 | <p className="text-sm theme-secondary mb-4"> |
| 1135 | Choose your aesthetic. Each theme affects colors, effects, and mood. |
| 1136 | </p> |
| 1137 | </div> |
| 1138 | |
| 1139 | <div className="grid grid-cols-2 gap-3"> |
| 1140 | {themes.map((t) => ( |
| 1141 | <button |
| 1142 | key={t.id} |
| 1143 | onClick={() => setTheme(t.id)} |
| 1144 | className={`p-4 rounded-lg border-2 transition-all |
| 1145 | ${theme === t.id |
| 1146 | ? 'border-theme-primary glow-box' |
| 1147 | : 'border-theme-dim hover:border-theme-primary/50' |
| 1148 | }`} |
| 1149 | > |
| 1150 | <div className="flex items-center gap-2 mb-2"> |
| 1151 | <span className="text-xl">{t.emoji}</span> |
| 1152 | <span className="font-semibold">{t.name}</span> |
| 1153 | </div> |
| 1154 | <div className={`h-8 rounded ${t.preview} border`} /> |
| 1155 | </button> |
| 1156 | ))} |
| 1157 | </div> |
| 1158 | |
| 1159 | <div className="pt-4 border-t border-theme-primary/20"> |
| 1160 | <ToggleSetting |
| 1161 | label="Show Magic" |
| 1162 | description="Display pipeline details on messages — AutoTune params, model tags, feedback buttons, and race response version arrows" |
| 1163 | enabled={showMagic} |
| 1164 | onChange={setShowMagic} |
| 1165 | /> |
| 1166 | </div> |
| 1167 | </div> |
| 1168 | ) |
| 1169 | } |
| 1170 | |
| 1171 | function PrivacyTab() { |
| 1172 | const { |
nothing calls this directly
no outgoing calls
no test coverage detected