({ onClose }: SettingsModalProps)
| 57 | type SettingsTab = 'api' | 'prompt' | 'appearance' | 'privacy' | 'liquid' | 'autotune' | 'parseltongue' | 'stm' | 'memory' | 'ultraplinian' | 'consortium' | 'plan' | 'data' |
| 58 | |
| 59 | export function SettingsModal({ onClose }: SettingsModalProps) { |
| 60 | const [activeTab, setActiveTab] = useState<SettingsTab>('api') |
| 61 | |
| 62 | return ( |
| 63 | <div className="fixed inset-0 z-50 flex items-center justify-center p-4"> |
| 64 | {/* Backdrop */} |
| 65 | <div |
| 66 | className="absolute inset-0 bg-black/60 backdrop-blur-sm" |
| 67 | onClick={onClose} |
| 68 | /> |
| 69 | |
| 70 | {/* Modal */} |
| 71 | <div className="relative w-full max-w-2xl bg-theme-bg border border-theme-primary rounded-lg shadow-2xl overflow-hidden"> |
| 72 | {/* Header */} |
| 73 | <div className="flex items-center justify-between px-6 py-4 border-b border-theme-primary"> |
| 74 | <h2 className="text-xl font-bold theme-primary">Settings</h2> |
| 75 | <button |
| 76 | onClick={onClose} |
| 77 | className="p-2 hover:bg-theme-accent rounded-lg transition-colors" |
| 78 | aria-label="Close settings" |
| 79 | > |
| 80 | <X className="w-5 h-5" /> |
| 81 | </button> |
| 82 | </div> |
| 83 | |
| 84 | {/* Content */} |
| 85 | <div className="flex min-h-[400px]"> |
| 86 | {/* Sidebar */} |
| 87 | <nav className="w-48 border-r border-theme-primary p-2"> |
| 88 | <TabButton |
| 89 | icon={<Key className="w-4 h-4" />} |
| 90 | label="API Key" |
| 91 | active={activeTab === 'api'} |
| 92 | onClick={() => setActiveTab('api')} |
| 93 | /> |
| 94 | <TabButton |
| 95 | icon={<FileText className="w-4 h-4" />} |
| 96 | label="System Prompt" |
| 97 | active={activeTab === 'prompt'} |
| 98 | onClick={() => setActiveTab('prompt')} |
| 99 | /> |
| 100 | <TabButton |
| 101 | icon={<SlidersHorizontal className="w-4 h-4" />} |
| 102 | label="AutoTune" |
| 103 | active={activeTab === 'autotune'} |
| 104 | onClick={() => setActiveTab('autotune')} |
| 105 | /> |
| 106 | <TabButton |
| 107 | icon={<Palette className="w-4 h-4" />} |
| 108 | label="Appearance" |
| 109 | active={activeTab === 'appearance'} |
| 110 | onClick={() => setActiveTab('appearance')} |
| 111 | /> |
| 112 | <TabButton |
| 113 | icon={<Shield className="w-4 h-4" />} |
| 114 | label="Privacy" |
| 115 | active={activeTab === 'privacy'} |
| 116 | onClick={() => setActiveTab('privacy')} |
nothing calls this directly
no outgoing calls
no test coverage detected