import { useEffect, useRef } from 'react'; import type { ModelOption, RuntimeSettings, TelemetrySnapshot } from '../../lib/contracts'; import { DEFAULT_MAX_TOKENS } from '../../lib/runtime-defaults'; import type { ThemeMode } from '../theme'; interface SettingsSheetProps { open: boolean; themeMode: ThemeMode; onThemeModeChange: (theme: ThemeMode) => void; activeModel: ModelOption; telemetry: TelemetrySnapshot; settings: RuntimeSettings; onSettingsChange: (settings: RuntimeSettings) => void; onPersistStorage: () => void; onClearStorage: () => void; onClearConversation: () => void; onClose: () => void; } export function SettingsSheet({ open, themeMode, onThemeModeChange, activeModel, telemetry, settings, onSettingsChange, onPersistStorage, onClearStorage, onClearConversation, onClose, }: SettingsSheetProps) { const closeButtonRef = useRef(null); useEffect(() => { if (!open) return; closeButtonRef.current?.focus(); const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') onClose(); }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [open, onClose]); if (!open) return null; const contextLimit = activeModel.id === 'bonsai-27b' ? activeModel.defaultContext : activeModel.contextLimit; const update = (key: Key, value: RuntimeSettings[Key]) => { onSettingsChange({ ...settings, [key]: value }); }; return (
{ if (event.target === event.currentTarget) onClose(); }}>

Chat settings

Selected model{activeModel.label}
{activeModel.footprint}