{"version":3,"sources":["../../src/dashboard/DashboardProvider.tsx","../../src/dashboard/hooks/useDashboard.ts","../../src/dashboard/panels/OrbViewer.tsx","../../src/dashboard/panels/ModeControls.tsx","../../src/dashboard/panels/TTSPanel.tsx","../../src/dashboard/panels/STTPanel.tsx","../../src/dashboard/panels/AudioToolbar.tsx","../../src/dashboard/panels/ConversationPanel.tsx","../../src/dashboard/panels/LogPanel.tsx","../../src/dashboard/config/ParamSlider.tsx","../../src/dashboard/config/ConfigSection.tsx","../../src/dashboard/config/slider-defs.ts","../../src/dashboard/config/ShapeTab.tsx","../../src/dashboard/config/LookTab.tsx","../../src/dashboard/config/AudioTab.tsx","../../src/dashboard/config/ConfigPanel.tsx","../../src/dashboard/DashboardLayout.tsx","../../src/dashboard/DashboardApp.tsx"],"names":["createContext","AISphereEventsProvider","jsx","__name","useLoggerBridge","useState","useEffect","useCallback","useRef","useConversation","LiquidOrbProvider","useContext","LiquidOrb","Circle","Ear","Brain","AudioLines","CircleCheck","CircleX","Info","useLiquidOrb","jsxs","ToggleGroup","ToggleGroupItem","Separator","Card","CardHeader","CardTitle","Volume2","CardContent","Textarea","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","Alert","AlertDescription","STATUS_COLORS","useSpeechRecorder","Mic","Badge","Pause","Play","Music","useMemo","MessageCircle","Slider","useLoggerStore","ScrollText","Trash2","Label","Waves","Wind","Zap","Palette","Sparkles","ArrowRightLeft","SlidersHorizontal","Activity","DEFAULT_PRESETS","DEFAULT_AUDIO_REACTIVITY","Tabs","TabsList","TabsTrigger","Shapes","Eye","ScrollArea","TabsContent","Copy"],"mappings":"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","file":"index.cjs","sourcesContent":["import React, { createContext, useCallback, useEffect, useRef, useState } from 'react';\nimport {\n  LiquidOrbProvider,\n  useConversation,\n  AISphereEventsProvider,\n} from '../index.js';\nimport { useLoggerBridge } from '../logger/index.js';\nimport type { LiquidOrbConfig, UseConversationReturn } from '../index.js';\nimport type { SDKRouterClient } from '@sdkrouter/client';\n\nexport interface DashboardContextValue {\n  // SDK client\n  client: SDKRouterClient;\n\n  // Audio source\n  audioEl: HTMLAudioElement | null;\n  fileAudioEl: HTMLAudioElement | null;\n  setFileAudioEl: (el: HTMLAudioElement | null) => void;\n  ttsAudioEl: HTMLAudioElement | null;\n  setTtsAudioEl: (el: HTMLAudioElement | null) => void;\n  playing: boolean;\n  togglePlay: () => void;\n  handleFile: (e: React.ChangeEvent<HTMLInputElement>) => void;\n  fileRef: React.RefObject<HTMLInputElement | null>;\n\n  // Orb configuration\n  config: LiquidOrbConfig;\n  setConfig: (c: LiquidOrbConfig) => void;\n\n  // Conversation\n  conversation: UseConversationReturn;\n\n  // Model tiers\n  llmModel: string;\n  setLlmModel: (v: string) => void;\n  ttsModel: string;\n  setTtsModel: (v: string) => void;\n  sttModel: string;\n  setSttModel: (v: string) => void;\n\n  // TTS delivery mode\n  ttsMode: 'buffered' | 'realtime' | 'streaming';\n  setTtsMode: (v: 'buffered' | 'realtime' | 'streaming') => void;\n\n  // TTS speed\n  ttsSpeed: number;\n  setTtsSpeed: (v: number) => void;\n}\n\nexport const DashboardContext = createContext<DashboardContextValue | null>(null);\n\nconst SYSTEM_PROMPT = 'You are a friendly, warm AI assistant who enjoys helping people. Reply in the SAME language the user speaks. Keep responses conversational and natural — not too long, but complete your thoughts. For creative requests like stories, give a proper short story (3-5 sentences).';\n\nexport interface DashboardProviderProps {\n  client: SDKRouterClient;\n  children: React.ReactNode;\n}\n\n/**\n * Outer shell — provides AISphereEventsProvider so that DashboardInner\n * (and its useConversation hook) can access the event emitter.\n */\nexport function DashboardProvider({ client, children }: DashboardProviderProps) {\n  return (\n    <AISphereEventsProvider>\n      <DashboardInner client={client}>{children}</DashboardInner>\n    </AISphereEventsProvider>\n  );\n}\n\n/**\n * Inner component rendered inside AISphereEventsProvider.\n * useConversation needs the event emitter context to emit phase-change\n * events that drive the orb's visual mode.\n */\nfunction DashboardInner({ client, children }: DashboardProviderProps) {\n  // Bridge emitter → zustand logger\n  useLoggerBridge();\n\n  // File-loaded audio (lazy init — Audio API unavailable during SSR)\n  const [fileAudioEl, setFileAudioEl] = useState<HTMLAudioElement | null>(null);\n\n  useEffect(() => {\n    const audio = new Audio('/output_streamed.mp3');\n    audio.preload = 'auto';\n    setFileAudioEl(audio);\n  }, []);\n\n  // TTS-generated audio (overrides file audio when active)\n  const [ttsAudioEl, setTtsAudioEl] = useState<HTMLAudioElement | null>(null);\n\n  // Active audio source — TTS takes priority\n  const audioEl = ttsAudioEl ?? fileAudioEl;\n\n  const [playing, setPlaying] = useState(false);\n\n  useEffect(() => {\n    if (!audioEl) return;\n    const audio = audioEl;\n    const onPlay = () => setPlaying(true);\n    const onPause = () => setPlaying(false);\n    const onEnded = () => setPlaying(false);\n    audio.addEventListener('play', onPlay);\n    audio.addEventListener('pause', onPause);\n    audio.addEventListener('ended', onEnded);\n    return () => {\n      audio.removeEventListener('play', onPlay);\n      audio.removeEventListener('pause', onPause);\n      audio.removeEventListener('ended', onEnded);\n    };\n  }, [audioEl]);\n\n  const togglePlay = useCallback(() => {\n    if (!audioEl) return;\n    audioEl.paused ? audioEl.play() : audioEl.pause();\n  }, [audioEl]);\n\n  const fileRef = useRef<HTMLInputElement>(null);\n\n  const handleFile = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n    const file = e.target.files?.[0];\n    if (!file) return;\n    const audio = new Audio(URL.createObjectURL(file));\n    audio.preload = 'auto';\n    setFileAudioEl(audio);\n    setTtsAudioEl(null);\n    audio.play();\n  }, []);\n\n  // Orb config\n  const [config, setConfig] = useState<LiquidOrbConfig>({});\n\n  // Model tiers\n  const [llmModel, setLlmModel] = useState('@standard');\n  const [ttsModel, setTtsModel] = useState('@fast');\n  const [sttModel, setSttModel] = useState('@fast');\n  const [ttsMode, setTtsMode] = useState<'buffered' | 'realtime' | 'streaming'>('buffered');\n  const [ttsSpeed, setTtsSpeed] = useState(1.3);\n\n  // Conversation — called inside AISphereEventsProvider so emitter is available\n  const conversation = useConversation({\n    client,\n    voice: 'fable',\n    llmModel,\n    ttsModel,\n    sttModel,\n    ttsMode,\n    ttsSpeed,\n    silenceTimeout: 3000,\n    systemPrompt: SYSTEM_PROMPT,\n  });\n\n  return (\n    <LiquidOrbProvider audioSource={audioEl} config={config}>\n      <DashboardContext.Provider\n        value={{\n          client,\n          audioEl,\n          fileAudioEl,\n          setFileAudioEl,\n          ttsAudioEl,\n          setTtsAudioEl,\n          playing,\n          togglePlay,\n          handleFile,\n          fileRef,\n          config,\n          setConfig,\n          conversation,\n          llmModel,\n          setLlmModel,\n          ttsModel,\n          setTtsModel,\n          sttModel,\n          setSttModel,\n          ttsMode,\n          setTtsMode,\n          ttsSpeed,\n          setTtsSpeed,\n        }}\n      >\n        {children}\n      </DashboardContext.Provider>\n    </LiquidOrbProvider>\n  );\n}\n","import { useContext } from 'react';\nimport { DashboardContext } from '../DashboardProvider.js';\nimport type { DashboardContextValue } from '../DashboardProvider.js';\n\nexport function useDashboard(): DashboardContextValue {\n  const ctx = useContext(DashboardContext);\n  if (!ctx) {\n    throw new Error('useDashboard must be used within <DashboardProvider>');\n  }\n  return ctx;\n}\n","import React from 'react';\nimport { LiquidOrb } from '../../index.js';\nimport { useDashboard } from '../hooks/index.js';\n\nexport function OrbViewer() {\n  const { config, conversation } = useDashboard();\n\n  return (\n    <div onClick={conversation.toggle} style={{ cursor: 'pointer' }}>\n      <LiquidOrb size={400} config={config} />\n    </div>\n  );\n}\n","import React from 'react';\nimport { useLiquidOrb } from '../../index.js';\nimport type { LiquidOrbMode } from '../../index.js';\nimport { ToggleGroup, ToggleGroupItem, Separator } from '@djangocfg/ui-core';\nimport {\n  Circle,\n  Ear,\n  Brain,\n  AudioLines,\n  CircleCheck,\n  CircleX,\n  Info,\n} from 'lucide-react';\n\nconst MODES: { value: LiquidOrbMode; icon: typeof Circle; label: string }[] = [\n  { value: 'idle', icon: Circle, label: 'Idle' },\n  { value: 'listening', icon: Ear, label: 'Listen' },\n  { value: 'thinking', icon: Brain, label: 'Think' },\n  { value: 'speaking', icon: AudioLines, label: 'Speak' },\n];\n\nconst PULSES = [\n  { type: 'success' as const, icon: CircleCheck, className: 'text-emerald-500 hover:text-emerald-400' },\n  { type: 'error' as const, icon: CircleX, className: 'text-red-500 hover:text-red-400' },\n  { type: 'info' as const, icon: Info, className: 'text-blue-500 hover:text-blue-400' },\n];\n\nexport function ModeControls() {\n  const { mode, setMode, triggerPulse } = useLiquidOrb();\n\n  const handleModeChange = (v: string) => { if (v) setMode(v as LiquidOrbMode); };\n\n  return (\n    <div className=\"flex items-center gap-1 rounded-lg border border-border bg-card/50 backdrop-blur-sm px-1 py-1\">\n      <ToggleGroup type=\"single\" value={mode} onValueChange={handleModeChange} className=\"gap-0\">\n        {MODES.map(({ value, icon: Icon, label }) => (\n          <ToggleGroupItem\n            key={value}\n            value={value}\n            size=\"sm\"\n            className=\"gap-1.5 px-3 text-xs data-[state=on]:bg-accent\"\n          >\n            <Icon className=\"h-3.5 w-3.5\" />\n            {label}\n          </ToggleGroupItem>\n        ))}\n      </ToggleGroup>\n\n      <Separator orientation=\"vertical\" className=\"mx-1 h-5\" />\n\n      <div className=\"flex items-center gap-0.5\">\n        {PULSES.map(({ type, icon: Icon, className }) => (\n          <button\n            key={type}\n            onClick={() => triggerPulse(type)}\n            className={`rounded-md p-1.5 transition-colors hover:bg-accent ${className}`}\n            title={`Pulse: ${type}`}\n          >\n            <Icon className=\"h-4 w-4\" />\n          </button>\n        ))}\n      </div>\n    </div>\n  );\n}\n","import React, { useCallback, useState } from 'react';\nimport { useLiquidOrb } from '../../index.js';\nimport {\n  Badge,\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  CardTitle,\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n  Textarea,\n  ToggleGroup,\n  ToggleGroupItem,\n  Alert,\n  AlertDescription,\n} from '@djangocfg/ui-core';\nimport { Volume2 } from 'lucide-react';\nimport { useDashboard } from '../hooks/index.js';\n\nconst VOICES = ['alloy', 'ash', 'coral', 'echo', 'fable', 'nova', 'onyx', 'sage', 'shimmer'];\n\ntype TTSMode = 'buffered' | 'realtime';\ntype TTSStatus = 'idle' | 'loading' | 'speaking' | 'error';\n\nconst STATUS_COLORS: Record<TTSStatus, string> = {\n  idle: 'bg-muted-foreground',\n  loading: 'bg-purple-500 animate-pulse',\n  speaking: 'bg-emerald-500',\n  error: 'bg-red-500',\n};\n\nexport function TTSPanel() {\n  const { setMode } = useLiquidOrb();\n  const { client, setTtsAudioEl } = useDashboard();\n\n  const [text, setText] = useState('Hello! I am the liquid orb. I can speak and react to my own voice in real time.');\n  const [voice, setVoice] = useState('nova');\n  const [ttsMode, setTTSMode] = useState<TTSMode>('buffered');\n  const [status, setStatus] = useState<TTSStatus>('idle');\n  const [error, setError] = useState<string | null>(null);\n  const [chunks, setChunks] = useState(0);\n\n  const handleSpeak = useCallback(async () => {\n    if (!text.trim()) return;\n\n    setStatus('loading');\n    setError(null);\n    setChunks(0);\n    setMode('thinking');\n\n    try {\n      let audioEl: HTMLAudioElement;\n\n      if (ttsMode === 'buffered') {\n        const result = await client.audio.speech({ model: 'tts-1', input: text, voice });\n        audioEl = result.audioEl;\n      } else {\n        audioEl = await client.audio.speechStream({\n          model: 'tts-1',\n          input: text,\n          voice,\n          onChunk: () => { setChunks((c) => c + 1); },\n        });\n      }\n\n      setTtsAudioEl(audioEl);\n      setStatus('speaking');\n      setMode('speaking');\n      audioEl.play();\n\n      audioEl.addEventListener('ended', () => {\n        setStatus('idle');\n        setMode('idle');\n        setTtsAudioEl(null);\n      }, { once: true });\n\n    } catch (e) {\n      setStatus('error');\n      setError(e instanceof Error ? e.message : String(e));\n      setMode('idle');\n    }\n  }, [text, voice, ttsMode, setMode, setTtsAudioEl]);\n\n  const statusDotClass = `ml-auto h-2 w-2 rounded-full ${STATUS_COLORS[status]}`;\n  const speakDisabled = status === 'loading' || status === 'speaking' || !text.trim();\n  const showChunks = status === 'loading' && ttsMode === 'realtime' && chunks > 0;\n\n  return (\n    <Card className=\"w-full\">\n      <CardHeader className=\"pb-3\">\n        <CardTitle className=\"flex items-center gap-2 text-sm font-medium\">\n          <Volume2 className=\"h-4 w-4 text-muted-foreground\" />\n          TTS Demo\n          <div className={statusDotClass} />\n          <span className=\"text-xs font-normal text-muted-foreground\">{status}</span>\n          {showChunks && (\n            <span className=\"text-xs font-normal text-muted-foreground\">({chunks} chunks)</span>\n          )}\n        </CardTitle>\n      </CardHeader>\n      <CardContent className=\"space-y-3\">\n        <Textarea\n          placeholder=\"Enter text to speak...\"\n          value={text}\n          onChange={(e) => setText(e.target.value)}\n          rows={3}\n          className=\"resize-none\"\n        />\n\n        <div className=\"flex items-center gap-2\">\n          <Select value={voice} onValueChange={setVoice}>\n            <SelectTrigger className=\"flex-1 text-xs\">\n              <SelectValue />\n            </SelectTrigger>\n            <SelectContent>\n              {VOICES.map((v) => (\n                <SelectItem key={v} value={v}>{v}</SelectItem>\n              ))}\n            </SelectContent>\n          </Select>\n\n          <Button size=\"sm\" disabled={speakDisabled} onClick={handleSpeak} className=\"shrink-0\">\n            Speak\n          </Button>\n        </div>\n\n        <ToggleGroup\n          type=\"single\"\n          value={ttsMode}\n          onValueChange={(v) => { if (v) setTTSMode(v as TTSMode); }}\n          className=\"w-full\"\n        >\n          <ToggleGroupItem value=\"buffered\" className=\"text-xs flex-1\">\n            Buffered\n          </ToggleGroupItem>\n          <ToggleGroupItem value=\"realtime\" className=\"text-xs flex-1\">\n            Realtime\n          </ToggleGroupItem>\n        </ToggleGroup>\n\n        {error && (\n          <Alert variant=\"destructive\">\n            <AlertDescription className=\"text-xs\">{error}</AlertDescription>\n          </Alert>\n        )}\n      </CardContent>\n    </Card>\n  );\n}\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { useLiquidOrb, useSpeechRecorder } from '../../index.js';\nimport {\n  Alert,\n  AlertDescription,\n  Badge,\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  CardTitle,\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n  ToggleGroup,\n  ToggleGroupItem,\n} from '@djangocfg/ui-core';\nimport { Mic } from 'lucide-react';\nimport { useDashboard } from '../hooks/index.js';\n\ntype STTBackend = 'server' | 'browser' | 'auto';\n\nconst STATUS_COLORS: Record<string, string> = {\n  idle: 'bg-muted-foreground',\n  recording: 'bg-red-500 animate-pulse',\n  transcribing: 'bg-purple-500 animate-pulse',\n  error: 'bg-red-500',\n};\n\nconst LANGUAGES = [\n  { value: '', label: 'Auto-detect' },\n  { value: 'en', label: 'English' },\n  { value: 'ru', label: 'Russian' },\n  { value: 'ko', label: 'Korean' },\n  { value: 'ja', label: 'Japanese' },\n  { value: 'zh', label: 'Chinese' },\n  { value: 'de', label: 'German' },\n  { value: 'fr', label: 'French' },\n  { value: 'es', label: 'Spanish' },\n];\n\nexport function STTPanel() {\n  const { client } = useDashboard();\n  const { setMode } = useLiquidOrb();\n  const [transcript, setTranscript] = useState('');\n  const [interim, setInterim] = useState('');\n  const [language, setLanguage] = useState('');\n  const [sttBackend, setSttBackend] = useState<STTBackend>('server');\n\n  const useWebSpeechAPIValue = sttBackend === 'server' ? false : sttBackend === 'browser' ? true : ('auto' as const);\n\n  const { status, startRecording, stopRecording, isRecording, backend, webSpeechSupported, error } = useSpeechRecorder({\n    client,\n    ...(language ? { language } : {}),\n    useWebSpeechAPI: useWebSpeechAPIValue,\n    onResult: (text) => {\n      setTranscript(text);\n      setInterim('');\n      setMode('idle');\n    },\n    onInterim: (text) => {\n      setInterim(text);\n    },\n    onError: () => {\n      setMode('idle');\n    },\n  });\n\n  const handleToggle = useCallback(() => {\n    if (isRecording) {\n      stopRecording();\n      setMode('thinking');\n    } else {\n      setTranscript('');\n      startRecording();\n      setMode('listening');\n    }\n  }, [isRecording, startRecording, stopRecording, setMode]);\n\n  const statusDotClass = `ml-auto h-2 w-2 rounded-full ${STATUS_COLORS[status]}`;\n  const recordVariant = isRecording ? 'destructive' as const : 'default' as const;\n  const recordLabel = isRecording ? 'Stop' : 'Record';\n  const transcribing = status === 'transcribing';\n  const showHttpsWarning = sttBackend !== 'server' && typeof location !== 'undefined' && location.protocol === 'http:';\n  const hasTranscript = Boolean(transcript || interim);\n\n  // Use '' for auto-detect in Select (needs a placeholder value mapped)\n  const languageValue = language || '__auto__';\n\n  const handleLanguageChange = useCallback((v: string) => {\n    setLanguage(v === '__auto__' ? '' : v);\n  }, []);\n\n  return (\n    <Card className=\"w-full\">\n      <CardHeader className=\"pb-3\">\n        <CardTitle className=\"flex items-center gap-2 text-sm font-medium\">\n          <Mic className=\"h-4 w-4 text-muted-foreground\" />\n          STT Demo\n          <Badge variant=\"outline\" className=\"text-[10px]\">{backend}</Badge>\n          <div className={statusDotClass} />\n          <span className=\"text-xs font-normal text-muted-foreground\">{status}</span>\n        </CardTitle>\n      </CardHeader>\n      <CardContent className=\"space-y-3\">\n        <div className=\"flex items-center gap-2\">\n          <Button\n            size=\"sm\"\n            variant={recordVariant}\n            onClick={handleToggle}\n            disabled={transcribing}\n            className=\"shrink-0\"\n          >\n            <Mic className=\"h-3.5 w-3.5 mr-2\" />\n            {recordLabel}\n          </Button>\n\n          <Select value={languageValue} onValueChange={handleLanguageChange}>\n            <SelectTrigger className=\"flex-1 text-xs\">\n              <SelectValue />\n            </SelectTrigger>\n            <SelectContent>\n              {LANGUAGES.map((lang) => (\n                <SelectItem key={lang.value || '__auto__'} value={lang.value || '__auto__'}>\n                  {lang.label}\n                </SelectItem>\n              ))}\n            </SelectContent>\n          </Select>\n        </div>\n\n        <ToggleGroup\n          type=\"single\"\n          value={sttBackend}\n          onValueChange={(v) => { if (v) setSttBackend(v as STTBackend); }}\n          className=\"w-full\"\n        >\n          <ToggleGroupItem value=\"server\" className=\"text-xs flex-1\">\n            server\n          </ToggleGroupItem>\n          <ToggleGroupItem\n            value=\"browser\"\n            className=\"text-xs flex-1\"\n            disabled={!webSpeechSupported}\n          >\n            browser\n          </ToggleGroupItem>\n          <ToggleGroupItem value=\"auto\" className=\"text-xs flex-1\">\n            auto\n          </ToggleGroupItem>\n        </ToggleGroup>\n\n        {showHttpsWarning && (\n          <Alert>\n            <AlertDescription className=\"text-xs\">\n              Browser STT requires HTTPS. On localhost set chrome://flags/#unsafely-treat-insecure-origin-as-secure\n            </AlertDescription>\n          </Alert>\n        )}\n\n        {hasTranscript && (\n          <Card>\n            <CardContent className=\"px-3 py-2 text-sm\">\n              {transcript}\n              {interim && <span className=\"text-muted-foreground italic\">{interim}</span>}\n            </CardContent>\n          </Card>\n        )}\n\n        {error && (\n          <Alert variant=\"destructive\">\n            <AlertDescription className=\"text-xs\">{error}</AlertDescription>\n          </Alert>\n        )}\n      </CardContent>\n    </Card>\n  );\n}\n","import React, { useCallback } from 'react';\nimport { Button } from '@djangocfg/ui-core';\nimport { Music, Play, Pause } from 'lucide-react';\nimport { useDashboard } from '../hooks/index.js';\n\nexport function AudioToolbar() {\n  const { playing, togglePlay, handleFile, fileRef } = useDashboard();\n\n  const handleFileClick = useCallback(() => fileRef.current?.click(), [fileRef]);\n\n  const PlayIcon = playing ? Pause : Play;\n  const playLabel = playing ? 'Pause' : 'Play';\n\n  return (\n    <div className=\"flex gap-2\">\n      <Button variant=\"outline\" size=\"sm\" className=\"flex-1\" onClick={handleFileClick}>\n        <Music className=\"h-3.5 w-3.5 mr-2\" />\n        Load audio\n      </Button>\n      <Button variant=\"outline\" size=\"sm\" className=\"flex-1\" onClick={togglePlay}>\n        <PlayIcon className=\"h-3.5 w-3.5 mr-2\" />\n        {playLabel}\n      </Button>\n      <input ref={fileRef} type=\"file\" accept=\"audio/*\" onChange={handleFile} style={{ display: 'none' }} />\n    </div>\n  );\n}\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport {\n  Badge,\n  Card,\n  CardContent,\n  CardHeader,\n  CardTitle,\n  Alert,\n  AlertDescription,\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n  Slider,\n} from '@djangocfg/ui-core';\nimport { MessageCircle } from 'lucide-react';\nimport { useDashboard } from '../hooks/index.js';\nimport type { ConversationPhase } from '../../index.js';\n\nconst PHASE_BADGE: Record<ConversationPhase, { label: string; variant: 'default' | 'secondary' | 'destructive' | 'outline' }> = {\n  idle: { label: 'Idle', variant: 'secondary' },\n  listening: { label: 'Listening...', variant: 'default' },\n  thinking: { label: 'Thinking...', variant: 'outline' },\n  speaking: { label: 'Speaking...', variant: 'default' },\n};\n\nconst LLM_TIERS = ['@cheap', '@budget', '@standard', '@balanced', '@smart', '@fast', '@premium'];\nconst AUDIO_TIERS = ['@cheap', '@quality', '@fast', '@balanced'];\nconst TTS_MODES = [\n  { value: 'buffered', label: 'Buffered' },\n  { value: 'realtime', label: 'SSE chunked' },\n  { value: 'streaming', label: 'Streaming' },\n] as const;\n\nconst MSG_ROLE_CLASS: Record<string, string> = {\n  user: 'bg-primary/10 text-primary',\n  assistant: 'bg-muted text-foreground',\n};\nconst MSG_ROLE_FALLBACK = 'bg-muted/50 text-muted-foreground italic';\n\nconst llmOptions = LLM_TIERS.map((t) => (\n  <SelectItem key={t} value={t} className=\"text-xs\">{t.slice(1)}</SelectItem>\n));\nconst audioOptions = AUDIO_TIERS.map((t) => (\n  <SelectItem key={t} value={t} className=\"text-xs\">{t.slice(1)}</SelectItem>\n));\nconst ttsModeOptions = TTS_MODES.map((m) => (\n  <SelectItem key={m.value} value={m.value} className=\"text-xs\">{m.label}</SelectItem>\n));\n\nexport function ConversationPanel() {\n  const {\n    conversation,\n    llmModel, setLlmModel,\n    ttsModel, setTtsModel,\n    sttModel, setSttModel,\n    ttsMode, setTtsMode,\n    ttsSpeed, setTtsSpeed,\n  } = useDashboard();\n  const { phase, messages, transcript, response, error } = conversation;\n  const scrollRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    if (scrollRef.current) {\n      scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n    }\n  }, [messages.length, transcript, response]);\n\n  const badge = PHASE_BADGE[phase];\n  const isEmpty = messages.length === 0;\n  const isListening = phase === 'listening';\n  const isThinking = phase === 'thinking';\n\n  const messageItems = useMemo(() =>\n    messages.map((msg, i) => (\n      <div\n        key={i}\n        className={`rounded px-2 py-1 ${MSG_ROLE_CLASS[msg.role] ?? MSG_ROLE_FALLBACK}`}\n      >\n        <span className=\"font-semibold capitalize\">{msg.role}: </span>\n        {msg.content}\n      </div>\n    )),\n  [messages]);\n\n  return (\n    <Card className=\"w-full overflow-hidden\">\n      <CardHeader className=\"pb-3\">\n        <CardTitle className=\"flex items-center gap-2 text-sm font-medium\">\n          <MessageCircle className=\"h-4 w-4 text-muted-foreground\" />\n          Conversation\n          <Badge variant={badge.variant} className=\"ml-auto text-xs\">\n            {badge.label}\n          </Badge>\n        </CardTitle>\n      </CardHeader>\n      <CardContent className=\"space-y-3 overflow-hidden\">\n        {/* Model tier selectors */}\n        <div className=\"grid grid-cols-3 gap-2\">\n          <div>\n            <label className=\"text-[10px] text-muted-foreground uppercase tracking-wide\">LLM</label>\n            <Select value={llmModel} onValueChange={setLlmModel}>\n              <SelectTrigger className=\"h-7 text-xs\"><SelectValue /></SelectTrigger>\n              <SelectContent>{llmOptions}</SelectContent>\n            </Select>\n          </div>\n          <div>\n            <label className=\"text-[10px] text-muted-foreground uppercase tracking-wide\">TTS</label>\n            <Select value={ttsModel} onValueChange={setTtsModel}>\n              <SelectTrigger className=\"h-7 text-xs\"><SelectValue /></SelectTrigger>\n              <SelectContent>{audioOptions}</SelectContent>\n            </Select>\n          </div>\n          <div>\n            <label className=\"text-[10px] text-muted-foreground uppercase tracking-wide\">STT</label>\n            <Select value={sttModel} onValueChange={setSttModel}>\n              <SelectTrigger className=\"h-7 text-xs\"><SelectValue /></SelectTrigger>\n              <SelectContent>{audioOptions}</SelectContent>\n            </Select>\n          </div>\n        </div>\n\n        {/* TTS delivery mode */}\n        <div>\n          <label className=\"text-[10px] text-muted-foreground uppercase tracking-wide\">TTS Mode</label>\n          <Select value={ttsMode} onValueChange={setTtsMode}>\n            <SelectTrigger className=\"h-7 text-xs\"><SelectValue /></SelectTrigger>\n            <SelectContent>{ttsModeOptions}</SelectContent>\n          </Select>\n        </div>\n\n        {/* TTS speed */}\n        <div>\n          <label className=\"text-[10px] text-muted-foreground uppercase tracking-wide\">\n            Speed: {ttsSpeed.toFixed(1)}x\n          </label>\n          <Slider\n            min={0.25}\n            max={4.0}\n            step={0.25}\n            value={[ttsSpeed]}\n            onValueChange={([v]) => setTtsSpeed(v)}\n            className=\"mt-1\"\n          />\n        </div>\n\n        {/* Message log */}\n        <div\n          ref={scrollRef}\n          className=\"max-h-60 overflow-y-auto space-y-2 rounded-md border border-border p-2 text-xs\"\n        >\n          {isEmpty && (\n            <p className=\"text-muted-foreground text-center py-4\">\n              Click the orb to start a conversation\n            </p>\n          )}\n          {messageItems}\n\n          {isListening && (\n            <div className=\"rounded px-2 py-1 bg-primary/5 text-primary/70 animate-pulse\">\n              <span className=\"font-semibold\">Listening...</span>\n            </div>\n          )}\n\n          {isThinking && (\n            <div className=\"rounded px-2 py-1 bg-muted/50 text-muted-foreground animate-pulse\">\n              <span className=\"font-semibold\">Thinking...</span>\n            </div>\n          )}\n        </div>\n\n        {/* Last transcript highlight */}\n        {transcript && (\n          <div className=\"text-xs truncate\">\n            <span className=\"text-muted-foreground\">Last transcript: </span>\n            <span className=\"text-primary\">{transcript}</span>\n          </div>\n        )}\n\n        {/* Last response highlight */}\n        {response && (\n          <div className=\"text-xs truncate\">\n            <span className=\"text-muted-foreground\">Last response: </span>\n            <span className=\"text-foreground\">{response}</span>\n          </div>\n        )}\n\n        {/* Error display */}\n        {error && (\n          <Alert variant=\"destructive\">\n            <AlertDescription className=\"text-xs\">{error}</AlertDescription>\n          </Alert>\n        )}\n      </CardContent>\n    </Card>\n  );\n}\n","import React, { useCallback, useEffect, useRef } from 'react';\nimport {\n  Badge,\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  CardTitle,\n} from '@djangocfg/ui-core';\nimport { ScrollText, Trash2 } from 'lucide-react';\nimport { useLoggerStore } from '../../logger/index.js';\nimport type { LogEntry } from '../../logger/index.js';\nimport type { AudioFrame } from '../../components/liquid-orb/context/types.js';\n\nconst EVENT_COLORS: Record<string, string> = {\n  'conversation:phase-change': 'text-blue-400',\n  'conversation:transcript': 'text-green-400',\n  'conversation:response': 'text-emerald-400',\n  'conversation:error': 'text-red-400',\n  'audio:mic-frame': 'text-yellow-400',\n  'audio:tts-frame': 'text-orange-400',\n  'audio:tts-start': 'text-purple-400',\n  'audio:tts-end': 'text-purple-400',\n};\n\nfunction formatData(event: string, data: unknown): string {\n  if (data === undefined || data === null) return '';\n  if (event === 'audio:mic-frame' || event === 'audio:tts-frame') {\n    const f = data as AudioFrame;\n    return `L:${f.low.toFixed(2)} M:${f.mid.toFixed(2)} H:${f.high.toFixed(2)} V:${f.volume.toFixed(2)}`;\n  }\n  if (typeof data === 'string') return data;\n  if (typeof data === 'object') {\n    try { return JSON.stringify(data); } catch { return String(data); }\n  }\n  return String(data);\n}\n\nfunction formatTimestamp(ms: number): string {\n  const s = (ms / 1000) % 60;\n  const m = Math.floor((ms / 1000 / 60) % 60);\n  return `${String(m).padStart(2, '0')}:${s.toFixed(1).padStart(4, '0')}`;\n}\n\nfunction LogRow({ entry }: { entry: LogEntry }) {\n  const colorClass = EVENT_COLORS[entry.event] ?? 'text-muted-foreground';\n  const shortEvent = entry.event.split(':')[1] ?? entry.event;\n  return (\n    <div className=\"flex gap-1.5 leading-tight\">\n      <span className=\"shrink-0 text-muted-foreground/60\">{formatTimestamp(entry.timestamp)}</span>\n      <span className={`shrink-0 font-medium ${colorClass}`}>{shortEvent}</span>\n      <span className=\"truncate text-muted-foreground\">{formatData(entry.event, entry.data)}</span>\n    </div>\n  );\n}\n\nexport function LogPanel() {\n  const logs = useLoggerStore((s) => s.logs);\n  const clear = useLoggerStore((s) => s.clear);\n  const scrollRef = useRef<HTMLDivElement>(null);\n\n  const handleClear = useCallback(() => clear(), [clear]);\n\n  // Auto-scroll to bottom on new entries\n  useEffect(() => {\n    const el = scrollRef.current;\n    if (el) el.scrollTop = el.scrollHeight;\n  }, [logs.length]);\n\n  return (\n    <Card className=\"w-full overflow-hidden\">\n      <CardHeader className=\"pb-3\">\n        <CardTitle className=\"flex items-center gap-2 text-sm font-medium\">\n          <ScrollText className=\"h-4 w-4 text-muted-foreground\" />\n          Event Log\n          <Badge variant=\"secondary\" className=\"ml-auto text-xs\">\n            {logs.length}\n          </Badge>\n          <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handleClear}>\n            <Trash2 className=\"h-3 w-3\" />\n          </Button>\n        </CardTitle>\n      </CardHeader>\n      <CardContent>\n        <div\n          ref={scrollRef}\n          className=\"max-h-48 overflow-y-auto rounded-md border border-border p-2 font-mono text-[10px] space-y-0.5\"\n        >\n          {logs.length === 0 && (\n            <p className=\"text-muted-foreground text-center py-2\">No events yet</p>\n          )}\n          {logs.map((entry) => (\n            <LogRow key={entry.id} entry={entry} />\n          ))}\n        </div>\n      </CardContent>\n    </Card>\n  );\n}\n","import React from 'react';\nimport { Label, Slider } from '@djangocfg/ui-core';\n\nexport function ParamSlider({ label, value, min, max, step, onChange }: {\n  label: string;\n  value: number;\n  min: number;\n  max: number;\n  step: number;\n  onChange: (v: number) => void;\n}) {\n  const formatted = value.toFixed(3);\n\n  return (\n    <div className=\"space-y-1.5 py-1\">\n      <div className=\"flex items-center justify-between\">\n        <Label className=\"text-xs font-medium text-foreground\">{label}</Label>\n        <span className=\"font-mono text-xs tabular-nums text-muted-foreground\">\n          {formatted}\n        </span>\n      </div>\n      <Slider\n        min={min}\n        max={max}\n        step={step}\n        value={[value]}\n        onValueChange={([v]) => onChange(v!)}\n      />\n    </div>\n  );\n}\n\nexport function ColorInput({ label, value, onChange }: {\n  label: string;\n  value: string;\n  onChange: (v: string) => void;\n}) {\n  return (\n    <div className=\"flex items-center gap-3 py-1.5\">\n      <input\n        type=\"color\"\n        value={value}\n        onChange={(e) => onChange(e.target.value)}\n        className=\"h-7 w-7 shrink-0 cursor-pointer rounded-md border border-border bg-transparent p-0.5\"\n      />\n      <Label className=\"flex-1 text-xs font-medium text-foreground\">{label}</Label>\n      <span className=\"font-mono text-xs tabular-nums text-muted-foreground\">\n        {value}\n      </span>\n    </div>\n  );\n}\n","import React from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport function ConfigSection({ title, icon: Icon, children }: {\n  title: string;\n  icon?: LucideIcon;\n  children: React.ReactNode;\n}) {\n  return (\n    <div className=\"space-y-3\">\n      <div className=\"flex items-center gap-2\">\n        {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />}\n        <h4 className=\"text-xs font-semibold text-muted-foreground\">\n          {title}\n        </h4>\n      </div>\n      <div className=\"space-y-3\">\n        {children}\n      </div>\n    </div>\n  );\n}\n","/**\n * Centralized slider definitions — single source of truth for label, min, max, step.\n */\n\nexport interface SliderDef {\n  label: string;\n  min: number;\n  max: number;\n  step: number;\n}\n\n// ── Shape (OrbParams) ──────────────────────────────────────────────────────────\n\nexport const NOISE_SLIDERS = {\n  noiseFrequency: { label: 'Frequency', min: 0.1, max: 4, step: 0.05 },\n  noiseAmplitude: { label: 'Amplitude', min: 0, max: 0.3, step: 0.005 },\n  noiseSpeed:     { label: 'Speed',     min: 0, max: 2, step: 0.05 },\n} satisfies Record<string, SliderDef>;\n\nexport const BREATHING_SLIDERS = {\n  breathSpeed:     { label: 'Speed',     min: 0, max: 3, step: 0.05 },\n  breathAmplitude: { label: 'Amplitude', min: 0, max: 0.1, step: 0.002 },\n} satisfies Record<string, SliderDef>;\n\nexport const DISTORTION_SLIDERS = {\n  distortion: { label: 'Amount', min: 0, max: 0.2, step: 0.005 },\n} satisfies Record<string, SliderDef>;\n\n// ── Look (OrbParams) ──────────────────────────────────────────────────────────\n\nexport const MATERIAL_SLIDERS = {\n  emissiveIntensity: { label: 'Emissive',    min: 0, max: 2, step: 0.05 },\n  iridescence:       { label: 'Iridescence', min: 0, max: 1, step: 0.05 },\n} satisfies Record<string, SliderDef>;\n\nexport const LERP_SLIDER: SliderDef = {\n  label: 'Lerp speed', min: 0.005, max: 0.3, step: 0.005,\n};\n\n// ── Audio Reactivity ──────────────────────────────────────────────────────────\n\nexport const FREQ_GAIN_SLIDERS = {\n  lowGain:      { label: 'Low',      min: 0, max: 0.3, step: 0.005 },\n  midGain:      { label: 'Mid',      min: 0, max: 0.2, step: 0.005 },\n  highGain:     { label: 'High',     min: 0, max: 0.2, step: 0.005 },\n  volumeGain:   { label: 'Volume',   min: 0, max: 1,   step: 0.01 },\n  emissiveGain: { label: 'Emissive', min: 0, max: 1.5, step: 0.05 },\n} satisfies Record<string, SliderDef>;\n\nexport const SMOOTHING_SLIDERS = {\n  smoothAttack:  { label: 'Attack',  min: 0.01, max: 1,   step: 0.01 },\n  smoothRelease: { label: 'Release', min: 0.01, max: 0.5, step: 0.01 },\n} satisfies Record<string, SliderDef>;\n","import React from 'react';\nimport type { OrbParams } from '../../index.js';\nimport { Waves, Wind, Zap } from 'lucide-react';\nimport { ParamSlider } from './ParamSlider.js';\nimport { ConfigSection } from './ConfigSection.js';\nimport { NOISE_SLIDERS, BREATHING_SLIDERS, DISTORTION_SLIDERS } from './slider-defs.js';\n\ninterface ShapeTabProps {\n  preset: OrbParams;\n  updatePreset: (key: keyof OrbParams, value: number | string) => void;\n}\n\nexport function ShapeTab({ preset, updatePreset }: ShapeTabProps) {\n  return (\n    <div className=\"space-y-6 p-5\">\n      <ConfigSection title=\"Noise\" icon={Waves}>\n        {Object.entries(NOISE_SLIDERS).map(([key, def]) => (\n          <ParamSlider key={key} {...def} value={preset[key as keyof OrbParams] as number} onChange={(v) => updatePreset(key as keyof OrbParams, v)} />\n        ))}\n      </ConfigSection>\n\n      <ConfigSection title=\"Breathing\" icon={Wind}>\n        {Object.entries(BREATHING_SLIDERS).map(([key, def]) => (\n          <ParamSlider key={key} {...def} value={preset[key as keyof OrbParams] as number} onChange={(v) => updatePreset(key as keyof OrbParams, v)} />\n        ))}\n      </ConfigSection>\n\n      <ConfigSection title=\"Distortion\" icon={Zap}>\n        {Object.entries(DISTORTION_SLIDERS).map(([key, def]) => (\n          <ParamSlider key={key} {...def} value={preset[key as keyof OrbParams] as number} onChange={(v) => updatePreset(key as keyof OrbParams, v)} />\n        ))}\n      </ConfigSection>\n    </div>\n  );\n}\n","import React from 'react';\nimport type { OrbParams } from '../../index.js';\nimport { Palette, Sparkles, ArrowRightLeft } from 'lucide-react';\nimport { ParamSlider, ColorInput } from './ParamSlider.js';\nimport { ConfigSection } from './ConfigSection.js';\nimport { MATERIAL_SLIDERS, LERP_SLIDER } from './slider-defs.js';\n\ninterface LookTabProps {\n  preset: OrbParams;\n  updatePreset: (key: keyof OrbParams, value: number | string) => void;\n  lerpSpeed: number;\n  updateLerp: (value: number) => void;\n}\n\nexport function LookTab({ preset, updatePreset, lerpSpeed, updateLerp }: LookTabProps) {\n  return (\n    <div className=\"space-y-6 p-5\">\n      <ConfigSection title=\"Colors\" icon={Palette}>\n        <ColorInput label=\"Primary\" value={preset.color1} onChange={(v) => updatePreset('color1', v)} />\n        <ColorInput label=\"Secondary\" value={preset.color2} onChange={(v) => updatePreset('color2', v)} />\n      </ConfigSection>\n\n      <ConfigSection title=\"Material\" icon={Sparkles}>\n        {Object.entries(MATERIAL_SLIDERS).map(([key, def]) => (\n          <ParamSlider key={key} {...def} value={preset[key as keyof OrbParams] as number} onChange={(v) => updatePreset(key as keyof OrbParams, v)} />\n        ))}\n      </ConfigSection>\n\n      <ConfigSection title=\"Transition\" icon={ArrowRightLeft}>\n        <ParamSlider {...LERP_SLIDER} value={lerpSpeed} onChange={updateLerp} />\n      </ConfigSection>\n    </div>\n  );\n}\n","import React from 'react';\nimport { SlidersHorizontal, Activity } from 'lucide-react';\nimport { ParamSlider } from './ParamSlider.js';\nimport { ConfigSection } from './ConfigSection.js';\nimport { FREQ_GAIN_SLIDERS, SMOOTHING_SLIDERS } from './slider-defs.js';\n\ninterface AudioTabProps {\n  lowGain: number;\n  midGain: number;\n  highGain: number;\n  volumeGain: number;\n  emissiveGain: number;\n  smoothAttack: number;\n  smoothRelease: number;\n  updateAR: (key: string, value: number) => void;\n}\n\nexport function AudioTab({\n  lowGain, midGain, highGain, volumeGain, emissiveGain,\n  smoothAttack, smoothRelease, updateAR,\n}: AudioTabProps) {\n  const gains: Record<string, number> = { lowGain, midGain, highGain, volumeGain, emissiveGain };\n  const smoothing: Record<string, number> = { smoothAttack, smoothRelease };\n\n  return (\n    <div className=\"space-y-6 p-5\">\n      <ConfigSection title=\"Frequency Gains\" icon={SlidersHorizontal}>\n        {Object.entries(FREQ_GAIN_SLIDERS).map(([key, def]) => (\n          <ParamSlider key={key} {...def} value={gains[key]!} onChange={(v) => updateAR(key, v)} />\n        ))}\n      </ConfigSection>\n\n      <ConfigSection title=\"Smoothing\" icon={Activity}>\n        {Object.entries(SMOOTHING_SLIDERS).map(([key, def]) => (\n          <ParamSlider key={key} {...def} value={smoothing[key]!} onChange={(v) => updateAR(key, v)} />\n        ))}\n      </ConfigSection>\n    </div>\n  );\n}\n","import React, { useCallback } from 'react';\nimport { DEFAULT_PRESETS, DEFAULT_AUDIO_REACTIVITY, useLiquidOrb } from '../../index.js';\nimport type { OrbParams } from '../../index.js';\nimport {\n  Badge,\n  Button,\n  ScrollArea,\n  Tabs,\n  TabsContent,\n  TabsList,\n  TabsTrigger,\n} from '@djangocfg/ui-core';\nimport { Copy, Shapes, Eye, AudioLines } from 'lucide-react';\nimport { useDashboard } from '../hooks/index.js';\nimport { ShapeTab } from './ShapeTab.js';\nimport { LookTab } from './LookTab.js';\nimport { AudioTab } from './AudioTab.js';\n\nexport function ConfigPanel() {\n  const { config, setConfig } = useDashboard();\n  const { mode } = useLiquidOrb();\n\n  const preset = { ...DEFAULT_PRESETS[mode], ...config.presets?.[mode] } as OrbParams;\n  const ar = config.audioReactivity ?? {};\n\n  const lerpSpeed = config.lerpSpeed ?? 0.04;\n  const lowGain = ar.lowGain ?? DEFAULT_AUDIO_REACTIVITY.lowGain;\n  const midGain = ar.midGain ?? DEFAULT_AUDIO_REACTIVITY.midGain;\n  const highGain = ar.highGain ?? DEFAULT_AUDIO_REACTIVITY.highGain;\n  const volumeGain = ar.volumeGain ?? DEFAULT_AUDIO_REACTIVITY.volumeGain;\n  const emissiveGain = ar.emissiveGain ?? DEFAULT_AUDIO_REACTIVITY.emissiveGain;\n  const smoothAttack = ar.smoothAttack ?? DEFAULT_AUDIO_REACTIVITY.smoothAttack;\n  const smoothRelease = ar.smoothRelease ?? DEFAULT_AUDIO_REACTIVITY.smoothRelease;\n\n  const updatePreset = useCallback((key: keyof OrbParams, value: number | string) => {\n    setConfig({\n      ...config,\n      presets: {\n        ...config.presets,\n        [mode]: { ...config.presets?.[mode], [key]: value },\n      },\n    });\n  }, [config, mode, setConfig]);\n\n  const updateAR = useCallback((key: string, value: number) => {\n    setConfig({\n      ...config,\n      audioReactivity: { ...config.audioReactivity, [key]: value },\n    });\n  }, [config, setConfig]);\n\n  const updateLerp = useCallback((value: number) => {\n    setConfig({ ...config, lerpSpeed: value });\n  }, [config, setConfig]);\n\n  const handleCopyConfig = useCallback(() => {\n    const json = JSON.stringify(config, null, 2);\n    navigator.clipboard.writeText(json);\n  }, [config]);\n\n  return (\n    <aside className=\"w-96 shrink-0 border-l border-border bg-card flex flex-col\">\n      {/* Header */}\n      <div className=\"flex items-center justify-between px-5 py-4 border-b border-border\">\n        <h2 className=\"text-sm font-semibold text-foreground\">Configuration</h2>\n        <Badge variant=\"outline\" className=\"text-xs capitalize\">{mode}</Badge>\n      </div>\n\n      {/* Tabs */}\n      <Tabs defaultValue=\"shape\" className=\"flex flex-1 flex-col min-h-0\">\n        <TabsList fullWidth className=\"shrink-0 mx-5 mt-4 w-auto\">\n          <TabsTrigger value=\"shape\" flexEqual className=\"gap-1.5 text-xs\">\n            <Shapes className=\"h-3.5 w-3.5\" />\n            Shape\n          </TabsTrigger>\n          <TabsTrigger value=\"look\" flexEqual className=\"gap-1.5 text-xs\">\n            <Eye className=\"h-3.5 w-3.5\" />\n            Look\n          </TabsTrigger>\n          <TabsTrigger value=\"audio\" flexEqual className=\"gap-1.5 text-xs\">\n            <AudioLines className=\"h-3.5 w-3.5\" />\n            Audio\n          </TabsTrigger>\n        </TabsList>\n\n        <ScrollArea className=\"flex-1\">\n          <TabsContent value=\"shape\" className=\"mt-0\">\n            <ShapeTab preset={preset} updatePreset={updatePreset} />\n          </TabsContent>\n\n          <TabsContent value=\"look\" className=\"mt-0\">\n            <LookTab preset={preset} updatePreset={updatePreset} lerpSpeed={lerpSpeed} updateLerp={updateLerp} />\n          </TabsContent>\n\n          <TabsContent value=\"audio\" className=\"mt-0\">\n            <AudioTab\n              lowGain={lowGain}\n              midGain={midGain}\n              highGain={highGain}\n              volumeGain={volumeGain}\n              emissiveGain={emissiveGain}\n              smoothAttack={smoothAttack}\n              smoothRelease={smoothRelease}\n              updateAR={updateAR}\n            />\n          </TabsContent>\n        </ScrollArea>\n      </Tabs>\n\n      {/* Footer */}\n      <div className=\"shrink-0 border-t border-border px-5 py-3\">\n        <Button variant=\"outline\" size=\"sm\" className=\"w-full gap-2\" onClick={handleCopyConfig}>\n          <Copy className=\"h-3.5 w-3.5\" />\n          Copy config JSON\n        </Button>\n      </div>\n    </aside>\n  );\n}\n","import React from 'react';\nimport { OrbViewer, ModeControls, TTSPanel, STTPanel, AudioToolbar, ConversationPanel, LogPanel } from './panels/index.js';\nimport { ConfigPanel } from './config/index.js';\n\nexport function DashboardLayout() {\n  return (\n    <div className=\"flex min-h-screen\">\n      {/* Left panel — TTS / STT controls */}\n      <aside className=\"w-80 shrink-0 border-r border-border bg-card h-screen overflow-y-auto\">\n        <div className=\"flex flex-col gap-4 p-4\">\n          <ConversationPanel />\n          <TTSPanel />\n          <STTPanel />\n          <AudioToolbar />\n          <LogPanel />\n        </div>\n      </aside>\n\n      {/* Center — Orb + mode controls */}\n      <main className=\"flex flex-1 flex-col items-center justify-center gap-6 p-6\">\n        <OrbViewer />\n        <ModeControls />\n      </main>\n\n      {/* Right panel — Config */}\n      <ConfigPanel />\n    </div>\n  );\n}\n","import React from 'react';\nimport type { SDKRouterClient } from '@sdkrouter/client';\nimport { DashboardProvider } from './DashboardProvider.js';\nimport { DashboardLayout } from './DashboardLayout.js';\n\nexport interface DashboardAppProps {\n  client: SDKRouterClient;\n}\n\nexport function DashboardApp({ client }: DashboardAppProps) {\n  return (\n    <DashboardProvider client={client}>\n      <DashboardLayout />\n    </DashboardProvider>\n  );\n}\n"]}