// ─── Live Panel — thin composition layer ──────────────────────────────────── import { motion } from "framer-motion"; import { Mic, MonitorUp, Music2 } from "lucide-react"; import type { ActiveSpeaker, Channel, Guild, MediaState, VoiceStatus, } from "../../shared/api/client"; import { cardItem, cardStagger } from "../../shared/hooks/useFramerStagger"; import { Card, CardContent, CardHeader, CardTitle, Tabs, TabsContent, TabsList, TabsTrigger, } from "../../shared/ui"; import { ActiveSpeakers } from "./components/ActiveSpeakers"; import { AudioVisualizer } from "./components/AudioVisualizer"; import { MusicSubPanel } from "./components/MusicSubPanel"; import { NowPlaying } from "./components/NowPlaying"; import { RecordingsSubPanel } from "./components/RecordingsSubPanel"; import { ScreenSubPanel } from "./components/ScreenSubPanel"; import { VoiceConnectionCard } from "./components/VoiceConnectionCard"; interface LivePanelProps { guilds: Guild[]; voiceChannels: Channel[]; selectedGuild: string; selectedChannel: string; status: VoiceStatus; voiceLoading: boolean; activeSpeakers: ActiveSpeaker[]; levels: number[]; isListening: boolean; isStreaming: boolean; mediaState: MediaState; mediaLoading: boolean; onGuildChange: (id: string) => void; onChannelChange: (id: string) => void; onJoin: () => void; onDisconnect: () => void; onListenToggle: () => void; onStreamingToggle: () => void; onQueueMusic: (source: string) => void; onStartScreen: (source: string) => void; onSkip: () => void; onStop: () => void; onVolumeChange: (v: number) => void; } export function LivePanel({ guilds, voiceChannels, selectedGuild, selectedChannel, status, voiceLoading, activeSpeakers, levels, isListening, isStreaming, mediaState, mediaLoading, onGuildChange, onChannelChange, onJoin, onDisconnect, onListenToggle, onStreamingToggle, onQueueMusic, onStartScreen, onSkip, onStop, onVolumeChange, }: LivePanelProps) { return ( Live Audio Active Speakers Music Screen Share Recordings ); }