{"version":3,"sources":["../src/stores/botAudioStore.ts","../src/components/BotAudioOutput.tsx","../src/lib/utils.ts","../src/components/ui/slider.tsx","../src/hooks/useBotAudioOutput.ts","../src/components/elements/BotVolumeSlider.tsx","../src/components/ui/buttonVariants.ts","../src/components/ui/button.tsx","../src/lib/dom.ts","../src/components/ui/popover.tsx","../src/components/elements/BotAudioControl.tsx","../src/components/elements/DataList.tsx","../src/components/elements/ClientStatus.tsx","../src/components/elements/ConnectButton.tsx","../src/components/ui/badge.tsx","../src/components/ui/banner.tsx","../src/components/ui/blankslates.tsx","../src/components/ui/buttongroup.tsx","../src/components/ui/card.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/container.tsx","../src/components/ui/divider.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/error.tsx","../src/components/ui/inputVariants.ts","../src/components/ui/input.tsx","../src/components/ui/layout.tsx","../src/components/ui/led.tsx","../src/components/ui/loader.tsx","../src/components/ui/panel.tsx","../src/components/ui/progress.tsx","../src/components/ui/resizable.tsx","../src/components/ui/select.tsx","../src/components/ui/tabs.tsx","../src/components/ui/textarea.tsx","../src/components/ui/tooltip.tsx","../src/components/elements/ControlBar.tsx","../src/components/elements/MessageRole.tsx","../src/components/elements/Thinking.tsx","../src/components/elements/MessageContent.tsx","../src/components/elements/FunctionCallContent.tsx","../src/components/elements/MessageContainer.tsx","../src/hooks/usePipecatConnectionState.ts","../src/components/elements/TextInput.tsx","../src/components/elements/Conversation.tsx","../src/components/elements/CopyText.tsx","../src/components/elements/DeviceDropDown.tsx","../src/components/elements/DeviceSelect.tsx","../src/components/elements/HighlightOverlay.tsx","../src/components/elements/PipecatLogo.tsx","../src/components/elements/SessionInfo.tsx","../src/utils/version.ts","../src/components/elements/TranscriptOverlay.tsx","../src/visualizers/CircularWaveform/canvas.ts","../src/visualizers/CircularWaveform/index.tsx","../src/visualizers/VoiceVisualizer/index.tsx","../src/components/elements/UserAudioControl.tsx","../src/components/elements/UserAudioOutputControl.tsx","../src/hooks/usePipecatEventStream.ts","../src/components/ThemeProviderContext.tsx","../src/hooks/useTheme.ts","../src/components/elements/UserScreenControl.tsx","../src/components/elements/UserVideoControl.tsx","../src/components/panels/BotAudioPanel.tsx","../src/components/panels/BotVideoPanel.tsx","../src/components/metrics/Metrics.tsx","../src/components/panels/ConversationPanel.tsx","../src/components/panels/EventsPanel.tsx","../src/components/panels/InfoPanel.tsx","../src/components/ThemeProvider.tsx","../src/lib/transports.ts","../src/components/PipecatAppBase.tsx","../src/components/ConversationProvider.tsx","../src/components/ThemeModeToggle.tsx","../src/templates/Console/SmallWebRTCCodecSetter.tsx","../src/templates/Console/index.tsx","../src/templates/Widget/index.tsx"],"names":["create","useRef","usePipecatClientMediaTrack","useEffect","useRTVIClientEvent","RTVIEvent","useCallback","jsx","extendTailwindMerge","clsx","React","jsxs","SliderPrimitive","cva","Slot","LoaderIcon","PopoverPrimitive","VolumeXIcon","VolumeIcon","Volume1Icon","Volume2Icon","Icon","usePipecatClientTransportState","Loader2Icon","useState","memo","createContext","useControllableState","useContext","XIcon","CollapsiblePrimitive","PlusIcon","DropdownMenuPrimitive","CheckIcon","CircleIcon","ChevronRightIcon","InfoIcon","React4","React5","ProgressPrimitive","disableGlobalCursorStyles","ResizablePrimitive","usePanelGroupContext","EllipsisVerticalIcon","SelectPrimitive","ChevronsUpDownIcon","ChevronUpIcon","ChevronDownIcon","TabsPrimitive","TooltipPrimitive","useMemo","Fragment","isMessageEmpty","LoaderCircleIcon","timeFormatter","usePipecatClient","SendIcon","useConversationContext","usePipecatConversation","CopyCheckIcon","CopyIcon","usePipecatClientMediaDevices","createPortal","Daily","semver","AudioContext","barCount","MicOffIcon","MicIcon","SpeakerIcon","useMediaState","PipecatClientMicToggle","useId","MonitorOffIcon","MonitorIcon","PipecatClientVideo","LoaderCircle","PipecatClientScreenShareToggle","VideoOffIcon","VideoIcon","PipecatClientCamToggle","width","maxHeight","ChartJS","CategoryScale","LinearScale","PointElement","LineElement","Title","Tooltip","Legend","Line","MessagesSquareIcon","LineChartIcon","FunnelIcon","usePipecatClientCamControl","client","PipecatClient","error","PipecatClientProvider","SunIcon","MoonIcon","PanelLeftCloseIcon","PanelRightCloseIcon","CircleAlertIcon","ChevronsLeftRightEllipsisIcon","BotIcon","TextInput"],"mappings":"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","file":"index.cjs","sourcesContent":["import { create } from \"zustand\";\n\n/**\n * Clamp a volume value to the valid HTMLMediaElement range [0, 1].\n */\nconst clampVolume = (v: number): number => {\n  if (Number.isNaN(v)) return 0;\n  if (v < 0) return 0;\n  if (v > 1) return 1;\n  return v;\n};\n\ninterface BotAudioState {\n  /** Current bot audio output volume, 0.0 – 1.0. */\n  volume: number;\n  /** Set the bot audio output volume. Values are clamped to [0, 1]. */\n  setVolume: (volume: number) => void;\n}\n\n/**\n * Store for bot audio output state.\n *\n * Drives the `<audio>` element rendered by `BotAudioOutput` and is read by\n * `BotAudioControl`. Kept as a module-level store so any number of control\n * instances stay in sync without prop drilling.\n *\n * Mute is intentionally not modeled here yet — see plan notes.\n */\nexport const useBotAudioStore = create<BotAudioState>()((set) => ({\n  volume: 1,\n  setVolume: (volume) => set({ volume: clampVolume(volume) }),\n}));\n","import { useBotAudioStore } from \"@/stores/botAudioStore\";\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport {\n  usePipecatClientMediaTrack,\n  useRTVIClientEvent,\n} from \"@pipecat-ai/client-react\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\n/**\n * Renders the bot's audio output and binds its volume to\n * {@link useBotAudioStore}.\n *\n * Functionally equivalent to `PipecatClientAudio` from\n * `@pipecat-ai/client-react` (attaches the bot's audio MediaStreamTrack to an\n * `<audio>` element and responds to `SpeakerUpdated` via `setSinkId`), with\n * the addition that `audio.volume` is driven by the bot audio store so it\n * can be controlled via `BotAudioControl` / `useBotAudioOutput`.\n *\n * Rendered by `PipecatAppBase` in place of `PipecatClientAudio` unless\n * `noAudioOutput` is set.\n */\nexport const BotAudioOutput: React.FC = () => {\n  const audioRef = useRef<HTMLAudioElement>(null);\n  const botAudioTrack = usePipecatClientMediaTrack(\"audio\", \"bot\");\n  const volume = useBotAudioStore((s) => s.volume);\n\n  // Attach the bot's audio track to the <audio> element, de-duping on track id\n  // so we don't tear down an already-playing stream.\n  useEffect(() => {\n    const el = audioRef.current;\n    if (!el || !botAudioTrack) return;\n    const existing = el.srcObject as MediaStream | null;\n    if (existing) {\n      const oldTrack = existing.getAudioTracks()[0];\n      if (oldTrack && oldTrack.id === botAudioTrack.id) return;\n    }\n    el.srcObject = new MediaStream([botAudioTrack]);\n  }, [botAudioTrack]);\n\n  // Bind store volume to the media element.\n  useEffect(() => {\n    const el = audioRef.current;\n    if (!el) return;\n    el.volume = volume;\n  }, [volume]);\n\n  // Mirror PipecatClientAudio's speaker routing behavior. `setSinkId` returns\n  // a Promise that can reject (unsupported deviceId, permission denied, etc.);\n  // swallow and log so failures stay non-fatal and observable.\n  useRTVIClientEvent(\n    RTVIEvent.SpeakerUpdated,\n    useCallback((speaker: MediaDeviceInfo) => {\n      const el = audioRef.current;\n      if (!el) return;\n      if (typeof el.setSinkId !== \"function\") return;\n      el.setSinkId(speaker.deviceId).catch((err: unknown) => {\n        console.warn(\"BotAudioOutput: setSinkId failed\", err);\n      });\n    }, []),\n  );\n\n  return <audio ref={audioRef} autoPlay />;\n};\n\nBotAudioOutput.displayName = \"BotAudioOutput\";\n\nexport default BotAudioOutput;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst customTwMerge = extendTailwindMerge({\n  extend: {\n    classGroups: {\n      shadow: [\n        {\n          shadow: [\"xshort\", \"short\", \"long\", \"xlong\"],\n        },\n      ],\n      button: [\n        {\n          button: [\"sm\", \"md\", \"lg\", \"xl\"],\n        },\n        {\n          \"button-icon\": [\"sm\", \"md\", \"lg\", \"xl\"],\n        },\n      ],\n    },\n    theme: {\n      spacing: [\n        \"element-xs\",\n        \"element-md\",\n        \"element-sm\",\n        \"element-lg\",\n        \"element-xl\",\n        \"element-2xl\",\n      ],\n    },\n  },\n} as Parameters<typeof extendTailwindMerge>[0]);\n\nexport function cn(...inputs: ClassValue[]) {\n  return customTwMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as SliderPrimitive from \"@radix-ui/react-slider\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\n/**\n * A thin wrapper around Radix Slider styled to match the rest of the kit.\n * Supports horizontal or vertical orientation.\n */\nconst Slider = React.forwardRef<\n  React.ElementRef<typeof SliderPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, orientation = \"horizontal\", ...props }, ref) => {\n  const values: number[] = Array.isArray(props.value)\n    ? props.value\n    : Array.isArray(props.defaultValue)\n      ? props.defaultValue\n      : [0];\n\n  return (\n    <SliderPrimitive.Root\n      ref={ref}\n      data-slot=\"slider\"\n      orientation={orientation}\n      className={cn(\n        \"relative flex touch-none select-none items-center\",\n        orientation === \"horizontal\"\n          ? \"w-full h-5\"\n          : \"h-32 w-5 flex-col justify-center\",\n        \"data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed\",\n        className,\n      )}\n      {...props}\n    >\n      <SliderPrimitive.Track\n        data-slot=\"slider-track\"\n        className={cn(\n          \"relative grow overflow-hidden rounded-full bg-primary/20\",\n          orientation === \"horizontal\" ? \"h-1.5 w-full\" : \"w-1.5 h-full\",\n        )}\n      >\n        <SliderPrimitive.Range\n          data-slot=\"slider-range\"\n          className={cn(\n            \"absolute bg-primary\",\n            orientation === \"horizontal\" ? \"h-full\" : \"w-full\",\n          )}\n        />\n      </SliderPrimitive.Track>\n      {values.map((_, i) => (\n        <SliderPrimitive.Thumb\n          key={i}\n          data-slot=\"slider-thumb\"\n          className=\"block size-4 rounded-full border border-primary/50 bg-background shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 disabled:pointer-events-none disabled:opacity-50\"\n        />\n      ))}\n    </SliderPrimitive.Root>\n  );\n});\nSlider.displayName = SliderPrimitive.Root.displayName;\n\nexport { Slider };\n","import { useBotAudioStore } from \"@/stores/botAudioStore\";\n\n/**\n * Return shape of {@link useBotAudioOutput}.\n */\nexport interface UseBotAudioOutputReturn {\n  /** Current bot audio output volume, 0.0 – 1.0. */\n  volume: number;\n  /** Set the bot audio output volume. Values are clamped to [0, 1]. */\n  setVolume: (volume: number) => void;\n}\n\n/**\n * Access and update the bot's audio output state.\n *\n * Pairs with the `BotAudioOutput` component (rendered by `PipecatAppBase`)\n * and the `BotAudioControl` component. Returns the current volume and a\n * setter; any consumer can read or drive the volume without prop drilling.\n *\n * ```tsx\n * const { volume, setVolume } = useBotAudioOutput();\n * ```\n */\nexport const useBotAudioOutput = (): UseBotAudioOutputReturn => {\n  const volume = useBotAudioStore((s) => s.volume);\n  const setVolume = useBotAudioStore((s) => s.setVolume);\n  return { volume, setVolume };\n};\n","\"use client\";\n\nimport { Slider } from \"@/components/ui/slider\";\nimport { useBotAudioOutput } from \"@/hooks/useBotAudioOutput\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Base props shared by the connected and headless variants.\n */\ninterface Props {\n  /** Hide the label + percent readout row. Default: false */\n  noLabel?: boolean;\n  /** Hide just the percent readout (keeps the label). Default: false */\n  noPercent?: boolean;\n  /** Override the label text. Default: `\"Bot volume\"` */\n  label?: string;\n  /** Slider orientation. Default: `\"horizontal\"` */\n  orientation?: \"horizontal\" | \"vertical\";\n  /** Classes for the outer wrapper */\n  className?: string;\n  /** Classes for individual parts */\n  classNames?: {\n    /** Classes for the label row */\n    labelRow?: string;\n    /** Classes for the label text */\n    label?: string;\n    /** Classes for the percent readout */\n    percent?: string;\n    /** Classes for the slider itself */\n    slider?: string;\n  };\n  /** Props forwarded to the underlying Slider primitive */\n  sliderProps?: Partial<React.ComponentProps<typeof Slider>>;\n}\n\n/**\n * Props for the headless {@link BotVolumeSliderComponent}.\n */\ninterface ComponentProps extends Props {\n  /** Current volume, 0.0 – 1.0 */\n  volume?: number;\n  /** Callback fired when the volume changes. Receives 0.0 – 1.0 */\n  onVolumeChange?: (volume: number) => void;\n}\n\n/**\n * Headless bot volume slider. Accepts `volume` + `onVolumeChange` directly,\n * so you can drive it from any state source (tests, custom stores, etc.).\n */\nexport const BotVolumeSliderComponent: React.FC<ComponentProps> = ({\n  volume = 1,\n  onVolumeChange,\n  noLabel = false,\n  noPercent = false,\n  label = \"Bot volume\",\n  orientation = \"horizontal\",\n  className,\n  classNames = {},\n  sliderProps,\n}) => {\n  const pct = Math.round(volume * 100);\n  // Guard the accessible name: an empty or whitespace-only `label` would\n  // leave the slider unannounced for assistive tech.\n  const accessibleLabel = label.trim() || \"Bot volume\";\n\n  return (\n    <div className={cn(\"flex flex-col gap-3\", className)}>\n      {!noLabel && (\n        <div\n          className={cn(\n            \"flex items-center justify-between text-sm\",\n            classNames.labelRow,\n          )}\n        >\n          <span className={cn(\"text-muted-foreground\", classNames.label)}>\n            {label}\n          </span>\n          {!noPercent && (\n            <span\n              className={cn(\"font-medium tabular-nums\", classNames.percent)}\n            >\n              {pct}%\n            </span>\n          )}\n        </div>\n      )}\n      <Slider\n        min={0}\n        max={1}\n        step={0.01}\n        value={[volume]}\n        onValueChange={(v: number[]) => onVolumeChange?.(v[0] ?? 0)}\n        orientation={orientation}\n        aria-label={accessibleLabel}\n        {...sliderProps}\n        className={cn(classNames.slider, sliderProps?.className)}\n      />\n    </div>\n  );\n};\n\nBotVolumeSliderComponent.displayName = \"BotVolumeSliderComponent\";\n\n/**\n * Connected bot volume slider wired to the kit's bot audio store\n * ({@link useBotAudioOutput}). Drop it anywhere inside `PipecatAppBase` for\n * an inline volume control; `BotAudioControl` composes it inside a popover.\n *\n * @example\n * ```tsx\n * <BotVolumeSlider />\n * <BotVolumeSlider noLabel />\n * <BotVolumeSlider orientation=\"vertical\" className=\"h-40\" />\n * ```\n */\nexport const BotVolumeSlider: React.FC<Props> = (props) => {\n  const { volume, setVolume } = useBotAudioOutput();\n  return (\n    <BotVolumeSliderComponent\n      volume={volume}\n      onVolumeChange={setVolume}\n      {...props}\n    />\n  );\n};\n\nBotVolumeSlider.displayName = \"BotVolumeSlider\";\n\nexport default BotVolumeSlider;\n","import { cva } from \"class-variance-authority\";\n\nexport const buttonVariants = cva(\n  \"border inline-flex items-center justify-center whitespace-nowrap text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n  {\n    variants: {\n      variant: {\n        primary:\n          \"bg-primary text-primary-foreground hover:bg-primary/90 border-transparent [--loader-stripe-color:var(--color-primary)]\",\n        secondary:\n          \"bg-secondary border-transparent text-secondary-foreground hover:bg-secondary/60 focus-visible:border-secondary [--loader-stripe-color:var(--color-secondary)]\",\n        outline:\n          \"text-foreground border bg-background hover:bg-accent dark:bg-input/30 dark:border-input dark:hover:bg-input/50 focus-visible:border-ring [--loader-stripe-color:var(--color-accent-foreground)]\",\n        destructive:\n          \"bg-destructive border-transparent text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 [--loader-stripe-color:var(--color-destructive)]\",\n        ghost:\n          \"text-foreground border border-transparent hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 [--loader-stripe-color:var(--color-accent-foreground)]\",\n        link: \"text-primary underline-offset-4 hover:underline border border-transparent [--loader-stripe-color:var(--color-primary)]\",\n        active:\n          \"bg-active border border-transparent text-active-foreground hover:bg-active/90 focus-visible:ring-active/20 dark:focus-visible:ring-active/40\",\n        inactive:\n          \"bg-inactive border border-transparent text-inactive-foreground hover:bg-inactive/90 focus-visible:ring-inactive/20 dark:focus-visible:ring-inactive/40\",\n      },\n      size: {\n        sm: \"button-sm [&_svg:not([class*='size-'])]:size-4\",\n        md: \"button-md [&_svg:not([class*='size-'])]:size-5\",\n        lg: \"button-lg [&_svg:not([class*='size-'])]:size-5\",\n        xl: \"button-xl [&_svg:not([class*='size-'])]:size-6 text-lg\",\n      },\n      rounded: {\n        size: \"\",\n        none: \"rounded-none\",\n        sm: \"rounded-sm\",\n        md: \"rounded-md\",\n        lg: \"rounded-lg\",\n        xl: \"rounded-xl\",\n        full: \"rounded-full\",\n      },\n      state: {\n        default: \"\",\n        active: \"\",\n        inactive: \"\",\n      },\n      isIcon: {\n        true: \"\",\n        false: \"\",\n      },\n      isFullWidth: {\n        true: \"w-full\",\n        false: \"\",\n      },\n      loader: {\n        icon: \"\",\n        stripes:\n          \"loader-stripes disabled:opacity-100 dark:disabled:opacity-100 text-white/0\",\n      },\n      uppercase: {\n        true: \"uppercase tracking-wider\",\n        false: \"\",\n      },\n      noContainerQueries: {\n        true: \"\",\n        false: \"\",\n      },\n    },\n    compoundVariants: [\n      /* Uppercase variants */\n      {\n        uppercase: true,\n        size: \"md\",\n        className: \"text-[11px] [&_svg:not([class*='size-'])]:size-4\",\n      },\n      {\n        uppercase: true,\n        size: \"sm\",\n        className: \"text-[10px]\",\n      },\n      {\n        uppercase: true,\n        size: \"lg\",\n        className: \"text-xs [&_svg:not([class*='size-'])]:size-5\",\n      },\n      {\n        uppercase: true,\n        size: \"xl\",\n        className: \"text-sm [&_svg:not([class*='size-'])]:size-5\",\n      },\n      /* Container queries */\n      {\n        size: [\"sm\", \"md\", \"lg\", \"xl\"],\n        isIcon: false,\n        noContainerQueries: false,\n        className:\n          \"@max-xs/panel:button-sm @max-xs/panel:has-[>svg]:button-sm @max-xs/panel:[&_svg:not([class*='size-'])]:size-4\",\n      },\n      {\n        size: [\"sm\", \"md\", \"lg\", \"xl\"],\n        isIcon: true,\n        noContainerQueries: false,\n        className:\n          \"@max-xs/panel:button-icon-sm @max-xs/panel:[&_svg:not([class*='size-'])]:size-4\",\n      },\n      {\n        rounded: \"size\",\n        noContainerQueries: false,\n        className: \"@max-xs/panel:rounded-sm \",\n      },\n      /* Icon variants */\n      {\n        size: \"sm\",\n        isIcon: true,\n        className: \"button-icon-sm [&_svg:not([class*='size-'])]:size-4\",\n      },\n      {\n        size: \"md\",\n        isIcon: true,\n        className: \"button-icon-md [&_svg:not([class*='size-'])]:size-5\",\n      },\n      {\n        size: \"lg\",\n        isIcon: true,\n        className: \"button-icon-lg [&_svg:not([class*='size-'])]:size-5\",\n      },\n      {\n        size: \"xl\",\n        isIcon: true,\n        className: \"button-icon-xl [&_svg:not([class*='size-'])]:size-6\",\n      },\n      /* State variants */\n      {\n        variant: \"primary\",\n        state: \"active\",\n        className:\n          \"bg-active text-active-foreground hover:bg-active/90 focus-visible:ring-active/20 dark:focus-visible:ring-active/40\",\n      },\n      {\n        variant: \"primary\",\n        state: \"inactive\",\n        className:\n          \"bg-inactive text-inactive-foreground hover:bg-inactive/90 focus-visible:ring-inactive/20 dark:focus-visible:ring-inactive/40\",\n      },\n      {\n        variant: \"secondary\",\n        state: \"active\",\n        className:\n          \"bg-active text-active-foreground hover:bg-active/90 focus-visible:ring-active/20 dark:focus-visible:ring-active/40 focus-visible:border-active\",\n      },\n      {\n        variant: \"secondary\",\n        state: \"inactive\",\n        className:\n          \"bg-inactive text-inactive-foreground hover:bg-inactive/90 focus-visible:ring-inactive/20 dark:focus-visible:ring-inactive/40 focus-visible:border-inactive\",\n      },\n      {\n        variant: \"outline\",\n        state: \"active\",\n        className:\n          \"bg-active-accent text-active border-active hover:bg-active-accent/60 dark:bg-active-accent dark:hover:bg-active-accent/60 dark:border-active focus-visible:border-active focus-visible:ring-active/20 dark:focus-visible:ring-active/40\",\n      },\n      {\n        variant: \"outline\",\n        state: \"inactive\",\n        className:\n          \"bg-inactive-accent text-inactive border-inactive hover:bg-inactive-accent/60 dark:bg-inactive-accent dark:hover:bg-inactive-accent/60 dark:border-inactive focus-visible:border-inactive focus-visible:ring-inactive/20 dark:focus-visible:ring-inactive/40\",\n      },\n      /* Rounded size variants */\n      {\n        rounded: \"size\",\n        size: \"md\",\n        className: \"rounded-md\",\n      },\n      {\n        rounded: \"size\",\n        size: \"sm\",\n        className: \"rounded-sm\",\n      },\n      {\n        rounded: \"size\",\n        size: \"lg\",\n        className: \"rounded-lg\",\n      },\n      {\n        rounded: \"size\",\n        size: \"xl\",\n        className: \"rounded-xl\",\n      },\n    ],\n    defaultVariants: {\n      variant: \"primary\",\n      size: \"md\",\n      state: \"default\",\n      rounded: \"size\",\n      isIcon: false,\n      isFullWidth: false,\n      uppercase: false,\n      noContainerQueries: false,\n    },\n  },\n);\n\nexport type ButtonVariant = NonNullable<\n  Parameters<typeof buttonVariants>[0]\n>[\"variant\"];\nexport type ButtonSize = NonNullable<\n  Parameters<typeof buttonVariants>[0]\n>[\"size\"];\nexport type ButtonRounded = NonNullable<\n  Parameters<typeof buttonVariants>[0]\n>[\"rounded\"];\nexport type ButtonState = NonNullable<\n  Parameters<typeof buttonVariants>[0]\n>[\"state\"];\n\nexport const buttonVariantOptions = [\n  \"primary\",\n  \"outline\",\n  \"secondary\",\n  \"ghost\",\n  \"link\",\n  \"destructive\",\n  \"active\",\n  \"inactive\",\n] as const;\nexport const buttonSizeOptions = [\"md\", \"sm\", \"lg\", \"xl\"] as const;\nexport const buttonStateOptions = [\"default\", \"active\", \"inactive\"] as const;\nexport const buttonRoundedOptions = [\n  \"size\",\n  \"sm\",\n  \"md\",\n  \"lg\",\n  \"xl\",\n  \"full\",\n  \"none\",\n] as const;\n\nexport const buttonAccentColorMapCls: Record<\n  (typeof buttonVariantOptions)[number],\n  Record<(typeof buttonStateOptions)[number], string>\n> = {\n  primary: {\n    default: \"text-active\",\n    inactive: \"text-inactive-foreground\",\n    active: \"text-active\",\n  },\n  secondary: {\n    default: \"text-active\",\n    inactive: \"text-inactive-foreground\",\n    active: \"text-active\",\n  },\n  outline: {\n    default: \"text-active\",\n    inactive: \"text-inactive\",\n    active: \"text-active\",\n  },\n  destructive: {\n    default: \"text-background\",\n    inactive: \"text-background\",\n    active: \"text-background\",\n  },\n  ghost: {\n    default: \"text-active\",\n    inactive: \"text-border\",\n    active: \"text-active\",\n  },\n  link: {\n    default: \"text-active\",\n    inactive: \"text-inactive\",\n    active: \"text-active\",\n  },\n  active: {\n    default: \"text-active\",\n    inactive: \"text-inactive-foreground\",\n    active: \"text-active\",\n  },\n  inactive: {\n    default: \"text-inactive\",\n    inactive: \"text-inactive-foreground\",\n    active: \"text-inactive\",\n  },\n};\n\nexport const buttonAccentColorMap: Record<\n  (typeof buttonVariantOptions)[number],\n  Record<(typeof buttonStateOptions)[number], string>\n> = {\n  primary: {\n    default: \"--color-active\",\n    inactive: \"--color-inactive-foreground\",\n    active: \"--color-active\",\n  },\n  secondary: {\n    default: \"--color-active\",\n    inactive: \"--color-inactive-foreground\",\n    active: \"--color-active\",\n  },\n  outline: {\n    default: \"--color-active\",\n    inactive: \"--color-inactive\",\n    active: \"--color-active\",\n  },\n  destructive: {\n    default: \"--color-background\",\n    inactive: \"--color-background\",\n    active: \"--color-background\",\n  },\n  ghost: {\n    default: \"--color-active\",\n    inactive: \"--color-border\",\n    active: \"--color-active\",\n  },\n  link: {\n    default: \"--color-active\",\n    inactive: \"--color-inactive\",\n    active: \"--color-active\",\n  },\n  active: {\n    default: \"--color-active\",\n    inactive: \"--color-inactive-foreground\",\n    active: \"--color-active\",\n  },\n  inactive: {\n    default: \"--color-inactive\",\n    inactive: \"--color-inactive-foreground\",\n    active: \"--color-inactive\",\n  },\n};\n\nexport default buttonVariants;\n","import buttonVariants from \"@/components/ui/buttonVariants\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { type VariantProps } from \"class-variance-authority\";\nimport { LoaderIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n    Omit<\n      VariantProps<typeof buttonVariants>,\n      \"variant\" | \"size\" | \"rounded\" | \"state\"\n    > {\n  asChild?: boolean;\n  isLoading?: boolean;\n  isFullWidth?: boolean;\n  loader?: \"icon\" | \"stripes\";\n  variant?: VariantProps<typeof buttonVariants>[\"variant\"];\n  size?: VariantProps<typeof buttonVariants>[\"size\"];\n  rounded?: VariantProps<typeof buttonVariants>[\"rounded\"];\n  state?: VariantProps<typeof buttonVariants>[\"state\"];\n  noContainerQueries?: boolean;\n}\n\nexport function Button({\n  className,\n  variant,\n  size,\n  rounded,\n  state,\n  isIcon,\n  isLoading = false,\n  isFullWidth = false,\n  uppercase = false,\n  noContainerQueries = false,\n  asChild = false,\n  loader = \"icon\",\n  children,\n  ...props\n}: ButtonProps) {\n  const Comp = asChild ? Slot : \"button\";\n\n  if (isLoading) {\n    return (\n      <Comp\n        data-slot=\"button\"\n        className={cn(\n          buttonVariants({\n            variant,\n            size,\n            rounded,\n            state,\n            isIcon,\n            isFullWidth,\n            loader,\n            uppercase,\n            noContainerQueries,\n          }),\n          className,\n        )}\n        {...props}\n        disabled\n      >\n        {loader === \"icon\" && <LoaderIcon className=\"animate-spin\" />}\n        {children}\n      </Comp>\n    );\n  }\n\n  return (\n    <Comp\n      data-slot=\"button\"\n      className={cn(\n        buttonVariants({\n          variant,\n          size,\n          rounded,\n          state,\n          isIcon,\n          isFullWidth,\n          uppercase,\n          noContainerQueries,\n        }),\n        className,\n      )}\n      {...props}\n    >\n      {children}\n    </Comp>\n  );\n}\n","export function getPipecatUiNamespace(): string {\n  return \".voice-ui-kit\";\n}\n\nexport function getPipecatUIContainer(): HTMLElement {\n  return document.querySelector(getPipecatUiNamespace()) ?? document.body;\n}\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as React from \"react\";\n\nimport { getPipecatUIContainer } from \"@/lib/dom\";\nimport { cn } from \"@/lib/utils\";\n\nfunction Popover({\n  ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n  return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({\n  ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n  return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverContent({\n  className,\n  align = \"center\",\n  sideOffset = 4,\n  ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n  return (\n    <PopoverPrimitive.Portal container={getPipecatUIContainer()}>\n      <PopoverPrimitive.Content\n        data-slot=\"popover-content\"\n        align={align}\n        sideOffset={sideOffset}\n        className={cn(\n          \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\n          className,\n        )}\n        {...props}\n      />\n    </PopoverPrimitive.Portal>\n  );\n}\n\nfunction PopoverAnchor({\n  ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n  return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\n","\"use client\";\n\nimport { BotVolumeSliderComponent } from \"@/components/elements/BotVolumeSlider\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n  type ButtonSize,\n  type ButtonState,\n  type ButtonVariant,\n} from \"@/components/ui/buttonVariants\";\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport { useBotAudioOutput } from \"@/hooks/useBotAudioOutput\";\nimport { cn } from \"@/lib/utils\";\nimport { usePipecatClientTransportState } from \"@pipecat-ai/client-react\";\nimport {\n  Volume1Icon,\n  Volume2Icon,\n  VolumeIcon,\n  VolumeXIcon,\n} from \"lucide-react\";\n\n/**\n * Base props interface for BotAudioControl components.\n */\ninterface Props {\n  /** Visual style variant for the control button */\n  variant?: ButtonVariant;\n  /** Size of the control button */\n  size?: ButtonSize;\n  /** State of the control button (default, inactive, etc.) */\n  state?: ButtonState;\n  /** Additional props to pass to the control button */\n  buttonProps?: Partial<React.ComponentProps<typeof Button>>;\n  /**\n   * Props forwarded to the Radix `Popover` root (e.g. `open`, `defaultOpen`,\n   * `onOpenChange`, `modal`).\n   */\n  popoverProps?: Partial<React.ComponentProps<typeof Popover>>;\n  /**\n   * Props forwarded to `PopoverContent`. Use this to adjust placement —\n   * `align`, `side`, `sideOffset`, `alignOffset`, `collisionPadding`, etc.\n   * Defaults: `align=\"end\"`.\n   */\n  popoverContentProps?: Partial<React.ComponentProps<typeof PopoverContent>>;\n  /**\n   * Props forwarded to the inner {@link BotVolumeSliderComponent} (e.g.\n   * `noLabel`, `noPercent`, `orientation`, `sliderProps`).\n   */\n  volumeSliderProps?: Partial<\n    Omit<\n      React.ComponentProps<typeof BotVolumeSliderComponent>,\n      \"volume\" | \"onVolumeChange\"\n    >\n  >;\n  /** Custom CSS classes for different parts of the component */\n  classNames?: {\n    /** CSS classes for the trigger button */\n    button?: string;\n    /** CSS classes for the popover content */\n    popoverContent?: string;\n    /** CSS classes for the volume slider */\n    slider?: string;\n  };\n  /** Whether to hide the volume icon in the button */\n  noIcon?: boolean;\n  /** Optional visible label rendered next to the icon */\n  label?: string;\n  /** Custom content to render inside the button (after the icon/label) */\n  children?: React.ReactNode;\n}\n\n/**\n * Props interface for the headless BotAudioComponent.\n */\ninterface ComponentProps extends Props {\n  /** Current volume, 0.0 – 1.0 */\n  volume?: number;\n  /** Callback invoked when the volume changes (value is in 0.0 – 1.0) */\n  onVolumeChange?: (volume: number) => void;\n}\n\n/**\n * Pick an icon that reflects the current volume level.\n * Purely cosmetic — this does not represent a mute state.\n */\nconst iconForVolume = (\n  volume: number,\n): typeof VolumeIcon | typeof Volume1Icon | typeof Volume2Icon => {\n  if (volume <= 0) return VolumeXIcon;\n  if (volume < 0.34) return VolumeIcon;\n  if (volume < 0.67) return Volume1Icon;\n  return Volume2Icon;\n};\n\n/**\n * Headless `BotAudioComponent` that accepts volume state and a change callback.\n *\n * Useful when you need full control over state (tests, custom stores, etc.)\n * and don't want the connected `BotAudioControl` to read/write the kit's\n * bot audio store.\n */\nexport const BotAudioComponent: React.FC<ComponentProps> = ({\n  variant = \"secondary\",\n  size = \"md\",\n  state,\n  buttonProps = {},\n  popoverProps,\n  popoverContentProps,\n  volumeSliderProps,\n  classNames = {},\n  noIcon = false,\n  label,\n  children,\n  volume = 1,\n  onVolumeChange,\n}) => {\n  const Icon = iconForVolume(volume);\n\n  return (\n    <Popover {...popoverProps}>\n      <PopoverTrigger asChild>\n        <Button\n          variant={variant}\n          size={size}\n          state={state}\n          aria-label={label?.trim() || \"Bot volume\"}\n          {...buttonProps}\n          className={cn(classNames.button, buttonProps?.className)}\n        >\n          {!noIcon && <Icon />}\n          {label ? <span className=\"flex-1\">{label}</span> : null}\n          {children}\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent\n        align=\"end\"\n        {...popoverContentProps}\n        className={cn(\n          \"w-56\",\n          classNames.popoverContent,\n          popoverContentProps?.className,\n        )}\n      >\n        <BotVolumeSliderComponent\n          volume={volume}\n          onVolumeChange={onVolumeChange}\n          {...volumeSliderProps}\n          classNames={{\n            slider: classNames.slider,\n            ...volumeSliderProps?.classNames,\n          }}\n        />\n      </PopoverContent>\n    </Popover>\n  );\n};\n\nBotAudioComponent.displayName = \"BotAudioComponent\";\n\n/**\n * Connected `BotAudioControl` wired to the kit's bot audio store and the\n * Pipecat client transport state.\n *\n * Must be used within a `PipecatClientProvider` (typically via\n * `PipecatAppBase`). The control becomes disabled while the transport is\n * disconnected or initializing.\n *\n * @example\n * ```tsx\n * <BotAudioControl size=\"sm\" />\n * ```\n */\nexport const BotAudioControl: React.FC<Props> = ({ buttonProps, ...props }) => {\n  const { volume, setVolume } = useBotAudioOutput();\n  const transportState = usePipecatClientTransportState();\n  const loading =\n    transportState === \"disconnected\" || transportState === \"initializing\";\n\n  return (\n    <BotAudioComponent\n      volume={volume}\n      onVolumeChange={setVolume}\n      buttonProps={{\n        isLoading: loading,\n        ...buttonProps,\n      }}\n      {...props}\n    />\n  );\n};\n\nBotAudioControl.displayName = \"BotAudioControl\";\n\nexport default BotAudioControl;\n","import { cn } from \"@/lib/utils\";\nimport React, { type ReactNode } from \"react\";\n\ninterface DataListProps {\n  data: Record<string, string | ReactNode>;\n  classNames?: {\n    container?: string;\n    key?: string;\n    value?: string;\n  };\n}\n\nexport const DataList: React.FC<DataListProps> = ({\n  data,\n  classNames = {},\n}) => {\n  return (\n    <dl\n      className={cn(\n        \"text-sm grid grid-cols-[1fr_2fr] gap-2 items-center\",\n        classNames.container,\n      )}\n    >\n      {Object.entries(data).map(([key, value]) => (\n        <React.Fragment key={key}>\n          <dt className={cn(\"text-muted-foreground\", classNames.key)}>{key}</dt>\n          <dd\n            className={cn(\n              \"text-right font-mono text-xs min-w-0 truncate\",\n              classNames.value,\n            )}\n          >\n            {value}\n          </dd>\n        </React.Fragment>\n      ))}\n    </dl>\n  );\n};\n\nexport default DataList;\n","import DataList from \"@/components/elements/DataList\";\nimport { TextDashBlankslate } from \"@/index\";\nimport { cn } from \"@/lib/utils\";\nimport { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport {\n  usePipecatClientTransportState,\n  useRTVIClientEvent,\n} from \"@pipecat-ai/client-react\";\nimport { Loader2Icon } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\n\ninterface Props {\n  classNames?: React.ComponentProps<typeof DataList>[\"classNames\"] & {\n    agentValue?: string;\n    clientValue?: string;\n  };\n  noAgentState?: boolean;\n  noClientState?: boolean;\n}\n\nexport const ClientStatusComponent = ({\n  className,\n  transportState,\n}: {\n  className?: string;\n  transportState?: string | null;\n}) => {\n  return (\n    <span\n      className={cn(\n        \"mono-upper text-muted-foreground font-medium flex items-center gap-1.5 leading-none justify-end\",\n        {\n          \"text-active\":\n            transportState === \"connected\" || transportState === \"ready\",\n          \"text-destructive\": transportState === \"error\",\n          \"text-subtle/50 dark:text-subtle/80\":\n            transportState === \"disconnected\",\n          \"text-subtle\": !transportState,\n          \"animate-pulse\": [\n            \"initializing\",\n            \"authenticating\",\n            \"authenticated\",\n            \"connecting\",\n          ].includes(transportState || \"\"),\n        },\n        className,\n      )}\n    >\n      {transportState || <TextDashBlankslate />}\n      {transportState &&\n        [\"authenticating\", \"authenticated\", \"connecting\"].includes(\n          transportState,\n        ) && <Loader2Icon size={12} className=\"animate-spin\" />}\n    </span>\n  );\n};\n\nexport const ClientStatus: React.FC<Props> = ({\n  classNames = {},\n  noAgentState = false,\n  noClientState = false,\n}) => {\n  const transportState = usePipecatClientTransportState();\n\n  const [botStatus, setBotStatus] = useState<\n    \"disconnected\" | \"connecting\" | \"connected\" | \"ready\" | null\n  >(null);\n\n  useEffect(() => {\n    if (transportState === \"connecting\") {\n      setBotStatus(\"connecting\");\n    }\n  }, [transportState]);\n\n  useRTVIClientEvent(RTVIEvent.BotReady, () => {\n    if (noAgentState) return;\n    setBotStatus(\"ready\");\n  });\n  useRTVIClientEvent(RTVIEvent.BotConnected, () => {\n    if (noAgentState) return;\n    setBotStatus(\"connected\");\n  });\n  useRTVIClientEvent(RTVIEvent.Disconnected, () => {\n    if (noAgentState) return;\n    setBotStatus(\"disconnected\");\n  });\n  useRTVIClientEvent(RTVIEvent.BotDisconnected, () => {\n    if (noAgentState) return;\n    setBotStatus(\"disconnected\");\n  });\n\n  if (noAgentState && noClientState) return null;\n\n  const data: React.ComponentProps<typeof DataList>[\"data\"] = {};\n  if (!noClientState) {\n    data[\"Client\"] = <ClientStatusComponent transportState={transportState} />;\n  }\n\n  if (!noAgentState) {\n    data[\"Agent\"] = <ClientStatusComponent transportState={botStatus} />;\n  }\n\n  return <DataList classNames={classNames} data={data} />;\n};\n\nexport default ClientStatus;\n","import { Button } from \"@/components/ui/button\";\nimport type { ButtonSize, ButtonVariant } from \"@/components/ui/buttonVariants\";\nimport { cn } from \"@/lib/utils\";\nimport { type TransportState } from \"@pipecat-ai/client-js\";\nimport { usePipecatClientTransportState } from \"@pipecat-ai/client-react\";\nimport React, { memo } from \"react\";\n\n/**\n * Configuration for customizing button appearance and content for specific transport states.\n * Allows partial configuration - only specify the states you want to customize.\n */\nexport type ConnectButtonStateContent = Partial<\n  Record<\n    TransportState,\n    {\n      /** The text or content to display in the button */\n      children: React.ReactNode;\n      /** The button variant to use for this state */\n      variant: ButtonVariant;\n      /** Optional CSS class to apply to the button */\n      className?: string;\n    }\n  >\n>;\n\n/**\n * Props for the ConnectButton component.\n */\nexport type ConnectButtonProps = {\n  /** CSS class name to apply to the button */\n  className?: string;\n  /** Callback function called when the connect action is triggered */\n  onConnect?: () => void;\n  /** Generic click handler for the button */\n  onClick?: () => void;\n  /** Callback function called when the disconnect action is triggered */\n  onDisconnect?: () => void;\n  /** Size of the button component */\n  size?: ButtonSize;\n  /** Default variant of the button component */\n  defaultVariant?: ButtonVariant;\n  /** Custom state content configuration for different transport states */\n  stateContent?: ConnectButtonStateContent;\n};\n\n/**\n * Internal component that renders a connect/disconnect button based on transport state.\n * Handles button appearance, content, and interactions based on the current transport state.\n *\n * @param props - Component props including transport state and configuration\n * @returns A button component that adapts to the current transport state\n */\nexport const ConnectButtonComponent: React.FC<\n  ConnectButtonProps & {\n    transportState: TransportState;\n  }\n> = ({\n  className: passedClassName,\n  onClick,\n  onConnect,\n  onDisconnect,\n  stateContent,\n  size = \"md\",\n  transportState,\n}) => {\n  /**\n   * Determines button properties based on current transport state and custom state content.\n   * Prioritizes custom state content over default behavior.\n   *\n   * @returns Button props including children, variant, and className\n   */\n  const getButtonProps = (): React.ComponentProps<typeof Button> => {\n    // Check if we have custom content for this state\n    if (stateContent && stateContent[transportState]) {\n      return stateContent[transportState]!;\n    }\n\n    // Default content based on transport state\n    switch (transportState) {\n      case \"disconnected\":\n      case \"initialized\":\n        return {\n          children: \"Connect\",\n          variant: \"active\",\n        };\n      case \"initializing\":\n        return {\n          children: \"Initializing...\",\n          variant: \"secondary\",\n        };\n      case \"ready\":\n        return {\n          children: \"Disconnect\",\n          variant: \"destructive\",\n        };\n      case \"disconnecting\":\n        return { children: \"Disconnecting...\", variant: \"secondary\" };\n      case \"error\":\n        return { children: \"Error\", variant: \"destructive\" };\n      default:\n        return { children: \"Connecting...\", variant: \"secondary\" };\n    }\n  };\n\n  const { children, className, variant } = getButtonProps();\n\n  /**\n   * Handles button click events.\n   * Calls the generic onClick handler, then either onConnect or onDisconnect based on current state.\n   */\n  const handleClick = () => {\n    onClick?.();\n    if ([\"ready\", \"connected\"].includes(transportState)) {\n      onDisconnect?.();\n    } else {\n      onConnect?.();\n    }\n  };\n\n  return (\n    <Button\n      onClick={handleClick}\n      variant={variant}\n      size={size}\n      disabled={\n        ![\"disconnected\", \"ready\", \"initialized\"].includes(transportState)\n      }\n      isLoading={\n        ![\"disconnected\", \"ready\", \"error\", \"initialized\"].includes(\n          transportState,\n        )\n      }\n      className={cn(className, passedClassName)}\n    >\n      {children}\n    </Button>\n  );\n};\n\n/**\n * ConnectButton component that automatically adapts to the current transport state.\n *\n * This component:\n * - Automatically gets the current transport state from the Pipecat client\n * - Renders a button that changes appearance and behavior based on the state\n * - Handles connect/disconnect actions automatically\n * - Supports custom state content configuration\n *\n * @param props - Component configuration including callbacks and styling options\n * @returns A button component that adapts to transport state changes\n */\nexport const ConnectButton = memo((props: ConnectButtonProps) => {\n  const transportState = usePipecatClientTransportState();\n\n  return <ConnectButtonComponent transportState={transportState} {...props} />;\n});\n\nConnectButton.displayName = \"ConnectButton\";\n\nexport default ConnectButton;\n","import { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst badgeVariants = cva(\n  \"shrink-0 [&_svg]:shrink-0 self-start items-center border text-xs font-semibold justify-center\",\n  {\n    variants: {\n      color: {\n        primary: \"bg-primary/10 text-primary border-primary\",\n        secondary: \"bg-secondary text-secondary-foreground/80 border-border\",\n        destructive: \"bg-destructive/10 text-destructive border-destructive\",\n        active: \"bg-active/10 text-active border-active\",\n        inactive: \"bg-inactive/10 text-inactive border-inactive\",\n        warning: \"bg-warning/10 text-warning border-warning\",\n        agent: \"bg-agent/10 text-agent border-agent\",\n        client: \"bg-client/10 text-client border-client\",\n      },\n      variant: {\n        default: \"\",\n        outline: \"bg-transparent\",\n        filled: \"\",\n        elbow: \"elbow border-transparent\",\n        bracket: \"elbow border-transparent\",\n      },\n      size: {\n        sm: \"text-xs px-2 gap-1 py-0.5 [&_svg:not([class*='size-'])]:size-2.5\",\n        md: \"text-xs px-3 gap-1.5 py-1 [&_svg:not([class*='size-'])]:size-3.5\",\n        lg: \"text-sm px-4 gap-2.5 py-2 [&_svg:not([class*='size-'])]:size-4\",\n      },\n      uppercase: {\n        false: \"\",\n        true: \"uppercase tracking-wider\",\n      },\n      buttonSizing: {\n        true: \"flex\",\n        false: \"inline-flex\",\n      },\n      rounded: {\n        size: \"\",\n        none: \"rounded-none\",\n        sm: \"rounded-sm\",\n        md: \"rounded-md\",\n        lg: \"rounded-lg\",\n        full: \"rounded-full\",\n      },\n    },\n    compoundVariants: [\n      // Text size adjustments for uppercase variants\n      {\n        uppercase: true,\n        size: \"md\",\n        className: \"text-[11px]\",\n      },\n      {\n        uppercase: true,\n        size: \"sm\",\n        className: \"text-[10px]\",\n      },\n      {\n        uppercase: true,\n        size: \"lg\",\n        className: \"text-xs\",\n      },\n      // Filled variant styles\n      {\n        variant: \"filled\",\n        color: \"primary\",\n        className: \"bg-primary/100 text-primary-foreground border-primary\",\n      },\n      {\n        variant: \"filled\",\n        color: \"secondary\",\n        className:\n          \"bg-secondary/100 text-secondary-foreground border-secondary\",\n      },\n      {\n        variant: \"filled\",\n        color: \"destructive\",\n        className:\n          \"bg-destructive/100 text-destructive-foreground border-destructive\",\n      },\n      {\n        variant: \"filled\",\n        color: \"warning\",\n        className: \"bg-warning/100 text-warning-foreground border-warning\",\n      },\n      {\n        variant: \"filled\",\n        color: \"active\",\n        className: \"bg-active/100 text-active-foreground border-active\",\n      },\n      {\n        variant: \"filled\",\n        color: \"inactive\",\n        className: \"bg-inactive/100 text-inactive-foreground border-inactive\",\n      },\n      {\n        variant: \"filled\",\n        color: \"agent\",\n        className: \"bg-agent/100 text-agent-foreground border-agent\",\n      },\n      {\n        variant: \"filled\",\n        color: \"client\",\n        className: \"bg-client/100 text-client-foreground border-client\",\n      },\n      // Elbow/Bracket size variants\n      {\n        variant: \"elbow\",\n        size: \"md\",\n        className: \"[--elbow-size:6px]\",\n      },\n      {\n        variant: \"elbow\",\n        size: \"sm\",\n        className: \"[--elbow-size:4px]\",\n      },\n      {\n        variant: \"elbow\",\n        size: \"lg\",\n        className: \"[--elbow-size:8px]\",\n      },\n      {\n        variant: \"bracket\",\n        size: \"sm\",\n        className: \"[--elbow-size:12px]\",\n      },\n      {\n        variant: \"bracket\",\n        size: \"lg\",\n        className: \"[--elbow-size:20px]\",\n      },\n      // Elbow/Bracket color variants\n      {\n        variant: [\"elbow\", \"bracket\"],\n        color: \"primary\",\n        className: \"[--color-elbow:var(--color-primary)]\",\n      },\n      {\n        variant: [\"elbow\", \"bracket\"],\n        color: \"secondary\",\n        className: \"[--color-elbow:var(--color-secondary-foreground)]\",\n      },\n      {\n        variant: [\"elbow\", \"bracket\"],\n        color: \"destructive\",\n        className: \"[--color-elbow:var(--color-destructive)]\",\n      },\n      {\n        variant: [\"elbow\", \"bracket\"],\n        color: \"active\",\n        className: \"[--color-elbow:var(--color-active)]\",\n      },\n      {\n        variant: [\"elbow\", \"bracket\"],\n        color: \"inactive\",\n        className: \"[--color-elbow:var(--color-inactive)]\",\n      },\n      {\n        variant: [\"elbow\", \"bracket\"],\n        color: \"warning\",\n        className: \"[--color-elbow:var(--color-warning)]\",\n      },\n      {\n        variant: [\"elbow\", \"bracket\"],\n        color: \"agent\",\n        className: \"[--color-elbow:var(--color-agent)]\",\n      },\n      {\n        variant: [\"elbow\", \"bracket\"],\n        color: \"client\",\n        className: \"[--color-elbow:var(--color-client)]\",\n      },\n      {\n        variant: [\"elbow\", \"bracket\"],\n        className: \"rounded-none\",\n      },\n      // Button sizing variants\n      {\n        buttonSizing: true,\n        size: \"md\",\n        className: \"button-md [&_svg:not([class*='size-'])]:size-5\",\n      },\n      {\n        buttonSizing: true,\n        size: \"sm\",\n        className: \"button-sm [&_svg:not([class*='size-'])]:size-4\",\n      },\n      {\n        buttonSizing: true,\n        size: \"lg\",\n        className: \"button-lg [&_svg:not([class*='size-'])]:size-5\",\n      },\n      // Rounded size variants\n      {\n        rounded: \"size\",\n        size: \"md\",\n        className: \"rounded-md\",\n      },\n      {\n        rounded: \"size\",\n        size: \"sm\",\n        className: \"rounded-sm\",\n      },\n      {\n        rounded: \"size\",\n        size: \"lg\",\n        className: \"rounded-lg\",\n      },\n    ],\n    defaultVariants: {\n      variant: \"default\",\n      size: \"md\",\n      rounded: \"size\",\n      color: \"primary\",\n    },\n  },\n);\n\nexport interface BadgeProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"color\">,\n    Omit<VariantProps<typeof badgeVariants>, \"color\" | \"uppercase\"> {\n  buttonSizing?: boolean;\n  asChild?: boolean;\n  color?: VariantProps<typeof badgeVariants>[\"color\"];\n  uppercase?: VariantProps<typeof badgeVariants>[\"uppercase\"];\n}\n\nexport function Badge({\n  buttonSizing = false,\n  children,\n  className,\n  color,\n  uppercase = false,\n  rounded,\n  size,\n  variant,\n  asChild = false,\n  ...props\n}: BadgeProps) {\n  const Comp = asChild ? \"span\" : \"div\";\n\n  return (\n    <Comp\n      className={cn(\n        badgeVariants({\n          variant,\n          size,\n          uppercase,\n          color,\n          buttonSizing,\n          rounded,\n        }),\n        className,\n      )}\n      {...props}\n    >\n      {children}\n    </Comp>\n  );\n}\n","\"use client\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { type LucideIcon, XIcon } from \"lucide-react\";\nimport {\n  type ComponentProps,\n  createContext,\n  type HTMLAttributes,\n  type MouseEventHandler,\n  useContext,\n} from \"react\";\ntype BannerContextProps = {\n  show: boolean;\n  setShow: (show: boolean) => void;\n};\nconst BannerContext = createContext<BannerContextProps>({\n  show: true,\n  setShow: () => {},\n});\nexport type BannerProps = HTMLAttributes<HTMLDivElement> & {\n  visible?: boolean;\n  defaultVisible?: boolean;\n  onClose?: () => void;\n  inset?: boolean;\n  variant?: \"primary\" | \"destructive\";\n};\nexport const Banner = ({\n  children,\n  visible,\n  defaultVisible = true,\n  variant = \"primary\",\n  onClose,\n  className,\n  inset = false,\n  ...props\n}: BannerProps) => {\n  const [show, setShow] = useControllableState({\n    defaultProp: defaultVisible,\n    prop: visible,\n    onChange: onClose,\n  });\n  if (!show) {\n    return null;\n  }\n  return (\n    <BannerContext.Provider value={{ show, setShow }}>\n      <div\n        className={cn(\n          \"flex w-full font-semibold items-center justify-between gap-2 bg-primary px-2 py-1 text-primary-foreground\",\n          inset && \"rounded-lg\",\n          variant === \"destructive\" && \"bg-destructive text-white\",\n          className,\n        )}\n        {...props}\n      >\n        {children}\n      </div>\n    </BannerContext.Provider>\n  );\n};\nexport type BannerIconProps = HTMLAttributes<HTMLDivElement> & {\n  icon: LucideIcon;\n};\nexport const BannerIcon = ({\n  icon: Icon,\n  className,\n  ...props\n}: BannerIconProps) => (\n  <div\n    className={cn(\n      \"rounded-full bg-foreground/10 dark:bg-foreground/30 p-1\",\n      className,\n    )}\n    {...props}\n  >\n    <Icon size={16} />\n  </div>\n);\nexport type BannerTitleProps = HTMLAttributes<HTMLParagraphElement>;\nexport const BannerTitle = ({ className, ...props }: BannerTitleProps) => (\n  <p className={cn(\"flex-1 text-sm\", className)} {...props} />\n);\nexport type BannerActionProps = ComponentProps<typeof Button>;\nexport const BannerAction = ({\n  variant = \"ghost\",\n  size = \"sm\",\n  className,\n  ...props\n}: BannerActionProps) => (\n  <Button\n    className={cn(\n      \"shrink-0 bg-transparent hover:bg-background/10 hover:text-background\",\n      className,\n    )}\n    size={size}\n    variant={variant}\n    {...props}\n  />\n);\nexport type BannerCloseProps = ComponentProps<typeof Button>;\nexport const BannerClose = ({\n  variant = \"ghost\",\n  size = \"sm\",\n  onClick,\n  className,\n  ...props\n}: BannerCloseProps) => {\n  const { setShow } = useContext(BannerContext);\n  const handleClick: MouseEventHandler<HTMLButtonElement> = (e) => {\n    setShow(false);\n    onClick?.(e);\n  };\n  return (\n    <Button\n      className={cn(\n        \"shrink-0 bg-transparent hover:bg-background/10 hover:text-background\",\n        className,\n      )}\n      isIcon\n      onClick={handleClick}\n      size={size}\n      variant={variant}\n      {...props}\n    >\n      <XIcon size={18} />\n    </Button>\n  );\n};\n","import { cn } from \"@/lib/utils\";\n\nexport const TextDashBlankslate = ({ className }: { className?: string }) => {\n  return (\n    <span className={cn(\"mono-upper text-subtle/60\", className)}>---</span>\n  );\n};\n","import { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst buttonGroupVariants = cva(\"flex items-center\", {\n  variants: {\n    orientation: {\n      horizontal:\n        \"flex-row *:not-first:not-last:rounded-none *:first:not-only:rounded-e-none *:last:not-only:rounded-s-none *:not-first:not-last:border-x-0\",\n      vertical:\n        \"flex-col *:not-first:not-last:rounded-none *:first:not-only:rounded-b-none *:last:not-only:rounded-t-none *:not-first:not-last:border-y-0 *:self-stretch\",\n    },\n  },\n  defaultVariants: {\n    orientation: \"horizontal\",\n  },\n});\n\nexport const ButtonGroup = ({\n  className,\n  orientation = \"horizontal\",\n  children,\n  ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) => {\n  return (\n    <div\n      className={cn(\"flex\", buttonGroupVariants({ orientation }), className)}\n      {...props}\n    >\n      {children}\n    </div>\n  );\n};\n\nexport default ButtonGroup;\n","import { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst cardVariants = cva(\n  \"text-card-foreground flex flex-col bg-card border-(length:--border-width-element) border-border\",\n  {\n    variants: {\n      variant: {\n        default: \"\",\n        destructive:\n          \"shadow-destructive/10 dark:shadow-destructive/15 border-destructive text-destructive-foreground bg-destructive/[.05] [--color-elbow:var(--color-destructive-foreground)]\",\n        success:\n          \"shadow-active/10 dark:shadow-active/15 border-active text-active bg-active-accent [--color-elbow:var(--color-active-foreground)]\",\n      },\n      background: {\n        none: \"\",\n        scanlines: \"bg-scanlines\",\n        grid: \"bg-grid\",\n        stripes: \"bg-stripes shrink-0\",\n      },\n      size: {\n        md: \"py-element-md gap-element-md [&_*[data-slot^=card-]:not([data-slot^=card-title])]:px-element-md\",\n        sm: \"py-element-sm gap-element-sm [&_*[data-slot^=card-]:not([data-slot^=card-title])]:px-element-md\",\n        lg: \"py-element-lg gap-element-lg [&_*[data-slot^=card-]:not([data-slot^=card-title])]:px-element-lg\",\n        xl: \"py-element-xl gap-element-xl [&_*[data-slot^=card-]:not([data-slot^=card-title])]:px-element-xl\",\n      },\n      rounded: {\n        none: \"\",\n        sm: \"rounded-sm\",\n        md: \"rounded-md\",\n        lg: \"rounded-lg\",\n        xl: \"rounded-xl\",\n      },\n      shadow: {\n        none: \"\",\n        xshort: \"shadow-xshort\",\n        short: \"shadow-short\",\n        long: \"shadow-long\",\n        xlong: \"shadow-xlong\",\n      },\n      withElbows: {\n        false: \"\",\n        true: \"elbow\",\n      },\n      withGradientBorder: {\n        false: \"\",\n        true: \"\",\n      },\n    },\n    compoundVariants: [\n      {\n        size: \"sm\",\n        withElbows: false,\n        className: \"[--elbow-size:var(--text-xs)]\",\n      },\n      {\n        size: \"lg\",\n        withElbows: false,\n        className: \"[--elbow-size:var(--text-lg)]\",\n      },\n      {\n        size: \"xl\",\n        withElbows: false,\n        className: \"[--elbow-size:var(--text-xl)]\",\n      },\n      {\n        size: \"sm\",\n        background: \"stripes\",\n        className:\n          \"[--stripe-border-size:calc(var(--text-base)/2)] [--stripe-inset:calc(var(--stripe-border-size)/2)]\",\n      },\n      {\n        variant: \"destructive\",\n        background: \"stripes\",\n        className: \"[--stripe-color:var(--color-destructive)]\",\n      },\n      {\n        variant: \"success\",\n        background: \"stripes\",\n        className: \"[--stripe-color:var(--color-active)]\",\n      },\n      {\n        rounded: [\"sm\", \"md\", \"lg\", \"xl\"],\n        withElbows: true,\n        className: \"rounded-none\",\n      },\n      {\n        variant: \"default\",\n        withGradientBorder: true,\n        className:\n          \"border border-transparent bg-origin-border borderclip bg-cardGradientBorder\",\n      },\n    ],\n\n    defaultVariants: {\n      size: \"md\",\n      shadow: \"none\",\n      variant: \"default\",\n      background: \"none\",\n      withElbows: false,\n      withGradientBorder: false,\n    },\n  },\n);\n\nexport type CardProps = React.ComponentProps<\"div\"> &\n  Omit<VariantProps<typeof cardVariants>, \"rounded\"> & {\n    withGradientBorder?: boolean;\n    rounded?: VariantProps<typeof cardVariants>[\"rounded\"];\n  };\n\nexport function Card({\n  variant,\n  className,\n  withGradientBorder = false,\n  withElbows = false,\n  size = \"md\",\n  rounded,\n  shadow = \"none\",\n  background = \"none\",\n  ...props\n}: CardProps) {\n  const roundedValue = rounded ?? size;\n  return (\n    <div\n      data-slot=\"card\"\n      className={cn(\n        cardVariants({\n          variant,\n          size,\n          shadow,\n          background,\n          rounded: roundedValue,\n          withElbows,\n          withGradientBorder,\n        }),\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nexport type CardHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport function CardHeader({ className, ...props }: CardHeaderProps) {\n  return (\n    <div\n      data-slot=\"card-header\"\n      className={cn(\"flex gap-1.5\", className)}\n      {...props}\n    />\n  );\n}\n\nexport type CardTitleProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport function CardTitle({ className, ...props }: CardTitleProps) {\n  return (\n    <div\n      data-slot=\"card-title\"\n      className={cn(\"font-semibold leading-none\", className)}\n      {...props}\n    />\n  );\n}\n\nexport type CardDescriptionProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport function CardDescription({ className, ...props }: CardDescriptionProps) {\n  return (\n    <div\n      data-slot=\"card-description\"\n      className={cn(\"text-muted-foreground text-sm\", className)}\n      {...props}\n    />\n  );\n}\n\nexport type CardActionProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport function CardAction({ className, ...props }: CardActionProps) {\n  return (\n    <div\n      data-slot=\"card-action\"\n      className={cn(\n        \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nexport type CardContentProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport function CardContent({ className, ...props }: CardContentProps) {\n  return (\n    <div data-slot=\"card-content\" className={cn(\"\", className)} {...props} />\n  );\n}\n\nexport type CardFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport function CardFooter({ className, ...props }: CardFooterProps) {\n  return (\n    <div\n      data-slot=\"card-footer\"\n      className={cn(\n        \"flex gap-card px-[calc(var(--card-padding)/2)] py-[calc(var(--card-padding)/2)]\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Collapsible({\n  ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n  return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />;\n}\n\nfunction CollapsibleTrigger({\n  className,\n  ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Trigger>) {\n  return (\n    <CollapsiblePrimitive.Trigger\n      data-slot=\"collapsible-trigger\"\n      className={cn(className)}\n      {...props}\n    />\n  );\n}\n\nfunction CollapsibleContent({\n  className,\n  ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Content>) {\n  return (\n    <CollapsiblePrimitive.Content\n      data-slot=\"collapsible-content\"\n      className={cn(className)}\n      {...props}\n    />\n  );\n}\n\nexport { Collapsible, CollapsibleContent, CollapsibleTrigger };\n","import { cn } from \"@/lib/utils\";\n\nexport function FullScreenContainer({\n  className,\n  horizontal = false,\n  ...props\n}: React.ComponentProps<\"div\"> & { horizontal?: boolean }) {\n  return (\n    <div\n      className={cn(\n        \"w-full h-dvh bg-background flex items-center justify-center flex-col\",\n        horizontal && \"flex-row\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n","import { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { PlusIcon } from \"lucide-react\";\n\nconst dividerVariants = cva(\"relative items-center\", {\n  variants: {\n    orientation: {\n      horizontal: \"h-px w-full\",\n      vertical: \"w-px h-full\",\n    },\n    color: {\n      primary: \"bg-primary\",\n      secondary: \"bg-border\",\n      destructive: \"bg-destructive\",\n      active: \"bg-active\",\n      inactive: \"bg-inactive\",\n      warning: \"bg-warning\",\n    },\n    thickness: {\n      thin: \"h-[1px]\",\n      medium: \"h-[2px]\",\n      thick: \"h-[3px]\",\n    },\n    variant: {\n      solid: \"\",\n      dotted:\n        \"bg-transparent bg-[repeating-linear-gradient(to_right,currentColor,currentColor_2px,transparent_2px,transparent_6px)] bg-[length:6px_100%]\",\n      dashed:\n        \"bg-transparent bg-[repeating-linear-gradient(to_right,currentColor,currentColor_20px,transparent_20px,transparent_40px)] bg-[length:40px_100%]\",\n    },\n    size: {\n      none: \"my-0 mx-0\",\n      sm: \"my-2 mx-2\",\n      md: \"my-4 mx-4\",\n      lg: \"my-8 mx-8\",\n      xl: \"my-10 mx-10\",\n    },\n  },\n  defaultVariants: {\n    orientation: \"horizontal\",\n    thickness: \"thin\",\n    variant: \"solid\",\n    color: \"secondary\",\n    size: \"none\",\n  },\n  compoundVariants: [\n    {\n      orientation: \"vertical\",\n      thickness: \"thin\",\n      className: \"h-full w-[1px]\",\n    },\n    {\n      orientation: \"vertical\",\n      thickness: \"medium\",\n      className: \"h-full w-[2px]\",\n    },\n    {\n      orientation: \"vertical\",\n      thickness: \"thick\",\n      className: \"h-full w-[3px]\",\n    },\n    {\n      orientation: \"vertical\",\n      variant: \"dashed\",\n      className:\n        \"bg-[repeating-linear-gradient(to_bottom,currentColor,currentColor_20px,transparent_20px,transparent_40px)] bg-[length:100%_40px]\",\n    },\n    {\n      orientation: \"vertical\",\n      variant: \"dotted\",\n      className:\n        \"bg-[repeating-linear-gradient(to_bottom,currentColor,currentColor_2px,transparent_2px,transparent_6px)] bg-[length:6px_100%]\",\n    },\n    {\n      variant: [\"dotted\", \"dashed\"],\n      color: \"primary\",\n      className: \"text-primary\",\n    },\n    {\n      variant: [\"dotted\", \"dashed\"],\n      color: \"secondary\",\n      className: \"text-border\",\n    },\n    {\n      variant: [\"dotted\", \"dashed\"],\n      color: \"destructive\",\n      className: \"text-destructive\",\n    },\n    {\n      variant: [\"dotted\", \"dashed\"],\n      color: \"active\",\n      className: \"text-active\",\n    },\n    {\n      variant: [\"dotted\", \"dashed\"],\n      color: \"inactive\",\n      className: \"text-inactive\",\n    },\n    {\n      variant: [\"dotted\", \"dashed\"],\n      color: \"warning\",\n      className: \"text-warning\",\n    },\n    // Size variants\n    {\n      size: [\"sm\", \"md\", \"lg\", \"xl\"],\n      orientation: \"horizontal\",\n      className: \"mx-0\",\n    },\n    {\n      size: [\"sm\", \"md\", \"lg\", \"xl\"],\n      orientation: \"vertical\",\n      className: \"my-0\",\n    },\n  ],\n});\n\nconst dividerChildrenVariants = cva(\"\", {\n  variants: {\n    color: {\n      primary: \"text-foreground\",\n      secondary: \"text-foreground\",\n      destructive: \"text-destructive\",\n      active: \"text-active\",\n      inactive: \"text-inactive\",\n      warning: \"text-warning\",\n    },\n  },\n});\n\nconst dividerDecorationVariants = cva(\"flex\", {\n  variants: {\n    decoration: {\n      plus: \"text-foreground\",\n    },\n    thickness: {\n      thin: \"[&_svg]:size-2.5 gap-1.5\",\n      medium: \"[&_svg]:size-3 gap-2\",\n      thick: \"[&_svg]:size-3.5 gap-2.5\",\n    },\n    orientation: {\n      horizontal: \"flex flex-row items-center justify-center w-full\",\n      vertical: \"flex flex-col items-center justify-center h-full\",\n    },\n    color: {\n      primary: \"text-primary\",\n      secondary: \"text-border\",\n      destructive: \"text-destructive [&_svg]:text-destructive\",\n      active: \"text-active [&_svg]:text-active\",\n      inactive: \"text-inactive [&_svg]:text-inactive\",\n      warning: \"text-warning [&_svg]:text-warning\",\n    },\n  },\n});\n\nexport interface DividerProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"color\">,\n    VariantProps<typeof dividerVariants>,\n    VariantProps<typeof dividerChildrenVariants> {\n  childrenClassName?: string;\n  color?: VariantProps<typeof dividerVariants>[\"color\"];\n  decoration?: \"none\" | \"plus\";\n}\n\nexport function Divider({\n  children,\n  color = \"secondary\",\n  decoration = \"none\",\n  thickness = \"thin\",\n  orientation = \"horizontal\",\n  variant = \"solid\",\n  size = \"none\",\n  className,\n  childrenClassName,\n  ...props\n}: DividerProps) {\n  const innerContent = children ? (\n    <div\n      className={cn(\n        orientation === \"horizontal\" &&\n          \"flex flex-row items-center justify-center gap-4 w-full\",\n        orientation === \"vertical\" &&\n          \"flex flex-col items-center justify-center gap-4 h-full\",\n        className,\n      )}\n    >\n      <span\n        className={cn(\n          dividerVariants({\n            color,\n            thickness,\n            variant,\n            size,\n            orientation,\n          }),\n        )}\n        {...props}\n      />\n      <span\n        className={cn(dividerChildrenVariants({ color }), childrenClassName)}\n      >\n        {children}\n      </span>\n      <span\n        className={cn(\n          dividerVariants({\n            color,\n            thickness,\n            variant,\n            size,\n            orientation,\n          }),\n        )}\n        {...props}\n      />\n    </div>\n  ) : (\n    <div\n      className={cn(\n        dividerVariants({\n          color,\n          thickness,\n          orientation,\n          variant,\n          size,\n        }),\n        className,\n      )}\n      {...props}\n    />\n  );\n\n  if (decoration === \"none\") {\n    return innerContent;\n  }\n\n  return (\n    <div\n      className={dividerDecorationVariants({\n        color,\n        decoration,\n        thickness,\n        orientation,\n      })}\n    >\n      <span>\n        <PlusIcon\n          strokeLinecap=\"square\"\n          strokeWidth={\n            thickness === \"thin\" ? 2 : thickness === \"medium\" ? 3.5 : 4.5\n          }\n        />\n      </span>\n      {innerContent}\n      <span>\n        <PlusIcon\n          strokeLinecap=\"square\"\n          strokeWidth={\n            thickness === \"thin\" ? 2 : thickness === \"medium\" ? 3.5 : 4.5\n          }\n        />\n      </span>\n    </div>\n  );\n}\n","import * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { getPipecatUIContainer } from \"@/lib/dom\";\nimport { cn } from \"@/lib/utils\";\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\";\n\nconst dropdownMenuContentVariants = cva(\n  \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto border p-1\",\n  {\n    variants: {\n      rounded: {\n        base: \"rounded-base\",\n        none: \"rounded-none\",\n        sm: \"rounded-sm\",\n        md: \"rounded-md\",\n        lg: \"rounded-lg\",\n        xl: \"rounded-xl\",\n      },\n      shadow: {\n        none: \"shadow-none\",\n        xshort: \"shadow-xshort\",\n        short: \"shadow-short\",\n        long: \"shadow-long\",\n        xlong: \"shadow-xlong\",\n      },\n    },\n    defaultVariants: {\n      rounded: \"base\",\n      shadow: \"short\",\n    },\n  },\n);\n\nexport interface DropdownMenuContentProps\n  extends React.ComponentProps<typeof DropdownMenuPrimitive.Content>,\n    VariantProps<typeof dropdownMenuContentVariants> {}\n\nfunction DropdownMenu({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n  return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n  return (\n    <DropdownMenuPrimitive.Portal\n      container={getPipecatUIContainer()}\n      data-slot=\"dropdown-menu-portal\"\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuTrigger({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n  return (\n    <DropdownMenuPrimitive.Trigger\n      data-slot=\"dropdown-menu-trigger\"\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuContent({\n  className,\n  sideOffset = 4,\n  rounded,\n  shadow,\n  ...props\n}: DropdownMenuContentProps) {\n  return (\n    <DropdownMenuPortal>\n      <DropdownMenuPrimitive.Content\n        data-slot=\"dropdown-menu-content\"\n        sideOffset={sideOffset}\n        className={cn(\n          dropdownMenuContentVariants({ rounded, shadow }),\n          className,\n        )}\n        {...props}\n      />\n    </DropdownMenuPortal>\n  );\n}\n\nfunction DropdownMenuGroup({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n  return (\n    <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n  );\n}\n\nfunction DropdownMenuItem({\n  className,\n  inset,\n  variant = \"default\",\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n  inset?: boolean;\n  variant?: \"default\" | \"destructive\";\n}) {\n  return (\n    <DropdownMenuPrimitive.Item\n      data-slot=\"dropdown-menu-item\"\n      data-inset={inset}\n      data-variant={variant}\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-base px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuCheckboxItem({\n  className,\n  children,\n  checked,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n  return (\n    <DropdownMenuPrimitive.CheckboxItem\n      data-slot=\"dropdown-menu-checkbox-item\"\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        checked && \"font-medium bg-accent\",\n        className,\n      )}\n      checked={checked}\n      {...props}\n    >\n      <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n        <DropdownMenuPrimitive.ItemIndicator>\n          <CheckIcon />\n        </DropdownMenuPrimitive.ItemIndicator>\n      </span>\n      {children}\n    </DropdownMenuPrimitive.CheckboxItem>\n  );\n}\n\nfunction DropdownMenuRadioGroup({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n  return (\n    <DropdownMenuPrimitive.RadioGroup\n      data-slot=\"dropdown-menu-radio-group\"\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuRadioItem({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n  return (\n    <DropdownMenuPrimitive.RadioItem\n      data-slot=\"dropdown-menu-radio-item\"\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-panel py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className,\n      )}\n      {...props}\n    >\n      <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n        <DropdownMenuPrimitive.ItemIndicator>\n          <CircleIcon className=\"size-2 fill-current\" />\n        </DropdownMenuPrimitive.ItemIndicator>\n      </span>\n      {children}\n    </DropdownMenuPrimitive.RadioItem>\n  );\n}\n\nfunction DropdownMenuLabel({\n  className,\n  inset,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n  inset?: boolean;\n}) {\n  return (\n    <DropdownMenuPrimitive.Label\n      data-slot=\"dropdown-menu-label\"\n      data-inset={inset}\n      className={cn(\n        \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuSeparator({\n  className,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n  return (\n    <DropdownMenuPrimitive.Separator\n      data-slot=\"dropdown-menu-separator\"\n      className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuShortcut({\n  className,\n  ...props\n}: React.ComponentProps<\"span\">) {\n  return (\n    <span\n      data-slot=\"dropdown-menu-shortcut\"\n      className={cn(\n        \"text-muted-foreground ml-auto text-xs tracking-widest\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuSub({\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n  return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n  className,\n  inset,\n  children,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n  inset?: boolean;\n}) {\n  return (\n    <DropdownMenuPrimitive.SubTrigger\n      data-slot=\"dropdown-menu-sub-trigger\"\n      data-inset={inset}\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n        className,\n      )}\n      {...props}\n    >\n      {children}\n      <ChevronRightIcon className=\"ml-auto size-4\" />\n    </DropdownMenuPrimitive.SubTrigger>\n  );\n}\n\nfunction DropdownMenuSubContent({\n  className,\n  rounded,\n  ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent> &\n  VariantProps<typeof dropdownMenuContentVariants>) {\n  return (\n    <DropdownMenuPrimitive.SubContent\n      data-slot=\"dropdown-menu-sub-content\"\n      className={cn(\n        dropdownMenuContentVariants({ rounded }),\n        \"overflow-hidden shadow-lg\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nexport {\n  DropdownMenu,\n  DropdownMenuCheckboxItem,\n  DropdownMenuContent,\n  DropdownMenuGroup,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuPortal,\n  DropdownMenuRadioGroup,\n  DropdownMenuRadioItem,\n  DropdownMenuSeparator,\n  DropdownMenuShortcut,\n  DropdownMenuSub,\n  DropdownMenuSubContent,\n  DropdownMenuSubTrigger,\n  DropdownMenuTrigger,\n};\n","import {\n  Card,\n  CardContent,\n  CardHeader,\n  CardProps,\n  CardTitle,\n} from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\nimport { InfoIcon } from \"lucide-react\";\n\nexport const ErrorCard = ({\n  title = \"An Error Occurred\",\n  noHeader = false,\n  classNames,\n  icon = <InfoIcon size={24} />,\n  children,\n  ...cardProps\n}: {\n  title?: string;\n  noHeader?: boolean;\n  classNames?: {\n    header?: string;\n    title?: string;\n    content?: string;\n  };\n  icon?: React.ReactNode;\n  children?: React.ReactNode;\n} & CardProps) => {\n  return (\n    <Card\n      className={cn(\"min-w-md\", cardProps.className)}\n      variant=\"destructive\"\n      {...cardProps}\n    >\n      {!noHeader && (\n        <CardHeader className={classNames?.header}>\n          <CardTitle\n            className={cn(\n              \"font-semibold flex flex-row items-center gap-2\",\n              classNames?.title,\n            )}\n          >\n            {icon} {title}\n          </CardTitle>\n        </CardHeader>\n      )}\n      {children && (\n        <CardContent className={cn(\"text-balanced\", classNames?.content)}>\n          {children}\n        </CardContent>\n      )}\n    </Card>\n  );\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const inputVariants = cva(\n  \"border file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex w-full min-w-0 rounded-md transition-[color,box-shadow] outline-none file:inline-flex file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n  {\n    variants: {\n      variant: {\n        default: \"border-input bg-transparent text-foreground dark:bg-input/30\",\n        secondary:\n          \"border-input bg-accent dark:bg-background text-foreground focus-visible:ring-0\",\n        destructive:\n          \"border-destructive bg-destructive/10 text-destructive-foreground focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 focus-visible:border-destructive placeholder:text-destructive-foreground/50\",\n        ghost:\n          \"border-transparent text-foreground bg-transparent focus-visible:bg-black\",\n      },\n      size: {\n        sm: \"button-sm px-2 text-sm\",\n        md: \"button-md px-2.5\",\n        lg: \"button-lg px-3.5\",\n        xl: \"button-xl px-4\",\n      },\n      rounded: {\n        size: \"\",\n        none: \"rounded-none\",\n        sm: \"rounded-sm\",\n        md: \"rounded-md\",\n        lg: \"rounded-lg\",\n        xl: \"rounded-xl\",\n        full: \"rounded-full\",\n      },\n    },\n    defaultVariants: {\n      size: \"md\",\n      variant: \"default\",\n      rounded: \"size\",\n    },\n  },\n);\n","import { cn } from \"@/lib/utils\";\nimport { type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { inputVariants } from \"./inputVariants\";\n\nexport interface InputProps\n  extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n    Omit<VariantProps<typeof inputVariants>, \"size\"> {\n  size?: VariantProps<typeof inputVariants>[\"size\"];\n}\n\nexport function Input({\n  className,\n  type,\n  variant,\n  size,\n  rounded,\n  ...props\n}: InputProps) {\n  const roundedValue = rounded === \"size\" ? size : rounded;\n  return (\n    <input\n      type={type}\n      data-slot=\"input\"\n      className={cn(\n        inputVariants({ size, variant, rounded: roundedValue, className }),\n      )}\n      {...props}\n    />\n  );\n}\n\nexport default Input;\n","import { cn } from \"@/lib/utils\";\n\nexport function LayoutSection({\n  className,\n  sectionKey,\n  ...props\n}: React.ComponentProps<\"section\"> & { sectionKey: string }) {\n  return (\n    <section data-section={sectionKey} className={cn(className)} {...props} />\n  );\n}\n\nexport default LayoutSection;\n","import { cn } from \"@/lib/utils\";\nimport * as React from \"react\";\n\n/**\n * LED indicator primitive.\n *\n * - Visual states: on, off, and optional blinking (binary toggle, no fades)\n * - Defaults to size-4 and rounded-full; merge additional classes via `className`\n * - Colors/styles for on/off are customizable via `classNames.on` / `classNames.off`\n * - Supports a transient flash when `watch` changes\n */\nexport type LEDProps = React.HTMLAttributes<HTMLDivElement> & {\n  /**\n   * Whether the LED is on. Ignored while a flash is active. When `blinking` is false,\n   * this directly controls the on/off state.\n   */\n  on?: boolean;\n  /**\n   * When true, toggles state on a fixed interval to produce a binary blink (no fades).\n   */\n  blinking?: boolean;\n  /**\n   * Interval (ms) used to toggle between on/off while blinking. Minimum 50ms. Default: 100ms.\n   */\n  blinkIntervalMs?: number;\n  classNames?: {\n    /** Classes applied when LED is on. */\n    on?: string;\n    /** Classes applied when LED is off. */\n    off?: string;\n  };\n  /**\n   * A value to watch. Whenever this value changes, the LED will blink for `watchBlinkDurationMs`,\n   * then settle into the off state.\n   */\n  watch?: unknown;\n  /** Duration (ms) to blink when `watch` changes, then settle to off. Default: 500ms. */\n  watchBlinkDurationMs?: number;\n};\n\n/**\n * A simple LED-like indicator that supports on/off, blinking, and change-driven flashes.\n *\n * - Uses a hard state toggle (no opacity fades) when blinking\n * - Defaults to `size-4` circle and merges classes with `cn`\n * - Provide `classNames.on` / `classNames.off` to control the visual styling for states\n */\nexport function LED({\n  on = false,\n  blinking = false,\n  blinkIntervalMs = 100,\n  className,\n  classNames,\n  watch,\n  watchBlinkDurationMs = 500,\n  ...rest\n}: LEDProps) {\n  const [watchBlinking, setWatchBlinking] = React.useState(false);\n  const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n  const [blinkOn, setBlinkOn] = React.useState<boolean>(true);\n\n  // When `watch` changes, start blinking for a duration, then stop\n  React.useEffect(() => {\n    if (watch === undefined) return;\n\n    // Clear any existing timeout\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n      timeoutRef.current = null;\n    }\n\n    // Start blinking\n    setWatchBlinking(true);\n\n    // Stop blinking after the duration\n    timeoutRef.current = setTimeout(\n      () => {\n        setWatchBlinking(false);\n        timeoutRef.current = null;\n      },\n      Math.max(1, watchBlinkDurationMs),\n    );\n\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n        timeoutRef.current = null;\n      }\n    };\n  }, [watch, watchBlinkDurationMs]);\n\n  // Toggle on/off state when blinking is enabled. No fades; a hard toggle.\n  React.useEffect(() => {\n    const shouldBlink = blinking || watchBlinking;\n\n    if (!shouldBlink) {\n      setBlinkOn(on);\n      return;\n    }\n\n    const interval = setInterval(\n      () => {\n        setBlinkOn((v) => !v);\n      },\n      Math.max(50, blinkIntervalMs),\n    );\n    return () => clearInterval(interval);\n  }, [blinking, watchBlinking, blinkIntervalMs, on]);\n\n  const effectiveOn = blinking || watchBlinking ? blinkOn : on;\n\n  // Precompute static layer classes; we will only toggle styles for performance\n  const onLayerClass = cn(\n    \"absolute inset-0\",\n    \"bg-active\",\n    className,\n    classNames?.on,\n  );\n  const offLayerClass = cn(\n    \"absolute inset-0\",\n    \"bg-primary\",\n    className,\n    classNames?.off,\n  );\n\n  return (\n    <div\n      className={cn(\n        \"relative inline-flex shrink-0 items-center justify-center rounded-full size-4\",\n        className,\n      )}\n      aria-live=\"polite\"\n      aria-label={\n        effectiveOn\n          ? blinking || watchBlinking\n            ? \"on, blinking\"\n            : \"on\"\n          : blinking || watchBlinking\n            ? \"off, blinking\"\n            : \"off\"\n      }\n      {...rest}\n    >\n      {/* On layer */}\n      <div className={onLayerClass} style={{ opacity: effectiveOn ? 1 : 0 }} />\n      {/* Off layer */}\n      <div className={offLayerClass} style={{ opacity: effectiveOn ? 0 : 1 }} />\n    </div>\n  );\n}\n","import { cn } from \"@/lib/utils\";\nimport { Loader2Icon } from \"lucide-react\";\n\nexport const SpinLoader = ({ size = 32 }: { size?: number }) => {\n  return <Loader2Icon className=\"animate-spin opacity-50\" size={size} />;\n};\n\nexport const StripeLoader = ({ className }: { className?: string }) => {\n  return <div className={cn(\"loader-stripes w-40 h-10\", className)} />;\n};\n\n/**\n * @deprecated Use SpinLoader instead. This component will be removed in a future version.\n */\nexport const LoaderSpinner = SpinLoader;\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nfunction Panel({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"panel\"\n      className={cn(\n        \"group @container/panel bg-card text-card-foreground flex flex-col rounded-panel border\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nconst PanelHeaderVariants = cva(\"@container/panel-header\", {\n  variants: {\n    variant: {\n      default:\n        \"border-b flex items-center justify-center text-card-foreground p-2 @xs/panel:p-3 @md/panel:p-4\",\n      inline:\n        \"items-start text-foreground p-2 @xs/panel:p-3 @md/panel:p-4 group-has-data-[slot=panel-content]:pb-0\",\n      noPadding:\n        \"border-b flex items-center justify-center text-card-foreground\",\n    },\n  },\n  defaultVariants: {\n    variant: \"default\",\n  },\n});\n\nfunction PanelHeader({\n  variant,\n  className,\n  ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof PanelHeaderVariants>) {\n  return (\n    <div\n      data-slot=\"panel-header\"\n      className={cn(PanelHeaderVariants({ variant }), className)}\n      {...props}\n    />\n  );\n}\n\nfunction PanelTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"panel-title\"\n      className={cn(\"mono-upper\", className)}\n      {...props}\n    />\n  );\n}\n\nfunction PanelContent({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"panel-content\"\n      className={cn(\n        \"text-foreground flex flex-col gap-2 p-2 @xs/panel:p-3 @xs/panel:gap-3 @md/panel:p-4 @md/panel:gap-4\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction PanelFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"panel-footer\"\n      className={cn(\n        \"flex items-center p-2 @xs/panel:p-3 @md/panel:p-4\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction PanelActions({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"panel-actions\"\n      className={cn(\"flex items-center gap-1 @xs/panel:gap-2\", className)}\n      {...props}\n    />\n  );\n}\n\nexport {\n  Panel,\n  PanelActions,\n  PanelContent,\n  PanelFooter,\n  PanelHeader,\n  PanelTitle,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\n\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nconst progressVariants = cva(\n  `inline-flex overflow-hidden bg-white min-h-[1px] h-full relative shrink-0 grow-0\n  [&>[data-slot=progress-indicator]]:absolute [&>[data-slot=progress-indicator]]:top-0 [&>[data-slot=progress-indicator]]:left-0 [&>[data-slot=progress-indicator]]:bottom-0 [&>[data-slot=progress-indicator]]:w-[var(--progress-width)]`,\n  {\n    variants: {\n      size: {\n        default: \"w-10\",\n        xs: \"w-2\",\n        sm: \"w-5\",\n        lg: \"w-15\",\n        xl: \"w-20\",\n        half: \"h-1/2 w-1/2\",\n      },\n      color: {\n        primary: \"bg-primary/20 [&>[data-slot=progress-indicator]]:bg-primary\",\n        secondary:\n          \"bg-secondary/20 [&>[data-slot=progress-indicator]]:bg-secondary\",\n        destructive:\n          \"bg-destructive/20 [&>[data-slot=progress-indicator]]:bg-destructive\",\n        warning: \"bg-warning/20 [&>[data-slot=progress-indicator]]:bg-warning\",\n        active: \"bg-active/20 [&>[data-slot=progress-indicator]]:bg-active\",\n        inactive:\n          \"bg-inactive/20 [&>[data-slot=progress-indicator]]:bg-inactive\",\n        agent: \"bg-agent/20 [&>[data-slot=progress-indicator]]:bg-agent\",\n        client: \"bg-client/20 [&>[data-slot=progress-indicator]]:bg-client\",\n      },\n      rounded: {\n        true: \"rounded-full\",\n        false: \"\",\n      },\n    },\n    defaultVariants: {\n      size: \"default\",\n      color: \"primary\",\n    },\n  },\n);\nexport interface ProgressProps extends VariantProps<typeof progressVariants> {\n  percent?: number;\n  className?: string;\n  rounded?: boolean;\n}\n\nconst Progress = React.forwardRef<\n  React.ElementRef<typeof ProgressPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> & ProgressProps\n>(({ className, percent, size, color, rounded, ...props }, ref) => {\n  return (\n    <ProgressPrimitive.Root\n      ref={ref}\n      data-slot=\"progress\"\n      className={cn(progressVariants({ size, color, rounded }), className)}\n      {...props}\n    >\n      <ProgressPrimitive.Indicator\n        data-slot=\"progress-indicator\"\n        style={\n          { \"--progress-width\": `${percent || 0}%` } as React.CSSProperties\n        }\n      />\n    </ProgressPrimitive.Root>\n  );\n});\nProgress.displayName = ProgressPrimitive.Root.displayName;\n\nexport { Progress };\n","import type { VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport * as ResizablePrimitive from \"react-resizable-panels\";\nimport {\n  disableGlobalCursorStyles,\n  usePanelGroupContext,\n} from \"react-resizable-panels\";\n\nimport { cn } from \"@/lib/utils\";\nimport { cva } from \"class-variance-authority\";\nimport { EllipsisVerticalIcon } from \"lucide-react\";\n\nfunction ResizablePanelGroup({\n  className,\n  ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) {\n  disableGlobalCursorStyles();\n\n  return (\n    <ResizablePrimitive.PanelGroup\n      data-slot=\"resizable-panel-group\"\n      className={cn(\n        \"flex h-full w-full data-[panel-group-direction=vertical]:flex-col\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction ResizablePanel({\n  ...props\n}: React.ComponentProps<typeof ResizablePrimitive.Panel>) {\n  return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n}\n\nconst resizableHandleVariants = cva(\n  \"group focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90\",\n  {\n    variants: {\n      size: {\n        sm: \"[&_svg]:size-3\",\n        md: \"[&_svg]:size-4\",\n        lg: \"[&_svg]:size-5\",\n      },\n      noBorder: {\n        false:\n          \"bg-border hover:bg-foreground/20 hover:ring-foreground/20 hover:ring-1\",\n        true: \"border-none\",\n      },\n    },\n  },\n);\n\nfunction ResizableHandle({\n  withHandle,\n  noBorder = true,\n  size = \"sm\",\n  icon,\n  className,\n  ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> &\n  VariantProps<typeof resizableHandleVariants> & {\n    withHandle?: boolean;\n    noBorder?: boolean;\n    icon?: React.ReactNode;\n  }) {\n  const { direction } = usePanelGroupContext();\n  return (\n    <ResizablePrimitive.PanelResizeHandle\n      data-slot=\"resizable-handle\"\n      className={cn(\n        resizableHandleVariants({ noBorder, size }),\n        direction === \"vertical\" ? \"cursor-row-resize\" : \"cursor-col-resize\",\n        className,\n      )}\n      {...props}\n    >\n      {withHandle && (\n        <div className=\"border-transparent z-10 flex items-center justify-center text-subtle group-hover:text-foreground group-focus:text-foreground\">\n          {icon || <EllipsisVerticalIcon />}\n        </div>\n      )}\n    </ResizablePrimitive.PanelResizeHandle>\n  );\n}\n\nexport {\n  ResizableHandle,\n  ResizablePanel,\n  ResizablePanelGroup,\n  ResizablePrimitive,\n};\n","import * as SelectPrimitive from \"@radix-ui/react-select\";\n\nimport { getPipecatUIContainer } from \"@/lib/dom\";\nimport { cn } from \"@/lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport {\n  CheckIcon,\n  ChevronDownIcon,\n  ChevronsUpDownIcon,\n  ChevronUpIcon,\n} from \"lucide-react\";\n\nconst selectTriggerVariants = cva(\n  \"truncate data-[placeholder]:text-muted-foreground font-mono text-xs [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between border bg-transparent whitespace-nowrap transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        primary:\n          \"text-primary-foreground bg-primary hover:bg-primary/90 dark:hover:bg-primary/90 border-transparent data-[placeholder]:text-primary-foreground dark:bg-primary [&_svg:not([class*='text-'])]:text-brder\",\n        outline: \"text-foreground border-input hover:bg-accent\",\n        ghost: \"text-foreground border-transparent hover:bg-accent\",\n      },\n      size: {\n        md: \"button-md [&_svg]:size-3.5 [&_[data-slot^=select-guide]]:mr-2\",\n        sm: \"button-sm [&_svg]:size-3.5 [&_[data-slot^=select-guide]]:mr-2\",\n        lg: \"button-lg [&_svg]:size-4 [&_[data-slot^=select-guide]]:mr-3\",\n        xl: \"button-xl [&_svg]:size-4 [&_[data-slot^=select-guide]]:mr-3\",\n      },\n      align: {\n        left: \"text-left\",\n        center: \"text-center\",\n        right: \"text-right\",\n      },\n      rounded: {\n        size: \"\",\n        none: \"rounded-none\",\n        sm: \"rounded-sm\",\n        md: \"rounded-md\",\n        lg: \"rounded-lg\",\n        xl: \"rounded-xl\",\n        full: \"rounded-full\",\n      },\n    },\n    defaultVariants: {\n      size: \"md\",\n      variant: \"outline\",\n      rounded: \"size\",\n      align: \"left\",\n    },\n  },\n);\n\nexport type SelectProps = React.ComponentProps<typeof SelectPrimitive.Root>;\n\nexport function Select({ ...props }: SelectProps) {\n  return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nexport type SelectGroupProps = React.ComponentProps<\n  typeof SelectPrimitive.Group\n>;\n\nexport function SelectGroup({ ...props }: SelectGroupProps) {\n  return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nexport type SelectValueProps = React.ComponentProps<\n  typeof SelectPrimitive.Value\n>;\n\nexport function SelectValue({ ...props }: SelectValueProps) {\n  return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nexport interface SelectTriggerProps\n  extends React.ComponentProps<typeof SelectPrimitive.Trigger>,\n    VariantProps<typeof selectTriggerVariants> {}\n\nexport function SelectTrigger({\n  className,\n  size = \"md\",\n  variant,\n  rounded = \"size\",\n  align,\n  children,\n  ...props\n}: SelectTriggerProps) {\n  const roundedValue = rounded === \"size\" ? size : rounded;\n\n  return (\n    <SelectPrimitive.Trigger\n      data-slot=\"select-trigger\"\n      data-size={size}\n      className={cn(\n        selectTriggerVariants({\n          size,\n          variant,\n          align,\n          rounded: roundedValue,\n          className,\n        }),\n      )}\n      {...props}\n    >\n      <span className=\"truncate flex-1 min-w-0\">{children}</span>\n      <SelectPrimitive.Icon asChild>\n        <ChevronsUpDownIcon className=\"opacity-50 flex-none\" />\n      </SelectPrimitive.Icon>\n    </SelectPrimitive.Trigger>\n  );\n}\n\nexport type SelectGuideProps = React.HTMLAttributes<HTMLSpanElement>;\n\nexport function SelectGuide({ className, ...props }: SelectGuideProps) {\n  return (\n    <span\n      data-slot=\"select-guide\"\n      className={cn(\"text-subtle font-sans\", className)}\n      {...props}\n    />\n  );\n}\n\nexport type SelectContentProps = React.ComponentProps<\n  typeof SelectPrimitive.Content\n>;\n\nexport function SelectContent({\n  className,\n  children,\n  position = \"popper\",\n  ...props\n}: SelectContentProps) {\n  return (\n    <SelectPrimitive.Portal container={getPipecatUIContainer()}>\n      <SelectPrimitive.Content\n        data-slot=\"select-content\"\n        className={cn(\n          \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n          position === \"popper\" &&\n            \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n          className,\n        )}\n        position={position}\n        {...props}\n      >\n        <SelectScrollUpButton />\n        <SelectPrimitive.Viewport\n          className={cn(\n            \"p-1\",\n            position === \"popper\" &&\n              \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\",\n          )}\n        >\n          {children}\n        </SelectPrimitive.Viewport>\n        <SelectScrollDownButton />\n      </SelectPrimitive.Content>\n    </SelectPrimitive.Portal>\n  );\n}\n\nexport type SelectItemProps = React.ComponentProps<typeof SelectPrimitive.Item>;\n\nexport function SelectItem({ className, children, ...props }: SelectItemProps) {\n  return (\n    <SelectPrimitive.Item\n      data-slot=\"select-item\"\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n        className,\n      )}\n      {...props}\n    >\n      <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n        <SelectPrimitive.ItemIndicator>\n          <CheckIcon className=\"size-4\" />\n        </SelectPrimitive.ItemIndicator>\n      </span>\n      <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n    </SelectPrimitive.Item>\n  );\n}\n\nexport type SelectSeparatorProps = React.ComponentProps<\n  typeof SelectPrimitive.Separator\n>;\n\nexport function SelectSeparator({ className, ...props }: SelectSeparatorProps) {\n  return (\n    <SelectPrimitive.Separator\n      data-slot=\"select-separator\"\n      className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n      {...props}\n    />\n  );\n}\n\nexport type SelectScrollUpButtonProps = React.ComponentProps<\n  typeof SelectPrimitive.ScrollUpButton\n>;\n\nexport function SelectScrollUpButton({\n  className,\n  ...props\n}: SelectScrollUpButtonProps) {\n  return (\n    <SelectPrimitive.ScrollUpButton\n      data-slot=\"select-scroll-up-button\"\n      className={cn(\n        \"flex cursor-default items-center justify-center py-1\",\n        className,\n      )}\n      {...props}\n    >\n      <ChevronUpIcon className=\"size-4\" />\n    </SelectPrimitive.ScrollUpButton>\n  );\n}\n\nexport type SelectScrollDownButtonProps = React.ComponentProps<\n  typeof SelectPrimitive.ScrollDownButton\n>;\n\nexport function SelectScrollDownButton({\n  className,\n  ...props\n}: SelectScrollDownButtonProps) {\n  return (\n    <SelectPrimitive.ScrollDownButton\n      data-slot=\"select-scroll-down-button\"\n      className={cn(\n        \"flex cursor-default items-center justify-center py-1\",\n        className,\n      )}\n      {...props}\n    >\n      <ChevronDownIcon className=\"size-4\" />\n    </SelectPrimitive.ScrollDownButton>\n  );\n}\n","import * as TabsPrimitive from \"@radix-ui/react-tabs\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Tabs({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n  return (\n    <TabsPrimitive.Root\n      data-slot=\"tabs\"\n      className={cn(\"flex flex-col gap-2\", className)}\n      {...props}\n    />\n  );\n}\n\nfunction TabsList({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n  return (\n    <TabsPrimitive.List\n      data-slot=\"tabs-list\"\n      className={cn(\n        \"bg-muted text-muted-foreground inline-flex h-10 p-1 w-fit items-center justify-center rounded-md p-[3px] gap-1\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TabsTrigger({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n  return (\n    <TabsPrimitive.Trigger\n      data-slot=\"tabs-trigger\"\n      className={cn(\n        \"data-[state=active]:bg-background data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring hover:bg-muted-foreground/10 text-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-sm border border-transparent px-2 py-1 text-xs font-bold whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 mono-upper\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TabsContent({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n  return (\n    <TabsPrimitive.Content\n      data-slot=\"tabs-content\"\n      forceMount\n      className={cn(\n        \"flex-1 outline-none data-[state=inactive]:hidden\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Tabs, TabsContent, TabsList, TabsTrigger };\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { inputVariants } from \"./inputVariants\";\n\nexport interface TextareaProps\n  extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\">,\n    Omit<VariantProps<typeof inputVariants>, \"size\"> {\n  size?: VariantProps<typeof inputVariants>[\"size\"];\n  multiline?: boolean;\n}\n\nconst textareaVariants = cva(\n  \"field-sizing-content disabled:cursor-not-allowed box-border h-auto\",\n  {\n    variants: {\n      size: {\n        sm: \"py-0.75\",\n        md: \"py-1.25\",\n        lg: \"py-2.25\",\n        xl: \"py-3.25\",\n      },\n      multiline: {\n        true: \"resize-y\",\n        false: \"resize-none\",\n      },\n    },\n  },\n);\n\nfunction Textarea({\n  className,\n  size,\n  variant,\n  rounded = \"size\",\n  multiline = true,\n  ...props\n}: TextareaProps) {\n  const roundedValue = rounded === \"size\" ? size : rounded;\n  return (\n    <textarea\n      data-slot=\"textarea\"\n      className={cn(\n        inputVariants({ size, variant, rounded: roundedValue, className }),\n        textareaVariants({ size, multiline, className }),\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Textarea };\n","import * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { getPipecatUIContainer } from \"@/lib/dom\";\n\nfunction TooltipProvider({\n  delayDuration = 0,\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n  return (\n    <TooltipPrimitive.Provider\n      data-slot=\"tooltip-provider\"\n      delayDuration={delayDuration}\n      {...props}\n    />\n  );\n}\n\nfunction Tooltip({\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n  return (\n    <TooltipProvider>\n      <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n    </TooltipProvider>\n  );\n}\n\nfunction TooltipTrigger({\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n  return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n  className,\n  sideOffset = 0,\n  children,\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n  return (\n    <TooltipPrimitive.Portal container={getPipecatUIContainer()}>\n      <TooltipPrimitive.Content\n        data-slot=\"tooltip-content\"\n        sideOffset={sideOffset}\n        className={cn(\n          \"bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n          className,\n        )}\n        {...props}\n      >\n        {children}\n        <TooltipPrimitive.Arrow className=\"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n      </TooltipPrimitive.Content>\n    </TooltipPrimitive.Portal>\n  );\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","import { Card, CardContent, type CardProps } from \"@/components/ui\";\nimport { cn } from \"@/lib/utils\";\n\ninterface Props extends CardProps {\n  children?: React.ReactNode;\n  className?: string;\n  noAnimateIn?: boolean;\n}\n\nexport const ControlBarDivider = ({\n  className,\n}: React.ComponentProps<\"div\">) => {\n  return <div className={cn(\"w-px bg-border self-stretch mx-2 \", className)} />;\n};\n\nexport const ControlBar = ({\n  children,\n  noAnimateIn = false,\n  className,\n  ...props\n}: Props) => {\n  return (\n    <Card\n      withGradientBorder\n      shadow=\"xlong\"\n      size=\"lg\"\n      {...props}\n      className={cn(\n        !noAnimateIn &&\n          \"animate-in fade-in slide-in-from-bottom-10 duration-500\",\n        className,\n      )}\n    >\n      <CardContent className=\"flex flex-row gap-4\">{children}</CardContent>\n    </Card>\n  );\n};\n","import { cn } from \"@/lib/utils\";\nimport { useMemo } from \"react\";\n\ninterface Props {\n  /**\n   * Custom label for assistant messages\n   * @default \"assistant\"\n   */\n  assistantLabel?: string;\n  /**\n   * Custom label for user/client messages\n   * @default \"user\"\n   */\n  clientLabel?: string;\n  /**\n   * Custom label for system messages\n   * @default \"system\"\n   */\n  systemLabel?: string;\n  /**\n   * Custom label for function call messages\n   * @default \"function call\"\n   */\n  functionCallLabel?: string;\n  /**\n   * Custom CSS classes for the role label\n   */\n  className?: string;\n  /**\n   * The role of the message\n   */\n  role: \"user\" | \"assistant\" | \"system\" | \"function_call\";\n}\n\n/**\n * MessageRole component that displays the role of a message\n *\n * @example\n * ```tsx\n * import { MessageRole } from \"@pipecat-ai/voice-ui-kit\";\n *\n * <MessageRole role=\"assistant\" />\n * ```\n */\nexport const MessageRole = ({\n  assistantLabel = \"assistant\",\n  clientLabel = \"user\",\n  systemLabel = \"system\",\n  functionCallLabel = \"function call\",\n  className,\n  role,\n}: Props) => {\n  /**\n   * Maps message roles to their display labels\n   * @returns Object mapping role keys to display labels\n   */\n  const roleLabelMap = useMemo(\n    () => ({\n      user: clientLabel,\n      assistant: assistantLabel,\n      system: systemLabel,\n      function_call: functionCallLabel,\n    }),\n    [assistantLabel, clientLabel, systemLabel, functionCallLabel],\n  );\n\n  return (\n    <div\n      className={cn(\n        \"font-semibold font-mono text-xs leading-6 w-max\",\n        {\n          \"text-client\": role === \"user\",\n          \"text-agent\": role === \"assistant\",\n          \"text-subtle\": role === \"system\" || role === \"function_call\",\n        },\n        className,\n      )}\n    >\n      {roleLabelMap[role] || role}\n    </div>\n  );\n};\n","import React, { useEffect, useState } from \"react\";\n\ninterface ThinkingProps {\n  \"aria-label\"?: string;\n  className?: string;\n  initialDots?: number;\n  interval?: number;\n  maxDots?: number;\n}\n\nexport const Thinking: React.FC<ThinkingProps> = ({\n  \"aria-label\": ariaLabel = \"Loading\",\n  className = \"\",\n  initialDots = 1,\n  interval = 500,\n  maxDots = 3,\n}) => {\n  const [dots, setDots] = useState(initialDots);\n\n  useEffect(() => {\n    const i = setInterval(() => {\n      setDots((prevDots) => (prevDots % maxDots) + 1);\n    }, interval);\n\n    return () => clearInterval(i);\n  }, [interval, maxDots]);\n\n  const renderDots = () => {\n    return \".\".repeat(dots);\n  };\n\n  return (\n    <span className={className} aria-label={ariaLabel}>\n      {renderDots()}\n    </span>\n  );\n};\n\nexport default Thinking;\n","import { cn } from \"@/lib/utils\";\nimport type {\n  AggregationMetadata,\n  BotOutputText,\n  ConversationMessage,\n  ConversationMessagePart,\n  TextRenderMode,\n} from \"@/types/conversation\";\nimport { isMessageEmpty } from \"@pipecat-ai/client-react\";\nimport { Fragment } from \"react\";\nimport Thinking from \"./Thinking\";\n\nconst timeFormatter = new Intl.DateTimeFormat(undefined, {\n  hour: \"numeric\",\n  minute: \"numeric\",\n  second: \"numeric\",\n});\n\ntype CustomBotOutputRenderer = (\n  content: string,\n  metadata: { spoken: string; unspoken: string },\n) => React.ReactNode;\n\ninterface Props {\n  /**\n   * Custom CSS classes for the component\n   */\n  classNames?: {\n    /**\n     * Custom CSS classes for the message content\n     */\n    messageContent?: string;\n    /**\n     * Custom CSS classes for the thinking\n     */\n    thinking?: string;\n    /**\n     * Custom CSS classes for the time\n     */\n    time?: string;\n  };\n  /**\n   * The message to display\n   */\n  message: ConversationMessage;\n  /**\n   * Custom renderers for BotOutput content based on aggregation type\n   * Key is the aggregation type (e.g., \"code\", \"link\"), value is a renderer function\n   */\n  botOutputRenderers?: Record<string, CustomBotOutputRenderer>;\n  /**\n   * Metadata for aggregation types to control rendering and speech progress behavior\n   * Key is the aggregation type (e.g., \"code\", \"link\"), value is metadata configuration\n   */\n  aggregationMetadata?: Record<string, AggregationMetadata>;\n  /**\n   * Controls how bot message text is rendered.\n   * @default \"karaoke\"\n   */\n  textRenderMode?: TextRenderMode;\n}\n\n/**\n * Renders BotOutput content based on the aggregation type. Uses a custom renderer if provided, otherwise renders the spoken and unspoken text.\n * @param spoken - The spoken text (already split from unspoken text to preserve punctuation)\n * @param unspoken - The unspoken text (remaining portion after spoken position)\n * @param aggregatedBy - The aggregation type\n * @param customRenderer - A custom renderer function\n * @param metadata - Metadata for the aggregation type\n * @returns The rendered content\n */\nconst renderBotOutput = (\n  spoken: string,\n  unspoken: string,\n  aggregatedBy?: string,\n  customRenderer?: CustomBotOutputRenderer,\n  metadata?: AggregationMetadata,\n  textRenderMode?: TextRenderMode,\n): React.ReactNode => {\n  // Use custom renderer if provided and aggregation type matches\n  if (aggregatedBy && customRenderer) {\n    const content = spoken + unspoken;\n    return customRenderer(content, { spoken, unspoken });\n  }\n\n  // Default rendering - unspoken is already split at the correct position\n  const displayMode = metadata?.displayMode || \"inline\";\n  const Wrapper = displayMode === \"block\" ? \"div\" : \"span\";\n\n  // In \"instant\" mode, render all text in normal color (no karaoke highlighting)\n  if (textRenderMode === \"instant\") {\n    return (\n      <Wrapper>\n        {spoken}\n        {unspoken}\n      </Wrapper>\n    );\n  }\n\n  return (\n    <Wrapper>\n      {spoken}\n      {unspoken && <span className=\"text-muted-foreground\">{unspoken}</span>}\n    </Wrapper>\n  );\n};\n\nfunction isBotOutputText(\n  part: ConversationMessagePart,\n): part is ConversationMessagePart & { text: BotOutputText } {\n  const text = part.text;\n  return (\n    text !== null &&\n    typeof text === \"object\" &&\n    \"spoken\" in text &&\n    \"unspoken\" in text\n  );\n}\n\nconst renderPartContent = (\n  part: ConversationMessagePart,\n  botOutputRenderers?: Record<string, CustomBotOutputRenderer>,\n  aggregationMetadata?: Record<string, AggregationMetadata>,\n  textRenderMode?: TextRenderMode,\n): React.ReactNode => {\n  if (!part.text) return null;\n  if (isBotOutputText(part)) {\n    const text = part.text as BotOutputText;\n    const customRenderer = part.aggregatedBy\n      ? botOutputRenderers?.[part.aggregatedBy]\n      : undefined;\n    const metadata = part.aggregatedBy\n      ? aggregationMetadata?.[part.aggregatedBy]\n      : undefined;\n    return renderBotOutput(\n      text.spoken,\n      text.unspoken,\n      part.aggregatedBy,\n      customRenderer,\n      metadata,\n      textRenderMode,\n    );\n  }\n  return part.text as React.ReactNode;\n};\n\nexport const MessageContent = ({\n  botOutputRenderers,\n  aggregationMetadata,\n  classNames = {},\n  message,\n  textRenderMode,\n}: Props) => {\n  const parts = Array.isArray(message.parts) ? message.parts : [];\n\n  // Group parts by display mode: inline parts together, block parts separate\n  const groupedParts: Array<{\n    type: \"inline\" | \"block\";\n    parts: ConversationMessagePart[];\n  }> = [];\n\n  let currentInlineGroup: ConversationMessagePart[] = [];\n\n  for (const part of parts) {\n    const metadata = part.aggregatedBy\n      ? aggregationMetadata?.[part.aggregatedBy]\n      : undefined;\n    const displayMode = part.displayMode ?? metadata?.displayMode ?? \"inline\";\n\n    if (displayMode === \"block\") {\n      // Flush any accumulated inline parts\n      if (currentInlineGroup.length > 0) {\n        groupedParts.push({ type: \"inline\", parts: currentInlineGroup });\n        currentInlineGroup = [];\n      }\n      // Add block part separately\n      groupedParts.push({ type: \"block\", parts: [part] });\n    } else {\n      // Accumulate inline parts\n      currentInlineGroup.push(part);\n    }\n  }\n\n  // Flush remaining inline parts\n  if (currentInlineGroup.length > 0) {\n    groupedParts.push({ type: \"inline\", parts: currentInlineGroup });\n  }\n\n  return (\n    <div className={cn(\"flex flex-col gap-2\", classNames.messageContent)}>\n      {groupedParts.map((group, groupIdx) => {\n        if (group.type === \"inline\") {\n          // Render inline parts together in a single line\n          return (\n            <div key={groupIdx} className=\"inline-block\">\n              {group.parts.map((part, partIdx) => {\n                const content = renderPartContent(\n                  part,\n                  botOutputRenderers,\n                  aggregationMetadata,\n                  textRenderMode,\n                );\n                const shouldAddSpace = partIdx > 0 && !isBotOutputText(part);\n\n                return (\n                  <Fragment key={partIdx}>\n                    {shouldAddSpace && \" \"}\n                    {content}\n                  </Fragment>\n                );\n              })}\n            </div>\n          );\n        } else {\n          // Render block parts separately (each on its own line)\n          return (\n            <Fragment key={groupIdx}>\n              {group.parts.map((part, partIdx) => (\n                <Fragment key={partIdx}>\n                  {renderPartContent(\n                    part,\n                    botOutputRenderers,\n                    aggregationMetadata,\n                    textRenderMode,\n                  )}\n                </Fragment>\n              ))}\n            </Fragment>\n          );\n        }\n      })}\n      {isMessageEmpty(message) ? (\n        <Thinking className={classNames.thinking} />\n      ) : null}\n      <div\n        className={cn(\"self-end text-xs text-gray-500 mb-1\", classNames.time)}\n      >\n        {timeFormatter.format(new Date(message.createdAt))}\n      </div>\n    </div>\n  );\n};\n","import { cn } from \"@/lib/utils\";\nimport type {\n  FunctionCallData,\n  FunctionCallRenderer,\n} from \"@pipecat-ai/client-react\";\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport {\n  CheckIcon,\n  ChevronRightIcon,\n  LoaderCircleIcon,\n  XIcon,\n} from \"lucide-react\";\nimport { useState } from \"react\";\n\ninterface FunctionCallContentProps {\n  functionCall: FunctionCallData;\n  /** Label for function call entries */\n  functionCallLabel?: string;\n  /** Custom renderer for function call messages. When provided, replaces the default rendering. */\n  functionCallRenderer?: FunctionCallRenderer;\n  classNames?: {\n    container?: string;\n  };\n}\n\nconst StatusIcon: React.FC<{\n  status: FunctionCallData[\"status\"];\n  cancelled?: boolean;\n}> = ({ status, cancelled }) => {\n  if (status === \"completed\" && cancelled) {\n    return <XIcon size={14} className=\"text-destructive\" />;\n  }\n  switch (status) {\n    case \"started\":\n    case \"in_progress\":\n      return <LoaderCircleIcon size={14} className=\"animate-spin\" />;\n    case \"completed\":\n      return <CheckIcon size={14} className=\"text-green-600\" />;\n  }\n};\n\nexport const FunctionCallContent: React.FC<FunctionCallContentProps> = ({\n  functionCall,\n  functionCallLabel = \"Function call\",\n  functionCallRenderer,\n  classNames = {},\n}) => {\n  const [isOpen, setIsOpen] = useState(false);\n\n  if (functionCallRenderer) {\n    return <>{functionCallRenderer(functionCall)}</>;\n  }\n\n  const hasDetails =\n    (functionCall.args && Object.keys(functionCall.args).length > 0) ||\n    functionCall.result !== undefined;\n\n  return (\n    <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n      <div className={cn(\"flex flex-col gap-1\", classNames.container)}>\n        <CollapsibleTrigger asChild disabled={!hasDetails}>\n          <button\n            className={cn(\n              \"flex items-center gap-2 text-xs font-mono\",\n              \"text-muted-foreground transition-colors\",\n              hasDetails && \"hover:text-foreground cursor-pointer\",\n              !hasDetails && \"cursor-default\",\n              \"select-none\",\n            )}\n          >\n            {hasDetails && (\n              <ChevronRightIcon\n                size={14}\n                className={cn(\n                  \"transition-transform duration-200\",\n                  isOpen && \"rotate-90\",\n                )}\n              />\n            )}\n            <StatusIcon\n              status={functionCall.status}\n              cancelled={functionCall.cancelled}\n            />\n            <span className=\"font-semibold\">{functionCallLabel}</span>\n            {functionCall.function_name && (\n              <span className=\"text-muted-foreground\">\n                ({functionCall.function_name})\n              </span>\n            )}\n          </button>\n        </CollapsibleTrigger>\n\n        {hasDetails && (\n          <CollapsibleContent>\n            <div\n              className={cn(\n                \"pl-3 border-l-2 border-muted text-xs font-mono\",\n                \"flex flex-col gap-2 mt-1\",\n                hasDetails && \"ml-3.5\",\n              )}\n            >\n              {functionCall.args &&\n                Object.keys(functionCall.args).length > 0 && (\n                  <div>\n                    <div className=\"font-semibold text-muted-foreground mb-1\">\n                      Arguments\n                    </div>\n                    <pre className=\"bg-muted/50 rounded p-2 overflow-x-auto whitespace-pre-wrap break-all\">\n                      {JSON.stringify(functionCall.args, null, 2)}\n                    </pre>\n                  </div>\n                )}\n\n              {functionCall.result !== undefined && (\n                <div>\n                  <div className=\"font-semibold text-muted-foreground mb-1\">\n                    Result\n                  </div>\n                  <pre className=\"bg-muted/50 rounded p-2 overflow-x-auto whitespace-pre-wrap break-all\">\n                    {typeof functionCall.result === \"string\"\n                      ? functionCall.result\n                      : JSON.stringify(functionCall.result, null, 2)}\n                  </pre>\n                </div>\n              )}\n            </div>\n          </CollapsibleContent>\n        )}\n      </div>\n    </Collapsible>\n  );\n};\n","import { memo } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport type {\n  AggregationMetadata,\n  ConversationMessage,\n  FunctionCallRenderer,\n  TextRenderMode,\n} from \"@/types/conversation\";\nimport { MessageRole } from \"./MessageRole\";\nimport { MessageContent } from \"./MessageContent\";\nimport { FunctionCallContent } from \"./FunctionCallContent\";\n\nconst timeFormatter = new Intl.DateTimeFormat(undefined, {\n  hour: \"numeric\",\n  minute: \"numeric\",\n  second: \"numeric\",\n});\n\ninterface Props {\n  /**\n   * Custom label for assistant messages\n   * @default \"assistant\"\n   */\n  assistantLabel?: string;\n  /**\n   * Custom label for user/client messages\n   * @default \"user\"\n   */\n  clientLabel?: string;\n  /**\n   * Custom label for system messages\n   * @default \"system\"\n   */\n  systemLabel?: string;\n  /**\n   * Custom label for function call entries\n   * @default \"function call\"\n   */\n  functionCallLabel?: string;\n  /**\n   * Custom renderer for function call messages.\n   * When provided, replaces the default function call rendering.\n   */\n  functionCallRenderer?: FunctionCallRenderer;\n  /**\n   * Custom CSS classes for the component\n   */\n  classNames?: {\n    /**\n     * Custom CSS classes for the container\n     */\n    container?: string;\n    /**\n     * Custom CSS classes for the message content\n     */\n    messageContent?: string;\n    /**\n     * Custom CSS classes for the role\n     */\n    role?: string;\n    /**\n     * Custom CSS classes for the thinking\n     */\n    thinking?: string;\n    /**\n     * Custom CSS classes for the time\n     */\n    time?: string;\n  };\n  /**\n   * The message to display\n   */\n  message: ConversationMessage;\n  /**\n   * Custom renderers for BotOutput content based on aggregation type\n   */\n  botOutputRenderers?: React.ComponentProps<\n    typeof MessageContent\n  >[\"botOutputRenderers\"];\n  /**\n   * Metadata for aggregation types to control rendering and speech progress behavior\n   */\n  aggregationMetadata?: Record<string, AggregationMetadata>;\n  /**\n   * Controls how bot message text is rendered.\n   * @default \"karaoke\"\n   */\n  textRenderMode?: TextRenderMode;\n}\n\nexport const MessageContainer = memo(\n  ({\n    assistantLabel,\n    clientLabel,\n    systemLabel,\n    functionCallLabel,\n    functionCallRenderer,\n    classNames = {},\n    message,\n    botOutputRenderers,\n    aggregationMetadata,\n    textRenderMode,\n  }: Props) => {\n    if (message.role === \"function_call\" && message.functionCall) {\n      return (\n        <div className={cn(\"flex flex-col gap-2\", classNames.container)}>\n          <FunctionCallContent\n            functionCall={message.functionCall}\n            functionCallLabel={functionCallLabel}\n            functionCallRenderer={functionCallRenderer}\n          />\n          <div\n            className={cn(\n              \"self-end text-xs text-gray-500 mb-1\",\n              classNames.time,\n            )}\n          >\n            {timeFormatter.format(new Date(message.createdAt))}\n          </div>\n        </div>\n      );\n    }\n\n    return (\n      <div className={cn(\"flex flex-col gap-2\", classNames.container)}>\n        <MessageRole\n          assistantLabel={assistantLabel}\n          clientLabel={clientLabel}\n          systemLabel={systemLabel}\n          functionCallLabel={functionCallLabel}\n          className={classNames.role}\n          role={message.role}\n        />\n        <MessageContent\n          classNames={{\n            messageContent: classNames.messageContent,\n            thinking: classNames.thinking,\n            time: classNames.time,\n          }}\n          message={message}\n          botOutputRenderers={botOutputRenderers}\n          aggregationMetadata={aggregationMetadata}\n          textRenderMode={textRenderMode}\n        />\n      </div>\n    );\n  },\n);\n","import { RTVIEvent, type TransportState } from \"@pipecat-ai/client-js\";\nimport { usePipecatClient, useRTVIClientEvent } from \"@pipecat-ai/client-react\";\nimport { useCallback, useState } from \"react\";\n\n/**\n * Simplified connection states derived from Pipecat transport states.\n *\n * This type provides a simplified view of connectivity that's useful for UI controls\n * where the full complexity of transport states isn't needed.\n */\nexport type PipecatConnectionState =\n  | \"disconnected\"\n  | \"connecting\"\n  | \"connected\";\n\n/**\n * Return type for the usePipecatConnectionState hook.\n */\nexport interface PipecatConnectionStateResult {\n  /** The current connection state */\n  state: PipecatConnectionState;\n  /** True when the connection is established and ready */\n  isConnected: boolean;\n  /** True when attempting to establish a connection */\n  isConnecting: boolean;\n  /** True when disconnected or in an error state */\n  isDisconnected: boolean;\n}\n\nconst deriveState = (state: TransportState): PipecatConnectionState => {\n  if (state === \"ready\") {\n    return \"connected\";\n  } else if (\n    [\"authenticating\", \"authenticated\", \"connecting\", \"connected\"].includes(\n      state,\n    )\n  ) {\n    return \"connecting\";\n  } else {\n    return \"disconnected\";\n  }\n};\n/**\n * Hook that provides a simplified connection state for Pipecat transport.\n *\n * This hook derives a basic connectivity state from the underlying Pipecat transport\n * states, mapping them to three simple states: disconnected, connecting, and connected.\n *\n * **Purpose:**\n * - Simplifies transport state management for UI components\n * - Provides consistent state for controlling button labels, loading states, and disabled elements\n * - Abstracts away complex transport states that aren't useful for UI control\n *\n * **State Mapping:**\n * - `\"ready\"` → `\"connected\"`\n * - `\"authenticating\"` | `\"authenticated\"` | `\"connecting\"` | `\"connected\"` → `\"connecting\"`\n * - All other states → `\"disconnected\"`\n *\n * @returns {PipecatConnectionStateResult} Object containing the state and boolean flags\n *\n * @example\n * ```tsx\n * const { state, isConnected, isConnecting, isDisconnected } = usePipecatConnectionState();\n *\n * return (\n *   <button\n *     disabled={!isConnected}\n *     onClick={handleConnect}\n *   >\n *     {isConnected ? \"Connected\" :\n *      isConnecting ? \"Connecting...\" : \"Connect\"}\n *   </button>\n * );\n * ```\n */\nexport const usePipecatConnectionState = (): PipecatConnectionStateResult => {\n  const client = usePipecatClient();\n  const [connectionState, setConnectionState] =\n    useState<PipecatConnectionState>(\n      deriveState(client?.state ?? \"disconnected\"),\n    );\n\n  useRTVIClientEvent(\n    RTVIEvent.TransportStateChanged,\n    useCallback((state: TransportState) => {\n      setConnectionState(deriveState(state));\n    }, []),\n  );\n\n  return {\n    state: connectionState,\n    isConnected: connectionState === \"connected\",\n    isConnecting: connectionState === \"connecting\",\n    isDisconnected: connectionState === \"disconnected\",\n  };\n};\n","import {\n  Button,\n  ButtonProps,\n  Input,\n  InputProps,\n  Textarea,\n} from \"@/components/ui\";\nimport { usePipecatConnectionState } from \"@/hooks/usePipecatConnectionState\";\nimport { cn } from \"@/lib/utils\";\nimport { usePipecatClient } from \"@pipecat-ai/client-react\";\nimport { SendIcon } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useConversationContext } from \"@pipecat-ai/client-react\";\n\nexport interface TextInputComponentProps {\n  debounceTime?: number;\n  onSend?: (message: string) => Promise<void> | void;\n  disabled?: boolean;\n  multiline?: boolean;\n  buttonLabel?: React.ReactNode;\n  buttonIcon?: React.ReactNode;\n  buttonProps?: ButtonProps;\n  inputProps?: InputProps;\n  classNames?: {\n    container?: string;\n    input?: string;\n    button?: string;\n  };\n  placeholder?: string;\n  size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n}\n\nexport const TextInputComponent = ({\n  debounceTime = 300,\n  onSend,\n  disabled,\n  classNames,\n  multiline = false,\n  buttonLabel,\n  buttonIcon = <SendIcon />,\n  buttonProps,\n  placeholder = \"Type message...\",\n  size = \"md\",\n}: TextInputComponentProps) => {\n  const [isSending, setIsSending] = useState(false);\n  const [message, setMessage] = useState(\"\");\n  const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  const handleSend = useCallback(async () => {\n    if (!message.trim() || isSending) return;\n\n    setIsSending(true);\n    try {\n      await onSend?.(message);\n      // Only clear message on successful send\n      setMessage(\"\");\n    } catch (error) {\n      // Keep message in input if send fails\n      // Error handling can be added here if needed (e.g., show toast)\n      console.error(\"Failed to send message:\", error);\n    } finally {\n      setIsSending(false);\n    }\n  }, [message, onSend, isSending]);\n\n  // Refocus input after message is cleared (successful send)\n  useEffect(() => {\n    if (message === \"\" && !isSending && containerRef.current) {\n      const input = containerRef.current.querySelector<HTMLInputElement>(\n        'input[data-slot=\"input\"], textarea[data-slot=\"textarea\"]',\n      );\n      input?.focus();\n    }\n  }, [message, isSending]);\n\n  useEffect(() => {\n    if (!message.trim()) return;\n\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n    }\n\n    timeoutRef.current = setTimeout(() => {\n      timeoutRef.current = null;\n    }, debounceTime);\n\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n    };\n  }, [message, debounceTime]);\n\n  const handleInputChange = (\n    e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\n  ) => {\n    setMessage(e.target.value);\n  };\n\n  const handleKeyDown = (\n    e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>,\n  ) => {\n    if (e.key === \"Enter\" && !e.shiftKey) {\n      e.preventDefault();\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n        timeoutRef.current = null;\n      }\n      handleSend();\n    }\n  };\n\n  const canSend = !disabled && !isSending && !!message.trim();\n\n  const InputComponent = multiline ? Textarea : Input;\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(\"flex flex-row gap-2 items-center\", classNames?.container)}\n    >\n      <InputComponent\n        placeholder={placeholder}\n        value={message}\n        onChange={handleInputChange}\n        onKeyDown={handleKeyDown}\n        disabled={disabled || isSending}\n        size={size}\n        className={cn(\"flex-1\", classNames?.input)}\n        {...(multiline && { multiline: true })}\n      />\n      <Button\n        onClick={handleSend}\n        disabled={!canSend}\n        isLoading={isSending}\n        size={size}\n        className={cn(\"shrink-0\", classNames?.button)}\n        isIcon={!buttonLabel}\n        {...buttonProps}\n      >\n        {!isSending && !buttonLabel && buttonIcon}\n        {buttonLabel}\n      </Button>\n    </div>\n  );\n};\n\nexport interface SendTextOptions {\n  run_immediately?: boolean;\n  audio_response?: boolean;\n}\n\nexport const TextInput = ({\n  debounceTime = 300,\n  disabled,\n  sendTextOptions,\n  noConnectedPlaceholder = \"Connect to send\",\n  noInject = false,\n  onSend,\n  ...props\n}: TextInputComponentProps & {\n  sendTextOptions?: SendTextOptions;\n  noConnectedPlaceholder?: string;\n  noInject?: boolean;\n}) => {\n  const { isConnected } = usePipecatConnectionState();\n  const client = usePipecatClient();\n\n  const { injectMessage } = useConversationContext();\n\n  const handleSend = useCallback(\n    async (message: string) => {\n      // Validate connection before attempting to send\n      if (!isConnected || !client) {\n        return;\n      }\n\n      // Inject message to store first (if enabled)\n      if (!noInject) {\n        injectMessage({\n          role: \"user\",\n          parts: [\n            {\n              text: message,\n              final: true,\n              createdAt: new Date().toISOString(),\n            },\n          ],\n        });\n      }\n\n      // Send the message through the client\n      await client.sendText(message, sendTextOptions);\n\n      // Call the optional callback after successful send\n      onSend?.(message);\n    },\n    [isConnected, client, injectMessage, noInject, onSend, sendTextOptions],\n  );\n\n  return (\n    <TextInputComponent\n      debounceTime={debounceTime}\n      disabled={disabled || !isConnected}\n      onSend={handleSend}\n      placeholder={!isConnected ? noConnectedPlaceholder : props.placeholder}\n      {...props}\n    />\n  );\n};\n","import { cn } from \"@/lib/utils\";\nimport type { TextRenderMode } from \"@/types/conversation\";\nimport {\n  useConversationContext,\n  usePipecatClientTransportState,\n  usePipecatConversation,\n} from \"@pipecat-ai/client-react\";\nimport { memo, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { MessageContainer } from \"./MessageContainer\";\nimport { TextInput } from \"./TextInput\";\n\n/**\n * Props for the Conversation component\n */\nexport interface ConversationProps {\n  /**\n   * Custom CSS classes for different parts of the component\n   */\n  classNames?: {\n    /** CSS classes for the main container */\n    container?: string;\n    /** CSS classes for individual message containers */\n    message?: string;\n    /** CSS classes for message content area */\n    messageContent?: string;\n    /** CSS classes for role labels */\n    role?: string;\n    /** CSS classes for timestamp elements */\n    time?: string;\n    /** CSS classes for thinking indicator */\n    thinking?: string;\n  };\n  /**\n   * Disable automatic scrolling when new messages arrive\n   * @default false\n   */\n  noAutoscroll?: boolean;\n  /**\n   * Display messages in reverse order (newest first)\n   * When enabled, new messages appear at the top and auto-scroll targets the top\n   * @default false\n   */\n  reverseOrder?: boolean;\n  /**\n   * Custom label for assistant messages\n   * @default \"assistant\"\n   */\n  assistantLabel?: string;\n  /**\n   * Custom label for user/client messages\n   * @default \"user\"\n   */\n  clientLabel?: string;\n  /**\n   * Custom label for system messages\n   * @default \"system\"\n   */\n  systemLabel?: string;\n  /**\n   * Custom label for function call entries\n   * @default \"function call\"\n   */\n  functionCallLabel?: string;\n  /**\n   * Custom renderer for function call messages.\n   * When provided, replaces the default function call rendering.\n   * Receives the full FunctionCallData so developers can render\n   * differently based on function name, status, args, and result.\n   *\n   * @example\n   * ```tsx\n   * <Conversation\n   *   functionCallRenderer={(fc) => {\n   *     switch (fc.function_name) {\n   *       case \"get_weather\":\n   *         return <WeatherCard functionCall={fc} />;\n   *       default:\n   *         return <FunctionCallContent functionCall={fc} />;\n   *     }\n   *   }}\n   * />\n   * ```\n   */\n  functionCallRenderer?: React.ComponentProps<\n    typeof MessageContainer\n  >[\"functionCallRenderer\"];\n  /**\n   * Disable the text input field at the bottom of the conversation\n   * @default false\n   */\n  noTextInput?: boolean;\n  /**\n   * Disable rendering of function call messages in the conversation.\n   * Function call data is still captured in the store.\n   * @default false\n   */\n  noFunctionCalls?: boolean;\n  /**\n   * Custom renderers for BotOutput content based on aggregation type\n   * Key is the aggregation type (e.g., \"code\", \"link\"), value is a renderer function\n   */\n  botOutputRenderers?: React.ComponentProps<\n    typeof MessageContainer\n  >[\"botOutputRenderers\"];\n  /**\n   * Metadata for aggregation types to control rendering and speech progress behavior\n   * Key is the aggregation type (e.g., \"code\", \"link\"), value is metadata configuration\n   */\n  aggregationMetadata?: React.ComponentProps<\n    typeof MessageContainer\n  >[\"aggregationMetadata\"];\n  /**\n   * Controls how bot message text is rendered.\n   * - \"karaoke\": Full text, already-spoken portion normal, upcoming portion muted (default)\n   * - \"captions\": Show only the portion that has been spoken (synced to audio)\n   * - \"instant\": Show the full LLM text immediately, no highlighting\n   * @default \"karaoke\"\n   */\n  textRenderMode?: TextRenderMode;\n}\n\n/**\n * Conversation component that displays real-time conversation history between users and AI assistants.\n *\n * This component automatically integrates with the Pipecat Client SDK to show messages,\n * connection states, and provides smooth scrolling behavior. It must be used within\n * a PipecatClientProvider and ConversationProvider context.\n *\n * @example\n * ```tsx\n * import { Conversation } from \"@pipecat-ai/voice-ui-kit\";\n *\n * <div className=\"h-96 border rounded-lg\">\n *   <Conversation\n *     assistantLabel=\"AI Assistant\"\n *     clientLabel=\"You\"\n *     noAutoscroll={false}\n *   />\n * </div>\n * ```\n *\n * @param props - The component props\n * @param props.classNames - Custom CSS classes for styling different parts\n * @param props.noAutoscroll - Whether to disable automatic scrolling\n * @param props.assistantLabel - Custom label for assistant messages\n * @param props.clientLabel - Custom label for user messages\n *\n * @returns A React component that renders the conversation interface\n */\nexport const Conversation: React.FC<ConversationProps> = memo(\n  ({\n    assistantLabel,\n    classNames = {},\n    clientLabel,\n    noAutoscroll = false,\n    noTextInput = false,\n    noFunctionCalls = false,\n    reverseOrder = false,\n    systemLabel,\n    functionCallLabel,\n    functionCallRenderer,\n    botOutputRenderers,\n    aggregationMetadata,\n    textRenderMode,\n  }) => {\n    const transportState = usePipecatClientTransportState();\n\n    const scrollRef = useRef<HTMLDivElement>(null);\n    const isScrolledToEdge = useRef(true);\n\n    /**\n     * Scrolls to the edge of the conversation if the user is already there.\n     * In normal mode, scrolls to the bottom. In reverse mode, scrolls to the top.\n     * This prevents interrupting users who are reading previous messages.\n     */\n    const maybeScrollToEdge = useCallback(() => {\n      if (!scrollRef.current) return;\n      if (isScrolledToEdge.current) {\n        scrollRef.current.scrollTo({\n          top: reverseOrder ? 0 : scrollRef.current.scrollHeight,\n          behavior: \"smooth\",\n        });\n      }\n    }, [reverseOrder]);\n\n    /**\n     * Updates the scroll state to track whether the user is at the target edge.\n     * In normal mode, tracks the bottom. In reverse mode, tracks the top.\n     * This is used to determine whether to auto-scroll when new messages arrive.\n     */\n    const updateScrollState = useCallback(() => {\n      if (!scrollRef.current || noAutoscroll) return;\n      if (reverseOrder) {\n        isScrolledToEdge.current = scrollRef.current.scrollTop <= 1;\n      } else {\n        isScrolledToEdge.current =\n          Math.ceil(\n            scrollRef.current.scrollHeight - scrollRef.current.scrollTop,\n          ) <= Math.ceil(scrollRef.current.clientHeight);\n      }\n    }, [noAutoscroll, reverseOrder]);\n\n    // Map textRenderMode to botOutputFilter\n    const botOutputFilter = useMemo(() => {\n      if (textRenderMode === \"captions\") return { unspoken: false };\n      return undefined; // \"karaoke\" and \"instant\" both need all data\n    }, [textRenderMode]);\n\n    const { messages: allMessages } = usePipecatConversation({\n      aggregationMetadata,\n      botOutputFilter,\n    });\n    const { botOutputSupported } = useConversationContext();\n\n    const messages = useMemo(\n      () =>\n        noFunctionCalls\n          ? allMessages.filter((m) => m.role !== \"function_call\")\n          : allMessages,\n      [allMessages, noFunctionCalls],\n    );\n\n    const messageClassNames = useMemo(\n      () => ({\n        container: classNames.message,\n        messageContent: classNames.messageContent,\n        thinking: classNames.thinking,\n        time: classNames.time,\n        role: classNames.role,\n      }),\n      [\n        classNames.message,\n        classNames.messageContent,\n        classNames.thinking,\n        classNames.time,\n        classNames.role,\n      ],\n    );\n\n    // Determine connection states based on transport state\n    const isConnecting =\n      transportState === \"authenticating\" || transportState === \"connecting\";\n    const isConnected =\n      transportState === \"connected\" || transportState === \"ready\";\n\n    // Auto-scroll when messages change (if enabled)\n    useEffect(() => {\n      if (noAutoscroll) return;\n      // Scroll to bottom when messages change\n      maybeScrollToEdge();\n    }, [messages, maybeScrollToEdge, noAutoscroll]);\n\n    // Set up scroll event listener to track user scroll position\n    const rafRef = useRef<number | undefined>(undefined);\n\n    useEffect(() => {\n      const scrollElement = scrollRef.current;\n      if (!scrollElement) return;\n\n      const handleScroll = () => {\n        if (rafRef.current !== undefined) return;\n        rafRef.current = requestAnimationFrame(() => {\n          rafRef.current = undefined;\n          updateScrollState();\n        });\n      };\n      scrollElement.addEventListener(\"scroll\", handleScroll, {\n        passive: true,\n      });\n\n      // Initial check\n      updateScrollState();\n\n      return () => {\n        scrollElement.removeEventListener(\"scroll\", handleScroll);\n        if (rafRef.current !== undefined) {\n          cancelAnimationFrame(rafRef.current);\n          rafRef.current = undefined;\n        }\n      };\n    }, [updateScrollState]);\n\n    const textInput = noTextInput ? null : (\n      <div className=\"p-3 border-t\">\n        <TextInput\n          classNames={{\n            container: \"items-center\",\n          }}\n        />\n      </div>\n    );\n\n    // Show messages first if they exist, regardless of connection state\n    if (messages.length > 0) {\n      return (\n        <div\n          className={cn(\"relative h-full flex flex-col\", classNames.container)}\n        >\n          <div\n            ref={scrollRef}\n            className={cn(\n              \"relative flex-1 overflow-y-auto p-4\",\n              !noTextInput && \"pb-2\",\n            )}\n          >\n            <div className={cn(classNames.message)}>\n              {(reverseOrder ? [...messages].reverse() : messages).map(\n                (message, index) => (\n                  <MessageContainer\n                    key={`${message.createdAt}-${index}`}\n                    message={message}\n                    assistantLabel={assistantLabel}\n                    clientLabel={clientLabel}\n                    systemLabel={systemLabel}\n                    functionCallLabel={functionCallLabel}\n                    functionCallRenderer={functionCallRenderer}\n                    classNames={messageClassNames}\n                    botOutputRenderers={botOutputRenderers}\n                    aggregationMetadata={aggregationMetadata}\n                    textRenderMode={textRenderMode}\n                  />\n                ),\n              )}\n            </div>\n          </div>\n          {textInput}\n        </div>\n      );\n    }\n\n    // Only show connection states if there are no messages\n    if (isConnecting) {\n      return (\n        <div\n          className={cn(\"relative h-full flex flex-col\", classNames.container)}\n        >\n          <div className=\"flex-1 flex items-center justify-center\">\n            <div className=\"text-muted-foreground text-sm\">\n              Connecting to agent...\n            </div>\n          </div>\n          {textInput}\n        </div>\n      );\n    }\n\n    if (!isConnected) {\n      return (\n        <div\n          className={cn(\"relative h-full flex flex-col\", classNames.container)}\n        >\n          <div className=\"flex-1 flex items-center justify-center\">\n            <div className=\"text-center p-4\">\n              <div className=\"text-muted-foreground mb-2\">\n                Not connected to agent\n              </div>\n              <p className=\"text-sm text-muted-foreground max-w-md\">\n                Connect to an agent to see conversation messages in real-time.\n              </p>\n            </div>\n          </div>\n          {textInput}\n        </div>\n      );\n    }\n\n    // Show warning if botOutput events are not supported\n    if (botOutputSupported === false) {\n      return (\n        <div\n          className={cn(\"relative h-full flex flex-col\", classNames.container)}\n        >\n          <div className=\"flex-1 flex items-center justify-center\">\n            <div className=\"text-center p-4 max-w-md\">\n              <div className=\"text-destructive font-medium mb-2\">\n                BotOutput events not supported\n              </div>\n              <p className=\"text-sm text-muted-foreground\">\n                This server does not support BotOutput events (requires RTVI\n                1.1.0+). Conversation messages cannot be displayed without\n                BotOutput event support.\n              </p>\n            </div>\n          </div>\n          {textInput}\n        </div>\n      );\n    }\n\n    return (\n      <div\n        className={cn(\"relative h-full flex flex-col\", classNames.container)}\n      >\n        <div className=\"flex-1 flex items-center justify-center\">\n          <div className=\"text-muted-foreground text-sm\">\n            Waiting for messages...\n          </div>\n        </div>\n        {textInput}\n      </div>\n    );\n  },\n);\n\n/**\n * Default export of the Conversation component\n */\nexport default Conversation;\n","import { Button } from \"@/components/ui/button\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\nimport { CopyCheckIcon, CopyIcon } from \"lucide-react\";\nimport React, { useState } from \"react\";\n\ninterface CopyTextProps {\n  className?: string;\n  iconSize?: number;\n  text: string;\n}\n\nexport const CopyText: React.FC<CopyTextProps> = ({\n  text,\n  iconSize = 16,\n  className = \"\",\n}) => {\n  const [copied, setCopied] = useState(false);\n\n  const copyToClipboard = async () => {\n    try {\n      await navigator.clipboard.writeText(text);\n      setCopied(true);\n      setTimeout(() => setCopied(false), 2000);\n    } catch (err) {\n      console.error(\"Failed to copy text: \", err);\n    }\n  };\n\n  return (\n    <div className={cn(\"flex items-center overflow-hidden w-full\", className)}>\n      <span className=\"truncate min-w-0\">{text}</span>\n      <TooltipProvider>\n        <Tooltip>\n          <TooltipTrigger asChild>\n            <Button\n              variant=\"ghost\"\n              isIcon\n              size=\"sm\"\n              className=\"flex-none text-muted-foreground\"\n              onClick={copyToClipboard}\n              aria-label=\"Copy to clipboard\"\n            >\n              {copied ? (\n                <CopyCheckIcon size={iconSize} />\n              ) : (\n                <CopyIcon size={iconSize} />\n              )}\n            </Button>\n          </TooltipTrigger>\n          <TooltipContent>\n            {copied ? \"Copied!\" : \"Copy to clipboard\"}\n          </TooltipContent>\n        </Tooltip>\n      </TooltipProvider>\n    </div>\n  );\n};\n\nexport default CopyText;\n","import {\n  DropdownMenu,\n  DropdownMenuCheckboxItem,\n  DropdownMenuContent,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/lib/utils\";\n\nimport {\n  type OptionalMediaDeviceInfo,\n  usePipecatClientMediaDevices,\n} from \"@pipecat-ai/client-react\";\n\n/**\n * Props for the headless DeviceDropDown component that accepts device data and callbacks as props.\n * This variant allows you to use the component with any framework or state management solution.\n */\nexport interface DeviceDropDownComponentProps {\n  /** The trigger element that opens the dropdown menu. Can be any React element. */\n  children: React.ReactNode;\n  /** Whether to hide the menu label at the top of the dropdown. */\n  noMenuLabel?: boolean;\n  /** Whether to hide the separator below the menu label. */\n  noMenuSeparator?: boolean;\n  /** Text label displayed at the top of the dropdown menu. */\n  menuLabel?: string;\n  /** Array of available microphone devices from the MediaDevices API. */\n  availableDevices?: MediaDeviceInfo[];\n  /** Currently selected microphone device. */\n  selectedDevice?: OptionalMediaDeviceInfo;\n  /** Callback function called when a device is selected. */\n  updateDevice?: (deviceId: string) => void;\n  /** Custom CSS classes for different parts of the component. */\n  classNames?: {\n    /** CSS classes for the dropdown menu content container. */\n    dropdownMenuContent?: string;\n    /** CSS classes for individual dropdown menu checkbox items. */\n    dropdownMenuCheckboxItem?: string;\n    /** CSS classes for the dropdown menu label. */\n    dropdownMenuLabel?: string;\n  };\n}\n\n/**\n * Props for the connected DeviceDropDown component that automatically integrates with Pipecat Client.\n * This variant must be used within a PipecatClientProvider context.\n */\nexport type DeviceDropDownProps = Omit<\n  DeviceDropDownComponentProps,\n  \"availableDevices\" | \"selectedDevice\" | \"updateDevice\"\n>;\n\n/**\n * Headless dropdown menu component for selecting microphone input devices.\n *\n * This component provides a flexible dropdown interface that accepts device data and callbacks as props,\n * making it suitable for use with any framework or state management solution.\n *\n * @example\n * ```tsx\n * import { DeviceDropDownComponent, Button } from \"@pipecat-ai/voice-ui-kit\";\n *\n * <DeviceDropDownComponent\n *   availableDevices={microphones}\n *   selectedDevice={selectedMic}\n *   updateDevice={setMicrophone}\n *   menuLabel=\"Select Microphone\"\n * >\n *   <Button variant=\"outline\">Choose Device</Button>\n * </DeviceDropDownComponent>\n * ```\n */\nexport const DeviceDropDownComponent = ({\n  children,\n  noMenuLabel = false,\n  noMenuSeparator = false,\n  menuLabel = \"Device select\",\n  availableDevices,\n  selectedDevice,\n  updateDevice,\n  classNames,\n}: DeviceDropDownComponentProps) => {\n  return (\n    <DropdownMenu>\n      <DropdownMenuTrigger asChild>{children}</DropdownMenuTrigger>\n      <DropdownMenuContent\n        align=\"end\"\n        className={cn(classNames?.dropdownMenuContent)}\n      >\n        {!noMenuLabel && (\n          <DropdownMenuLabel className={cn(classNames?.dropdownMenuLabel)}>\n            {menuLabel}\n          </DropdownMenuLabel>\n        )}\n        {!noMenuSeparator && <DropdownMenuSeparator />}\n        {availableDevices?.map((device) => (\n          <DropdownMenuCheckboxItem\n            key={device.deviceId}\n            checked={selectedDevice?.deviceId === device.deviceId}\n            onCheckedChange={() => updateDevice?.(device.deviceId)}\n            className={cn(classNames?.dropdownMenuCheckboxItem)}\n          >\n            {device.label || `Device ${device.deviceId.slice(0, 5)}`}\n          </DropdownMenuCheckboxItem>\n        ))}\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n};\n\n/**\n * Connected dropdown menu component for selecting microphone input devices.\n *\n * This component automatically integrates with the Pipecat Client SDK to fetch available microphones\n * and handle device selection. It must be used within a PipecatClientProvider context.\n *\n * The component will automatically:\n * - Fetch available microphone devices\n * - Display the currently selected microphone\n * - Handle device selection changes\n * - Update the Pipecat Client's microphone configuration\n *\n * @example\n * ```tsx\n * import { DeviceDropDown, Button } from \"@pipecat-ai/voice-ui-kit\";\n *\n * <DeviceDropDown menuLabel=\"Select Microphone\">\n *   <Button variant=\"outline\">Choose Device</Button>\n * </DeviceDropDown>\n * ```\n */\nexport const DeviceDropDown: React.FC<DeviceDropDownProps> = (props) => {\n  const { availableMics, selectedMic, updateMic } =\n    usePipecatClientMediaDevices();\n\n  return (\n    <DeviceDropDownComponent\n      availableDevices={availableMics}\n      selectedDevice={selectedMic}\n      updateDevice={updateMic}\n      {...props}\n    />\n  );\n};\n\nexport default DeviceDropDown;\n","import {\n  Select,\n  SelectContent,\n  type SelectContentProps,\n  SelectGuide,\n  SelectItem,\n  type SelectProps,\n  SelectTrigger,\n  type SelectTriggerProps,\n  SelectValue,\n} from \"@/components/ui/select\";\nimport { cn } from \"@/lib/utils\";\nimport {\n  type OptionalMediaDeviceInfo,\n  usePipecatClientMediaDevices,\n} from \"@pipecat-ai/client-react\";\n\nexport interface DeviceSelectBaseProps\n  extends Omit<SelectTriggerProps, \"children\"> {\n  placeholder?: string;\n  guide?: React.ReactNode;\n  classNames?: {\n    selectTrigger?: string;\n    selectContent?: string;\n    selectItem?: string;\n  };\n  selectProps?: SelectProps;\n  contentProps?: SelectContentProps;\n}\n\nexport interface DeviceSelectComponentProps extends DeviceSelectBaseProps {\n  availableDevices?: MediaDeviceInfo[];\n  selectedDevice?: OptionalMediaDeviceInfo;\n  updateDevice?: (deviceId: string) => void;\n}\n\nexport const DeviceSelectComponent = ({\n  placeholder = \"Device select\",\n  guide,\n  availableDevices,\n  selectedDevice,\n  updateDevice,\n  className,\n  classNames,\n  selectProps,\n  contentProps,\n  ...triggerProps\n}: DeviceSelectComponentProps) => {\n  const selectedValue = selectedDevice?.deviceId ?? \"\";\n\n  return (\n    <Select\n      value={selectedValue}\n      onValueChange={(v) => updateDevice?.(v)}\n      {...selectProps}\n    >\n      <SelectTrigger\n        className={cn(classNames?.selectTrigger, className)}\n        {...triggerProps}\n      >\n        {guide ? <SelectGuide>{guide}</SelectGuide> : null}\n        <SelectValue placeholder={placeholder} />\n      </SelectTrigger>\n      <SelectContent\n        className={cn(classNames?.selectContent)}\n        {...contentProps}\n      >\n        {availableDevices?.map((device) => (\n          <SelectItem\n            key={device.deviceId}\n            value={device.deviceId}\n            className={cn(classNames?.selectItem)}\n          >\n            {device.label || `Device ${device.deviceId.slice(0, 5)}`}\n          </SelectItem>\n        ))}\n      </SelectContent>\n    </Select>\n  );\n};\n\nexport const DeviceSelect: React.FC<DeviceSelectBaseProps> = (props) => {\n  const { availableMics, selectedMic, updateMic } =\n    usePipecatClientMediaDevices();\n\n  return (\n    <DeviceSelectComponent\n      availableDevices={availableMics}\n      selectedDevice={selectedMic}\n      updateDevice={updateMic}\n      {...props}\n    />\n  );\n};\n\nexport default DeviceSelect;\n","import { getPipecatUIContainer } from \"@/lib/dom\";\nimport { cn } from \"@/lib/utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ninterface HighlightOverlayProps {\n  className?: string;\n  offset?: number;\n  autoClearDuration?: number;\n  highlightedElement?: string | null;\n  elementRefs?: Record<string, HTMLElement | null>;\n  onHighlightElement?: (elementId: string | null) => void;\n}\n\nexport const HighlightOverlay = ({\n  className = \"ring-4\",\n  offset = 4,\n  autoClearDuration = 3000,\n  highlightedElement,\n  elementRefs = {},\n  onHighlightElement,\n}: HighlightOverlayProps) => {\n  const [position, setPosition] = useState<{\n    top: number;\n    left: number;\n    width: number;\n    height: number;\n  } | null>(null);\n  const observerRef = useRef<ResizeObserver | null>(null);\n  const scrollHandlerRef = useRef<number | null>(null);\n  const timeoutRef = useRef<number | null>(null);\n\n  const targetElementId = highlightedElement;\n  const targetElement = useMemo(() => {\n    if (!targetElementId) return null;\n\n    // Prefer provided refs map\n    const refMatch = elementRefs[targetElementId] ?? null;\n    if (refMatch) return refMatch;\n\n    // Fallback to DOM lookup by id (supports optional leading '#')\n    if (typeof document === \"undefined\") return null;\n    const domId = targetElementId.startsWith(\"#\")\n      ? targetElementId.slice(1)\n      : targetElementId;\n    return document.getElementById(domId);\n  }, [elementRefs, targetElementId]);\n  const [isReady, setIsReady] = useState(false);\n  const [animationKey, setAnimationKey] = useState(0);\n  const isActive = !!targetElementId && !!targetElement && isReady;\n\n  // Track previous target to detect changes\n  const prevTargetRef = useRef<HTMLElement | null>(null);\n\n  const updatePosition = useCallback(() => {\n    if (!targetElement) return;\n\n    const rect = targetElement.getBoundingClientRect();\n    setPosition({\n      // Use viewport coordinates because overlay is position: fixed\n      top: rect.top,\n      left: rect.left,\n      width: rect.width,\n      height: rect.height,\n    });\n  }, [targetElement]);\n\n  // Auto-clear timer - runs regardless of DOM element existence\n  useEffect(() => {\n    if (!targetElementId || autoClearDuration <= 0 || !onHighlightElement) {\n      return;\n    }\n\n    // Set up auto-clear timeout\n    timeoutRef.current = window.setTimeout(() => {\n      onHighlightElement(null);\n    }, autoClearDuration);\n\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n    };\n  }, [targetElementId, autoClearDuration, onHighlightElement]);\n\n  // DOM positioning and ResizeObserver - only runs if element exists\n  useEffect(() => {\n    // Immediately clear position when target changes\n    if (!targetElement || !targetElementId) {\n      setPosition(null);\n      setIsReady(false);\n      prevTargetRef.current = null;\n      return;\n    }\n\n    // If target element changed, reset ready state and animation\n    if (prevTargetRef.current !== targetElement) {\n      setIsReady(false);\n      setPosition(null);\n      setAnimationKey((prev) => prev + 1);\n      prevTargetRef.current = targetElement;\n    }\n\n    // Wait for next paint cycle and ensure element is ready\n    const checkElementReady = () => {\n      const rect = targetElement.getBoundingClientRect();\n      if (rect.width > 0 && rect.height > 0) {\n        updatePosition();\n        setIsReady(true);\n      } else {\n        requestAnimationFrame(checkElementReady);\n      }\n    };\n\n    requestAnimationFrame(checkElementReady);\n\n    // Set up ResizeObserver\n    observerRef.current = new ResizeObserver(() => {\n      updatePosition();\n    });\n\n    // Observe the target element and its ancestors for layout changes\n    let currentElement: Element | null = targetElement;\n    while (currentElement && currentElement !== document.body) {\n      observerRef.current.observe(currentElement);\n      currentElement = currentElement.parentElement;\n    }\n\n    return () => {\n      if (observerRef.current) {\n        observerRef.current.disconnect();\n      }\n    };\n  }, [targetElement, targetElementId, updatePosition]);\n\n  // Throttled scroll handler\n  useEffect(() => {\n    if (!isActive || !targetElement) return;\n\n    const handleScroll = () => {\n      if (scrollHandlerRef.current) {\n        cancelAnimationFrame(scrollHandlerRef.current);\n      }\n\n      scrollHandlerRef.current = requestAnimationFrame(() => {\n        updatePosition();\n      });\n    };\n\n    window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n    return () => {\n      window.removeEventListener(\"scroll\", handleScroll);\n      if (scrollHandlerRef.current) {\n        cancelAnimationFrame(scrollHandlerRef.current);\n      }\n    };\n  }, [isActive, targetElement, updatePosition]);\n\n  if (!isActive || !position) return null;\n\n  return createPortal(\n    <div\n      key={animationKey}\n      className={cn(\n        \"fixed pointer-events-none z-50 animate-highlight\",\n        className,\n      )}\n      style={\n        {\n          top: position.top - offset,\n          left: position.left - offset,\n          width: position.width + offset * 2,\n          height: position.height + offset * 2,\n          \"--highlight-final-opacity\": autoClearDuration > 0 ? \"0\" : \"1\",\n        } as React.CSSProperties & { \"--highlight-final-opacity\": string }\n      }\n    />,\n    getPipecatUIContainer(),\n  );\n};\n","import React from \"react\";\n\ninterface PipecatLogoProps {\n  alt?: string;\n  className?: string;\n  color?: string;\n  height?: number;\n  width?: number;\n}\n\nconst aspectRatio = 45 / 26;\n\nexport const PipecatLogo: React.FC<PipecatLogoProps> = ({\n  className = \"\",\n  alt = \"Pipecat Logo\",\n  color = \"currentColor\",\n  height,\n  width,\n}) => {\n  const resolvedHeight = height\n    ? height\n    : width\n      ? Math.round(width / aspectRatio)\n      : 100;\n  const resolvedWidth = width\n    ? width\n    : height\n      ? Math.round(height * aspectRatio)\n      : 200;\n\n  return (\n    <svg\n      width={resolvedWidth}\n      height={resolvedHeight}\n      viewBox=\"0 0 45 26\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={className}\n      aria-label={alt}\n    >\n      <path\n        d=\"M6.19825 0.104287C6.83144 -0.13411 7.5461 0.044779 7.99232 0.553371L13.8037 7.17714H31.1545L36.9659 0.553371C37.4121 0.044779 38.1268 -0.13411 38.76 0.104287C39.3932 0.342685 39.8124 0.948477 39.8124 1.62507V16.25H44.9582V19.5H36.5624V5.94116L33.112 9.87383C32.8035 10.2255 32.3584 10.4271 31.8905 10.4271H13.0677C12.5998 10.4271 12.1547 10.2255 11.8462 9.87383L8.39581 5.94116V19.5H0V16.25H5.14582V1.62507C5.14582 0.948477 5.56505 0.342685 6.19825 0.104287Z\"\n        fill={color}\n      />\n      <path d=\"M36.5624 22.75H44.9582V26H36.5624V22.75Z\" fill={color} />\n      <path d=\"M0 22.75H8.39581V26H0V22.75Z\" fill={color} />\n      <path\n        d=\"M17.3333 17.3334C17.3333 18.53 16.3632 19.5 15.1666 19.5C13.97 19.5 13 18.53 13 17.3334C13 16.1367 13.97 15.1667 15.1666 15.1667C16.3632 15.1667 17.3333 16.1367 17.3333 17.3334Z\"\n        fill={color}\n      />\n      <path\n        d=\"M31.9582 17.3334C31.9582 18.53 30.9882 19.5 29.7916 19.5C28.595 19.5 27.6249 18.53 27.6249 17.3334C27.6249 16.1367 28.595 15.1667 29.7916 15.1667C30.9882 15.1667 31.9582 16.1367 31.9582 17.3334Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n\nexport default PipecatLogo;\n","import CopyText from \"@/components/elements/CopyText\";\nimport DataList from \"@/components/elements/DataList\";\nimport { TextDashBlankslate } from \"@/index\";\nimport Daily from \"@daily-co/daily-js\";\nimport { BotReadyData, RTVIEvent } from \"@pipecat-ai/client-js\";\nimport { usePipecatClient, useRTVIClientEvent } from \"@pipecat-ai/client-react\";\nimport { useState } from \"react\";\n\ninterface Props {\n  noTransportType?: boolean;\n  noSessionId?: boolean;\n  noParticipantId?: boolean;\n  noRTVIVersion?: boolean;\n  participantId?: string;\n  sessionId?: string;\n}\n\nexport const SessionInfo: React.FC<Props> = ({\n  noTransportType = false,\n  noSessionId = false,\n  noParticipantId = false,\n  noRTVIVersion = false,\n  sessionId,\n  participantId,\n}) => {\n  const client = usePipecatClient();\n  const [serverVersion, setServerVersion] = useState<string | null>(null);\n\n  // Reset server version on disconnect\n  useRTVIClientEvent(RTVIEvent.Disconnected, () => {\n    setServerVersion(null);\n  });\n\n  // Track server RTVI version from BotReady event\n  useRTVIClientEvent(RTVIEvent.BotReady, (botData: BotReadyData) => {\n    setServerVersion(botData.version);\n  });\n\n  let transportTypeName = \"Unknown\";\n  if (client && \"dailyCallClient\" in client.transport) {\n    transportTypeName = `Daily (v${Daily.version()})`;\n  } else if (\n    // @ts-expect-error - __proto__ not typed\n    client?.transport.__proto__.constructor.SERVICE_NAME ===\n    \"small-webrtc-transport\"\n  ) {\n    transportTypeName = \"Small WebRTC\";\n  }\n\n  const data: React.ComponentProps<typeof DataList>[\"data\"] = {};\n  if (!noTransportType) {\n    data[\"Transport\"] = transportTypeName;\n  }\n  if (!noSessionId) {\n    data[\"Session ID\"] = sessionId ? (\n      <CopyText className=\"justify-end\" iconSize={12} text={sessionId} />\n    ) : (\n      <TextDashBlankslate />\n    );\n  }\n  if (!noParticipantId) {\n    data[\"Participant ID\"] = participantId ? (\n      <CopyText className=\"justify-end\" iconSize={12} text={participantId} />\n    ) : (\n      <TextDashBlankslate />\n    );\n  }\n  if (!noRTVIVersion) {\n    const clientVersion = client?.version;\n    data[\"RTVI Client\"] = clientVersion ? (\n      `v${clientVersion}`\n    ) : (\n      <TextDashBlankslate />\n    );\n    data[\"RTVI Server\"] = serverVersion ? (\n      `v${serverVersion}`\n    ) : (\n      <TextDashBlankslate />\n    );\n  }\n\n  return (\n    <DataList\n      classNames={{ container: \"w-full overflow-hidden\" }}\n      data={data}\n    />\n  );\n};\n","/**\n * Version comparison utilities for semantic versioning using the semver package\n */\n\nimport semver from \"semver\";\n\n/**\n * Converts a version array [major, minor, patch] to a semver string\n */\nfunction versionArrayToString(version: [number, number, number]): string {\n  return `${version[0]}.${version[1]}.${version[2]}`;\n}\n\n/**\n * Checks if a version meets a minimum version requirement.\n * @param currentVersion - The current version string (e.g., \"0.0.98\")\n * @param minVersion - The minimum version as an array [major, minor, patch]\n * @returns true if currentVersion >= minVersion\n */\nexport function isMinVersion(\n  currentVersion: string,\n  minVersion: [number, number, number],\n): boolean {\n  const minVersionStr = versionArrayToString(minVersion);\n  return semver.gte(currentVersion, minVersionStr);\n}\n\n/**\n * Checks if a version is below a maximum version.\n * @param currentVersion - The current version string (e.g., \"0.0.98\")\n * @param maxVersion - The maximum version as an array [major, minor, patch]\n * @returns true if currentVersion <= maxVersion\n */\nexport function isMaxVersion(\n  currentVersion: string,\n  maxVersion: [number, number, number],\n): boolean {\n  const maxVersionStr = versionArrayToString(maxVersion);\n  return semver.lte(currentVersion, maxVersionStr);\n}\n\n/**\n * Checks if a version is within a version range (inclusive).\n * @param currentVersion - The current version string (e.g., \"0.0.98\")\n * @param minVersion - The minimum version as an array [major, minor, patch]\n * @param maxVersion - The maximum version as an array [major, minor, patch]\n * @returns true if minVersion <= currentVersion <= maxVersion\n */\nexport function isVersionInRange(\n  currentVersion: string,\n  minVersion: [number, number, number],\n  maxVersion: [number, number, number],\n): boolean {\n  const minVersionStr = versionArrayToString(minVersion);\n  const maxVersionStr = versionArrayToString(maxVersion);\n  // Use semver's satisfies with a range\n  return semver.satisfies(\n    currentVersion,\n    `>=${minVersionStr} <=${maxVersionStr}`,\n  );\n}\n","\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { BotOutputData, BotReadyData, RTVIEvent } from \"@pipecat-ai/client-js\";\nimport {\n  usePipecatClientTransportState,\n  useRTVIClientEvent,\n} from \"@pipecat-ai/client-react\";\nimport { isMinVersion } from \"@/utils/version\";\nimport { cva } from \"class-variance-authority\";\nimport { useCallback, useState } from \"react\";\n\n/**\n * Base props shared by all transcript overlay components\n */\ninterface BaseTranscriptOverlayProps {\n  /** Additional CSS classes to apply to the component */\n  className?: string;\n  /** Size variant of the transcript overlay */\n  size?: \"sm\" | \"md\" | \"lg\";\n  /** Duration of the fade-in animation in milliseconds (default: 300) */\n  fadeInDuration?: number;\n  /** Duration of the fade-out animation in milliseconds (default: 1000) */\n  fadeOutDuration?: number;\n}\n\n/**\n * Props for the connected TranscriptOverlay component that integrates with Pipecat\n */\ninterface TranscriptOverlayProps extends BaseTranscriptOverlayProps {\n  /** The participant type - \"local\" for user speech, \"remote\" for bot speech */\n  participant: \"local\" | \"remote\";\n}\n\n/**\n * Props for the headless TranscriptOverlayComponent (for manual control)\n */\ninterface TranscriptOverlayComponentProps extends BaseTranscriptOverlayProps {\n  /** Array of words to display as individual animated spans */\n  words: string[];\n  /** Whether the current speech turn has ended (triggers fade-out animation) */\n  turnEnd?: boolean;\n}\n\nconst transcriptOverlayVariants = cva(\n  `mx-auto items-center justify-end text-center \n  *:box-decoration-clone *:text-balance *:mx-auto *:inline\n  *:bg-foreground *:text-background *:box-decoration-clone *:text-balance\n  `,\n  {\n    variants: {\n      size: {\n        sm: \"*:leading-4 *:px-2 *:py-1 *:text-xs *:font-medium *:rounded-md\",\n        md: \"*:leading-6 *:px-3 *:py-1.5 *:text-sm *:font-medium *:rounded-lg\",\n        lg: \"*:leading-7 *:px-4 *:py-2 *:text-base *:font-medium *:rounded-xl\",\n      },\n    },\n  },\n);\n\n/**\n * A simple component that renders transcript text as an animated span element.\n * Each word gets its own fade-in animation when rendered, creating a smooth\n * word-by-word appearance effect.\n *\n * @param text - The text content to display\n * @param fadeInDuration - Duration of the fade-in animation in milliseconds (default: 300)\n * @returns A span element with fade-in animation\n */\nexport const TranscriptOverlayPartComponent = ({\n  text,\n  fadeInDuration = 300,\n}: {\n  text: string;\n  fadeInDuration?: number;\n}) => (\n  <span\n    className=\"animate-in fade-in\"\n    style={{ animationDuration: `${fadeInDuration}ms` }}\n  >\n    {text}\n  </span>\n);\n\n/**\n * The main transcript overlay component that handles the visual presentation of transcript text.\n * This component provides the styling and animation for displaying speech transcripts with\n * word-by-word fade-in animations and optional fade-out when the turn ends.\n *\n * The background wraps around each line of text, creating separate background blocks\n * for multi-line transcripts while maintaining smooth word-by-word animations.\n *\n * @param words - Array of words to display as individual animated spans\n * @param className - Additional CSS classes to apply\n * @param size - Size variant of the overlay (\"sm\", \"md\", or \"lg\")\n * @param turnEnd - Whether the current speech turn has ended (triggers fade-out animation)\n * @param fadeInDuration - Duration of the fade-in animation in milliseconds (default: 300)\n * @param fadeOutDuration - Duration of the fade-out animation in milliseconds (default: 1000)\n * @returns A div element containing the styled transcript overlay\n */\nexport const TranscriptOverlayComponent = ({\n  words,\n  className,\n  size = \"md\",\n  turnEnd,\n  fadeInDuration = 300,\n  fadeOutDuration = 1000,\n}: TranscriptOverlayComponentProps) => {\n  const containerStyle = {\n    \"--fade-in-duration\": `${fadeInDuration}ms`,\n    ...(turnEnd && { animationDuration: `${fadeOutDuration}ms` }),\n  } as React.CSSProperties;\n\n  return (\n    <div\n      className={cn(\n        transcriptOverlayVariants({ size }),\n        turnEnd ? \"animate-out fade-out fill-mode-forwards\" : \"\",\n        className,\n      )}\n      style={containerStyle}\n    >\n      <p>\n        {words.map((word, index) => (\n          <TranscriptOverlayPartComponent\n            key={index}\n            text={word + (index < words.length - 1 ? \" \" : \"\")}\n            fadeInDuration={fadeInDuration}\n          />\n        ))}\n      </p>\n    </div>\n  );\n};\n\n/**\n * A React component that displays real-time speech transcripts as an overlay.\n *\n * This component listens to Pipecat Client events to automatically display\n * speech transcripts from either the local user or remote bot. It provides\n * smooth word-by-word fade-in animations and handles the accumulation of\n * transcript text as speech progresses.\n *\n * The component integrates with the Pipecat Client SDK and must be used\n * within a PipecatClientProvider context to function properly.\n *\n * Features:\n * - Real-time transcript display with word-by-word animations\n * - Automatic transcript accumulation and cleanup\n * - Smooth fade-in/fade-out animations\n * - Support for both local and remote participants\n * - Responsive design with line-wrapped backgrounds\n *\n * @param participant - Whether to display \"local\" (user) or \"remote\" (bot) transcripts\n * @param className - Additional CSS classes to apply to the component\n * @param size - Size variant of the transcript overlay (\"sm\", \"md\", or \"lg\")\n * @param fadeInDuration - Duration of the fade-in animation in milliseconds (default: 300)\n * @param fadeOutDuration - Duration of the fade-out animation in milliseconds (default: 1000)\n * @returns The transcript overlay component or null if no transcript is available\n *\n * @example\n * ```tsx\n * // Display bot speech transcripts\n * <TranscriptOverlay participant=\"remote\" />\n *\n * // Display user speech transcripts with custom styling and animation durations\n * <TranscriptOverlay\n *   participant=\"local\"\n *   className=\"custom-overlay\"\n *   size=\"lg\"\n *   fadeInDuration={500}\n *   fadeOutDuration={1500}\n * />\n * ```\n */\nexport const TranscriptOverlay = ({\n  participant = \"remote\",\n  className,\n  size = \"md\",\n  fadeInDuration = 300,\n  fadeOutDuration = 1000,\n}: TranscriptOverlayProps) => {\n  const [transcript, setTranscript] = useState<string[]>([]);\n  const [turnEnd, setIsTurnEnd] = useState(false);\n  const [botOutputSupported, setBotOutputSupported] = useState(false);\n  const transportState = usePipecatClientTransportState();\n\n  // Detect BotOutput support from BotReady event\n  useRTVIClientEvent(RTVIEvent.BotReady, (botData: BotReadyData) => {\n    const rtviVersion = botData.version;\n    const supportsBotOutput = isMinVersion(rtviVersion, [1, 1, 0]);\n    setBotOutputSupported(supportsBotOutput);\n  });\n\n  // Handle BotOutput events (when supported) - only word-level spoken chunks\n  useRTVIClientEvent(RTVIEvent.BotOutput, (data: BotOutputData) => {\n    if (participant === \"local\" || !botOutputSupported) {\n      return;\n    }\n\n    // Only process spoken outputs\n    if (data.spoken === true && data.text) {\n      if (turnEnd) {\n        setTranscript([]);\n        setIsTurnEnd(false);\n      }\n\n      setTranscript((prev) => [...prev, data.text]);\n    }\n  });\n\n  useRTVIClientEvent(\n    RTVIEvent.BotStoppedSpeaking,\n    useCallback(() => {\n      if (participant === \"local\") {\n        return;\n      }\n      setIsTurnEnd(true);\n    }, [participant]),\n  );\n\n  if (transcript.length === 0 || transportState !== \"ready\") {\n    return null;\n  }\n\n  return (\n    <TranscriptOverlayComponent\n      words={transcript}\n      size={size}\n      turnEnd={turnEnd}\n      className={className}\n      fadeInDuration={fadeInDuration}\n      fadeOutDuration={fadeOutDuration}\n    />\n  );\n};\n\nexport default TranscriptOverlay;\n","// Type definitions\nexport enum WaveformState {\n  IDLE = \"idle\",\n  AUDIO = \"audio\",\n  THINKING = \"thinking\",\n  COMPLETE = \"complete\",\n}\n\nexport interface CanvasWaveformOptions {\n  /** Width of the canvas in pixels (responsive if omitted) */\n  width?: number;\n\n  /** Height of the canvas in pixels (responsive if omitted) */\n  height?: number;\n\n  /** Primary color for the visualization bars (RGBA or hex format) */\n  color1?: string;\n\n  /** Secondary color for the visualization bars (RGBA or hex format) - used for color transitions */\n  color2?: string;\n\n  /** Background color of the canvas (use 'transparent' for no background) */\n  backgroundColor?: string;\n\n  /** Audio sensitivity factor (0.5-2.0) - higher values make visualization more responsive to quiet sounds */\n  sensitivity?: number;\n\n  /** Whether the visualization should rotate */\n  rotationEnabled?: boolean;\n\n  /** Base rotation speed (radians per frame * 0.01) */\n  rotationSpeed?: number;\n\n  /** How much audio activity boosts rotation speed (higher values = more dramatic spin-up) */\n  rotationBoostFactor?: number;\n\n  /** Number of bars in the circular visualization */\n  numBars?: number;\n\n  /** Width of each individual bar in pixels */\n  barWidth?: number;\n\n  /** Current state of the waveform (idle/audio/thinking/complete) */\n  state?: WaveformState;\n\n  /** Whether to display debug information */\n  debug?: boolean;\n}\n\ninterface FrequencyBar {\n  angle: number;\n  value: number;\n  targetValue: number;\n  hue: number;\n  transitionWeight: number;\n}\n\ninterface WaveformConfig {\n  // Bar rendering properties\n  numBars: number;\n  barWidth: number;\n  maxBarLength: number;\n  minBarLength: number;\n\n  // Audio processing\n  downsampleFactor: number;\n  activityThreshold: number;\n  minGain: number;\n  maxGain: number;\n  dynamicRange: number;\n  bassBoost: number;\n\n  // Animation properties\n  baseRadius: number;\n  rotationSpeed: number;\n  rotationBoostFactor: number;\n  rotationDecayRate: number;\n\n  // Frequency processing\n  frequencySmoothing: number;\n\n  // Pulse properties\n  pulseSpeed: number;\n  pulseWidth: number;\n  maxPulseHeight: number;\n  listeningPulseAmount: number;\n}\n\nexport class CircularWaveformCanvas {\n  // DOM elements\n  private canvas: HTMLCanvasElement;\n  private ctx: CanvasRenderingContext2D | null = null;\n  private dpr: number = 1;\n\n  // Audio processing\n  private audioContext: AudioContext | null = null;\n  private analyser: AnalyserNode | null = null;\n  private source: MediaStreamAudioSourceNode | null = null;\n  private frequencyData: Uint8Array | null = null;\n\n  // Visualization data buffers\n  private downsampledData: Float32Array | null = null;\n  private normalizedData: Float32Array | null = null;\n  private smoothedData: Float32Array | null = null;\n  private temporallySmoothedData: Float32Array | null = null;\n  private peakValues: Float32Array | null = null;\n  private prevFrameData: Float32Array | null = null;\n\n  // Animation state\n  private animationId: number | null = null;\n  private isPlaying: boolean = false;\n  private animationTime: number = 0;\n  private lastFrameTime: number = 0;\n  private rotation: number = 0;\n  private targetRotationSpeed: number = 0;\n  private currentRotationSpeed: number = 0;\n  private freqBars: FrequencyBar[] = [];\n\n  // Pulse animation\n  private nextPulseTime: number = 0;\n  private isPulsing: boolean = false;\n  private pulseProgress: number = 0;\n  private pulseDuration: number = 0.8;\n\n  // Status\n  private statusCallback: ((status: string) => void) | null = null;\n\n  // Configuration\n  private options: Required<CanvasWaveformOptions> = {\n    width: 0,\n    height: 0,\n    color1: \"rgba(0, 150, 255, 0.8)\",\n    color2: \"rgba(255, 0, 150, 0.8)\",\n    backgroundColor: \"transparent\",\n    sensitivity: 1.0,\n    rotationEnabled: true,\n    rotationSpeed: 0.05,\n    rotationBoostFactor: 15,\n    numBars: 128,\n    barWidth: 5,\n    state: WaveformState.IDLE,\n    debug: false,\n  };\n\n  private config: WaveformConfig;\n\n  /**\n   * Creates a new audio waveform visualization on the provided canvas\n   * @param canvas - The HTML canvas element to draw on\n   * @param options - Configuration options for the visualization\n   */\n  constructor(canvas: HTMLCanvasElement, options: CanvasWaveformOptions = {}) {\n    this.canvas = canvas;\n    this.ctx = canvas.getContext(\"2d\");\n    this.options = { ...this.options, ...options };\n    this.options.state = this.options.state || WaveformState.IDLE;\n\n    this.config = this.generateConfig();\n    this.freqBars = this.createFrequencyBars(this.config.numBars);\n\n    this.updateCanvasSize();\n    this.drawInitialState();\n  }\n\n  //===================================\n  // CONFIGURATION AND INITIALIZATION\n  //===================================\n\n  /**\n   * Generates derived configuration parameters from input options\n   */\n  private generateConfig(): WaveformConfig {\n    const {\n      sensitivity,\n      numBars,\n      barWidth,\n      rotationSpeed,\n      rotationBoostFactor,\n    } = this.options;\n\n    return {\n      // Bar rendering properties\n      numBars,\n      barWidth,\n      maxBarLength: 1,\n      minBarLength: 0.0001,\n\n      // Audio processing\n      downsampleFactor: 2,\n      activityThreshold: 0.1,\n      minGain: Math.max(0.01, 0.25 - sensitivity * 0.1),\n      maxGain: 1.2,\n      dynamicRange: Math.max(0.8, Math.min(2.5, sensitivity * 1.2)),\n      bassBoost: 1.4,\n\n      // Animation properties\n      baseRadius: 0.3,\n      rotationSpeed: rotationSpeed * 0.01,\n      rotationBoostFactor: rotationBoostFactor,\n      rotationDecayRate: 1,\n\n      // Frequency processing\n      frequencySmoothing: 0.6,\n\n      // Pulse properties\n      pulseSpeed: 8,\n      pulseWidth: Math.PI * 0.3,\n      maxPulseHeight: 0.15,\n      listeningPulseAmount: 2,\n    };\n  }\n\n  /**\n   * Creates frequency bar objects that form the circular visualization\n   * @param count - Number of bars to create\n   */\n  private createFrequencyBars(count: number): FrequencyBar[] {\n    const bars: FrequencyBar[] = [];\n\n    for (let i = 0; i < count; i++) {\n      const angle = (i / count) * Math.PI * 2;\n      const hue = (i / count) * 360;\n\n      // Calculate transition weight for smoothing connection points\n      const transitionPoints = [0, count * 0.5];\n      const transitionWidth = count * 0.2;\n      const transitionWeight = transitionPoints\n        .map((point) => {\n          const distance =\n            Math.min(\n              Math.abs(i - point),\n              Math.abs(i - point - count),\n              Math.abs(i - point + count),\n            ) /\n            (transitionWidth / 2);\n          return Math.max(0, 1 - distance);\n        })\n        .reduce((max, val) => Math.max(max, val), 0);\n\n      bars.push({\n        angle,\n        value: 0,\n        targetValue: 0,\n        hue,\n        transitionWeight,\n      });\n    }\n\n    return bars;\n  }\n\n  /**\n   * Initialize the audio context and analyzer\n   * @returns AudioContext or null if initialization failed\n   */\n  private initializeAudio(): AudioContext | null {\n    if (this.audioContext) {\n      return this.audioContext;\n    }\n\n    try {\n      const AudioContext: typeof window.AudioContext =\n        window.AudioContext ||\n        (\n          window as unknown as {\n            webkitAudioContext: typeof window.AudioContext;\n          }\n        ).webkitAudioContext;\n\n      const audioCtx = new AudioContext({\n        latencyHint: \"interactive\",\n        sampleRate: 44100,\n      });\n\n      this.audioContext = audioCtx;\n      const analyser = audioCtx.createAnalyser();\n      analyser.fftSize = 1024;\n      analyser.minDecibels = -110;\n      analyser.maxDecibels = -30 + (this.config.dynamicRange - 1) * 5;\n      analyser.smoothingTimeConstant = 0.5;\n      this.analyser = analyser;\n\n      // Create data arrays\n      this.frequencyData = new Uint8Array(analyser.frequencyBinCount);\n\n      // Initialize reusable arrays\n      const downsampledLength = Math.ceil(\n        analyser.frequencyBinCount / this.config.downsampleFactor,\n      );\n      this.downsampledData = new Float32Array(downsampledLength);\n      this.normalizedData = new Float32Array(downsampledLength);\n      this.smoothedData = new Float32Array(downsampledLength);\n      this.temporallySmoothedData = new Float32Array(downsampledLength);\n\n      // Auto-resume if needed\n      if (audioCtx.state === \"suspended\") {\n        this.setupAutoResume(audioCtx);\n      }\n\n      return audioCtx;\n    } catch (error) {\n      console.error(\"Failed to initialize audio context:\", error);\n      this.setStatus(\"Audio API not supported in this browser\");\n      return null;\n    }\n  }\n\n  /**\n   * Setup event listeners to auto-resume audio context on user interaction\n   */\n  private setupAutoResume(audioCtx: AudioContext): void {\n    const resumeOnInteraction = () => {\n      audioCtx\n        .resume()\n        .then(() => {\n          document.removeEventListener(\"click\", resumeOnInteraction);\n          document.removeEventListener(\"touchstart\", resumeOnInteraction);\n          document.removeEventListener(\"keydown\", resumeOnInteraction);\n        })\n        .catch((err) => {\n          console.error(\"Failed to resume AudioContext:\", err);\n        });\n    };\n\n    document.addEventListener(\"click\", resumeOnInteraction);\n    document.addEventListener(\"touchstart\", resumeOnInteraction);\n    document.addEventListener(\"keydown\", resumeOnInteraction);\n  }\n\n  /**\n   * Setup audio processing chain for voice optimization\n   */\n  private setupAudioProcessingChain(audioCtx: AudioContext): void {\n    if (!this.source || !this.analyser) return;\n\n    // Voice filter - for speech emphasis\n    const voiceFilter = audioCtx.createBiquadFilter();\n    voiceFilter.type = \"peaking\";\n    voiceFilter.frequency.value = 2000;\n    voiceFilter.Q.value = 1.0;\n    voiceFilter.gain.value = 3.5;\n\n    // Low shelf for bass\n    const lowFilter = audioCtx.createBiquadFilter();\n    lowFilter.type = \"lowshelf\";\n    lowFilter.frequency.value = 300;\n    lowFilter.gain.value = this.config.bassBoost;\n\n    // Analyzer settings\n    this.analyser.fftSize = 1024;\n    this.analyser.minDecibels = -100;\n    this.analyser.maxDecibels = -30 + (this.config.dynamicRange - 1) * 5;\n    this.analyser.smoothingTimeConstant = 0.65;\n\n    // Connect the chain\n    this.source.connect(voiceFilter);\n    voiceFilter.connect(lowFilter);\n    lowFilter.connect(this.analyser);\n  }\n\n  //===================================\n  // AUDIO PROCESSING\n  //===================================\n\n  /**\n   * Process audio data from analyzer frequency data\n   */\n  private processAudioData(frequencyData: Uint8Array): void {\n    // Downsample frequency data for efficiency\n    const downsampleFactor = this.config.downsampleFactor;\n    const sampleLength = Math.ceil(frequencyData.length / downsampleFactor);\n\n    // Initialize arrays if needed\n    if (!this.downsampledData || this.downsampledData.length !== sampleLength) {\n      this.downsampledData = new Float32Array(sampleLength);\n      this.normalizedData = new Float32Array(sampleLength);\n      this.smoothedData = new Float32Array(sampleLength);\n      this.temporallySmoothedData = new Float32Array(sampleLength);\n    }\n\n    // Ensure arrays are initialized\n    if (!this.downsampledData || !this.normalizedData) {\n      return;\n    }\n\n    // Calculate voice frequency range bins\n    const vocalLowBin = Math.floor(4 / downsampleFactor);\n    const vocalHighBin = Math.min(\n      Math.floor(372 / downsampleFactor),\n      this.downsampledData.length - 1,\n    );\n\n    // Downsample and normalize in one pass\n    let maxValue = 0;\n    for (let i = 0; i < this.downsampledData.length; i++) {\n      // Downsample\n      const value = frequencyData[i * downsampleFactor] / 255;\n      this.downsampledData[i] = value;\n\n      // Apply emphasis to vocal range\n      const emphasis = i >= vocalLowBin && i <= vocalHighBin ? 1.0 : 0.25;\n      this.normalizedData[i] = value * emphasis;\n\n      // Track maximum value\n      if (\n        i >= vocalLowBin &&\n        i <= vocalHighBin &&\n        this.normalizedData[i] > maxValue\n      ) {\n        maxValue = this.normalizedData[i];\n      }\n    }\n\n    // Apply dynamic range adjustment\n    for (let i = 0; i < this.normalizedData.length; i++) {\n      this.normalizedData[i] = Math.pow(this.normalizedData[i], 0.8);\n      this.normalizedData[i] = Math.max(\n        this.config.minGain,\n        Math.min(this.config.maxGain, this.normalizedData[i]),\n      );\n    }\n\n    // Apply basic compression if needed\n    if (maxValue > 0.7) {\n      const compressionRatio = 2.0;\n      for (let i = 0; i < this.normalizedData.length; i++) {\n        if (this.normalizedData[i] > 0.7) {\n          const overThreshold = this.normalizedData[i] - 0.7;\n          this.normalizedData[i] = 0.7 + overThreshold / compressionRatio;\n        }\n      }\n    }\n\n    // Apply frequency smoothing and temporal smoothing\n    this.applyOptimizedFrequencySmoothing();\n    this.applyOptimizedTemporalSmoothing();\n\n    // Calculate audio levels and process bars\n    this.calculateOptimizedAudioLevels(\n      frequencyData,\n      vocalLowBin,\n      vocalHighBin,\n    );\n  }\n\n  /**\n   * Apply smoothing between frequency bins\n   */\n  private applyOptimizedFrequencySmoothing(): void {\n    const len = this.normalizedData!.length;\n    const radius = Math.max(1, Math.floor(this.config.frequencySmoothing * 3));\n    const temp = new Float32Array(len);\n\n    // Single-pass weighted smoothing\n    for (let i = 0; i < len; i++) {\n      let sum = 0,\n        weightSum = 0;\n\n      for (\n        let j = Math.max(0, i - radius);\n        j <= Math.min(len - 1, i + radius);\n        j++\n      ) {\n        const weight = 1 - Math.abs(i - j) / (radius + 1);\n        sum += this.normalizedData![j] * weight;\n        weightSum += weight;\n      }\n\n      temp[i] = sum / weightSum;\n    }\n\n    // Smooth the edges for circular continuity\n    const edgeBlendSize = Math.min(8, Math.floor(len * 0.04));\n    for (let i = 0; i < edgeBlendSize; i++) {\n      const weight = (edgeBlendSize - i) / edgeBlendSize;\n      const frontIdx = i;\n      const backIdx = len - i - 1;\n\n      if (frontIdx < backIdx) {\n        const blendedValue = (temp[frontIdx] + temp[backIdx]) / 2;\n        temp[frontIdx] = temp[frontIdx] * (1 - weight) + blendedValue * weight;\n        temp[backIdx] = temp[backIdx] * (1 - weight) + blendedValue * weight;\n      }\n    }\n\n    this.smoothedData!.set(temp);\n  }\n\n  /**\n   * Apply smoothing over time to prevent jumps\n   */\n  private applyOptimizedTemporalSmoothing(): void {\n    if (\n      !this.prevFrameData ||\n      this.prevFrameData.length !== this.smoothedData!.length\n    ) {\n      this.prevFrameData = new Float32Array(this.smoothedData!.length);\n      this.prevFrameData.set(this.smoothedData!);\n    }\n\n    if (\n      !this.temporallySmoothedData ||\n      this.temporallySmoothedData.length !== this.smoothedData!.length\n    ) {\n      this.temporallySmoothedData = new Float32Array(this.smoothedData!.length);\n    }\n\n    // Use a fixed smoothing factor\n    const smoothFactor = 0.3;\n\n    for (let i = 0; i < this.smoothedData!.length; i++) {\n      this.temporallySmoothedData[i] =\n        this.smoothedData![i] * (1 - smoothFactor) +\n        this.prevFrameData[i] * smoothFactor;\n\n      this.prevFrameData[i] = this.temporallySmoothedData[i];\n    }\n  }\n\n  // Calculate audio levels with simplified math\n  private calculateOptimizedAudioLevels(\n    frequencyData: Uint8Array,\n    vocalLowBin: number,\n    vocalHighBin: number,\n  ): void {\n    const length = frequencyData.length;\n\n    // Simplified frequency band calculation\n    const bassEnd = Math.floor(length * 0.2);\n    const midEnd = Math.floor(length * 0.6);\n\n    // Sample every 4th point for efficiency\n    const sampleRate = 4;\n\n    // Use efficient summing approach\n    let bassSum = 0,\n      midSum = 0,\n      highSum = 0;\n    let bassCount = 0,\n      midCount = 0,\n      highCount = 0;\n\n    for (let i = 0; i < bassEnd; i += sampleRate) {\n      bassSum += frequencyData[i];\n      bassCount++;\n    }\n\n    for (let i = bassEnd; i < midEnd; i += sampleRate) {\n      midSum += frequencyData[i];\n      midCount++;\n    }\n\n    for (let i = midEnd; i < length; i += sampleRate) {\n      highSum += frequencyData[i];\n      highCount++;\n    }\n\n    // Calculate normalized levels with reasonable defaults to avoid division by zero\n    const bassLevel = Math.max(\n      0.2,\n      (bassSum / (bassCount || 1) / 255) * this.config.bassBoost,\n    );\n    const midLevel = Math.max(0.2, midSum / (midCount || 1) / 255);\n    const highLevel = Math.max(0.2, highSum / (highCount || 1) / 255);\n\n    // Simplified activity level calculation\n    const overallActivityLevel = Math.sqrt(\n      (bassLevel * bassLevel + midLevel * midLevel + highLevel * highLevel) / 3,\n    );\n\n    // Detection logic kept similar to maintain good behavior\n    const isActiveAudio = overallActivityLevel > this.config.activityThreshold;\n    const volumeScalingFactor = isActiveAudio\n      ? Math.min(1.0, Math.max(0.15, Math.pow(overallActivityLevel / 0.4, 1.2)))\n      : 0.15;\n\n    // Rotation speed update - simplified calculations\n    if (this.options.rotationEnabled) {\n      if (isActiveAudio) {\n        // Linear relationship is simpler than complex formulas\n        const boostAmount =\n          Math.min(1.0, overallActivityLevel) * this.config.rotationBoostFactor;\n        this.targetRotationSpeed =\n          this.config.rotationSpeed * (1 + boostAmount);\n      } else {\n        this.targetRotationSpeed = this.config.rotationSpeed;\n      }\n    }\n\n    // Update the frequency bars\n    this.updateBarsOptimized(\n      vocalLowBin,\n      vocalHighBin,\n      volumeScalingFactor,\n      isActiveAudio,\n      overallActivityLevel,\n      [bassLevel, midLevel, highLevel],\n    );\n  }\n\n  // Optimized bar update method\n  private updateBarsOptimized(\n    vocalLowBin: number,\n    vocalHighBin: number,\n    volumeScalingFactor: number,\n    isActiveAudio: boolean,\n    overallActivityLevel: number,\n    levelsByRange: number[],\n  ): void {\n    const barCount = this.freqBars.length;\n\n    if (!this.peakValues || this.peakValues.length !== barCount) {\n      this.peakValues = new Float32Array(barCount);\n    }\n\n    // Create frequency mapping for bars - maintain good frequency distribution\n    const frequencyValues = new Array(barCount).fill(0);\n\n    // Improved frequency distribution to eliminate dead zones\n    for (let i = 0; i < barCount; i++) {\n      const normalizedPosition = i / barCount;\n\n      // Using a more balanced distribution across the entire circle\n      // This helps avoid the harsh transition/dead zone\n      if (normalizedPosition < 0.8) {\n        // Use first 80% of the circle for a wider range of frequencies\n        // This expands the vocal range coverage\n        const speechRangeLow = Math.floor(vocalLowBin * 1.2); // Lower starting point\n        const speechRangeHigh = Math.min(\n          vocalHighBin,\n          Math.floor(vocalHighBin * 0.9), // Extend higher for more coverage\n        );\n\n        // Map frequency bins more evenly across the circle\n        const frequencyIndex = Math.floor(\n          speechRangeLow +\n            (normalizedPosition * (speechRangeHigh - speechRangeLow)) / 0.8,\n        );\n\n        if (this.temporallySmoothedData) {\n          const safeIndex = Math.min(\n            this.temporallySmoothedData.length - 1,\n            Math.max(0, frequencyIndex),\n          );\n          // Apply a consistent boost across all frequencies\n          frequencyValues[i] = this.temporallySmoothedData[safeIndex] * 1.1;\n        }\n      } else {\n        // For the remaining 20%, create a smoother transition to higher frequencies\n        // Use overlapping frequencies to avoid harsh transitions\n        const remappedPosition = (normalizedPosition - 0.8) / 0.2;\n\n        // Start from a lower frequency point to overlap with the previous section\n        const highFreqLow = Math.floor(vocalHighBin * 0.6); // Lower starting point for better overlap\n        const highFreqHigh = vocalHighBin;\n\n        const frequencyIndex = Math.floor(\n          highFreqLow + remappedPosition * (highFreqHigh - highFreqLow),\n        );\n\n        if (this.temporallySmoothedData) {\n          const safeIndex = Math.min(\n            this.temporallySmoothedData.length - 1,\n            Math.max(0, frequencyIndex),\n          );\n          // Apply a stronger boost to this traditionally less active region\n          frequencyValues[i] = this.temporallySmoothedData[safeIndex] * 1.4;\n        }\n      }\n    }\n\n    // Apply enhanced frequency spread with stronger influence in problem areas\n    this.applyEnhancedFrequencySpread(frequencyValues);\n\n    // Process each bar using optimized value calculations\n    for (let i = 0; i < barCount; i++) {\n      const bar = this.freqBars[i];\n\n      // Optimized but effective bar value processing\n      const value = this.processBarValueOptimized(\n        frequencyValues[i],\n        volumeScalingFactor,\n        isActiveAudio,\n        overallActivityLevel,\n        i,\n        barCount,\n        levelsByRange,\n      );\n\n      // Set target with smoothing\n      bar.targetValue = value;\n\n      // Simplified smoothing with different rates for increasing vs. decreasing\n      const smoothingFactor = bar.targetValue > bar.value ? 0.25 : 0.12;\n\n      const delta = bar.targetValue - bar.value;\n      bar.value += delta * smoothingFactor;\n\n      // Cap maximum value\n      bar.value = Math.min(bar.value, 0.9);\n\n      // Store the peak value for possible normalization\n      this.peakValues[i] = bar.value;\n    }\n  }\n\n  // Enhanced frequency spread function with special handling for transition areas\n  private applyEnhancedFrequencySpread(values: number[]): void {\n    const len = values.length;\n    const spreadRadius = Math.floor(len * 0.15); // Increased radius for better spread\n    const temp = [...values];\n\n    // First, identify the regions with least activity\n    const activityLevels = new Array(len).fill(0);\n    let totalActivity = 0;\n\n    for (let i = 0; i < len; i++) {\n      activityLevels[i] = temp[i];\n      totalActivity += temp[i];\n    }\n\n    const avgActivity = totalActivity / len;\n\n    // Apply adaptive spreading based on activity levels\n    for (let i = 0; i < len; i++) {\n      if (temp[i] > 0.08) {\n        // Lower threshold to include more source points\n        const peakValue = temp[i];\n\n        // Determine if this is in a typically low-activity area\n        // (approximately 3/4 through the circle based on the image)\n        const isInLowActivityZone =\n          i >= Math.floor(len * 0.6) && i <= Math.floor(len * 0.9);\n\n        // Use a wider spread and stronger influence in low activity zones\n        const effectiveSpreadRadius = isInLowActivityZone\n          ? spreadRadius * 1.5\n          : spreadRadius;\n\n        for (let offset = 1; offset <= effectiveSpreadRadius; offset++) {\n          const leftIdx = (i - offset + len) % len;\n          const rightIdx = (i + offset) % len;\n\n          // Calculate falloff with special boosting for problem areas\n          let falloff = 1 - offset / effectiveSpreadRadius;\n\n          // Apply stronger spreading in historically inactive areas\n          const targetIsInLowZone =\n            (leftIdx >= Math.floor(len * 0.6) &&\n              leftIdx <= Math.floor(len * 0.9)) ||\n            (rightIdx >= Math.floor(len * 0.6) &&\n              rightIdx <= Math.floor(len * 0.9));\n\n          if (targetIsInLowZone) {\n            falloff = falloff * 1.3; // Boost the spread influence in problem areas\n          }\n\n          const spreadValue = peakValue * falloff * 0.4; // Increased spread influence\n\n          // Apply spread to neighbors with stronger effect\n          values[leftIdx] = Math.max(\n            values[leftIdx],\n            values[leftIdx] * 0.6 + spreadValue * 0.4, // More influence from neighbors\n          );\n          values[rightIdx] = Math.max(\n            values[rightIdx],\n            values[rightIdx] * 0.6 + spreadValue * 0.4,\n          );\n        }\n      }\n    }\n\n    // Apply multiple smoothing passes focused on transition areas\n    const smoothingPasses = 2;\n    for (let pass = 0; pass < smoothingPasses; pass++) {\n      const resultCopy = [...values];\n\n      for (let i = 0; i < len; i++) {\n        // Apply stronger smoothing in problem areas\n        const isInTransitionZone =\n          i >= Math.floor(len * 0.55) && i <= Math.floor(len * 0.95);\n\n        if (isInTransitionZone || pass === 0) {\n          const prev = (i - 1 + len) % len;\n          const next = (i + 1) % len;\n\n          // Weighted smoothing (center gets more weight in normal areas, less in transition zones)\n          const centerWeight = isInTransitionZone ? 1.5 : 2;\n          values[i] =\n            (resultCopy[prev] +\n              resultCopy[i] * centerWeight +\n              resultCopy[next]) /\n            (2 + centerWeight);\n        }\n      }\n    }\n\n    // Final balancing to ensure more even distribution\n    let minVal = 1.0;\n    let maxVal = 0.0;\n\n    // Find min and max\n    for (let i = 0; i < len; i++) {\n      minVal = Math.min(minVal, values[i]);\n      maxVal = Math.max(maxVal, values[i]);\n    }\n\n    // If we have a significant range, apply a subtle normalization\n    // This brings up low areas slightly without flattening everything\n    if (maxVal > minVal * 3 && minVal > 0) {\n      const range = maxVal - minVal;\n      for (let i = 0; i < len; i++) {\n        // Apply sqrt normalization to bring up lower values more than higher ones\n        const normalizedVal = (values[i] - minVal) / range;\n        const boostedVal =\n          Math.sqrt(normalizedVal) * range * 0.8 + minVal * 1.2;\n\n        // Only apply to lower values to avoid flattening everything\n        if (values[i] < avgActivity) {\n          values[i] = values[i] * 0.7 + boostedVal * 0.3;\n        }\n      }\n    }\n  }\n\n  // Optimized bar value processing with similar visual results\n  private processBarValueOptimized(\n    frequencyValue: number,\n    volumeScalingFactor: number,\n    isActiveAudio: boolean,\n    overallActivityLevel: number,\n    barIndex: number,\n    barCount: number,\n    levelsByRange: number[],\n  ): number {\n    const position = barIndex / barCount;\n    let value = frequencyValue;\n\n    // Simplified level distribution - still maintains good distribution\n    const [bassLevel, midLevel, highLevel] = levelsByRange;\n\n    // Simpler zone calculation with fewer trig functions\n    const zoneAngle = position * Math.PI * 2;\n    const zone1 = 0.5 + 0.5 * Math.cos(zoneAngle);\n    const zone2 = 0.5 + 0.5 * Math.cos(zoneAngle - Math.PI * 0.5);\n    const zone3 = 0.5 + 0.5 * Math.cos(zoneAngle - Math.PI);\n    const zone4 = 0.5 + 0.5 * Math.cos(zoneAngle - Math.PI * 1.5);\n\n    // Simplified boost factor calculation\n    const boostFactor =\n      (0.85 + bassLevel * 0.7) * zone1 * 0.25 +\n      (0.85 + midLevel * 0.6) * zone2 * 0.25 +\n      (0.85 + highLevel * 0.6) * zone3 * 0.25 +\n      (0.85 + bassLevel * 0.7) * zone4 * 0.25;\n\n    // Apply boost and volume scaling\n    value = value * boostFactor * 1.3;\n    value = value * volumeScalingFactor * 1.2;\n\n    // Add baseline activity when audio is active\n    if (isActiveAudio && overallActivityLevel > 0.2) {\n      value = Math.max(value, 0.08 * overallActivityLevel);\n    }\n\n    // Handle thinking state separately\n    if (this.options.state === WaveformState.THINKING) {\n      const thinkingBaseline = 0.01;\n      const thinkingOscillation =\n        Math.sin(this.animationTime * 0.8 + position * Math.PI * 2) * 0.008;\n\n      const pulseInfluence = this.getThinkingPulseInfluence(barIndex, barCount);\n      value = thinkingBaseline + thinkingOscillation + pulseInfluence * 0.1;\n\n      return this.limitBarValue(value);\n    }\n\n    // Apply oscillation for organic movement\n    if (isActiveAudio) {\n      const oscillationIntensity = Math.min(\n        0.04,\n        Math.max(0.01, overallActivityLevel * 0.12),\n      );\n\n      const oscillation =\n        Math.sin(this.animationTime * 1.5 + position * Math.PI * 2) *\n        oscillationIntensity;\n\n      if (value < 0.15) {\n        value += oscillation + overallActivityLevel * 0.2;\n      } else {\n        value += oscillation * 0.6;\n      }\n    } else {\n      const restingOscillation =\n        Math.sin(this.animationTime * 0.8 + position * Math.PI * 2) * 0.002;\n      value = Math.min(value, 0.01);\n      value = 0.005 + restingOscillation;\n    }\n\n    // Apply ceiling\n    value = Math.min(value, 0.85);\n\n    // Handle audio pulse effects\n    if (this.options.state === WaveformState.AUDIO) {\n      const audioPulseInfluence = this.getAudioPulseInfluence(\n        barIndex,\n        barCount,\n      );\n\n      if (audioPulseInfluence > 0) {\n        const pulseDamping = Math.max(0, 1 - value * 0.8);\n        const pulseAmount = audioPulseInfluence * pulseDamping * 0.4;\n        value = value * (1 + pulseAmount) + audioPulseInfluence * 0.05;\n      } else if (this.isPulsing && this.pulseProgress > 0) {\n        const normalizedPosition = barIndex / barCount;\n        let distance = Math.abs(normalizedPosition - this.pulseProgress);\n        distance = Math.min(distance, 1 - distance);\n\n        const fadeOutFactor = 1 - this.pulseProgress;\n        const influence = Math.max(0, 1 - Math.pow(distance / 0.12, 2));\n        const thinkingPulseInfluence = influence * fadeOutFactor * 0.2;\n\n        value =\n          value * (1 + thinkingPulseInfluence * 0.1) +\n          thinkingPulseInfluence * 0.01;\n      }\n    }\n\n    // Final bounds check\n    value = Math.max(0.005, this.limitBarValue(value, 0.9));\n\n    return value;\n  }\n\n  //===================================\n  // RENDERING\n  //===================================\n\n  /**\n   * Main animation frame handler - called on each frame\n   */\n  private draw = (timestamp: number) => {\n    if (!this.ctx) {\n      this.animationId = requestAnimationFrame(this.draw);\n      return;\n    }\n\n    // Calculate time since last frame\n    const deltaTime = Math.min(\n      Math.max((timestamp - this.lastFrameTime) / 1000, 0.001),\n      0.1,\n    );\n    this.lastFrameTime = timestamp;\n    this.animationTime += deltaTime;\n\n    // Update rotation\n    if (this.options.rotationEnabled) {\n      this.updateRotationSpeed(deltaTime);\n      this.rotation += this.currentRotationSpeed * deltaTime * 60;\n    }\n\n    // Setup drawing context\n    const ctx = this.ctx;\n    const canvas = this.canvas;\n    const logicalWidth = canvas.width / this.dpr;\n    const logicalHeight = canvas.height / this.dpr;\n\n    ctx.imageSmoothingEnabled = true;\n    ctx.imageSmoothingQuality = \"high\";\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    ctx.scale(this.dpr, this.dpr);\n\n    // Update pulse animation in audio mode\n    if (this.options.state === WaveformState.AUDIO) {\n      this.updateAudioPulse();\n    }\n\n    // Clear canvas and draw background\n    ctx.clearRect(0, 0, logicalWidth, logicalHeight);\n    if (this.options.backgroundColor !== \"transparent\") {\n      ctx.fillStyle = this.options.backgroundColor;\n      ctx.fillRect(0, 0, logicalWidth, logicalHeight);\n    }\n\n    // Render based on current state\n    switch (this.options.state) {\n      case WaveformState.COMPLETE:\n        this.drawCompleteState();\n        break;\n      case WaveformState.THINKING:\n        this.drawThinkingState(ctx, canvas, deltaTime);\n        break;\n      case WaveformState.AUDIO:\n        if (this.analyser && this.frequencyData) {\n          this.drawAudioState(ctx, canvas);\n        } else {\n          this.drawStaticState(ctx, canvas, deltaTime);\n        }\n        break;\n      case WaveformState.IDLE:\n      default:\n        this.drawStaticState(ctx, canvas, deltaTime);\n        break;\n    }\n\n    this.animationId = requestAnimationFrame(this.draw);\n  };\n\n  // Draw the initial state (before audio connection)\n  public drawInitialState(): void {\n    if (!this.ctx) return;\n\n    const ctx = this.ctx;\n    // Use logical dimensions for all drawing\n    const width = this.canvas.width / this.dpr;\n    const height = this.canvas.height / this.dpr;\n\n    // Ensure the correct scale is applied\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    ctx.scale(this.dpr, this.dpr);\n\n    // Clear canvas and set background\n    ctx.clearRect(0, 0, width, height);\n\n    // Apply background color if not transparent\n    if (this.options.backgroundColor !== \"transparent\") {\n      ctx.fillStyle = this.options.backgroundColor;\n      ctx.fillRect(0, 0, width, height);\n    }\n  }\n\n  // Draw the thinking state animation\n  private drawThinkingState(\n    ctx: CanvasRenderingContext2D,\n    canvas: HTMLCanvasElement,\n    deltaTime: number,\n  ): void {\n    // Use logical dimensions\n    const width = canvas.width / this.dpr;\n    const height = canvas.height / this.dpr;\n    const centerX = width / 2;\n    const centerY = height / 2;\n    const baseCircleRadius = Math.min(width, height) * this.config.baseRadius;\n\n    // Create traveling pulse animation\n    const bars = this.freqBars;\n    const barCount = bars.length;\n\n    // Base size and transition constants\n    const baseSize = 0.1;\n\n    // Scale down pulse height to be more consistent with audio mode\n    // audio mode uses listeningPulseAmount (default 2) but applies additional scaling factors\n    const pulseHeight = this.config.maxPulseHeight * 0.35; // Reduced scaling factor\n\n    // Travel pulse position around the circle\n    const pulsePosition =\n      (this.animationTime * this.config.pulseSpeed) % (Math.PI * 2);\n\n    for (let i = 0; i < barCount; i++) {\n      const bar = bars[i];\n      const barAngle = (i / barCount) * Math.PI * 2;\n\n      // Calculate this bar's relation to the pulse position\n      let angleDiff = Math.abs(barAngle - pulsePosition);\n      angleDiff = Math.min(angleDiff, Math.PI * 2 - angleDiff); // Handle wrapping\n\n      // Calculate pulse influence using the configured width\n      const pulseInfluence = Math.max(\n        0,\n        1 - angleDiff / (this.config.pulseWidth / 2),\n      );\n\n      // Create a smooth pulse shape with reduced amplitude\n      const smoothedPulse =\n        Math.pow(Math.sin((pulseInfluence * Math.PI) / 2), 2) * pulseHeight;\n\n      // Gradually transition base value toward standard size\n      const stabilizationFactor = 0.03 * deltaTime * 60; // Slightly faster stabilization\n\n      // Transition toward baseSize, but preserve some of the current value\n      const newBaseValue =\n        bar.targetValue * (1 - stabilizationFactor) +\n        baseSize * stabilizationFactor;\n\n      // Add pulse on top of the base value\n      const newTargetValue = newBaseValue + smoothedPulse;\n\n      // Ensure we don't exceed maximum length\n      bar.targetValue = Math.min(newTargetValue, this.config.maxBarLength);\n\n      // Apply smoothing for transitions\n      const growFactor = 0.6 * deltaTime * 60; // Fast growth for pulse\n      const shrinkFactor = 0.4 * deltaTime * 60; // Slower shrink for smooth fade\n\n      const smoothingFactor =\n        bar.targetValue > bar.value\n          ? Math.min(1, growFactor)\n          : Math.min(1, shrinkFactor);\n\n      const delta = bar.targetValue - bar.value;\n      bar.value += delta * smoothingFactor;\n\n      // Draw the bar\n      const angle = bar.angle + this.rotation;\n      this.drawBar(ctx, centerX, centerY, baseCircleRadius, bar, angle);\n    }\n\n    // Use base rotation speed in thinking state\n    this.targetRotationSpeed = this.config.rotationSpeed;\n  }\n\n  // Draw a basic static state when no audio is available\n  private drawStaticState(\n    ctx: CanvasRenderingContext2D,\n    canvas: HTMLCanvasElement,\n    deltaTime: number,\n  ): void {\n    // Use logical dimensions\n    const width = canvas.width / this.dpr;\n    const height = canvas.height / this.dpr;\n    const centerX = width / 2;\n    const centerY = height / 2;\n    const circleRadius = Math.min(width, height) * this.config.baseRadius;\n\n    // Clear any previous content\n    ctx.clearRect(0, 0, width, height);\n\n    // Apply background color if not transparent\n    if (this.options.backgroundColor !== \"transparent\") {\n      ctx.fillStyle = this.options.backgroundColor;\n      ctx.fillRect(0, 0, width, height);\n    }\n\n    // Draw with minimal animation\n    for (let i = 0; i < this.freqBars.length; i++) {\n      const bar = this.freqBars[i];\n      const angle = bar.angle + this.rotation;\n\n      // Base size with subtle animation\n      const baseSize = 0.1;\n      const variationAmount = 0.1;\n      const randomValue =\n        baseSize + Math.sin(this.animationTime + i * 0.1) * variationAmount;\n\n      // Animate towards random value - adjust for delta time\n      bar.targetValue = randomValue;\n      bar.value += (bar.targetValue - bar.value) * 0.05 * deltaTime * 60;\n\n      // Draw the bar\n      this.drawBar(ctx, centerX, centerY, circleRadius, bar, angle);\n    }\n\n    // Use base rotation in all states\n    this.targetRotationSpeed = this.config.rotationSpeed;\n  }\n\n  // Draw the normal audio-reactive state\n  private drawAudioState(\n    ctx: CanvasRenderingContext2D,\n    canvas: HTMLCanvasElement,\n  ): void {\n    // Use logical dimensions\n    const width = canvas.width / this.dpr;\n    const height = canvas.height / this.dpr;\n    const centerX = width / 2;\n    const centerY = height / 2;\n    const baseCircleRadius = Math.min(width, height) * this.config.baseRadius;\n\n    const analyser = this.analyser!;\n    const frequencyData = this.frequencyData!;\n\n    // Get audio data\n    analyser.getByteFrequencyData(frequencyData);\n\n    // Process the audio data\n    this.processAudioData(frequencyData);\n\n    // Draw each bar\n    const bars = this.freqBars;\n    const barCount = bars.length;\n\n    for (let i = 0; i < barCount; i++) {\n      const bar = bars[i];\n      const angle = bar.angle + this.rotation;\n      this.drawBar(ctx, centerX, centerY, baseCircleRadius, bar, angle);\n    }\n  }\n\n  // Draw a bar\n  private drawBar(\n    ctx: CanvasRenderingContext2D,\n    centerX: number,\n    centerY: number,\n    baseCircleRadius: number,\n    bar: FrequencyBar,\n    angle: number,\n  ): void {\n    // Get the current value and ensure it doesn't exceed maximum bounds\n    const currentValue = this.limitBarValue(bar.value);\n\n    // Calculate bar height based on mode\n    let barHeight;\n\n    // For audio mode, make bars much smaller at low values\n    const minBarLength = baseCircleRadius * this.config.minBarLength;\n    const maxBarLength = baseCircleRadius * this.config.maxBarLength;\n\n    // More pronounced power curve (1.4 instead of 1.6) to emphasize changes\n    barHeight = minBarLength + Math.pow(currentValue, 1.4) * maxBarLength;\n\n    // Ensure length doesn't exceed the maximum due to pulse\n    barHeight = Math.min(barHeight, maxBarLength);\n\n    // Add a small minimum bar length to ensure visibility\n    barHeight = Math.max(barHeight, baseCircleRadius * 0.003);\n\n    // Inner and outer radius - adjust inner radius for audio mode\n    const innerRadius = baseCircleRadius;\n    const outerRadius = innerRadius + barHeight;\n\n    // Calculate positions\n    const startX = centerX + Math.cos(angle) * innerRadius;\n    const startY = centerY + Math.sin(angle) * innerRadius;\n    const endX = centerX + Math.cos(angle) * outerRadius;\n    const endY = centerY + Math.sin(angle) * outerRadius;\n\n    // Calculate color based on value - using a stronger exponential curve\n    // This makes the color blend more subtle until extreme bar lengths\n    // At value=0.3, we want the color to be mostly color1 still\n    // At value=0.7+, we want to rapidly shift toward color2\n    const normalizedValue = Math.min(1.0, currentValue / 0.3);\n    // Use a power curve to delay the blend toward color2\n    const colorBlendRatio = Math.pow(normalizedValue, 3.0); // Higher exponent means slower transition\n    const color = this.blendColors(\n      this.options.color1,\n      this.options.color2,\n      colorBlendRatio,\n    );\n\n    // Calculate line width that varies with volume\n    // For small bars, make them much thinner, gradually getting thicker as they grow\n    const baseWidth = this.config.barWidth;\n\n    const minWidthRatio = 0.5;\n    const maxWidthRatio = 1.5;\n\n    // Adjust the power curve for a more dramatic thickness growth (2.2 instead of 2.5)\n    const thicknessRatio =\n      minWidthRatio +\n      (maxWidthRatio - minWidthRatio) * Math.pow(normalizedValue, 2.2);\n\n    const lineWidth = baseWidth * thicknessRatio;\n\n    // Draw the bar\n    ctx.beginPath();\n    ctx.moveTo(startX, startY);\n    ctx.lineTo(endX, endY);\n    ctx.strokeStyle = color;\n    ctx.lineWidth = lineWidth;\n    ctx.lineCap = \"round\";\n    ctx.stroke();\n  }\n\n  // Helper to blend between two colors\n  private blendColors(color1: string, color2: string, ratio: number): string {\n    // Parse colors to extract RGB components\n    const c1 = this.parseRGBA(color1);\n    const c2 = this.parseRGBA(color2);\n\n    // Blend RGB components\n    const r = Math.round(c1.r * (1 - ratio) + c2.r * ratio);\n    const g = Math.round(c1.g * (1 - ratio) + c2.g * ratio);\n    const b = Math.round(c1.b * (1 - ratio) + c2.b * ratio);\n\n    // Use alpha from colors if present, otherwise default to 1\n    const a =\n      c1.a !== undefined && c2.a !== undefined\n        ? c1.a * (1 - ratio) + c2.a * ratio\n        : 1;\n\n    // Return blended color\n    return a !== 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;\n  }\n\n  // Helper to parse RGBA from color string\n  private parseRGBA(color: string): {\n    r: number;\n    g: number;\n    b: number;\n    a?: number;\n  } {\n    // Handle rgba format\n    let match = color.match(\n      /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([0-9.]+))?\\)/,\n    );\n    if (match) {\n      return {\n        r: parseInt(match[1], 10),\n        g: parseInt(match[2], 10),\n        b: parseInt(match[3], 10),\n        a: match[4] ? parseFloat(match[4]) : undefined,\n      };\n    }\n\n    // Handle hex format\n    match = color.match(/#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i);\n    if (match) {\n      return {\n        r: parseInt(match[1], 16),\n        g: parseInt(match[2], 16),\n        b: parseInt(match[3], 16),\n      };\n    }\n\n    // Handle shorthand hex format\n    match = color.match(/#([0-9a-f])([0-9a-f])([0-9a-f])/i);\n    if (match) {\n      return {\n        r: parseInt(match[1] + match[1], 16),\n        g: parseInt(match[2] + match[2], 16),\n        b: parseInt(match[3] + match[3], 16),\n      };\n    }\n\n    // Default to black if parsing fails\n    console.warn(`Failed to parse color: ${color}, using black instead`);\n    return { r: 0, g: 0, b: 0 };\n  }\n\n  // Draw the complete state (empty state)\n  private drawCompleteState(): void {\n    // Empty state visualization\n    // No rendering needed for now\n\n    // Use base rotation in all states\n    this.targetRotationSpeed = this.config.rotationSpeed;\n  }\n\n  //===================================\n  // PUBLIC API\n  //===================================\n\n  /**\n   * Start the visualization animation\n   */\n  public startVisualization(): void {\n    if (this.animationId) {\n      cancelAnimationFrame(this.animationId);\n    }\n\n    // Only reset properties if not already playing\n    if (!this.isPlaying) {\n      this.rotation = 0;\n      this.currentRotationSpeed = this.config.rotationSpeed;\n      this.targetRotationSpeed = this.config.rotationSpeed;\n      this.animationTime = 0;\n\n      // Delay first pulse\n      if (this.nextPulseTime === 0) {\n        this.nextPulseTime = 1.5 + this.getRandomPulseInterval();\n      }\n    }\n\n    // Initialize bars if needed\n    if (!this.freqBars.length) {\n      this.freqBars = this.createFrequencyBars(this.config.numBars);\n    }\n\n    // Initialize peak values array if needed\n    if (!this.peakValues || this.peakValues.length !== this.config.numBars) {\n      this.peakValues = new Float32Array(this.config.numBars);\n    }\n\n    this.lastFrameTime = performance.now();\n    this.isPlaying = true;\n    this.animationId = requestAnimationFrame(this.draw);\n  }\n\n  /**\n   * Stop the visualization animation\n   */\n  public stopVisualization(): void {\n    if (this.animationId) {\n      cancelAnimationFrame(this.animationId);\n      this.animationId = null;\n    }\n\n    this.isPlaying = false;\n    this.targetRotationSpeed = this.config.rotationSpeed;\n    this.currentRotationSpeed = this.config.rotationSpeed;\n\n    // Return to idle state if currently in audio state\n    if (this.options.state === WaveformState.AUDIO) {\n      this.setState(WaveformState.IDLE);\n    }\n  }\n\n  /**\n   * Connect to an audio track to visualize\n   * @param track - MediaStreamTrack to connect (typically from microphone)\n   * @returns true if successfully connected, false otherwise\n   */\n  public connectToAudioTrack(track: MediaStreamTrack): boolean {\n    const audioCtx = this.initializeAudio();\n    if (!audioCtx || !this.analyser) return false;\n\n    try {\n      audioCtx\n        .resume()\n        .catch((err) => console.warn(\"Failed to resume audio context:\", err));\n\n      // Clean up previous source\n      if (this.source) {\n        this.source.disconnect();\n      }\n\n      // Create media stream and audio source\n      const mediaStream = new MediaStream();\n      mediaStream.addTrack(track);\n      this.source = audioCtx.createMediaStreamSource(mediaStream);\n\n      // Set up processing chain and start visualization\n      this.setupAudioProcessingChain(audioCtx);\n      this.targetRotationSpeed = this.config.rotationSpeed;\n      this.currentRotationSpeed = this.config.rotationSpeed;\n      this.startVisualization();\n\n      // Change state if not already in thinking mode\n      if (this.options.state !== WaveformState.THINKING) {\n        this.setState(WaveformState.AUDIO);\n      }\n\n      this.setStatus(\"Audio connected\");\n      return true;\n    } catch (err) {\n      console.error(\"Error connecting audio source:\", err);\n      this.setStatus(`Error connecting audio: ${(err as Error).message}`);\n      return false;\n    }\n  }\n\n  /**\n   * Clean up resources when component is no longer needed\n   */\n  public dispose(): void {\n    this.stopVisualization();\n\n    // Disconnect audio\n    if (this.source) {\n      this.source.disconnect();\n      this.source = null;\n    }\n\n    // Close audio context\n    if (this.audioContext) {\n      this.audioContext.close().catch(console.error);\n      this.audioContext = null;\n    }\n\n    // Clear arrays to free memory\n    this.frequencyData = null;\n    this.prevFrameData = null;\n    this.downsampledData = null;\n    this.normalizedData = null;\n    this.smoothedData = null;\n    this.temporallySmoothedData = null;\n    this.peakValues = null;\n  }\n\n  /**\n   * Update visualization options\n   * @param options - New options to apply\n   */\n  public updateOptions(options: Partial<CanvasWaveformOptions>): void {\n    const prevSensitivity = this.options.sensitivity;\n    const prevState = this.options.state;\n    const prevRotationSpeed = this.options.rotationSpeed;\n    const prevRotationBoostFactor = this.options.rotationBoostFactor;\n\n    // Apply new options\n    this.options = { ...this.options, ...options };\n    this.config = this.generateConfig();\n\n    // Update audio processing if sensitivity changed\n    if (\n      this.isPlaying &&\n      this.options.sensitivity !== prevSensitivity &&\n      this.audioContext\n    ) {\n      this.setupAudioProcessingChain(this.audioContext);\n    }\n\n    // Update rotation parameters if changed\n    if (\n      this.options.rotationSpeed !== prevRotationSpeed ||\n      this.options.rotationBoostFactor !== prevRotationBoostFactor\n    ) {\n      this.targetRotationSpeed = this.config.rotationSpeed;\n    }\n\n    // Handle state change\n    if (this.options.state !== prevState) {\n      this.setState(this.options.state);\n    }\n\n    // Restart visualization if needed\n    if (this.isPlaying) {\n      if (prevState !== this.options.state) {\n        const wasPlaying = this.isPlaying;\n        this.stopVisualization();\n        if (wasPlaying && this.options.state !== WaveformState.COMPLETE) {\n          this.startVisualization();\n        }\n      }\n    } else {\n      this.drawInitialState();\n    }\n  }\n\n  /**\n   * Set visualization state\n   * @param state - New state to apply\n   */\n  public setState(state: WaveformState): void {\n    if (this.options.state === state) return;\n\n    const prevState = this.options.state;\n    this.options.state = state;\n\n    // Reset rotation speed when changing states\n    this.targetRotationSpeed = this.config.rotationSpeed;\n    this.currentRotationSpeed = this.config.rotationSpeed;\n\n    // Handle state-specific transitions\n    switch (state) {\n      case WaveformState.THINKING:\n        // Reset pulse params but preserve bar values for smooth transition\n        this.isPulsing = false;\n        this.pulseProgress = 0;\n        this.nextPulseTime = this.animationTime;\n\n        // Force immediate draw if not currently animating\n        if (this.ctx && !this.isPlaying) {\n          this.drawThinkingState(this.ctx, this.canvas, 0);\n        }\n        break;\n\n      case WaveformState.AUDIO:\n        // Handle transition from thinking to audio state\n        this.isPulsing = false;\n        this.pulseProgress = 0;\n\n        if (prevState === WaveformState.THINKING) {\n          // Delay pulse after thinking->audio transition\n          this.nextPulseTime =\n            this.animationTime + this.getRandomPulseInterval() + 1.0;\n        } else {\n          // Standard delay for other transitions\n          this.nextPulseTime = this.animationTime + 1.0;\n        }\n\n        // Resume audio context if necessary\n        if (this.audioContext && !this.isPlaying) {\n          this.audioContext.resume().catch(console.error);\n          this.startVisualization();\n        }\n        break;\n    }\n\n    // Start animation if currently stopped (except for IDLE state)\n    if (this.animationId === null && state !== WaveformState.IDLE) {\n      this.startVisualization();\n    }\n  }\n\n  /**\n   * Update the canvas size\n   * @param width - Optional new width (in pixels)\n   * @param height - Optional new height (in pixels)\n   */\n  public updateCanvasSize(width?: number, height?: number): void {\n    // Update dimensions if provided\n    if (width !== undefined) this.options.width = width;\n    if (height !== undefined) this.options.height = height;\n\n    const size = this.getSize();\n    this.dpr = window.devicePixelRatio || 1;\n\n    // Set physical canvas size (scaled for retina displays)\n    this.canvas.width = size.width * this.dpr;\n    this.canvas.height = size.height * this.dpr;\n\n    // Set CSS size\n    this.canvas.style.width = `${size.width}px`;\n    this.canvas.style.height = `${size.height}px`;\n\n    // Reset scale for retina displays\n    if (this.ctx) {\n      this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n      this.ctx.scale(this.dpr, this.dpr);\n    }\n\n    // Redraw if not currently animating\n    if (!this.isPlaying && this.ctx) {\n      this.drawInitialState();\n    }\n  }\n\n  /**\n   * Calculate responsive dimensions\n   */\n  private getSize(): { width: number; height: number } {\n    if (this.options.width && this.options.height) {\n      return { width: this.options.width, height: this.options.height };\n    }\n\n    const screenWidth = window.innerWidth;\n    const screenHeight = window.innerHeight;\n    const size = Math.min(screenWidth * 0.95, screenHeight * 0.7, 400);\n\n    return { width: size, height: size };\n  }\n\n  /**\n   * Register a callback to receive status updates\n   * @param callback - Function to call with status messages\n   */\n  public setStatusCallback(callback: (status: string) => void): void {\n    this.statusCallback = callback;\n  }\n\n  /**\n   * Update status\n   */\n  private setStatus(status: string): void {\n    if (this.statusCallback) {\n      this.statusCallback(status);\n    }\n  }\n\n  /**\n   * Update the pulse animation for audio state\n   */\n  private updateAudioPulse(): void {\n    const currentTime = this.animationTime;\n\n    // Initialize pulse time if needed\n    if (this.nextPulseTime === 0) {\n      this.nextPulseTime = currentTime + this.getRandomPulseInterval();\n    }\n\n    if (this.isPulsing) {\n      // Update progress of active pulse\n      this.pulseProgress += 0.016 / this.pulseDuration;\n\n      // Complete pulse and schedule next one\n      if (this.pulseProgress >= 1) {\n        this.isPulsing = false;\n        this.pulseProgress = 0;\n        this.nextPulseTime = currentTime + this.getRandomPulseInterval();\n      }\n    } else if (currentTime >= this.nextPulseTime) {\n      // Start a new pulse\n      this.isPulsing = true;\n      this.pulseProgress = 0;\n    }\n  }\n\n  /**\n   * Get random interval between pulses\n   */\n  private getRandomPulseInterval(): number {\n    return 3 + Math.random() * 5; // 3-8 second range\n  }\n\n  /**\n   * Update rotation speed based on audio activity\n   * @param deltaTime - Time elapsed since last frame (seconds)\n   */\n  private updateRotationSpeed(deltaTime: number): void {\n    // Use base rotation for non-audio states\n    if (this.options.state !== WaveformState.AUDIO || !this.analyser) {\n      this.targetRotationSpeed = this.config.rotationSpeed;\n\n      if (this.options.state !== WaveformState.AUDIO) {\n        this.currentRotationSpeed = this.config.rotationSpeed;\n        return;\n      }\n    }\n\n    // Detect voice activity for audio state\n    if (\n      this.options.state === WaveformState.AUDIO &&\n      this.analyser &&\n      this.frequencyData\n    ) {\n      // Sample frequency data to detect activity\n      let sum = 0;\n      const sampleSize = Math.min(50, this.frequencyData.length);\n      for (let i = 0; i < sampleSize; i++) {\n        sum += this.frequencyData[i];\n      }\n\n      const avgLevel = sum / sampleSize / 255;\n      const hasVoiceActivity = avgLevel >= 0.05;\n\n      if (hasVoiceActivity) {\n        // Voice detected - spin up quickly\n        const activityLevel = Math.min(1.0, avgLevel * 2);\n        const boostFactor = this.config.rotationBoostFactor * activityLevel;\n\n        // Set dramatic target speed\n        this.targetRotationSpeed =\n          this.config.rotationSpeed * (1 + boostFactor);\n\n        // Fast acceleration (reach target quickly)\n        const accelerationRate = 10.0;\n        const speedDiff = this.targetRotationSpeed - this.currentRotationSpeed;\n\n        if (speedDiff > 0) {\n          this.currentRotationSpeed +=\n            speedDiff * Math.min(1, accelerationRate * deltaTime);\n        }\n      } else {\n        // No voice - gradually slow down\n        this.targetRotationSpeed = this.config.rotationSpeed;\n\n        // Gentle deceleration based on config\n        const decelerationRate = this.config.rotationDecayRate;\n        const speedDiff = this.targetRotationSpeed - this.currentRotationSpeed;\n\n        if (speedDiff < 0) {\n          this.currentRotationSpeed +=\n            speedDiff * Math.min(1, decelerationRate * deltaTime);\n        }\n      }\n\n      // Debug logging\n      if (this.options.debug && Math.random() < 0.01) {\n        console.log(\n          `Rotation: current=${this.currentRotationSpeed.toFixed(4)}, ` +\n            `target=${this.targetRotationSpeed.toFixed(4)}, ` +\n            `audio=${hasVoiceActivity ? \"active\" : \"inactive\"}`,\n        );\n      }\n    }\n  }\n\n  /**\n   * Helper method to ensure value doesn't exceed maximum bounds\n   */\n  private limitBarValue(\n    value: number,\n    maxValue: number = this.config.maxBarLength,\n  ): number {\n    return Math.min(value, maxValue);\n  }\n\n  /**\n   * Calculate a pulse influence factor for the audio mode\n   */\n  private getAudioPulseInfluence(barIndex: number, barCount: number): number {\n    if (!this.isPulsing || this.config.listeningPulseAmount <= 0) {\n      return 0;\n    }\n\n    // Create a pulse that travels around the circle\n    const normalizedPosition = barIndex / barCount;\n    const pulseCenter = this.pulseProgress;\n\n    // Calculate distance from pulse center (in circular space)\n    let distance = Math.abs(normalizedPosition - pulseCenter);\n    distance = Math.min(distance, 1 - distance); // Handle wrapping\n\n    // Create a bell curve centered at the pulse\n    const pulseWidth = 0.15;\n    const influence = Math.max(0, 1 - Math.pow(distance / pulseWidth, 2));\n\n    // Apply a sine wave to create a smooth pulse that rises and falls\n    const pulseFactor = Math.sin(this.pulseProgress * Math.PI) * influence;\n\n    // Add a smooth fade-in for new pulses\n    const fadeInFactor = Math.min(1.0, this.pulseProgress * 4); // Fade in during first 25% of pulse\n\n    return pulseFactor * this.config.listeningPulseAmount * fadeInFactor;\n  }\n\n  /**\n   * Helper method for thinking state pulse influence calculation\n   */\n  private getThinkingPulseInfluence(\n    barIndex: number,\n    barCount: number,\n  ): number {\n    // Create a pulse that travels around the circle\n    const normalizedPosition = barIndex / barCount;\n    const pulseCenter = (this.animationTime * 0.4) % 1.0;\n\n    // Calculate distance from pulse center (in circular space)\n    let distance = Math.abs(normalizedPosition - pulseCenter);\n    distance = Math.min(distance, 1 - distance); // Handle wrapping\n\n    // Create pulse shape\n    const pulseWidth = 0.12;\n    const influence = Math.max(0, 1 - Math.pow(distance / pulseWidth, 2));\n\n    // Use a controlled pulse height\n    const pulseHeight = influence * this.config.maxPulseHeight * 0.35;\n\n    return this.limitBarValue(pulseHeight);\n  }\n}\n","import { cn } from \"@/lib/utils\";\nimport React, { useCallback, useEffect, useRef } from \"react\";\nimport {\n  type CanvasWaveformOptions,\n  CircularWaveformCanvas,\n  WaveformState,\n} from \"./canvas\";\n\nexport interface CircularWaveformProps {\n  size?: number;\n  isThinking?: boolean;\n  audioTrack?: MediaStreamTrack | null;\n  className?: string;\n  color1?: string;\n  color2?: string;\n  backgroundColor?: string;\n  sensitivity?: number;\n  rotationEnabled?: boolean;\n  numBars?: number;\n  barWidth?: number;\n  debug?: boolean;\n}\n\nexport const CircularWaveform: React.FC<CircularWaveformProps> = ({\n  size,\n  audioTrack = null,\n  isThinking = false,\n  className = \"\",\n  color1 = \"#00D3F2\",\n  color2 = \"#E12AFB\",\n  backgroundColor = \"transparent\",\n  sensitivity = 1,\n  rotationEnabled = true,\n  numBars = 64,\n  barWidth = 4,\n  debug = false,\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement | null>(null);\n  const containerRef = useRef<HTMLDivElement | null>(null);\n  const waveformRef = useRef<CircularWaveformCanvas | null>(null);\n\n  const getSize = useCallback((): { width: number; height: number } => {\n    if (size) {\n      return { width: size, height: size };\n    }\n\n    let containerWidth = window.innerWidth;\n    let containerHeight = window.innerHeight;\n\n    if (containerRef.current) {\n      const containerRect = containerRef.current.getBoundingClientRect();\n      containerWidth = containerRect.width;\n      containerHeight = containerRect.height;\n    }\n\n    const availableSize = Math.min(containerWidth, containerHeight);\n    const calculatedSize = availableSize;\n\n    return { width: calculatedSize, height: calculatedSize };\n  }, [size]);\n\n  const determineState = useCallback((): WaveformState => {\n    const newState = isThinking\n      ? WaveformState.THINKING\n      : audioTrack\n        ? WaveformState.AUDIO\n        : WaveformState.IDLE;\n\n    return newState;\n  }, [isThinking, audioTrack]);\n\n  const initializeWaveform = useCallback(() => {\n    if (!canvasRef.current) return;\n\n    const canvas = canvasRef.current;\n    const { width: canvasWidth, height: canvasHeight } = getSize();\n\n    const options: CanvasWaveformOptions = {\n      width: canvasWidth,\n      height: canvasHeight,\n      state: WaveformState.IDLE,\n      color1,\n      color2,\n      backgroundColor,\n      sensitivity,\n      rotationEnabled,\n      numBars,\n      barWidth,\n      debug,\n    };\n\n    // Create the waveform canvas\n    const waveform = new CircularWaveformCanvas(canvas, options);\n\n    // Store reference\n    waveformRef.current = waveform;\n\n    // Start visualization after a short delay\n    setTimeout(() => {\n      // Start the visualization\n      waveform.startVisualization();\n\n      // Apply the correct state based on props\n      const currentState = determineState();\n      waveform.setState(currentState);\n    }, 100);\n  }, [\n    getSize,\n    color1,\n    color2,\n    backgroundColor,\n    sensitivity,\n    rotationEnabled,\n    numBars,\n    barWidth,\n    debug,\n    determineState,\n  ]);\n\n  // Connect audio track if provided\n  const connectAudioTrack = useCallback(() => {\n    if (!waveformRef.current || !audioTrack) return;\n\n    waveformRef.current.connectToAudioTrack(audioTrack);\n  }, [audioTrack]);\n\n  // Handle container resize using ResizeObserver\n  useEffect(() => {\n    if (!containerRef.current) return;\n\n    const handleContainerResize = () => {\n      if (!waveformRef.current || !canvasRef.current) return;\n\n      const { width: canvasWidth, height: canvasHeight } = getSize();\n      waveformRef.current.updateCanvasSize(canvasWidth, canvasHeight);\n    };\n\n    const resizeObserver = new ResizeObserver(() => {\n      handleContainerResize();\n    });\n\n    resizeObserver.observe(containerRef.current);\n\n    return () => {\n      resizeObserver.disconnect();\n    };\n  }, [getSize]);\n\n  // Initialize canvas on component mount\n  useEffect(() => {\n    initializeWaveform();\n  }, [initializeWaveform]);\n\n  // Connect audio track if provided\n  useEffect(() => {\n    if (audioTrack && waveformRef.current) {\n      connectAudioTrack();\n    }\n  }, [audioTrack, connectAudioTrack]);\n\n  // Update waveform state when relevant props change\n  useEffect(() => {\n    if (!waveformRef.current) return;\n\n    const currentState = determineState();\n    waveformRef.current.setState(currentState);\n  }, [isThinking, audioTrack, determineState]);\n\n  // Update waveform options when props change\n  useEffect(() => {\n    if (!waveformRef.current) return;\n\n    waveformRef.current.updateOptions({\n      color1,\n      color2,\n      backgroundColor,\n      sensitivity,\n      rotationEnabled,\n      numBars,\n      barWidth,\n      debug,\n    });\n  }, [\n    color1,\n    color2,\n    backgroundColor,\n    sensitivity,\n    rotationEnabled,\n    numBars,\n    barWidth,\n    debug,\n  ]);\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => {\n      if (waveformRef.current) {\n        waveformRef.current.dispose();\n      }\n    };\n  }, []);\n\n  return (\n    <div\n      ref={containerRef}\n      className={cn(\n        \"circular-waveform-container w-full h-full flex items-center justify-center\",\n        className,\n      )}\n      style={{ position: \"relative\" }}\n    >\n      <canvas ref={canvasRef} className=\"circular-waveform-canvas\" />\n    </div>\n  );\n};\n\nCircularWaveform.displayName = \"CircularWaveform\";\n","import React, { useEffect, useRef } from \"react\";\n\nimport { usePipecatClientMediaTrack } from \"@pipecat-ai/client-react\";\n\ntype ParticipantType = Parameters<typeof usePipecatClientMediaTrack>[1];\n\ninterface Props {\n  backgroundColor?: string;\n  barColor?: string;\n  noPeaks?: boolean;\n  peakLineColor?: string;\n  peakLineSpeed?: number;\n  peakLineThickness?: number;\n  peakOffset?: number;\n  peakFadeSpeed?: number;\n  barCount?: number;\n  barGap?: number;\n  barLineCap?: \"round\" | \"square\";\n  barMaxHeight?: number;\n  barOrigin?: \"top\" | \"bottom\" | \"center\";\n  barWidth?: number;\n  participantType: ParticipantType;\n  className?: string;\n}\n\nexport const VoiceVisualizer: React.FC<Props> = React.memo(\n  ({\n    backgroundColor = \"transparent\",\n    barColor = \"black\",\n    noPeaks = true,\n    peakLineColor = \"red\",\n    peakLineSpeed = 0.2,\n    peakLineThickness = 2,\n    peakOffset = 0,\n    peakFadeSpeed = 0.02,\n    barCount = 5,\n    barGap = 12,\n    barLineCap = \"round\",\n    barMaxHeight = 120,\n    barOrigin = \"center\",\n    barWidth = 30,\n    participantType,\n    className,\n  }) => {\n    const canvasRef = useRef<HTMLCanvasElement>(null);\n    const resolvedBarColorRef = useRef<string>(\"black\");\n    const resolvedPeakLineColorRef = useRef<string>(\"black\");\n    const analyserRef = useRef<AnalyserNode | null>(null);\n    const frequencyDataRef = useRef<Uint8Array | null>(null);\n\n    useEffect(() => {\n      function resolveColor(color: string) {\n        if (!color) return \"black\";\n        if (color === \"currentColor\") {\n          if (canvasRef.current) {\n            const computedStyle = getComputedStyle(canvasRef.current);\n            return computedStyle.color || \"black\";\n          }\n          return \"black\";\n        }\n        if (color.startsWith(\"--\")) {\n          return (\n            getComputedStyle(document.documentElement)\n              .getPropertyValue(color)\n              .trim() || \"black\"\n          );\n        }\n        return color;\n      }\n      resolvedBarColorRef.current = resolveColor(barColor);\n      resolvedPeakLineColorRef.current = resolveColor(peakLineColor);\n    }, [barColor, peakLineColor, className]);\n\n    const track: MediaStreamTrack | null = usePipecatClientMediaTrack(\n      \"audio\",\n      participantType,\n    );\n\n    // Effect 1: Audio pipeline — only recreated when track changes\n    useEffect(() => {\n      if (!track) {\n        analyserRef.current = null;\n        frequencyDataRef.current = null;\n        return;\n      }\n\n      const audioContext = new AudioContext();\n      const source = audioContext.createMediaStreamSource(\n        new MediaStream([track]),\n      );\n      const analyser = audioContext.createAnalyser();\n      analyser.fftSize = 1024;\n      source.connect(analyser);\n\n      analyserRef.current = analyser;\n      frequencyDataRef.current = new Uint8Array(analyser.frequencyBinCount);\n\n      return () => {\n        analyserRef.current = null;\n        frequencyDataRef.current = null;\n        audioContext.close();\n      };\n    }, [track]);\n\n    // Effect 2: Canvas setup + animation loop\n    useEffect(() => {\n      if (!canvasRef.current) return;\n\n      const canvas = canvasRef.current;\n      const canvasWidth = barCount * barWidth + (barCount - 1) * barGap;\n      const canvasHeight = barMaxHeight;\n      const scaleFactor = 2;\n\n      canvas.width = canvasWidth * scaleFactor;\n      canvas.height = canvasHeight * scaleFactor;\n      canvas.style.width = `${canvasWidth}px`;\n      canvas.style.height = `${canvasHeight}px`;\n\n      const canvasCtx = canvas.getContext(\"2d\")!;\n      canvasCtx.lineCap = barLineCap;\n      canvasCtx.scale(scaleFactor, scaleFactor);\n\n      // Create frequency bands with precomputed bin indices\n      const sampleRate = analyserRef.current?.context.sampleRate ?? 48000;\n      const frequencyBinCount = analyserRef.current?.frequencyBinCount ?? 512;\n      const nyquist = sampleRate / 2;\n\n      const bands = Array.from({ length: barCount }, (_, i) => {\n        const minFreq = barCount > 20 ? 200 : 80;\n        const maxFreq = 10000;\n\n        // Mel scale inspired approach for perceptually uniform distribution\n        // https://en.wikipedia.org/wiki/Mel_scale\n        const melMin = 2595 * Math.log10(1 + minFreq / 700);\n        const melMax = 2595 * Math.log10(1 + maxFreq / 700);\n        const melStep = (melMax - melMin) / barCount;\n\n        const melValue = melMin + i * melStep;\n        const startFreq = 700 * (Math.pow(10, melValue / 2595) - 1);\n        const endFreq = 700 * (Math.pow(10, (melValue + melStep) / 2595) - 1);\n\n        const startBin = Math.round(\n          (startFreq / nyquist) * (frequencyBinCount - 1),\n        );\n        const endBin = Math.round(\n          (endFreq / nyquist) * (frequencyBinCount - 1),\n        );\n\n        const band: {\n          startBin: number;\n          endBin: number;\n          smoothValue: number;\n          peakValue?: number;\n          peakOpacity?: number;\n        } = {\n          startBin,\n          endBin,\n          smoothValue: 0,\n        };\n\n        if (!noPeaks) {\n          band.peakValue = 0;\n          band.peakOpacity = 0;\n        }\n\n        return band;\n      });\n\n      // Precompute layout constants\n      const totalBarsWidth =\n        bands.length * barWidth + (bands.length - 1) * barGap;\n      const startX = (canvasWidth - totalBarsWidth) / 2;\n      const adjustedCircleRadius = barWidth / 2;\n\n      function drawInactiveCircle(\n        circleRadius: number,\n        color: string,\n        x: number,\n        y: number,\n      ) {\n        switch (barLineCap) {\n          case \"square\":\n            canvasCtx.fillStyle = color;\n            canvasCtx.fillRect(\n              x + barWidth / 2 - circleRadius,\n              y - circleRadius,\n              circleRadius * 2,\n              circleRadius * 2,\n            );\n            break;\n          case \"round\":\n          default:\n            canvasCtx.beginPath();\n            canvasCtx.arc(x + barWidth / 2, y, circleRadius, 0, 2 * Math.PI);\n            canvasCtx.fillStyle = color;\n            canvasCtx.fill();\n            canvasCtx.closePath();\n            break;\n        }\n      }\n\n      function drawInactiveCircles(circleRadius: number, color: string) {\n        let y;\n        switch (barOrigin) {\n          case \"top\":\n            y = circleRadius;\n            break;\n          case \"bottom\":\n            y = canvasHeight - circleRadius;\n            break;\n          case \"center\":\n          default:\n            y = canvasHeight / 2;\n            break;\n        }\n\n        bands.forEach((_, i) => {\n          const x = startX + i * (barWidth + barGap);\n          drawInactiveCircle(circleRadius, color, x, y);\n        });\n      }\n\n      let rafId: number;\n\n      function drawSpectrum() {\n        const analyser = analyserRef.current;\n        const frequencyData = frequencyDataRef.current;\n\n        canvasCtx.clearRect(0, 0, canvasWidth, canvasHeight);\n        canvasCtx.fillStyle = backgroundColor;\n        canvasCtx.fillRect(0, 0, canvasWidth, canvasHeight);\n\n        if (!analyser || !frequencyData) {\n          drawInactiveCircles(\n            adjustedCircleRadius,\n            resolvedBarColorRef.current,\n          );\n          // Don't schedule another frame — effect re-runs when track changes\n          return;\n        }\n\n        analyser.getByteFrequencyData(frequencyData);\n\n        let isActive = false;\n\n        const resolvedBarColor = resolvedBarColorRef.current;\n\n        bands.forEach((band, i) => {\n          // Index-based sum avoids per-frame array allocation\n          let sum = 0;\n          const count = band.endBin - band.startBin;\n          for (let j = band.startBin; j < band.endBin; j++) {\n            sum += frequencyData[j];\n          }\n          const bandValue = count > 0 ? sum / count : 0;\n\n          const smoothingFactor = 0.2;\n          const fadeEpsilon = 0.5;\n\n          if (bandValue < 1) {\n            band.smoothValue = Math.max(\n              band.smoothValue - smoothingFactor * 5,\n              0,\n            );\n          } else {\n            band.smoothValue =\n              band.smoothValue +\n              (bandValue - band.smoothValue) * smoothingFactor;\n            isActive = true;\n          }\n\n          // Update peak value - moves up with the bar but returns more slowly\n          if (\n            !noPeaks &&\n            band.peakValue !== undefined &&\n            band.peakOpacity !== undefined\n          ) {\n            if (band.smoothValue > band.peakValue) {\n              band.peakValue = band.smoothValue;\n              band.peakOpacity = 1;\n            } else {\n              // Peak returns to the top of the bar more slowly\n              const peakSmoothingFactor = peakLineSpeed;\n              band.peakValue = Math.max(\n                band.peakValue - peakSmoothingFactor * 5,\n                band.smoothValue,\n              );\n              // Begin fading once the bar is effectively zeroed\n              if (band.smoothValue <= fadeEpsilon) {\n                band.peakOpacity = Math.max(\n                  0,\n                  band.peakOpacity - peakFadeSpeed,\n                );\n              }\n            }\n          }\n\n          const x = startX + i * (barWidth + barGap);\n          // Calculate bar height with a maximum cap\n          const minHeight = 0;\n          const barHeight = Math.max(\n            minHeight,\n            Math.min((band.smoothValue / 255) * barMaxHeight, barMaxHeight),\n          );\n\n          let yTop, yBottom;\n\n          switch (barOrigin) {\n            case \"top\":\n              yTop = adjustedCircleRadius;\n              yBottom = Math.min(\n                adjustedCircleRadius + barHeight,\n                canvasHeight - adjustedCircleRadius,\n              );\n              break;\n            case \"bottom\":\n              yBottom = canvasHeight - adjustedCircleRadius;\n              yTop = Math.max(yBottom - barHeight, adjustedCircleRadius);\n              break;\n            case \"center\":\n            default:\n              yTop = Math.max(\n                canvasHeight / 2 - barHeight / 2,\n                adjustedCircleRadius,\n              );\n              yBottom = Math.min(\n                canvasHeight / 2 + barHeight / 2,\n                canvasHeight - adjustedCircleRadius,\n              );\n              break;\n          }\n\n          if (band.smoothValue > 0) {\n            canvasCtx.beginPath();\n            canvasCtx.moveTo(x + barWidth / 2, yTop);\n            canvasCtx.lineTo(x + barWidth / 2, yBottom);\n            canvasCtx.lineWidth = barWidth;\n            canvasCtx.strokeStyle = resolvedBarColor;\n            canvasCtx.stroke();\n          } else {\n            drawInactiveCircle(adjustedCircleRadius, resolvedBarColor, x, yTop);\n          }\n\n          // Draw the peak line (2px line at the top) - always draw when it exists\n          if (\n            !noPeaks &&\n            band.peakValue !== undefined &&\n            band.peakOpacity !== undefined &&\n            (band.peakValue > 0 || (peakOffset > 0 && band.peakOpacity > 0))\n          ) {\n            const peakHeight = Math.max(\n              minHeight,\n              Math.min((band.peakValue / 255) * barMaxHeight, barMaxHeight),\n            );\n\n            // Compute raw peak position by origin\n            let peakY;\n            switch (barOrigin) {\n              case \"top\":\n                peakY = adjustedCircleRadius + peakHeight;\n                break;\n              case \"bottom\":\n                peakY = canvasHeight - adjustedCircleRadius - peakHeight;\n                break;\n              case \"center\":\n              default:\n                peakY = canvasHeight / 2 - peakHeight / 2;\n                break;\n            }\n\n            // Visual tip offset due to lineCap (round/square extend by barWidth/2)\n            const capExtension =\n              barLineCap === \"round\" || barLineCap === \"square\"\n                ? barWidth / 2\n                : 0;\n\n            // Bar visual tip Y coordinate to clamp/offset against\n            const barTipY = ((): number => {\n              switch (barOrigin) {\n                case \"top\":\n                  return yBottom + capExtension; // bar grows downward\n                case \"bottom\":\n                  return yTop - capExtension; // bar grows upward\n                case \"center\":\n                default:\n                  return yTop - capExtension; // use upper tip as cap\n              }\n            })();\n\n            // Enforce a constant offset from the bar tip in the outward direction\n            if (barOrigin === \"top\") {\n              const desiredY = barTipY + peakOffset; // outward is increasing y\n              peakY = Math.max(peakY, desiredY);\n            } else {\n              const desiredY = barTipY - peakOffset; // outward is decreasing y\n              peakY = Math.min(peakY, desiredY);\n            }\n\n            // Draw the peak line, matching bar width exactly\n            const previousLineCap = canvasCtx.lineCap;\n            const previousAlpha = canvasCtx.globalAlpha;\n            canvasCtx.lineCap = \"butt\";\n            canvasCtx.globalAlpha = band.peakOpacity;\n            canvasCtx.beginPath();\n            canvasCtx.moveTo(x, peakY);\n            canvasCtx.lineTo(x + barWidth, peakY);\n            canvasCtx.lineWidth = peakLineThickness;\n            canvasCtx.strokeStyle = resolvedPeakLineColorRef.current;\n            canvasCtx.stroke();\n            canvasCtx.lineCap = previousLineCap;\n            canvasCtx.globalAlpha = previousAlpha;\n          }\n        });\n\n        if (!isActive) {\n          drawInactiveCircles(adjustedCircleRadius, resolvedBarColor);\n        }\n\n        rafId = requestAnimationFrame(drawSpectrum);\n      }\n\n      rafId = requestAnimationFrame(drawSpectrum);\n\n      return () => {\n        cancelAnimationFrame(rafId);\n      };\n    }, [\n      backgroundColor,\n      barCount,\n      barGap,\n      barLineCap,\n      barMaxHeight,\n      barOrigin,\n      barWidth,\n      track,\n      noPeaks,\n      peakLineSpeed,\n      peakLineThickness,\n      peakOffset,\n      peakFadeSpeed,\n    ]);\n\n    return (\n      <canvas\n        ref={canvasRef}\n        style={{\n          display: \"block\",\n          width: \"100%\",\n          height: \"100%\",\n        }}\n        className={className}\n      />\n    );\n  },\n);\n\nVoiceVisualizer.displayName = \"VoiceVisualizer\";\n","\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ButtonGroup } from \"@/components/ui/buttongroup\";\nimport {\n  buttonAccentColorMapCls,\n  type ButtonSize,\n  type ButtonState,\n  type ButtonVariant,\n} from \"@/components/ui/buttonVariants\";\nimport {\n  DropdownMenu,\n  DropdownMenuCheckboxItem,\n  DropdownMenuContent,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/lib/utils\";\nimport { VoiceVisualizer } from \"@/visualizers\";\nimport { type DeviceErrorReason } from \"@pipecat-ai/client-js\";\nimport {\n  type OptionalMediaDeviceInfo,\n  PipecatClientMicToggle,\n  useMediaState,\n  usePipecatClientMediaDevices,\n} from \"@pipecat-ai/client-react\";\nimport {\n  ChevronDownIcon,\n  MicIcon,\n  MicOffIcon,\n  SpeakerIcon,\n} from \"lucide-react\";\n\n/**\n * Base props interface for UserAudioControl components.\n * Provides styling, behavior, and customization options for audio controls.\n */\ninterface Props {\n  /** Visual style variant for the control button */\n  variant?: ButtonVariant;\n  /** Size of the control button */\n  size?: ButtonSize;\n  /** State of the control button (default, inactive, etc.) */\n  state?: ButtonState;\n  /** Additional props to pass to the main control button */\n  buttonProps?: Partial<React.ComponentProps<typeof Button>>;\n  /** Custom CSS classes for different parts of the component */\n  classNames?: {\n    /** CSS classes for the main control button */\n    button?: string;\n    /** CSS classes for the button group */\n    buttongroup?: string;\n    /** CSS classes for the dropdown menu trigger button */\n    dropdownMenuTrigger?: string;\n    /** CSS classes for the dropdown menu content */\n    dropdownMenuContent?: string;\n    /** CSS classes for dropdown menu checkbox items */\n    dropdownMenuCheckboxItem?: string;\n    /** CSS classes for active state text */\n    activeText?: string;\n    /** CSS classes for inactive state text */\n    inactiveText?: string;\n  };\n  /** Additional props to pass to the dropdown button */\n  dropdownButtonProps?: Partial<React.ComponentProps<typeof Button>>;\n  /** Whether to hide the device picker dropdown */\n  noDevicePicker?: boolean;\n  /** Custom label for the main dropdown menu (null/empty to hide) */\n  dropdownMenuLabel?: string | null;\n  /** Whether to hide microphones from the device dropdown */\n  noMicrophones?: boolean;\n  /** Whether to hide speakers from the device dropdown */\n  noSpeakers?: boolean;\n  /** Custom label for the microphone section in the dropdown */\n  microphoneLabel?: string;\n  /** Custom label for the speaker section in the dropdown */\n  speakerLabel?: string;\n  /** Whether to hide the voice visualizer */\n  noVisualizer?: boolean;\n  /** Additional props to pass to the VoiceVisualizer component */\n  visualizerProps?: Partial<React.ComponentProps<typeof VoiceVisualizer>>;\n  /** Whether to disable audio functionality entirely */\n  noAudio?: boolean;\n  /** Custom text to display when audio is disabled */\n  noAudioText?: string | null;\n  /** Whether to hide the microphone icon in the button */\n  noIcon?: boolean;\n  /** Text to display when microphone is active */\n  activeText?: string;\n  /** Text to display when microphone is inactive */\n  inactiveText?: string;\n  /** Custom content to render inside the button */\n  children?: React.ReactNode;\n}\n\n/**\n * Props interface for the headless UserAudioComponent.\n * Includes device data and callbacks for external state management.\n */\ninterface ComponentProps extends Props {\n  /** Callback function called when the microphone toggle button is clicked */\n  onClick?: () => void;\n  /** Whether the microphone is currently enabled */\n  isMicEnabled?: boolean;\n  /** Array of available microphone devices */\n  availableMics?: MediaDeviceInfo[];\n  /** Currently selected microphone device */\n  selectedMic?: OptionalMediaDeviceInfo;\n  /** Callback function called when a microphone device is selected */\n  updateMic?: (deviceId: string) => void;\n  /** Array of available speaker devices */\n  availableSpeakers?: MediaDeviceInfo[];\n  /** Currently selected speaker device */\n  selectedSpeaker?: OptionalMediaDeviceInfo;\n  /** Callback function called when a speaker device is selected */\n  updateSpeaker?: (deviceId: string) => void;\n  /**\n   * When set, renders a disabled button with this message instead of the\n   * toggle and hides the picker. Used by the connected UserAudioControl to\n   * surface mic-error states (blocked, in-use, etc.) sourced from\n   * useMediaState(). Distinct from `noAudio`, which is a deliberate\n   * consumer opt-out.\n   */\n  unavailableText?: string;\n}\n\nconst btnClasses = \"flex-1 w-full z-10 justify-start\";\n\n/**\n * Headless UserAudioComponent that accepts all device data and callbacks as props.\n * This component can be used with any framework or state management solution.\n *\n * @example\n * ```tsx\n * <UserAudioComponent\n *   isMicEnabled={isMicrophoneOn}\n *   onClick={handleMicrophoneToggle}\n *   availableMics={microphones}\n *   selectedMic={currentMicrophone}\n *   updateMic={handleMicrophoneChange}\n *   variant=\"outline\"\n *   size=\"lg\"\n * />\n * ```\n */\nexport const UserAudioComponent: React.FC<ComponentProps> = ({\n  variant = \"secondary\",\n  size = \"md\",\n  classNames = {},\n  buttonProps = {},\n  dropdownButtonProps = {},\n  noDevicePicker = false,\n  dropdownMenuLabel = \"Audio Devices\",\n  noMicrophones = false,\n  noSpeakers = false,\n  microphoneLabel = \"Microphones\",\n  speakerLabel = \"Speakers\",\n  noVisualizer = false,\n  visualizerProps = {},\n  isMicEnabled = false,\n  state,\n  availableMics,\n  selectedMic,\n  updateMic,\n  availableSpeakers,\n  selectedSpeaker,\n  updateSpeaker,\n  noAudio,\n  noAudioText = \"Audio disabled\",\n  noIcon = false,\n  activeText,\n  inactiveText,\n  children,\n  onClick,\n  unavailableText,\n}) => {\n  let buttonComp;\n\n  const noDropdown = noDevicePicker || (noMicrophones && noSpeakers);\n  const isUnavailable = !!unavailableText;\n\n  /** NO AUDIO / LOADING / DEVICE UNAVAILABLE */\n  if (noAudio || buttonProps?.isLoading || isUnavailable) {\n    // unavailableText (mic blocked, in-use, etc.) takes precedence over\n    // the consumer's noAudioText so the actual cause is visible.\n    const disabledText = unavailableText ?? noAudioText;\n    buttonComp = (\n      <Button\n        variant={variant}\n        size={size}\n        {...buttonProps}\n        disabled\n        className={cn(\n          btnClasses,\n          buttonProps?.isLoading && \"justify-center\",\n          classNames.button,\n        )}\n      >\n        {!buttonProps?.isLoading && (\n          <>\n            {!noIcon && <MicOffIcon />}\n            {disabledText && <span className=\"flex-1\">{disabledText}</span>}\n            {children}\n          </>\n        )}\n      </Button>\n    );\n  } else {\n    /** AUDIO ENABLED */\n    const buttonState = state || (isMicEnabled ? \"default\" : \"inactive\");\n\n    const hasMicrophones =\n      !noMicrophones && availableMics && availableMics.length > 0;\n    const hasSpeakers =\n      !noSpeakers && availableSpeakers && availableSpeakers.length > 0;\n\n    buttonComp = (\n      <>\n        <Button\n          onClick={onClick}\n          variant={variant}\n          state={buttonState}\n          size={size}\n          {...buttonProps}\n          className={cn(\n            btnClasses,\n            !noDropdown && \"rounded-e-none\",\n            classNames.button,\n          )}\n        >\n          {!noIcon && (isMicEnabled ? <MicIcon /> : <MicOffIcon />)}\n          {buttonState === \"inactive\" && inactiveText ? (\n            <span className={cn(\"flex-1\", classNames.inactiveText)}>\n              {inactiveText}\n            </span>\n          ) : null}\n          {buttonState !== \"inactive\" && activeText ? (\n            <span className={cn(\"flex-1 \", classNames.activeText)}>\n              {activeText}\n            </span>\n          ) : null}\n          {children}\n          {!noVisualizer && (\n            <VoiceVisualizer\n              participantType=\"local\"\n              backgroundColor=\"transparent\"\n              barCount={10}\n              barGap={2}\n              barMaxHeight={size === \"lg\" ? 24 : size === \"xl\" ? 36 : 20}\n              barOrigin=\"center\"\n              barWidth={3}\n              barColor=\"currentColor\"\n              className={cn(\n                \"mx-auto\",\n                buttonAccentColorMapCls[variant || \"primary\"]?.[buttonState],\n              )}\n              {...visualizerProps}\n            />\n          )}\n        </Button>\n        {!noDropdown && (\n          <DropdownMenu>\n            <DropdownMenuTrigger asChild>\n              <Button\n                className={cn(\n                  \"flex-none z-0 rounded-s-none border-l-0\",\n                  classNames.dropdownMenuTrigger,\n                )}\n                variant={variant}\n                size={size}\n                isIcon\n                {...dropdownButtonProps}\n              >\n                <ChevronDownIcon size={16} />\n              </Button>\n            </DropdownMenuTrigger>\n            <DropdownMenuContent\n              align=\"end\"\n              className={cn(classNames.dropdownMenuContent)}\n            >\n              {dropdownMenuLabel && (\n                <>\n                  <DropdownMenuLabel>{dropdownMenuLabel}</DropdownMenuLabel>\n                  {(hasMicrophones || hasSpeakers) && <DropdownMenuSeparator />}\n                </>\n              )}\n\n              {/* Microphone devices */}\n              {hasMicrophones && (\n                <>\n                  <DropdownMenuLabel className=\"text-xs text-muted-foreground\">\n                    <MicIcon size={12} className=\"inline mr-1\" />\n                    {microphoneLabel}\n                  </DropdownMenuLabel>\n                  {availableMics.map((device) => (\n                    <DropdownMenuCheckboxItem\n                      key={`mic-${device.deviceId}`}\n                      checked={selectedMic?.deviceId === device.deviceId}\n                      onCheckedChange={() => updateMic?.(device.deviceId)}\n                      className={cn(classNames.dropdownMenuCheckboxItem)}\n                    >\n                      {device.label ||\n                        `Microphone ${device.deviceId.slice(0, 5)}`}\n                    </DropdownMenuCheckboxItem>\n                  ))}\n                  {hasSpeakers && <DropdownMenuSeparator />}\n                </>\n              )}\n\n              {/* Speaker devices */}\n              {hasSpeakers && (\n                <>\n                  <DropdownMenuLabel className=\"text-xs text-muted-foreground\">\n                    <SpeakerIcon size={12} className=\"inline mr-1\" />\n                    {speakerLabel}\n                  </DropdownMenuLabel>\n                  {availableSpeakers.map((device) => (\n                    <DropdownMenuCheckboxItem\n                      key={`speaker-${device.deviceId}`}\n                      checked={selectedSpeaker?.deviceId === device.deviceId}\n                      onCheckedChange={() => updateSpeaker?.(device.deviceId)}\n                      className={cn(classNames.dropdownMenuCheckboxItem)}\n                    >\n                      {device.label || `Speaker ${device.deviceId.slice(0, 5)}`}\n                    </DropdownMenuCheckboxItem>\n                  ))}\n                </>\n              )}\n            </DropdownMenuContent>\n          </DropdownMenu>\n        )}\n      </>\n    );\n  }\n\n  return (\n    <ButtonGroup className={cn(variant !== \"outline\" && \"gap-[1px]\")}>\n      {buttonComp}\n    </ButtonGroup>\n  );\n};\n\n/**\n * Connected UserAudioControl component that integrates with the Pipecat Client SDK.\n * This component automatically manages microphone detection, selection, and updates.\n * Must be used within a PipecatClientProvider context.\n *\n * @example\n * ```tsx\n * <UserAudioControl\n *   variant=\"outline\"\n *   size=\"lg\"\n *   noDevicePicker={false}\n *   activeText=\"Microphone is on\"\n *   inactiveText=\"Microphone is off\"\n * />\n * ```\n */\n/**\n * Map a per-device DeviceErrorReason onto a short, user-facing message for\n * the disabled microphone button. Kept minimal per Plan A's \"minimal\n * affordance\" decision.\n */\nconst micErrorText = (reason: DeviceErrorReason): string => {\n  switch (reason) {\n    case \"blocked\":\n      return \"Microphone blocked\";\n    case \"already-in-use\":\n      return \"Microphone in use\";\n    case \"not-found\":\n      return \"No microphone\";\n    case \"not-supported\":\n      return \"Audio not supported\";\n    case \"unknown\":\n    default:\n      return \"Microphone unavailable\";\n  }\n};\n\nexport const UserAudioControl: React.FC<Props> = ({\n  buttonProps,\n  ...props\n}) => {\n  const {\n    availableMics,\n    selectedMic,\n    updateMic,\n    availableSpeakers,\n    selectedSpeaker,\n    updateSpeaker,\n  } = usePipecatClientMediaDevices();\n\n  // Drive loading and error UI from the per-device MediaState surface\n  // (Plan A step 2). Decouples the button from TransportState, so the\n  // picker stays accessible across connect / disconnect cycles once mic\n  // permission has been granted.\n  //\n  // 'uninitialized' is intentionally NOT treated as loading. It maps to\n  // both pre-init (initDevices() not called yet) AND post-init when the\n  // transport didn't acquire the mic (e.g. enableMic was false, or the\n  // transport opted out). In those cases there's no work in flight, so\n  // showing a spinner indefinitely would be wrong. The button just renders\n  // as inactive — clicking it routes through PipecatClientMicToggle as\n  // usual.\n  const { mic } = useMediaState();\n  const isLoading = mic.state === \"initializing\";\n  const unavailableText =\n    mic.state === \"error\" ? micErrorText(mic.reason) : undefined;\n\n  return (\n    <PipecatClientMicToggle>\n      {({ isMicEnabled, onClick }) => (\n        <UserAudioComponent\n          onClick={onClick}\n          isMicEnabled={isMicEnabled}\n          availableMics={availableMics}\n          selectedMic={selectedMic}\n          updateMic={updateMic}\n          availableSpeakers={availableSpeakers}\n          selectedSpeaker={selectedSpeaker}\n          updateSpeaker={updateSpeaker}\n          state={isMicEnabled ? \"default\" : \"inactive\"}\n          unavailableText={unavailableText}\n          buttonProps={{\n            isLoading,\n            ...buttonProps,\n          }}\n          {...props}\n        />\n      )}\n    </PipecatClientMicToggle>\n  );\n};\n\nexport default UserAudioControl;\n","import {\n  Select,\n  SelectContent,\n  type SelectContentProps,\n  SelectGuide,\n  SelectItem,\n  type SelectProps,\n  SelectTrigger,\n  type SelectTriggerProps,\n  SelectValue,\n} from \"@/components/ui/select\";\nimport { cn } from \"@/lib/utils\";\nimport {\n  type OptionalMediaDeviceInfo,\n  usePipecatClientMediaDevices,\n} from \"@pipecat-ai/client-react\";\nimport React, { useId } from \"react\";\n\n/**\n * Base props interface for UserAudioOutputControl components.\n * Extends SelectTriggerProps to provide consistent styling and behavior.\n */\nexport interface UserAudioOutputControlBaseProps\n  extends Omit<SelectTriggerProps, \"children\"> {\n  /** Label text displayed next to the select input */\n  label?: string;\n  /** Placeholder text displayed in the select input when no device is selected */\n  placeholder?: string;\n  /** Optional guide content (icon, label, etc.) to display in the select trigger */\n  guide?: React.ReactNode;\n  /** Custom CSS classes for different parts of the component */\n  classNames?: {\n    /** CSS classes for the select trigger element */\n    selectTrigger?: string;\n    /** CSS classes for the select content dropdown */\n    selectContent?: string;\n    /** CSS classes for individual select items */\n    selectItem?: string;\n  };\n  /** Props to pass to the underlying Select component */\n  selectProps?: SelectProps;\n  /** Props to pass to the SelectContent component */\n  contentProps?: SelectContentProps;\n}\n\n/**\n * Props interface for the headless UserAudioOutputControlComponent.\n * Includes device data and callbacks for external state management.\n */\nexport interface UserAudioOutputControlComponentProps\n  extends UserAudioOutputControlBaseProps {\n  /** Array of available audio output devices */\n  availableDevices?: MediaDeviceInfo[];\n  /** Currently selected audio output device */\n  selectedDevice?: OptionalMediaDeviceInfo;\n  /** Callback function called when a device is selected */\n  updateDevice?: (deviceId: string) => void;\n}\n\n/**\n * Headless UserAudioOutputControl component that accepts all device data and callbacks as props.\n * This component can be used with any framework or state management solution.\n *\n * @example\n * ```tsx\n * <UserAudioOutputControlComponent\n *   availableDevices={speakers}\n *   selectedDevice={currentSpeaker}\n *   updateDevice={handleSpeakerChange}\n *   placeholder=\"Choose speaker\"\n * />\n * ```\n */\nexport const UserAudioOutputControlComponent = ({\n  label = \"Audio Output\",\n  placeholder = \"Select a speaker\",\n  guide,\n  availableDevices,\n  selectedDevice,\n  updateDevice,\n  className,\n  classNames,\n  selectProps,\n  contentProps,\n  ...triggerProps\n}: UserAudioOutputControlComponentProps) => {\n  const selectedValue = selectedDevice?.deviceId ?? \"\";\n  const id = useId();\n\n  return (\n    <div className=\"flex items-center gap-4\">\n      <label\n        htmlFor={id}\n        className=\"text-sm font-medium text-muted-foreground whitespace-nowrap flex-1\"\n      >\n        {label}\n      </label>\n      <Select\n        value={selectedValue}\n        onValueChange={(v) => updateDevice?.(v)}\n        {...selectProps}\n      >\n        <SelectTrigger\n          id={id}\n          className={cn(classNames?.selectTrigger, className)}\n          variant=\"ghost\"\n          {...triggerProps}\n        >\n          {guide ? <SelectGuide>{guide}</SelectGuide> : null}\n          <SelectValue placeholder={placeholder} />\n        </SelectTrigger>\n        <SelectContent\n          className={cn(classNames?.selectContent)}\n          align=\"end\"\n          {...contentProps}\n        >\n          {availableDevices?.map((device) => (\n            <SelectItem\n              key={device.deviceId || \"empty\"}\n              value={device.deviceId || \"empty\"}\n              className={cn(classNames?.selectItem)}\n            >\n              {device.label || `Speaker ${device.deviceId.slice(0, 5)}`}\n            </SelectItem>\n          ))}\n        </SelectContent>\n      </Select>\n    </div>\n  );\n};\n\n/**\n * Connected UserAudioOutputControl component that integrates with the Pipecat Client SDK.\n * This component automatically manages device detection, selection, and updates.\n * Must be used within a PipecatClientProvider context.\n *\n * @example\n * ```tsx\n * <UserAudioOutputControl\n *   placeholder=\"Choose audio output\"\n *   guide={<SpeakerIcon />}\n * />\n * ```\n */\nexport const UserAudioOutputControl: React.FC<\n  UserAudioOutputControlBaseProps\n> = (props) => {\n  const { availableSpeakers, selectedSpeaker, updateSpeaker } =\n    usePipecatClientMediaDevices();\n\n  return (\n    <UserAudioOutputControlComponent\n      availableDevices={availableSpeakers}\n      selectedDevice={selectedSpeaker}\n      updateDevice={updateSpeaker}\n      {...props}\n    />\n  );\n};\n\nexport default UserAudioOutputControl;\n","import { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport {\n  usePipecatClient,\n  usePipecatClientTransportState,\n} from \"@pipecat-ai/client-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\ntype ClientInstance = NonNullable<ReturnType<typeof usePipecatClient>>;\ntype ClientEventName = Parameters<ClientInstance[\"on\"]>[0];\n\nexport interface PipecatEventLog {\n  id: string;\n  type: string;\n  data: unknown;\n  timestamp: Date;\n}\n\n/**\n * Optional configuration for `usePipecatEventStream`.\n */\nexport interface UsePipecatEventStreamOptions {\n  maxEvents?: number;\n  ignoreEvents?: string[];\n  /** When true, also compute and return consecutive groups */\n  groupConsecutive?: boolean;\n  /** Optional grouping key selector; defaults to event.type */\n  groupKey?: (event: PipecatEventLog) => string;\n  /** When provided, only these events will be captured (takes precedence over ignoreEvents) */\n  includeEvents?: string[];\n  /** Pause capturing without tearing down subscriptions */\n  paused?: boolean;\n  /** Optional transform to sanitize/shape event data before storing */\n  mapEventData?: (data: unknown, eventType: string) => unknown;\n  /** Throttle notifications; 0 uses requestAnimationFrame, otherwise uses setTimeout(ms) */\n  throttleMs?: number;\n  /** Optional callback invoked for each captured event (after stored) */\n  onEvent?: (event: PipecatEventLog) => void;\n}\n\nexport interface PipecatEventGroup {\n  id: string;\n  type: string;\n  events: ReadonlyArray<PipecatEventLog>;\n}\n\n/**\n * Subscribes to all RTVI events and returns a throttled snapshot of recent events.\n * - Uses requestAnimationFrame batching by default; set `throttleMs > 0` to time-slice updates\n * - Prefers `includeEvents` over `ignoreEvents` when filtering\n * - Can compute contiguous groups when `groupConsecutive` is true\n *\n * Returns a stable object `{ events, groups, clear }` where:\n * - `events`: frozen array snapshot that updates on the configured throttle cadence\n * - `groups`: grouped consecutive events (empty unless `groupConsecutive` is enabled)\n * - `clear()`: clears the current event list\n */\nexport function usePipecatEventStream(options?: UsePipecatEventStreamOptions) {\n  const client = usePipecatClient();\n  const transportState = usePipecatClientTransportState();\n\n  const maxEvents = options?.maxEvents ?? 500;\n  const allEventNames = useMemo(() => {\n    // Guard against numeric enum reverse mappings by filtering strings only\n    return (\n      Object.values(RTVIEvent).filter((v) => typeof v === \"string\") as string[]\n    ).slice();\n  }, []);\n  const ignoredEventsSet = useMemo(() => {\n    const defaults = new Set<string>([RTVIEvent.LocalAudioLevel]);\n    if (!options?.ignoreEvents) return defaults;\n    for (const e of options.ignoreEvents) defaults.add(e);\n    return defaults;\n  }, [options?.ignoreEvents]);\n  const includedEventsSet = useMemo(() => {\n    if (!options?.includeEvents || options.includeEvents.length === 0)\n      return null as Set<string> | null;\n    return new Set(options.includeEvents);\n  }, [options?.includeEvents]);\n  const pausedRef = useRef<boolean>(!!options?.paused);\n  useEffect(() => {\n    pausedRef.current = !!options?.paused;\n  }, [options?.paused]);\n\n  // Extract scalar option values to avoid depending on the whole options object\n  const throttleMs = options?.throttleMs ?? 0;\n  const mapEventData = options?.mapEventData;\n  const onEvent = options?.onEvent;\n  const groupConsecutive = options?.groupConsecutive;\n  const groupKey = options?.groupKey;\n\n  // Keep the actual event list in a ref to avoid forcing re-renders on every push\n  const eventsRef = useRef<PipecatEventLog[]>([]);\n  const versionRef = useRef(0);\n  const [, setVersion] = useState(0);\n  const rafIdRef = useRef<number | null>(null);\n  const timeoutIdRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const idCounterRef = useRef(0);\n  const previousTransportState = useRef(transportState);\n\n  const scheduleNotify = useCallback(() => {\n    const throttle = throttleMs;\n    if (throttle > 0) {\n      if (timeoutIdRef.current != null) return;\n      timeoutIdRef.current = setTimeout(() => {\n        versionRef.current += 1;\n        setVersion(versionRef.current);\n        timeoutIdRef.current = null;\n      }, throttle);\n      return;\n    }\n    if (rafIdRef.current != null) return;\n    rafIdRef.current = requestAnimationFrame(() => {\n      versionRef.current += 1;\n      setVersion(versionRef.current);\n      rafIdRef.current = null;\n    });\n  }, [throttleMs]);\n\n  const clearEvents = useCallback(() => {\n    eventsRef.current = [];\n    scheduleNotify();\n  }, [scheduleNotify]);\n\n  // Clear when a new connection is starting (disconnected -> initializing)\n  useEffect(() => {\n    if (\n      previousTransportState.current === \"disconnected\" &&\n      transportState === \"initializing\"\n    ) {\n      clearEvents();\n    }\n    previousTransportState.current = transportState;\n  }, [transportState, clearEvents]);\n\n  // Single event handler reused for all event names\n  const handleRTVIEvent = useCallback(\n    (eventType: string, data: unknown) => {\n      if (pausedRef.current) return;\n      if (includedEventsSet) {\n        if (!includedEventsSet.has(eventType)) return;\n      } else if (ignoredEventsSet.has(eventType)) {\n        return;\n      }\n\n      idCounterRef.current += 1;\n      const newEvent: PipecatEventLog = {\n        id: `${Date.now()}-${idCounterRef.current}`,\n        type: eventType,\n        data: mapEventData ? mapEventData(data, eventType) : data,\n        timestamp: new Date(),\n      };\n\n      const next =\n        eventsRef.current.length >= maxEvents\n          ? [...eventsRef.current.slice(-maxEvents + 1), newEvent]\n          : [...eventsRef.current, newEvent];\n      // Freeze to preserve immutability guarantees without copying on read\n      eventsRef.current = Object.freeze(next) as unknown as PipecatEventLog[];\n      scheduleNotify();\n      if (onEvent) onEvent(newEvent);\n    },\n    [\n      ignoredEventsSet,\n      includedEventsSet,\n      maxEvents,\n      scheduleNotify,\n      mapEventData,\n      onEvent,\n    ],\n  );\n\n  // Subscribe to all events in the RTVIEvent enum\n  useEffect(() => {\n    if (!client) return;\n\n    const handlers: Record<string, (data: unknown) => void> = {};\n    for (const eventName of allEventNames) {\n      if (includedEventsSet && !includedEventsSet.has(eventName)) continue;\n      if (!includedEventsSet && ignoredEventsSet.has(eventName)) continue;\n      handlers[eventName] = (data: unknown) => handleRTVIEvent(eventName, data);\n      try {\n        client.on(\n          eventName as ClientEventName,\n          handlers[eventName] as Parameters<ClientInstance[\"on\"]>[1],\n        );\n      } catch {\n        // Some events may not be supported; ignore\n      }\n    }\n\n    return () => {\n      for (const [eventName, handler] of Object.entries(handlers)) {\n        try {\n          client.off(\n            eventName as ClientEventName,\n            handler as Parameters<ClientInstance[\"off\"]>[1],\n          );\n        } catch {\n          // ignore\n        }\n      }\n    };\n  }, [\n    client,\n    handleRTVIEvent,\n    allEventNames,\n    ignoredEventsSet,\n    includedEventsSet,\n  ]);\n\n  // Expose a snapshot; re-render is already gated by `version`, so memo is unnecessary\n  const events = eventsRef.current as ReadonlyArray<PipecatEventLog>;\n\n  const groups: ReadonlyArray<PipecatEventGroup> = useMemo(() => {\n    if (!groupConsecutive) return [];\n    const keySelector = groupKey ?? ((e: PipecatEventLog) => e.type);\n    const grouped: PipecatEventGroup[] = [] as PipecatEventGroup[];\n    let current: {\n      id: string;\n      type: string;\n      events: PipecatEventLog[];\n    } | null = null;\n    for (const e of events) {\n      const key = keySelector(e);\n      if (!current || current.type !== key) {\n        current = { id: e.id, type: key, events: [e] };\n        grouped.push({\n          id: current.id,\n          type: current.type,\n          events: current.events,\n        });\n      } else {\n        current.events.push(e);\n      }\n    }\n    return grouped;\n  }, [events, groupConsecutive, groupKey]);\n\n  // Cleanup unknown scheduled rAF on unmount\n  useEffect(() => {\n    return () => {\n      if (rafIdRef.current != null) {\n        cancelAnimationFrame(rafIdRef.current);\n        rafIdRef.current = null;\n      }\n      if (timeoutIdRef.current != null) {\n        clearTimeout(timeoutIdRef.current);\n        timeoutIdRef.current = null;\n      }\n    };\n  }, []);\n\n  return {\n    events: events as ReadonlyArray<PipecatEventLog>,\n    groups,\n    clear: clearEvents,\n  } as const;\n}\n","import { createContext } from \"react\";\nimport type { Theme } from \"./ThemeProvider\";\n\ntype ThemeProviderState = {\n  resolvedTheme: string;\n  theme: Theme;\n  setTheme: (theme: Theme) => void;\n};\n\nconst initialState: ThemeProviderState = {\n  resolvedTheme: \"light\",\n  theme: \"system\",\n  setTheme: () => null,\n};\n\nexport const ThemeProviderContext =\n  createContext<ThemeProviderState>(initialState);\n","import { useContext } from \"react\";\nimport type { Theme } from \"../components/ThemeProvider\";\nimport { ThemeProviderContext } from \"../components/ThemeProviderContext\";\n\nexport type { Theme };\n\nexport const useTheme = () => {\n  const context = useContext(ThemeProviderContext);\n\n  if (context === undefined)\n    throw new Error(\"useTheme must be used within a ThemeProvider\");\n\n  return context;\n};\n","\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n  type ButtonSize,\n  type ButtonState,\n  type ButtonVariant,\n} from \"@/components/ui/buttonVariants\";\nimport { usePipecatConnectionState } from \"@/hooks\";\nimport { cn } from \"@/lib/utils\";\nimport {\n  type OptionalMediaDeviceInfo,\n  PipecatClientScreenShareToggle,\n  PipecatClientVideo,\n} from \"@pipecat-ai/client-react\";\nimport { LoaderCircle, MonitorIcon, MonitorOffIcon } from \"lucide-react\";\n\n/**\n * Base props interface for UserScreenControl components.\n * Provides styling, behavior, and customization options for screen sharing controls.\n */\nexport interface UserScreenControlBaseProps {\n  /** Visual style variant for the control button */\n  variant?: ButtonVariant;\n  /** Size of the control button */\n  size?: ButtonSize;\n  /** State of the control button (default, inactive, etc.) */\n  state?: ButtonState;\n  /** Additional props to pass to the main control button */\n  buttonProps?: Partial<React.ComponentProps<typeof Button>>;\n  /** Custom CSS classes for different parts of the component */\n  classNames?: {\n    /** CSS classes for the main container */\n    container?: string;\n    /** CSS classes for the screen element */\n    screen?: string;\n    /** CSS classes for the button group */\n    buttongroup?: string;\n    /** CSS classes for the main control button */\n    button?: string;\n    /** CSS classes for the screen off state container */\n    screenOffContainer?: string;\n    /** CSS classes for the screen off state text */\n    screenOffText?: string;\n    /** CSS classes for active state text */\n    activeText?: string;\n    /** CSS classes for inactive state text */\n    inactiveText?: string;\n  };\n  /** Whether to hide the screen element entirely */\n  noScreen?: boolean;\n  /** Additional props to pass to the PipecatClientVideo component (used for screen sharing) */\n  screenProps?: Partial<React.ComponentProps<typeof PipecatClientVideo>>;\n  /** Custom text to display when screen sharing is disabled */\n  noScreenText?: string | null;\n  /** Whether to hide the screen icon in the button */\n  noIcon?: boolean;\n  /** Text to display when screen sharing is active */\n  activeText?: string;\n  /** Text to display when screen sharing is inactive */\n  inactiveText?: string;\n  /** Custom content to render inside the button */\n  children?: React.ReactNode;\n}\n\n/**\n * Props interface for the headless UserScreenComponent.\n * Includes device data and callbacks for external state management.\n */\nexport interface UserScreenComponentProps extends UserScreenControlBaseProps {\n  /** Callback function called when the screen toggle button is clicked */\n  onClick?: () => void;\n  /** Whether the screen sharing is currently enabled */\n  isScreenEnabled?: boolean;\n  /** Array of available screen sources */\n  availableScreens?: MediaDeviceInfo[];\n  /** Currently selected screen source */\n  selectedScreen?: OptionalMediaDeviceInfo;\n  /** Callback function called when a screen source is selected */\n  updateScreen?: (deviceId: string) => void;\n}\n\n/**\n * Headless UserScreenComponent that accepts all device data and callbacks as props.\n * This component can be used with any framework or state management solution.\n *\n * @example\n * ```tsx\n * <UserScreenComponent\n *   isScreenEnabled={isScreenSharingOn}\n *   onClick={handleScreenToggle}\n *   availableScreens={screens}\n *   selectedScreen={currentScreen}\n *   updateScreen={handleScreenChange}\n *   variant=\"outline\"\n *   size=\"lg\"\n * />\n * ```\n */\nexport const UserScreenComponent: React.FC<UserScreenComponentProps> = ({\n  variant = \"secondary\",\n  size = \"md\",\n  classNames = {},\n  buttonProps = {},\n  noScreen = false,\n  screenProps = {},\n  isScreenEnabled = false,\n  state,\n  noScreenText = \"Screen sharing disabled\",\n  noIcon = false,\n  activeText,\n  inactiveText,\n  children,\n  onClick,\n}) => {\n  const buttonState = state || (isScreenEnabled ? \"active\" : \"inactive\");\n\n  // Determine button content and styling based on state\n  const getButtonContent = () => {\n    if (buttonProps?.isLoading) {\n      return (\n        <>\n          {!buttonProps?.isLoading && (\n            <>\n              {!noIcon && <MonitorOffIcon />}\n              {noScreenText && <span className=\"flex-1\">{noScreenText}</span>}\n              {children}\n            </>\n          )}\n        </>\n      );\n    }\n\n    return (\n      <>\n        {!noIcon && (isScreenEnabled ? <MonitorIcon /> : <MonitorOffIcon />)}\n        {!noScreen && buttonState === \"inactive\" && inactiveText ? (\n          <span className={cn(\"flex-1\", classNames.inactiveText)}>\n            {inactiveText}\n          </span>\n        ) : null}\n        {!noScreen && buttonState !== \"inactive\" && activeText ? (\n          <span className={cn(\"flex-1\", classNames.activeText)}>\n            {activeText}\n          </span>\n        ) : null}\n        {children}\n      </>\n    );\n  };\n\n  return (\n    <div\n      className={cn(\n        \"relative\",\n        {\n          \"aspect-video bg-primary rounded-md\": !noScreen,\n        },\n        classNames.container,\n      )}\n    >\n      {!noScreen && (\n        <>\n          <PipecatClientVideo\n            className={cn(\n              \"rounded-md w-full h-full object-cover aspect-video\",\n              {\n                hidden: !isScreenEnabled,\n              },\n              classNames.screen,\n            )}\n            participant=\"local\"\n            trackType=\"screenVideo\"\n            {...screenProps}\n          />\n\n          {buttonProps?.isLoading && (\n            <div className=\"absolute inset-0 flex items-center justify-center\">\n              <LoaderCircle className=\"animate-spin\" size={24} />\n            </div>\n          )}\n        </>\n      )}\n\n      <div\n        className={cn({\n          \"absolute bottom-2 left-2\": !noScreen,\n        })}\n      >\n        <Button\n          className={cn(\n            {\n              \"w-fit! hover:opacity-100! hover:bg-muted hover:text-muted-foreground\":\n                !noScreen,\n              \"flex-1 w-full z-10\": noScreen,\n              \"bg-active text-active-foreground\": isScreenEnabled,\n            },\n            classNames.button,\n          )}\n          variant={variant}\n          size={size}\n          state={buttonState}\n          onClick={buttonProps?.isLoading ? undefined : onClick}\n          isIcon={!noScreen}\n          disabled={buttonProps?.disabled || buttonProps?.isLoading}\n          {...buttonProps}\n        >\n          {getButtonContent()}\n        </Button>\n      </div>\n    </div>\n  );\n};\n\n/**\n * Connected UserScreenControl component that integrates with the Pipecat Client SDK.\n * This component automatically manages screen sharing detection, selection, and updates.\n * Must be used within a PipecatClientProvider context.\n *\n * @example\n * ```tsx\n * <UserScreenControl\n *   variant=\"outline\"\n *   size=\"lg\"\n *   noDevicePicker={false}\n *   activeText=\"Screen sharing is on\"\n *   inactiveText=\"Screen sharing is off\"\n * />\n * ```\n */\nexport const UserScreenControl: React.FC<UserScreenControlBaseProps> = (\n  props,\n) => {\n  const { isConnected } = usePipecatConnectionState();\n\n  return (\n    <PipecatClientScreenShareToggle>\n      {({ isScreenShareEnabled, onClick }) => (\n        <>\n          <UserScreenComponent\n            isScreenEnabled={isScreenShareEnabled}\n            noScreen={!isScreenShareEnabled}\n            onClick={onClick}\n            {...props}\n            buttonProps={{\n              disabled: !isConnected,\n              ...props.buttonProps,\n            }}\n          />\n        </>\n      )}\n    </PipecatClientScreenShareToggle>\n  );\n};\nexport default UserScreenControl;\n","\"use client\";\n\nimport {\n  DeviceDropDownComponent,\n  type DeviceDropDownComponentProps,\n} from \"@/components/elements/DeviceDropDown\";\nimport { Button } from \"@/components/ui/button\";\nimport { ButtonGroup } from \"@/components/ui/buttongroup\";\nimport {\n  type ButtonSize,\n  type ButtonState,\n  type ButtonVariant,\n} from \"@/components/ui/buttonVariants\";\nimport { cn } from \"@/lib/utils\";\nimport { type DeviceErrorReason } from \"@pipecat-ai/client-js\";\nimport {\n  type OptionalMediaDeviceInfo,\n  PipecatClientCamToggle,\n  PipecatClientVideo,\n  useMediaState,\n  usePipecatClientMediaDevices,\n} from \"@pipecat-ai/client-react\";\nimport {\n  ChevronDownIcon,\n  LoaderCircle,\n  VideoIcon,\n  VideoOffIcon,\n} from \"lucide-react\";\n\n/**\n * Base props interface for UserVideoControl components.\n * Provides styling, behavior, and customization options for video controls.\n */\nexport interface UserVideoControlBaseProps {\n  /** Visual style variant for the control button */\n  variant?: ButtonVariant;\n  /** Size of the control button */\n  size?: ButtonSize;\n  /** State of the control button (default, inactive, etc.) */\n  state?: ButtonState;\n  /** Additional props to pass to the main control button */\n  buttonProps?: Partial<React.ComponentProps<typeof Button>>;\n  /** Custom CSS classes for different parts of the component */\n  classNames?: {\n    /** CSS classes for the main container */\n    container?: string;\n    /** CSS classes for the video element */\n    video?: string;\n    /** CSS classes for the button group */\n    buttongroup?: string;\n    /** CSS classes for the main control button */\n    button?: string;\n    /** CSS classes for the dropdown menu trigger button */\n    dropdownMenuTrigger?: string;\n    /** CSS classes for the dropdown menu content */\n    dropdownMenuContent?: string;\n    /** CSS classes for dropdown menu checkbox items */\n    dropdownMenuCheckboxItem?: string;\n    /** CSS classes for the video off state container */\n    videoOffContainer?: string;\n    /** CSS classes for the video off state text */\n    videoOffText?: string;\n    /** CSS classes for active state text */\n    activeText?: string;\n    /** CSS classes for inactive state text */\n    inactiveText?: string;\n    /** CSS classes for the button group wrapper */\n    buttongroupWrapper?: string;\n  };\n  /** Additional props to pass to the dropdown button */\n  dropdownButtonProps?: Partial<React.ComponentProps<typeof Button>>;\n  /** Additional props to pass to the device dropdown component */\n  deviceDropDownProps?: Partial<DeviceDropDownComponentProps>;\n  /** Whether to hide the device picker dropdown */\n  noDevicePicker?: boolean;\n  /** Whether to hide the video element entirely */\n  noVideo?: boolean;\n  /** Additional props to pass to the PipecatClientVideo component */\n  videoProps?: Partial<React.ComponentProps<typeof PipecatClientVideo>>;\n  /** Custom text to display when video is disabled */\n  noVideoText?: string | null;\n  /** Whether to hide the video icon in the button */\n  noIcon?: boolean;\n  /** Text to display when camera is active */\n  activeText?: string;\n  /** Text to display when camera is inactive */\n  inactiveText?: string;\n  /** Custom content to render inside the button */\n  children?: React.ReactNode;\n}\n\n/**\n * Props interface for the headless UserVideoComponent.\n * Includes device data and callbacks for external state management.\n */\nexport interface UserVideoComponentProps extends UserVideoControlBaseProps {\n  /** Callback function called when the video toggle button is clicked */\n  onClick?: () => void;\n  /** Whether the camera is currently enabled */\n  isCamEnabled?: boolean;\n  /** Array of available camera devices */\n  availableCams?: MediaDeviceInfo[];\n  /** Currently selected camera device */\n  selectedCam?: OptionalMediaDeviceInfo;\n  /** Callback function called when a camera device is selected */\n  updateCam?: (deviceId: string) => void;\n  /**\n   * When set, renders a disabled button with this message instead of the\n   * toggle and hides the picker. Used by the connected UserVideoControl to\n   * surface cam-error states (blocked, in-use, etc.) sourced from\n   * useMediaState(). Distinct from `noVideo`, which is a deliberate\n   * consumer opt-out.\n   */\n  unavailableText?: string;\n}\n\n/**\n * Headless UserVideoComponent that accepts all device data and callbacks as props.\n * This component can be used with any framework or state management solution.\n *\n * @example\n * ```tsx\n * <UserVideoComponent\n *   isCamEnabled={isCameraOn}\n *   onClick={handleCameraToggle}\n *   availableCams={cameras}\n *   selectedCam={currentCamera}\n *   updateCam={handleCameraChange}\n *   variant=\"outline\"\n *   size=\"lg\"\n * />\n * ```\n */\nexport const UserVideoComponent: React.FC<UserVideoComponentProps> = ({\n  variant = \"secondary\",\n  size = \"md\",\n  classNames = {},\n  buttonProps = {},\n  dropdownButtonProps = {},\n  deviceDropDownProps = {},\n  noDevicePicker = false,\n  noVideo = false,\n  videoProps = {},\n  isCamEnabled = false,\n  state,\n  availableCams = [],\n  selectedCam,\n  updateCam,\n  // noVideoText is currently not rendered by this component (loading uses\n  // the spinner overlay; unavailable states use unavailableText). Kept on\n  // the public prop type for API stability — future revisions could pipe\n  // it into a \"video disabled\" state if needed.\n  noIcon = false,\n  activeText,\n  inactiveText,\n  children,\n  onClick,\n  unavailableText,\n}) => {\n  const buttonState = state || (isCamEnabled ? \"active\" : \"inactive\");\n  const isUnavailable = !!unavailableText;\n  // The button is non-interactive whenever the cam isn't usable, whether\n  // we're still figuring out (isLoading) or it's known to be in error\n  // (isUnavailable). Keep this logic in one place.\n  const buttonDisabled = buttonProps?.isLoading || isUnavailable;\n\n  // Determine button content and styling based on state\n  const getButtonContent = () => {\n    if (buttonProps?.isLoading) {\n      // Loading: render nothing — the spinner overlay or Button's own\n      // loading indicator carries the message.\n      return null;\n    }\n\n    if (isUnavailable) {\n      return (\n        <>\n          {!noIcon && <VideoOffIcon />}\n          <span className=\"flex-1\">{unavailableText}</span>\n          {children}\n        </>\n      );\n    }\n\n    return (\n      <>\n        {!noIcon && (isCamEnabled ? <VideoIcon /> : <VideoOffIcon />)}\n        {!noVideo && buttonState === \"inactive\" && inactiveText ? (\n          <span className={cn(\"flex-1\", classNames.inactiveText)}>\n            {inactiveText}\n          </span>\n        ) : null}\n        {!noVideo && buttonState !== \"inactive\" && activeText ? (\n          <span className={cn(\"flex-1\", classNames.activeText)}>\n            {activeText}\n          </span>\n        ) : null}\n        {children}\n      </>\n    );\n  };\n\n  return (\n    <div\n      className={cn(\n        \"relative\",\n        {\n          \"aspect-video bg-primary rounded-md\": !noVideo,\n        },\n        classNames.container,\n      )}\n    >\n      {!noVideo && (\n        <>\n          <PipecatClientVideo\n            className={cn(\n              \"rounded-md w-full h-full object-cover aspect-video\",\n              {\n                hidden: !isCamEnabled,\n              },\n              classNames.video,\n            )}\n            participant=\"local\"\n            {...videoProps}\n          />\n\n          {buttonProps?.isLoading && (\n            <div className=\"absolute inset-0 flex items-center justify-center\">\n              <LoaderCircle className=\"animate-spin\" size={24} />\n            </div>\n          )}\n        </>\n      )}\n\n      <div\n        className={cn(\n          {\n            \"absolute bottom-2 left-2\": !noVideo,\n          },\n          classNames.buttongroupWrapper,\n        )}\n      >\n        <ButtonGroup\n          className={cn(\n            variant !== \"outline\" && \"gap-[1px]\",\n            classNames.buttongroup,\n          )}\n        >\n          <Button\n            className={cn(\n              {\n                \"w-fit! hover:opacity-100! hover:bg-muted hover:text-muted-foreground\":\n                  !noVideo,\n                \"flex-1 w-full z-10\": noVideo,\n                \"rounded-e-none\": noVideo && !noDevicePicker && !isUnavailable,\n                \"bg-active text-active-foreground\": isCamEnabled,\n              },\n              classNames.button,\n            )}\n            variant={variant}\n            size={size}\n            state={buttonState}\n            onClick={buttonDisabled ? undefined : onClick}\n            isIcon={!noVideo && !isUnavailable}\n            disabled={buttonDisabled}\n            {...buttonProps}\n          >\n            {getButtonContent()}\n          </Button>\n          {!noDevicePicker && !isUnavailable && (\n            <DeviceDropDownComponent\n              availableDevices={availableCams}\n              selectedDevice={selectedCam}\n              updateDevice={updateCam}\n              classNames={{\n                dropdownMenuCheckboxItem: classNames.dropdownMenuCheckboxItem,\n                dropdownMenuContent: classNames.dropdownMenuContent,\n              }}\n              menuLabel=\"Camera device\"\n              {...deviceDropDownProps}\n            >\n              <Button\n                className={cn(\n                  {\n                    \"hover:opacity-100! hover:bg-primary hover:text-primary-foreground\":\n                      !noVideo,\n                    \"flex-none z-0 rounded-s-none border-l-0\": noVideo,\n                  },\n                  classNames.dropdownMenuTrigger,\n                )}\n                variant={variant}\n                size={size}\n                isIcon\n                disabled={buttonProps?.isLoading}\n                {...dropdownButtonProps}\n              >\n                <ChevronDownIcon size={noVideo ? 16 : 12} />\n              </Button>\n            </DeviceDropDownComponent>\n          )}\n        </ButtonGroup>\n      </div>\n    </div>\n  );\n};\n\n/**\n * Connected UserVideoControl component that integrates with the Pipecat Client SDK.\n * This component automatically manages camera detection, selection, and updates.\n * Must be used within a PipecatClientProvider context.\n *\n * @example\n * ```tsx\n * <UserVideoControl\n *   variant=\"outline\"\n *   size=\"lg\"\n *   noDevicePicker={false}\n *   activeText=\"Camera is on\"\n *   inactiveText=\"Camera is off\"\n * />\n * ```\n */\n/**\n * Map a per-device DeviceErrorReason onto a short, user-facing message for\n * the disabled camera button. Kept minimal per Plan A's \"minimal\n * affordance\" decision.\n */\nconst camErrorText = (reason: DeviceErrorReason): string => {\n  switch (reason) {\n    case \"blocked\":\n      return \"Camera blocked\";\n    case \"already-in-use\":\n      return \"Camera in use\";\n    case \"not-found\":\n      return \"No camera\";\n    case \"not-supported\":\n      return \"Video not supported\";\n    case \"unknown\":\n    default:\n      return \"Camera unavailable\";\n  }\n};\n\nexport const UserVideoControl: React.FC<UserVideoControlBaseProps> = ({\n  buttonProps,\n  ...props\n}) => {\n  const { availableCams, selectedCam, updateCam } =\n    usePipecatClientMediaDevices();\n\n  // Drive loading and error UI from the per-device MediaState surface\n  // (Plan A step 2). Decouples the button from TransportState, so the\n  // picker stays accessible across connect / disconnect cycles once cam\n  // permission has been granted.\n  //\n  // 'uninitialized' is intentionally NOT treated as loading. It maps to\n  // both pre-init (initDevices() not called yet) AND post-init when the\n  // transport didn't acquire the cam (e.g. enableCam was false, or\n  // daily-js skipping cam under startVideoOff: true). In those cases\n  // there's no work in flight, so showing a spinner indefinitely would\n  // be wrong. The button just renders as inactive — clicking it routes\n  // through PipecatClientCamToggle as usual.\n  const { cam } = useMediaState();\n  const isLoading = cam.state === \"initializing\";\n  const unavailableText =\n    cam.state === \"error\" ? camErrorText(cam.reason) : undefined;\n\n  return (\n    <PipecatClientCamToggle>\n      {({ isCamEnabled, onClick }) => (\n        <UserVideoComponent\n          isCamEnabled={isCamEnabled}\n          onClick={onClick}\n          availableCams={availableCams}\n          selectedCam={selectedCam}\n          updateCam={updateCam}\n          state={isLoading ? \"default\" : isCamEnabled ? \"default\" : \"inactive\"}\n          unavailableText={unavailableText}\n          buttonProps={{\n            isLoading,\n            ...buttonProps,\n          }}\n          {...props}\n        />\n      )}\n    </PipecatClientCamToggle>\n  );\n};\nexport default UserVideoControl;\n","import { BotAudioControl } from \"@/components/elements/BotAudioControl\";\nimport {\n  Panel,\n  PanelContent,\n  PanelHeader,\n  PanelTitle,\n} from \"@/components/ui/panel\";\nimport { cn } from \"@/lib/utils\";\nimport { VoiceVisualizer } from \"@/visualizers/VoiceVisualizer\";\nimport { usePipecatClientMediaTrack } from \"@pipecat-ai/client-react\";\nimport { MicOffIcon } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface BotAudioPanelProps {\n  audioTracks?: MediaStreamTrack[];\n  className?: string;\n  collapsed?: boolean;\n  visualization?: \"bar\" | \"circle\";\n  isMuted?: boolean;\n  onMuteToggle?: () => void;\n  /** Hide the header bot audio controls (e.g. volume). Defaults to `false`. */\n  noControls?: boolean;\n}\n\nconst barCount = 10;\n\nexport const BotAudioPanel: React.FC<BotAudioPanelProps> = ({\n  className,\n  collapsed = false,\n  noControls = false,\n}) => {\n  const track = usePipecatClientMediaTrack(\"audio\", \"bot\");\n\n  const [maxHeight, setMaxHeight] = useState(48);\n  const [width, setWidth] = useState(4);\n\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    if (!containerRef.current) return;\n    const observer = new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        const { width, height } = entry.contentRect;\n\n        const maxWidth = 240;\n        const maxBarWidth = maxWidth / (2 * barCount - 1);\n        const maxMaxHeight = 240 / (16 / 9);\n\n        const barWidth = Math.max(\n          Math.min(width / (barCount * 2), maxBarWidth),\n          2,\n        );\n        const maxHeight = Math.max(Math.min(height, maxMaxHeight), 20);\n\n        setMaxHeight(maxHeight);\n        setWidth(barWidth);\n      }\n    });\n    observer.observe(containerRef.current);\n    return () => {\n      observer.disconnect();\n    };\n  }, []);\n\n  return (\n    <Panel\n      className={cn(\n        \"flex-1 mt-auto\",\n        {\n          \"flex-0 border-none\": collapsed,\n        },\n        className,\n      )}\n    >\n      {!collapsed && (\n        <PanelHeader className={cn(!noControls && \"justify-between gap-2\")}>\n          <PanelTitle>Bot Audio</PanelTitle>\n          {!noControls && <BotAudioControl size=\"sm\" variant=\"ghost\" />}\n        </PanelHeader>\n      )}\n      <PanelContent\n        className={cn(\"overflow-hidden flex-1\", {\n          \"aspect-video\": collapsed,\n        })}\n      >\n        <div\n          ref={containerRef}\n          className=\"relative flex h-full overflow-hidden\"\n        >\n          {track ? (\n            <div className=\"m-auto\">\n              <VoiceVisualizer\n                participantType=\"bot\"\n                backgroundColor=\"transparent\"\n                barColor=\"--color-agent\"\n                barCount={barCount}\n                barGap={width}\n                barLineCap=\"square\"\n                barMaxHeight={maxHeight}\n                barOrigin=\"bottom\"\n                barWidth={width}\n              />\n            </div>\n          ) : (\n            <div className=\"text-subtle flex w-full gap-2 items-center justify-center\">\n              <MicOffIcon size={16} />\n              {!collapsed && (\n                <span className=\"font-semibold text-sm\">No audio</span>\n              )}\n            </div>\n          )}\n        </div>\n      </PanelContent>\n    </Panel>\n  );\n};\n\nexport default BotAudioPanel;\n","import {\n  Panel,\n  PanelContent,\n  PanelHeader,\n  PanelTitle,\n} from \"@/components/ui/panel\";\nimport { cn } from \"@/lib/utils\";\nimport {\n  PipecatClientVideo,\n  usePipecatClientMediaTrack,\n} from \"@pipecat-ai/client-react\";\nimport { VideoOffIcon } from \"lucide-react\";\n\ninterface BotVideoPanelProps {\n  className?: string;\n  collapsed?: boolean;\n}\n\nexport const BotVideoPanel: React.FC<BotVideoPanelProps> = ({\n  className,\n  collapsed = false,\n}) => {\n  const track = usePipecatClientMediaTrack(\"video\", \"bot\");\n\n  return (\n    <Panel\n      className={cn(\n        \"flex-1 mb-auto\",\n        {\n          \"flex-0 border-none\": collapsed,\n        },\n        className,\n      )}\n    >\n      {!collapsed && (\n        <PanelHeader>\n          <PanelTitle>Bot Video</PanelTitle>\n        </PanelHeader>\n      )}\n      <PanelContent\n        className={cn(\"overflow-hidden flex-1\", {\n          \"aspect-video\": collapsed,\n        })}\n      >\n        {track ? (\n          <div\n            className={cn(\"relative flex h-full bg-muted rounded-sm\", {\n              \"aspect-video\": collapsed,\n            })}\n          >\n            <PipecatClientVideo\n              participant=\"bot\"\n              className=\"aspect-video max-h-full\"\n              fit=\"contain\"\n            />\n          </div>\n        ) : (\n          <div className=\"text-subtle flex w-full h-full gap-2 items-center justify-center\">\n            <VideoOffIcon size={16} />\n            {!collapsed && (\n              <span className=\"font-semibold text-sm\">No video</span>\n            )}\n          </div>\n        )}\n      </PanelContent>\n    </Panel>\n  );\n};\n\nexport default BotVideoPanel;\n","import { RTVIEvent } from \"@pipecat-ai/client-js\";\nimport {\n  usePipecatClientTransportState,\n  useRTVIClientEvent,\n} from \"@pipecat-ai/client-react\";\nimport {\n  CategoryScale,\n  Chart as ChartJS,\n  type ChartOptions,\n  Legend,\n  LinearScale,\n  LineElement,\n  PointElement,\n  Title,\n  Tooltip,\n} from \"chart.js\";\nimport { useState } from \"react\";\nimport { Line } from \"react-chartjs-2\";\n\nimport { cn } from \"@/lib/utils\";\n\n// Register Chart.js components\nChartJS.register(\n  CategoryScale,\n  LinearScale,\n  PointElement,\n  LineElement,\n  Title,\n  Tooltip,\n  Legend,\n);\n\ninterface ProcessingMetric {\n  processor: string;\n  value: number;\n}\n\ninterface MetricData {\n  timestamp: string;\n  value: number;\n}\n\ninterface MetricsState {\n  [processorName: string]: MetricData[];\n}\n\ninterface TokenMetrics {\n  completion_tokens: number;\n  prompt_tokens: number;\n  total_tokens: number;\n}\n\ninterface Props {\n  chartOptions?: ChartOptions<\"line\">;\n  classNames?: {\n    container?: string;\n    heading?: string;\n    metricsContainer?: string;\n    metricsCard?: string;\n    metricsTitle?: string;\n    metricsChart?: string;\n    tokenContainer?: string;\n    tokenCard?: string;\n    tokenType?: string;\n    tokenValue?: string;\n  };\n  ignoreProcessorNames?: string[];\n  noPromptTokens?: boolean;\n  noCompletionTokens?: boolean;\n  noTotalTokens?: boolean;\n}\n\nexport const Metrics: React.FC<Props> = ({\n  chartOptions = {},\n  classNames = {},\n  ignoreProcessorNames = [],\n  noPromptTokens = false,\n  noCompletionTokens = false,\n  noTotalTokens = false,\n}) => {\n  const [ttfbMetrics, setTtfbMetrics] = useState<MetricsState>({});\n  const [tokenMetrics, setTokenMetrics] = useState<Partial<TokenMetrics>>({});\n\n  const transportState = usePipecatClientTransportState();\n\n  useRTVIClientEvent(RTVIEvent.Connected, () => {\n    setTtfbMetrics({});\n    setTokenMetrics({\n      completion_tokens: 0,\n      prompt_tokens: 0,\n      total_tokens: 0,\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.Metrics, (data) => {\n    // Handle processing metrics\n    if (data?.ttfb && Array.isArray(data.ttfb)) {\n      const timestamp = new Date().toISOString();\n\n      setTtfbMetrics((prevMetrics) => {\n        const newMetrics = { ...prevMetrics };\n\n        (data.ttfb ?? []).forEach((item: ProcessingMetric) => {\n          const { processor, value } = item;\n\n          if (ignoreProcessorNames.includes(processor)) {\n            return; // Skip ignored processors\n          }\n\n          if (!newMetrics[processor]) {\n            newMetrics[processor] = [];\n          }\n\n          // Limit array to last 100 entries to prevent excessive memory use\n          const updatedMetrics = [\n            ...newMetrics[processor],\n            { timestamp, value },\n          ].slice(-100);\n\n          newMetrics[processor] = updatedMetrics;\n        });\n\n        return newMetrics;\n      });\n    }\n\n    // Handle token metrics\n    // @ts-expect-error - tokens type not defined\n    const tokens = data?.tokens;\n    if (tokens && Array.isArray(tokens) && tokens.length > 0) {\n      const tokenData = tokens[0];\n\n      setTokenMetrics((prev) => ({\n        completion_tokens:\n          prev.completion_tokens +\n          (noCompletionTokens ? 0 : tokenData.completion_tokens || 0),\n        prompt_tokens:\n          prev.prompt_tokens +\n          (noPromptTokens ? 0 : tokenData.prompt_tokens || 0),\n        total_tokens:\n          prev.total_tokens + (noTotalTokens ? 0 : tokenData.total_tokens || 0),\n      }));\n    }\n  });\n\n  const generateChartData = (processorName: string, data: MetricData[]) => {\n    return {\n      labels: data.map((d) => {\n        const date = new Date(d.timestamp);\n        return `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}.${date.getMilliseconds()}`;\n      }),\n      datasets: [\n        {\n          label: `TTFB (${processorName})`,\n          data: data.map((d) => d.value * 1000), // Convert to ms for better readability\n          borderColor: getColorForProcessor(processorName),\n          backgroundColor: getColorForProcessor(processorName, 0.2),\n          tension: 0.4,\n        },\n      ],\n    };\n  };\n\n  // Simple function to generate consistent colors based on processor name\n  const getColorForProcessor = (processor: string, alpha = 1) => {\n    const hash = processor.split(\"\").reduce((acc, char) => {\n      return char.charCodeAt(0) + ((acc << 5) - acc);\n    }, 0);\n    const h = Math.abs(hash) % 360;\n    return `hsla(${h}, 70%, 50%, ${alpha})`;\n  };\n\n  const lineChartOptions: ChartOptions<\"line\"> = {\n    responsive: true,\n    maintainAspectRatio: false,\n    scales: {\n      y: {\n        title: {\n          display: true,\n          text: \"Time (ms)\",\n        },\n        beginAtZero: true,\n      },\n      x: {\n        title: {\n          display: true,\n          text: \"Time\",\n        },\n        ticks: {\n          maxRotation: 0,\n          autoSkip: true,\n          maxTicksLimit: 10,\n        },\n      },\n    },\n    plugins: {\n      tooltip: {\n        callbacks: {\n          label: function (context) {\n            return `${context.dataset.label}: ${context.parsed.y.toFixed(2)} ms`;\n          },\n        },\n      },\n    },\n    ...chartOptions,\n  };\n\n  const isConnecting =\n    transportState === \"authenticating\" || transportState === \"connecting\";\n  const isConnected =\n    transportState === \"connected\" || transportState === \"ready\";\n\n  const hasTokenMetrics = Object.keys(tokenMetrics).length > 0;\n  const hasMetrics = Object.keys(ttfbMetrics).length > 0;\n\n  const tokenCardClassName = cn(\n    \"bg-card rounded-md p-3 shadow-sm\",\n    classNames.tokenCard,\n  );\n  const tokenTypeClassName = cn(\n    \"text-sm text-muted-foreground\",\n    classNames.tokenType,\n  );\n  const tokenValueClassName = cn(\"text-2xl font-medium\", classNames.tokenValue);\n\n  if (hasMetrics || hasTokenMetrics) {\n    return (\n      <div\n        className={cn(\n          \"@container/metrics grid gap-6 items-start p-4 max-h-full overflow-auto\",\n          classNames.container,\n        )}\n      >\n        {hasTokenMetrics && (\n          <>\n            <h2 className={cn(\"text-xl font-semibold\", classNames.heading)}>\n              Token Usage\n            </h2>\n            <div\n              className={cn(\n                \"grid grid-cols-1 @xl/metrics:grid-cols-2 @3xl/metrics:grid-cols-3 gap-4\",\n                classNames.tokenContainer,\n              )}\n            >\n              {!noPromptTokens && (\n                <div className={tokenCardClassName}>\n                  <div className={tokenTypeClassName}>Prompt Tokens</div>\n                  <div className={tokenValueClassName}>\n                    {tokenMetrics.prompt_tokens}\n                  </div>\n                </div>\n              )}\n              {!noCompletionTokens && (\n                <div className={tokenCardClassName}>\n                  <div className={tokenTypeClassName}>Completion Tokens</div>\n                  <div className={tokenValueClassName}>\n                    {tokenMetrics.completion_tokens}\n                  </div>\n                </div>\n              )}\n              {!noTotalTokens && (\n                <div className={tokenCardClassName}>\n                  <div className={tokenTypeClassName}>Total Tokens</div>\n                  <div className={tokenValueClassName}>\n                    {tokenMetrics.total_tokens}\n                  </div>\n                </div>\n              )}\n            </div>\n          </>\n        )}\n        {hasMetrics && (\n          <>\n            <h2 className={cn(\"text-xl font-semibold\", classNames.heading)}>\n              TTFB Metrics\n            </h2>\n            <div\n              className={cn(\n                \"grid grid-cols-1 @xl/metrics:grid-cols-2 @3xl/metrics:grid-cols-3 gap-4\",\n                classNames.metricsContainer,\n              )}\n            >\n              {Object.entries(ttfbMetrics).map(([processorName, data]) => (\n                <div\n                  key={processorName}\n                  className={cn(\n                    \"bg-card border rounded-lg shadow-sm p-3 h-60\",\n                    classNames.metricsCard,\n                  )}\n                >\n                  <h3 className={cn(\"mb-2\", classNames.metricsTitle)}>\n                    {processorName}\n                  </h3>\n                  <div className={cn(\"h-44\", classNames.metricsChart)}>\n                    <Line\n                      data={generateChartData(processorName, data)}\n                      options={lineChartOptions}\n                    />\n                  </div>\n                </div>\n              ))}\n            </div>\n          </>\n        )}\n      </div>\n    );\n  }\n\n  if (isConnecting) {\n    return (\n      <div\n        className={cn(\n          \"flex items-center justify-center h-full text-muted-foreground text-sm\",\n          classNames.container,\n        )}\n      >\n        Connecting to agent...\n      </div>\n    );\n  }\n\n  if (!isConnected) {\n    return (\n      <div\n        className={cn(\n          \"flex items-center justify-center h-full text-muted-foreground text-center\",\n          classNames.container,\n        )}\n      >\n        <div className=\"p-4\">\n          <div className=\"mb-2\">Not connected to agent</div>\n          <p className=\"text-sm max-w-md\">\n            Connect to an agent to view metrics in real-time.\n          </p>\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div\n      className={cn(\n        \"flex items-center justify-center h-full text-muted-foreground text-sm\",\n        classNames.container,\n      )}\n    >\n      Waiting for metrics data...\n    </div>\n  );\n};\n\nexport default Metrics;\n","import type { ConversationProps } from \"@/components/elements/Conversation\";\nimport Conversation from \"@/components/elements/Conversation\";\nimport { Metrics } from \"@/components/metrics\";\nimport { Panel, PanelContent, PanelHeader } from \"@/components/ui/panel\";\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from \"@/components/ui/select\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport type { TextRenderMode } from \"@/types/conversation\";\nimport { LineChartIcon, MessagesSquareIcon } from \"lucide-react\";\nimport { memo, useEffect, useState } from \"react\";\n\ninterface ConversationPanelProps {\n  /**\n   * Disable conversation tab.\n   * @default false\n   */\n  noConversation?: boolean;\n  /**\n   * Disable metrics tab.\n   * @default false\n   */\n  noMetrics?: boolean;\n  /**\n   * Props for the conversation element.\n   */\n  conversationElementProps?: Partial<ConversationProps>;\n  /**\n   * Disable the text input field in the conversation.\n   * @default false\n   */\n  noTextInput?: boolean;\n  /**\n   * Disable rendering of function call messages in the conversation.\n   * Function call data is still captured in the store.\n   * @default false\n   */\n  noFunctionCalls?: boolean;\n  /**\n   * Text rendering mode for bot messages.\n   * @default \"karaoke\"\n   */\n  textRenderMode?: TextRenderMode;\n  /**\n   * Hides the text render mode switch in the panel header.\n   * @default false\n   */\n  noTextRenderModeSwitch?: boolean;\n}\n\nexport const ConversationPanel: React.FC<ConversationPanelProps> = memo(\n  ({\n    conversationElementProps,\n    noConversation = false,\n    noMetrics = false,\n    noTextInput = false,\n    noFunctionCalls = false,\n    textRenderMode,\n    noTextRenderModeSwitch = false,\n  }) => {\n    const [localTextRenderMode, setLocalTextRenderMode] =\n      useState<TextRenderMode>(textRenderMode ?? \"karaoke\");\n\n    useEffect(() => {\n      if (textRenderMode !== undefined) {\n        setLocalTextRenderMode(textRenderMode);\n      }\n    }, [textRenderMode]);\n\n    const defaultValue = noConversation ? \"metrics\" : \"conversation\";\n\n    return (\n      <Tabs className=\"h-full\" defaultValue={defaultValue}>\n        <Panel className=\"h-full max-sm:border-none\">\n          <PanelHeader variant=\"noPadding\" className=\"p-1.5 relative\">\n            <TabsList>\n              {!noConversation && (\n                <TabsTrigger value=\"conversation\">\n                  <MessagesSquareIcon size={20} />\n                  Conversation\n                </TabsTrigger>\n              )}\n              {!noMetrics && (\n                <TabsTrigger value=\"metrics\">\n                  <LineChartIcon size={20} />\n                  Metrics\n                </TabsTrigger>\n              )}\n            </TabsList>\n            {!noTextRenderModeSwitch && (\n              <Select\n                value={localTextRenderMode}\n                onValueChange={(v) =>\n                  setLocalTextRenderMode(v as TextRenderMode)\n                }\n              >\n                <SelectTrigger\n                  variant=\"ghost\"\n                  size=\"sm\"\n                  className=\"ml-auto w-auto gap-1\"\n                >\n                  <SelectValue />\n                </SelectTrigger>\n                <SelectContent>\n                  <SelectItem value=\"karaoke\">Karaoke</SelectItem>\n                  <SelectItem value=\"captions\">Captions</SelectItem>\n                  <SelectItem value=\"instant\">Instant</SelectItem>\n                </SelectContent>\n              </Select>\n            )}\n          </PanelHeader>\n          <PanelContent className=\"p-0! overflow-hidden h-full\">\n            {!noConversation && (\n              <TabsContent\n                value=\"conversation\"\n                className=\"overflow-hidden h-full\"\n              >\n                <Conversation\n                  {...conversationElementProps}\n                  noTextInput={\n                    conversationElementProps?.noTextInput ?? noTextInput\n                  }\n                  noFunctionCalls={\n                    conversationElementProps?.noFunctionCalls ?? noFunctionCalls\n                  }\n                  botOutputRenderers={\n                    conversationElementProps?.botOutputRenderers\n                  }\n                  textRenderMode={localTextRenderMode}\n                />\n              </TabsContent>\n            )}\n            {!noMetrics && (\n              <TabsContent value=\"metrics\" className=\"h-full\">\n                <Metrics />\n              </TabsContent>\n            )}\n          </PanelContent>\n        </Panel>\n      </Tabs>\n    );\n  },\n);\n\nexport default ConversationPanel;\n","import { Input } from \"@/components/ui/input\";\nimport {\n  Panel,\n  PanelContent,\n  PanelHeader,\n  PanelTitle,\n} from \"@/components/ui/panel\";\nimport { cn } from \"@/lib/utils\";\nimport { BotOutputData, RTVIEvent } from \"@pipecat-ai/client-js\";\n\nimport {\n  usePipecatClient,\n  usePipecatClientTransportState,\n  useRTVIClientEvent,\n} from \"@pipecat-ai/client-react\";\nimport { FunnelIcon } from \"lucide-react\";\nimport { Fragment, useCallback, useEffect, useRef, useState } from \"react\";\n\ninterface EventData {\n  event: RTVIEvent | string;\n  message: string;\n  time: string;\n}\n\ninterface Props {\n  collapsed?: boolean;\n}\n\nexport const EventsPanel: React.FC<Props> = ({ collapsed = false }) => {\n  const client = usePipecatClient();\n  const [events, setEvents] = useState<EventData[]>([]);\n\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const isScrolledToBottom = useRef(true);\n\n  const addEvent = useCallback((data: EventData) => {\n    if (scrollRef.current) {\n      isScrolledToBottom.current =\n        Math.ceil(\n          scrollRef.current.scrollHeight - scrollRef.current.scrollTop,\n        ) <= Math.ceil(scrollRef.current.clientHeight);\n    }\n    setEvents((prev) => {\n      return [...prev, data];\n    });\n  }, []);\n\n  const transportState = usePipecatClientTransportState();\n  const lastTransportState = useRef(\"\");\n  useEffect(() => {\n    if (transportState === lastTransportState.current) return;\n    addEvent({\n      event: \"transportState\",\n      message: `Transport state changed: ${transportState}`,\n      time: new Date().toLocaleTimeString(),\n    });\n    lastTransportState.current = transportState;\n  }, [addEvent, transportState]);\n\n  useEffect(() => {\n    if (!client) return;\n    addEvent({\n      event: \"initialized\",\n      message: `RTVI Client initialized (version ${client.version})`,\n      time: new Date().toLocaleTimeString(),\n    });\n  }, [addEvent, client]);\n\n  useRTVIClientEvent(RTVIEvent.BotConnected, (participant) => {\n    addEvent({\n      event: RTVIEvent.BotConnected,\n      message: `Bot connected: ${participant.id}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.BotDisconnected, (participant) => {\n    addEvent({\n      event: RTVIEvent.BotDisconnected,\n      message: `Bot disconnected: ${participant.id}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.BotReady, (botData) => {\n    addEvent({\n      event: RTVIEvent.BotReady,\n      message: `Bot ready (v${botData.version}): ${JSON.stringify(botData.about ?? {})}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.BotStartedSpeaking, () => {\n    addEvent({\n      event: RTVIEvent.BotStartedSpeaking,\n      message: \"Bot started speaking\",\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.BotStoppedSpeaking, () => {\n    addEvent({\n      event: RTVIEvent.BotStoppedSpeaking,\n      message: \"Bot stopped speaking\",\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.BotOutput, (data: BotOutputData) => {\n    if (data.aggregated_by === \"word\") return;\n    addEvent({\n      event: RTVIEvent.BotOutput,\n      message: `Bot output (${data.aggregated_by}, spoken: ${data.spoken}): ${data.text}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.Connected, () => {\n    addEvent({\n      event: RTVIEvent.Connected,\n      message: \"Client connected\",\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n  useRTVIClientEvent(RTVIEvent.Disconnected, () => {\n    addEvent({\n      event: RTVIEvent.Disconnected,\n      message: \"Client disconnected\",\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.Error, (message) => {\n    addEvent({\n      event: RTVIEvent.Error,\n      message: `Error: ${JSON.stringify(message)}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.ParticipantConnected, (participant) => {\n    addEvent({\n      event: RTVIEvent.ParticipantConnected,\n      message: `Participant connected: ${participant.id}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n  useRTVIClientEvent(RTVIEvent.ParticipantLeft, (participant) => {\n    addEvent({\n      event: RTVIEvent.ParticipantLeft,\n      message: `Participant left: ${participant.id}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.ServerMessage, (data) => {\n    addEvent({\n      event: RTVIEvent.ServerMessage,\n      message: `Server message: ${JSON.stringify(data)}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.TrackStarted, (track, participant) => {\n    addEvent({\n      event: RTVIEvent.TrackStarted,\n      message: `Track started: ${track.kind} for participant ${participant?.id}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.TrackStopped, (track, participant) => {\n    addEvent({\n      event: RTVIEvent.TrackStopped,\n      message: `Track stopped: ${track.kind} for participant ${participant?.id}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.ScreenTrackStarted, (track, participant) => {\n    addEvent({\n      event: RTVIEvent.ScreenTrackStarted,\n      message: `Screen track started: ${track.kind} for participant ${participant?.id}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n  useRTVIClientEvent(RTVIEvent.ScreenTrackStopped, (track, participant) => {\n    addEvent({\n      event: RTVIEvent.ScreenTrackStopped,\n      message: `Screen track stopped: ${track.kind} for participant ${participant?.id}`,\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.UserStartedSpeaking, () => {\n    addEvent({\n      event: RTVIEvent.UserStartedSpeaking,\n      message: \"User started speaking\",\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useRTVIClientEvent(RTVIEvent.UserStoppedSpeaking, () => {\n    addEvent({\n      event: RTVIEvent.UserStoppedSpeaking,\n      message: \"User stopped speaking\",\n      time: new Date().toLocaleTimeString(),\n    });\n  });\n\n  useEffect(() => {\n    if (!scrollRef.current) return;\n    if (!isScrolledToBottom.current) return;\n    scrollRef.current.scrollTo({\n      top: scrollRef.current.scrollHeight,\n      behavior: \"instant\",\n    });\n  }, [events]);\n\n  const [filter, setFilter] = useState(\"\");\n  const filteredEvents = events.filter(\n    (eventData) =>\n      eventData.event.toString().toLowerCase().includes(filter) ||\n      eventData.message.toLowerCase().includes(filter),\n  );\n\n  return (\n    <Panel\n      className={cn(\n        \"bg-accent dark:bg-accent/50 h-full rounded-none! max-sm:border-none sm:border-x-0 sm:mt-2\",\n        {\n          \"bg-accent opacity-50\": collapsed,\n        },\n      )}\n    >\n      <PanelHeader\n        className={cn(\n          \"gap-4 justify-start items-center @md:py-2 bg-background\",\n          {\n            \"py-2!\": collapsed,\n          },\n        )}\n      >\n        <PanelTitle>Events</PanelTitle>\n        {!collapsed && (\n          <div className=\"relative\">\n            <div className=\"absolute inset-y-0 left-0 flex items-center pl-2 pointer-events-none\">\n              <FunnelIcon size={16} />\n            </div>\n            <Input\n              type=\"text\"\n              placeholder=\"Filter\"\n              className=\"bg-secondary max-w-48 ps-8\"\n              onChange={(e) => {\n                setFilter(e.target.value.toLowerCase());\n              }}\n            />\n          </div>\n        )}\n      </PanelHeader>\n      {!collapsed && (\n        <PanelContent ref={scrollRef} className=\"overflow-y-auto\">\n          <div className=\"grid grid-cols-[min-content_min-content_1fr] gap-x-4 gap-y-2 items-center font-mono text-xs\">\n            {filteredEvents.map((eventData, index) => (\n              <Fragment key={index}>\n                <div className=\"text-xs text-muted-foreground text-nowrap\">\n                  {eventData.time}\n                </div>\n                <div className=\"font-semibold\">{eventData.event}</div>\n                <div>{eventData.message}</div>\n              </Fragment>\n            ))}\n          </div>\n        </PanelContent>\n      )}\n    </Panel>\n  );\n};\n\nexport default EventsPanel;\n","import { ClientStatus } from \"@/components/elements/ClientStatus\";\nimport { SessionInfo } from \"@/components/elements/SessionInfo\";\nimport UserAudioControl from \"@/components/elements/UserAudioControl\";\nimport UserScreenControl from \"@/components/elements/UserScreenControl\";\nimport UserVideoControl from \"@/components/elements/UserVideoControl\";\nimport {\n  Panel,\n  PanelContent,\n  PanelHeader,\n  PanelTitle,\n} from \"@/components/ui/panel\";\nimport { usePipecatClientCamControl } from \"@pipecat-ai/client-react\";\n\ninterface Props {\n  noSessionInfo?: boolean;\n  noStatusInfo?: boolean;\n  noUserAudio?: boolean;\n  noUserVideo?: boolean;\n  noScreenControl?: boolean;\n  participantId?: string;\n  sessionId?: string;\n}\n\nexport const InfoPanel: React.FC<Props> = ({\n  noSessionInfo = false,\n  noStatusInfo = false,\n  noUserAudio = false,\n  noUserVideo = false,\n  noScreenControl = false,\n  participantId,\n  sessionId,\n}) => {\n  const noDevices = noUserAudio && noUserVideo && noScreenControl;\n  const noInfoPanel = noStatusInfo && noDevices && noSessionInfo;\n\n  const { isCamEnabled } = usePipecatClientCamControl();\n\n  if (noInfoPanel) return null;\n\n  return (\n    <Panel className=\"h-full overflow-y-auto overflow-x-hidden\">\n      {!noStatusInfo && (\n        <>\n          <PanelHeader variant=\"inline\">\n            <PanelTitle>Status</PanelTitle>\n          </PanelHeader>\n          <PanelContent>\n            <ClientStatus />\n          </PanelContent>\n        </>\n      )}\n      {!noDevices && (\n        <>\n          <PanelHeader className=\"border-t border-t-border\" variant=\"inline\">\n            <PanelTitle>Devices</PanelTitle>\n          </PanelHeader>\n          <PanelContent>\n            {!noUserAudio && <UserAudioControl />}\n            {!noUserVideo && <UserVideoControl noVideo={!isCamEnabled} />}\n            {!noScreenControl && <UserScreenControl />}\n          </PanelContent>\n        </>\n      )}\n      {!noSessionInfo && (\n        <>\n          <PanelHeader className=\"border-t border-t-border\" variant=\"inline\">\n            <PanelTitle>Session</PanelTitle>\n          </PanelHeader>\n          <PanelContent>\n            <SessionInfo sessionId={sessionId} participantId={participantId} />\n          </PanelContent>\n        </>\n      )}\n    </Panel>\n  );\n};\n\nexport default InfoPanel;\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ThemeProviderContext } from \"./ThemeProviderContext\";\n\n// Allow arbitrary theme names while keeping a special \"system\" value\nexport type Theme = \"system\" | (string & {});\n\nexport type ThemeProviderProps = {\n  children: React.ReactNode;\n  defaultTheme?: Theme;\n  storageKey?: string;\n  disableStorage?: boolean;\n};\n\nexport function ThemeProvider({\n  children,\n  defaultTheme = \"system\",\n  storageKey = \"voice-ui-kit-theme\",\n  disableStorage = false,\n  ...props\n}: ThemeProviderProps) {\n  const [theme, setTheme] = useState<Theme>(() => {\n    // Initialize from localStorage or fall back to defaultTheme\n    if (typeof window !== \"undefined\" && !disableStorage) {\n      const storedTheme = localStorage.getItem(storageKey) as Theme;\n      return storedTheme || defaultTheme;\n    }\n    return defaultTheme;\n  });\n  const [mounted, setMounted] = useState(false);\n  const [systemPrefersDark, setSystemPrefersDark] = useState<boolean>(() =>\n    typeof window !== \"undefined\"\n      ? window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n      : false,\n  );\n\n  useEffect(() => {\n    setMounted(true);\n  }, []);\n\n  // Track system theme only when using system mode\n  useEffect(() => {\n    if (!mounted || theme !== \"system\") return;\n\n    const mediaQueryList = window.matchMedia(\"(prefers-color-scheme: dark)\");\n    const updateFromList = (list: MediaQueryList) => {\n      setSystemPrefersDark(list.matches);\n    };\n    const handleChange = (event: MediaQueryListEvent) => {\n      setSystemPrefersDark(event.matches);\n    };\n\n    // Initialize with current value\n    updateFromList(mediaQueryList);\n\n    // Subscribe to changes (with cross-browser support)\n    if (\"addEventListener\" in mediaQueryList) {\n      mediaQueryList.addEventListener(\"change\", handleChange);\n      return () => {\n        mediaQueryList.removeEventListener(\"change\", handleChange);\n      };\n    } else {\n      // Fallback for older browsers\n      // @ts-expect-error addListener is deprecated but still present in some environments\n      mediaQueryList.addListener(handleChange);\n      return () => {\n        // @ts-expect-error removeListener is deprecated but still present in some environments\n        mediaQueryList.removeListener(handleChange);\n      };\n    }\n  }, [mounted, theme]);\n\n  useEffect(() => {\n    if (!mounted || disableStorage) return;\n\n    // Only store in localStorage if theme is not system, otherwise remove it\n    if (theme !== \"system\") {\n      localStorage.setItem(storageKey, theme);\n    } else {\n      localStorage.removeItem(storageKey);\n    }\n  }, [mounted, storageKey, theme, disableStorage]);\n\n  const resolvedTheme = useMemo<Theme>(\n    () => (theme === \"system\" ? (systemPrefersDark ? \"dark\" : \"light\") : theme),\n    [theme, systemPrefersDark],\n  );\n\n  useEffect(() => {\n    if (!mounted) return;\n\n    const root = window.document.documentElement;\n    // Track and remove previously applied theme class to avoid buildup\n    const previousThemeClass = previousThemeRef.current;\n    if (previousThemeClass) {\n      root.classList.remove(previousThemeClass);\n    }\n\n    const appliedThemeClass = String(resolvedTheme);\n\n    root.classList.add(appliedThemeClass);\n    previousThemeRef.current = appliedThemeClass;\n  }, [resolvedTheme, mounted]);\n\n  // Update theme when defaultTheme changes (if needed)\n  useEffect(() => {\n    if (!mounted) return;\n    // Check if localStorage has a value before updating from defaultTheme\n    if (!disableStorage) {\n      const storedTheme = localStorage.getItem(storageKey);\n      if (!storedTheme && theme !== defaultTheme) {\n        setTheme(defaultTheme);\n      }\n    } else if (theme !== defaultTheme) {\n      // When storage is disabled, reflect defaultTheme changes immediately\n      setTheme(defaultTheme);\n    }\n  }, [defaultTheme, mounted, storageKey, disableStorage, theme]);\n\n  const previousThemeRef = useRef<string | null>(null);\n\n  const setThemeStable = useCallback((newTheme: Theme) => {\n    setTheme(newTheme);\n  }, []);\n\n  const value = useMemo(\n    () => ({\n      theme,\n      setTheme: setThemeStable,\n      resolvedTheme,\n    }),\n    [theme, setThemeStable, resolvedTheme],\n  );\n\n  return (\n    <ThemeProviderContext.Provider {...props} value={value}>\n      {children}\n    </ThemeProviderContext.Provider>\n  );\n}\n","import type { Transport } from \"@pipecat-ai/client-js\";\n\nexport type TransportType = \"daily\" | \"smallwebrtc\" | \"websocket\";\n\n// Use the actual types from the packages without importing them at build time\nexport type DailyTransportOptions = ConstructorParameters<\n  typeof import(\"@pipecat-ai/daily-transport\").DailyTransport\n>[0];\nexport type SmallWebRTCTransportOptions = ConstructorParameters<\n  typeof import(\"@pipecat-ai/small-webrtc-transport\").SmallWebRTCTransport\n>[0];\nexport type WebSocketTransportOptions = ConstructorParameters<\n  typeof import(\"@pipecat-ai/websocket-transport\").WebSocketTransport\n>[0];\n\nexport interface TransportModule {\n  DailyTransport: typeof import(\"@pipecat-ai/daily-transport\").DailyTransport;\n  SmallWebRTCTransport: typeof import(\"@pipecat-ai/small-webrtc-transport\").SmallWebRTCTransport;\n  WebSocketTransport: typeof import(\"@pipecat-ai/websocket-transport\").WebSocketTransport;\n}\n\n/**\n * Dynamically imports transport modules based on the transport type.\n * This allows the packages to be peer dependencies and only loaded when needed.\n */\nexport async function loadTransport(transportType: TransportType) {\n  try {\n    switch (transportType) {\n      case \"daily\": {\n        const { DailyTransport } = await import(\"@pipecat-ai/daily-transport\");\n        return { DailyTransport };\n      }\n      case \"smallwebrtc\": {\n        const { SmallWebRTCTransport } = await import(\n          \"@pipecat-ai/small-webrtc-transport\"\n        );\n        return { SmallWebRTCTransport };\n      }\n      case \"websocket\": {\n        const { WebSocketTransport } = await import(\n          \"@pipecat-ai/websocket-transport\"\n        );\n        return { WebSocketTransport };\n      }\n      default:\n        throw new Error(`Unsupported transport type: ${transportType}`);\n    }\n  } catch (loadError) {\n    const errorMessage =\n      loadError instanceof Error ? loadError.message : String(loadError);\n    const installHint =\n      transportType === \"daily\"\n        ? \"npm install @pipecat-ai/daily-transport\"\n        : transportType === \"smallwebrtc\"\n          ? \"npm install @pipecat-ai/small-webrtc-transport\"\n          : \"npm install @pipecat-ai/websocket-transport\";\n    throw new Error(\n      `Failed to load transport \"${transportType}\". Make sure the package is installed: ${installHint}. Original error: ${errorMessage}`,\n    );\n  }\n}\n\n/**\n * Creates a transport instance based on the transport type.\n *\n * @param transportType - The type of transport to create (\"daily\" or \"smallwebrtc\")\n * @param options - Transport-specific options\n *\n */\nexport async function createTransport(\n  transportType: \"daily\",\n  options?: DailyTransportOptions,\n): Promise<Transport>;\nexport async function createTransport(\n  transportType: \"smallwebrtc\",\n  options?: SmallWebRTCTransportOptions,\n): Promise<Transport>;\nexport async function createTransport(\n  transportType: \"websocket\",\n  options?: WebSocketTransportOptions,\n): Promise<Transport>;\nexport async function createTransport(\n  transportType: TransportType,\n  options?:\n    | DailyTransportOptions\n    | SmallWebRTCTransportOptions\n    | WebSocketTransportOptions,\n): Promise<Transport>;\nexport async function createTransport(\n  transportType: TransportType,\n  options?:\n    | DailyTransportOptions\n    | SmallWebRTCTransportOptions\n    | WebSocketTransportOptions,\n): Promise<Transport> {\n  const transportModule = await loadTransport(transportType);\n\n  switch (transportType) {\n    case \"daily\": {\n      const { DailyTransport } = transportModule;\n      if (!DailyTransport) {\n        throw new Error(\"DailyTransport not found in loaded module\");\n      }\n      return new DailyTransport(options as DailyTransportOptions);\n    }\n    case \"smallwebrtc\": {\n      const { SmallWebRTCTransport } = transportModule;\n      if (!SmallWebRTCTransport) {\n        throw new Error(\"SmallWebRTCTransport not found in loaded module\");\n      }\n      return new SmallWebRTCTransport(options as SmallWebRTCTransportOptions);\n    }\n    case \"websocket\": {\n      const { WebSocketTransport } = transportModule;\n      if (!WebSocketTransport) {\n        throw new Error(\"WebSocketTransport not found in loaded module\");\n      }\n      return new WebSocketTransport(options as WebSocketTransportOptions);\n    }\n    default:\n      throw new Error(`Unsupported transport type: ${transportType}`);\n  }\n}\n","\"use client\";\n\nimport { BotAudioOutput } from \"@/components/BotAudioOutput\";\nimport {\n  ThemeProvider,\n  type ThemeProviderProps,\n} from \"@/components/ThemeProvider\";\nimport { createTransport } from \"@/lib/transports\";\nimport {\n  APIRequest,\n  PipecatClient,\n  type PipecatClientOptions,\n  type TransportConnectionParams,\n} from \"@pipecat-ai/client-js\";\nimport { PipecatClientProvider } from \"@pipecat-ai/client-react\";\nimport type { DailyTransportConstructorOptions } from \"@pipecat-ai/daily-transport\";\nimport type {\n  SmallWebRTCTransport,\n  SmallWebRTCTransportConstructorOptions,\n} from \"@pipecat-ai/small-webrtc-transport\";\nimport type { WebSocketTransportConstructorOptions } from \"@pipecat-ai/websocket-transport\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\n\n/**\n * Props for the PipecatAppBase component.\n */\nexport interface PipecatBaseProps {\n  /** Optional connection parameters. Accepts either TransportConnectionParams for direct\n   *  transport connections, or APIRequest to start and connect to a bot in one step. */\n  connectParams?: TransportConnectionParams | APIRequest;\n  /** Optional parameters for startBot. */\n  startBotParams?: APIRequest;\n  /** Callback function to transform the startBot response before connecting. */\n  startBotResponseTransformer?: (\n    response: TransportConnectionParams,\n  ) => TransportConnectionParams | Promise<TransportConnectionParams>;\n  /** Type of transport to use for the connection */\n  transportType: \"smallwebrtc\" | \"daily\" | \"websocket\";\n  /** Options for configuring the transport. */\n  transportOptions?:\n    | SmallWebRTCTransportConstructorOptions\n    | DailyTransportConstructorOptions\n    | WebSocketTransportConstructorOptions;\n  /** Optional configuration options for the Pipecat client */\n  clientOptions?: Partial<PipecatClientOptions>;\n  /** Whether to disable the theme provider */\n  noThemeProvider?: boolean;\n  /** Default theme to use for the app */\n  themeProps?: Partial<ThemeProviderProps>;\n  /** Whether to automatically connect to the session when the component mounts. Defaults to false. */\n  connectOnMount?: boolean;\n  /** Whether to automatically initialize devices when the component mounts. Defaults to false. */\n  initDevicesOnMount?: boolean;\n  /** Disables audio output for the bot. Default: false */\n  noAudioOutput?: boolean;\n  /** Callback fired when a new client instance is created. Useful for subscribing to client events before connecting. */\n  onClient?: (client: PipecatClient) => void;\n\n  /**\n   * Children can be either:\n   * - A render prop function that receives helper props and returns React nodes\n   * - Direct React nodes that will be wrapped with the necessary providers\n   *\n   * @param props - PipecatBaseChildProps including connection handlers, loading, and error state\n   * @returns React.ReactNode\n   */\n  children:\n    | ((props: PipecatBaseChildProps) => React.ReactNode)\n    | React.ReactNode;\n}\n\n/**\n * Props that are passed to child components by the PipecatAppBase.\n */\nexport interface PipecatBaseChildProps {\n  /** Pipecat client instance */\n  client: PipecatClient | null;\n  /** Function to initiate a connection to the session. Can be sync or async. */\n  handleConnect?: () => void | Promise<void>;\n  /** Function to disconnect from the current session. Can be sync or async. */\n  handleDisconnect?: () => void | Promise<void>;\n  /** Error message if connection fails */\n  error?: string | null;\n  /** Response returned from starting the bot. */\n  rawStartBotResponse?: TransportConnectionParams | unknown;\n  /** Transformed start bot response. */\n  transformedStartBotResponse?: TransportConnectionParams | unknown;\n}\n\nconst defaultStartBotResponseTransformer = (\n  response: TransportConnectionParams,\n) => response;\n\n/**\n * PipecatAppBase component that provides a configured Pipecat client with audio capabilities.\n *\n * This component:\n * - Initializes a Pipecat client with the specified transport type\n * - Provides connection and disconnection handlers (sync or async)\n * - Wraps children in the necessary providers (ThemeProvider, PipecatClientProvider)\n * - Handles error states and loading states\n * - Automatically disconnects the client when unmounting\n * - Optionally disables theme provider based on noThemeProvider prop\n * - Optionally auto-connects to the session on mount based on connectOnMount prop\n *\n * @param props - Configuration for the audio client including connection params, transport type, and auto-connect behavior\n * @returns A provider component that wraps children with client context and handlers\n *\n * @example\n * ```tsx\n * // Using as a render prop (function children)\n * <PipecatAppBase\n *   connectParams={...}\n *   transportType=\"smallwebrtc\"\n * >\n *   {({ client, handleConnect, handleDisconnect, error }) => (\n *     <YourComponent\n *       client={client}\n *       handleConnect={handleConnect}\n *       handleDisconnect={handleDisconnect}\n *       error={error}\n *     />\n *   )}\n * </PipecatAppBase>\n *\n * // Using with direct React nodes\n * <PipecatAppBase\n *   startBotParams={...}\n *   transportType=\"daily\"\n * >\n *   <YourComponent />\n * </PipecatAppBase>\n *\n * // Using with noThemeProvider to disable theme wrapping\n * <PipecatAppBase\n *   startBotParams={...}\n *   transportType=\"daily\"\n *   noThemeProvider={true}\n * >\n *   <YourComponent />\n * </PipecatAppBase>\n *\n * // Using with connectOnMount to auto-connect on component mount\n * <PipecatAppBase\n *   connectParams={...}\n *   transportType=\"smallwebrtc\"\n *   connectOnMount={true}\n * >\n *   <YourComponent />\n * </PipecatAppBase>\n * ```\n */\nexport const PipecatAppBase: React.FC<PipecatBaseProps> = ({\n  clientOptions,\n  connectOnMount = false,\n  connectParams,\n  initDevicesOnMount = false,\n  noAudioOutput = false,\n  noThemeProvider = false,\n  onClient,\n  startBotParams,\n  startBotResponseTransformer = defaultStartBotResponseTransformer,\n  transportOptions,\n  transportType,\n  themeProps,\n  children,\n}) => {\n  const onClientRef = useRef(onClient);\n  onClientRef.current = onClient;\n\n  const [client, setClient] = useState<PipecatClient | null>(null);\n  const [error, setError] = useState<string | null>(null);\n  const [rawStartBotResponse, setRawStartBotResponse] = useState<\n    TransportConnectionParams | unknown\n  >(null);\n  const [transformedStartBotResponse, setTransformedStartBotResponse] =\n    useState<TransportConnectionParams | unknown>(null);\n\n  const startAndConnect = useCallback(\n    async (client: PipecatClient) => {\n      try {\n        if (startBotParams) {\n          const response = await client.startBot({\n            requestData: {},\n            ...startBotParams,\n          });\n          setRawStartBotResponse(response);\n          if (transportType === \"smallwebrtc\") {\n            // Check if response has ICEServers\n            if (\n              typeof response === \"object\" &&\n              response !== null &&\n              \"iceConfig\" in response\n            ) {\n              const iceConfig = response.iceConfig as {\n                iceServers: RTCIceServer[];\n              };\n              (client.transport as SmallWebRTCTransport).iceServers =\n                iceConfig.iceServers;\n            }\n          }\n          const transformedResponse =\n            await startBotResponseTransformer(response);\n          await client.connect(transformedResponse);\n          setTransformedStartBotResponse(transformedResponse);\n        } else if (\n          connectParams &&\n          typeof connectParams === \"object\" &&\n          \"endpoint\" in connectParams\n        ) {\n          await client.startBotAndConnect(connectParams as APIRequest);\n        } else {\n          await client.connect(connectParams ?? {});\n        }\n      } catch (err) {\n        console.error(\"Connection error:\", err);\n        setError(\n          `Failed to start session: ${err instanceof Error ? err.message : String(err)}`,\n        );\n      }\n    },\n    [connectParams, startBotParams, startBotResponseTransformer, transportType],\n  );\n\n  /**\n   * Initializes the Pipecat client with the specified transport type.\n   * Creates a new client instance when transport type or connection params change.\n   */\n  useEffect(() => {\n    let currentClient: PipecatClient | null = null;\n\n    (async () => {\n      try {\n        const transport = await createTransport(\n          transportType,\n          transportOptions,\n        );\n\n        const pcClient = new PipecatClient({\n          enableCam: false,\n          enableMic: true,\n          transport: transport,\n          ...clientOptions,\n        });\n        currentClient = pcClient;\n        setClient(pcClient);\n        onClientRef.current?.(pcClient);\n\n        if (initDevicesOnMount) {\n          await pcClient.initDevices();\n        }\n\n        if (connectOnMount) {\n          await startAndConnect(pcClient);\n        }\n      } catch (error) {\n        console.error(\"Failed to initialize transport:\", error);\n      }\n    })();\n\n    return () => {\n      currentClient?.disconnect();\n      setClient(null);\n      setError(null);\n    };\n  }, [\n    clientOptions,\n    connectOnMount,\n    initDevicesOnMount,\n    startAndConnect,\n    transportOptions,\n    transportType,\n  ]);\n\n  /**\n   * Initiates a connection to the session using the configured client.\n   * Only allows connection from specific states (initialized, disconnected, error).\n   * Clears any previous errors and handles connection failures.\n   */\n  const handleConnect = async () => {\n    if (\n      !client ||\n      ![\"initialized\", \"disconnected\", \"error\"].includes(client.state)\n    ) {\n      return;\n    }\n    setError(null);\n\n    await startAndConnect(client);\n  };\n\n  /**\n   * Disconnects from the current session.\n   * Safely handles the case where no client is available.\n   */\n  const handleDisconnect = async () => {\n    if (!client) return;\n    await client.disconnect();\n  };\n\n  /**\n   * Show loading state while client is being initialized.\n   * Don't render PipecatClientProvider until client is ready.\n   */\n  if (!client) {\n    return typeof children === \"function\"\n      ? children({ client: null, error: null })\n      : children;\n  }\n\n  const passedProps: PipecatBaseChildProps = {\n    client,\n    handleConnect,\n    handleDisconnect,\n    error,\n    rawStartBotResponse,\n    transformedStartBotResponse,\n  };\n\n  // Only create PipecatClientProvider when client is fully initialized\n  const renderedChildren =\n    typeof children === \"function\" ? children(passedProps) : children;\n  const clientProvider = (\n    <PipecatClientProvider client={client!}>\n      <>\n        {renderedChildren}\n        {!noAudioOutput && <BotAudioOutput />}\n      </>\n    </PipecatClientProvider>\n  );\n\n  return noThemeProvider ? (\n    clientProvider\n  ) : (\n    <ThemeProvider {...themeProps}>{clientProvider}</ThemeProvider>\n  );\n};\n","/* eslint-disable react-refresh/only-export-components */\nexport { useConversationContext } from \"@pipecat-ai/client-react\";\n\n/**\n * @deprecated ConversationProvider is no longer needed — conversation state\n * management is now built into PipecatClientProvider from @pipecat-ai/client-react.\n * This component is a no-op pass-through kept for backwards compatibility.\n * It will be removed in the next major release.\n */\nexport const ConversationProvider = ({ children }: React.PropsWithChildren) => {\n  return <>{children}</>;\n};\n","import { Button } from \"@/components/ui/button\";\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { useTheme } from \"@/hooks/useTheme\";\nimport { MoonIcon, SunIcon } from \"lucide-react\";\n\nexport function ThemeModeToggle() {\n  const { setTheme } = useTheme();\n\n  return (\n    <DropdownMenu>\n      <DropdownMenuTrigger asChild>\n        <Button variant=\"ghost\" isIcon>\n          <SunIcon className=\"h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n          <MoonIcon className=\"absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n          <span className=\"sr-only\">Toggle theme</span>\n        </Button>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent align=\"end\">\n        <DropdownMenuItem onClick={() => setTheme(\"light\")}>\n          Light\n        </DropdownMenuItem>\n        <DropdownMenuItem onClick={() => setTheme(\"dark\")}>\n          Dark\n        </DropdownMenuItem>\n        <DropdownMenuItem onClick={() => setTheme(\"system\")}>\n          System\n        </DropdownMenuItem>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n}\n\nexport default ThemeModeToggle;\n","import { usePipecatClient } from \"@pipecat-ai/client-react\";\nimport { useEffect } from \"react\";\nimport { PipecatBaseProps } from \"@/components/PipecatAppBase\";\nimport { loadTransport } from \"@/lib/transports\";\n\ninterface Props {\n  audioCodec?: string;\n  transportType: PipecatBaseProps[\"transportType\"];\n  videoCodec?: string;\n}\n\nexport const SmallWebRTCCodecSetter = ({\n  audioCodec = \"default\",\n  transportType,\n  videoCodec = \"default\",\n}: Props) => {\n  const client = usePipecatClient();\n\n  useEffect(\n    function updateSmallWebRTCCodecs() {\n      if (!client || transportType !== \"smallwebrtc\") return;\n\n      loadTransport(\"smallwebrtc\").then(({ SmallWebRTCTransport }) => {\n        if (!SmallWebRTCTransport) return;\n        const transport = client.transport as unknown;\n        if (!(transport instanceof SmallWebRTCTransport)) return;\n        if (audioCodec) {\n          transport.setAudioCodec(audioCodec);\n        }\n        if (videoCodec) {\n          transport.setVideoCodec(videoCodec);\n        }\n      });\n    },\n    [audioCodec, client, videoCodec, transportType],\n  );\n\n  return null;\n};\n","\"use client\";\n\nimport { ClientStatus } from \"@/components/elements/ClientStatus\";\nimport ConnectButton from \"@/components/elements/ConnectButton\";\nimport type { ConversationProps } from \"@/components/elements/Conversation\";\nimport PipecatLogo from \"@/components/elements/PipecatLogo\";\nimport { SessionInfo } from \"@/components/elements/SessionInfo\";\nimport UserAudioControl from \"@/components/elements/UserAudioControl\";\nimport UserVideoControl from \"@/components/elements/UserVideoControl\";\nimport { BotAudioPanel } from \"@/components/panels/BotAudioPanel\";\nimport { BotVideoPanel } from \"@/components/panels/BotVideoPanel\";\nimport ConversationPanel from \"@/components/panels/ConversationPanel\";\nimport { EventsPanel } from \"@/components/panels/EventsPanel\";\nimport { InfoPanel } from \"@/components/panels/InfoPanel\";\nimport { PipecatAppBase, PipecatBaseProps } from \"@/components/PipecatAppBase\";\nimport ThemeModeToggle from \"@/components/ThemeModeToggle\";\nimport {\n  Banner,\n  BannerClose,\n  BannerIcon,\n  BannerTitle,\n} from \"@/components/ui/banner\";\nimport { Button } from \"@/components/ui/button\";\nimport { SpinLoader } from \"@/components/ui/loader\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from \"@/components/ui/popover\";\nimport {\n  ResizableHandle,\n  ResizablePanel,\n  ResizablePanelGroup,\n} from \"@/components/ui/resizable\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { cn } from \"@/lib/utils\";\nimport {\n  type ConversationMessage,\n  type TextRenderMode,\n} from \"@/types/conversation\";\nimport {\n  type APIRequest,\n  type PipecatClientOptions,\n  RTVIEvent,\n} from \"@pipecat-ai/client-js\";\nimport {\n  usePipecatClientCamControl,\n  usePipecatConversation,\n  useRTVIClientEvent,\n} from \"@pipecat-ai/client-react\";\nimport {\n  BotIcon,\n  ChevronsLeftRightEllipsisIcon,\n  CircleAlertIcon,\n  InfoIcon,\n  MessagesSquareIcon,\n  MicIcon,\n  PanelLeftCloseIcon,\n  PanelRightCloseIcon,\n} from \"lucide-react\";\nimport { type ImperativePanelHandle } from \"react-resizable-panels\";\nimport React, { memo, useEffect, useRef, useState } from \"react\";\nimport { SmallWebRTCCodecSetter } from \"./SmallWebRTCCodecSetter\";\nimport UserScreenControl from \"../../components/elements/UserScreenControl\";\n\nexport interface ConsoleTemplateProps\n  extends Omit<PipecatBaseProps, \"children\"> {\n  /** Disables RTVI related functionality. Default: false */\n  noRTVI?: boolean;\n  /** Specifies the RTVI version in use by the server. Default: null */\n  serverRTVIVersion?: string | null;\n  /** Disables user audio input entirely. Default: false */\n  noUserAudio?: boolean;\n  /** Disables user video input entirely. Default: false */\n  noUserVideo?: boolean;\n  /** Disables user screen control entirely. Default: false */\n  noScreenControl?: boolean;\n  /** Disables text input in the conversation. Default: false */\n  noTextInput?: boolean;\n  /** Disables audio output for the bot. Default: false */\n  noAudioOutput?: boolean;\n  /** Disables audio visualization for the bot. Default: false */\n  noBotAudio?: boolean;\n  /**\n   * Hides the bot audio controls (e.g. volume) in the bot audio panel header.\n   * Implicitly hidden when `noAudioOutput` is true. Default: false\n   */\n  noBotAudioControls?: boolean;\n  /** Disables video visualization for the bot. Default: true */\n  noBotVideo?: boolean;\n  /** Disables automatic initialization of devices. Default: false */\n  noAutoInitDevices?: boolean;\n\n  /** Theme to use for the UI. Default: \"system\" */\n  theme?: string;\n  /** Disables the theme switcher in the header. Default: false */\n  noThemeSwitch?: boolean;\n  /** Disables the logo in the header. Default: false */\n  noLogo?: boolean;\n  /** Disables the session info panel. Default: false */\n  noSessionInfo?: boolean;\n  /** Disables the status info panel. Default: false */\n  noStatusInfo?: boolean;\n\n  /** Title displayed in the header. Default: \"Pipecat Playground\" */\n  titleText?: string;\n  /** Label for assistant messages. Default: \"assistant\" */\n  assistantLabelText?: string;\n  /** Label for user messages. Default: \"user\" */\n  userLabelText?: string;\n  /** Label for system messages. Default: \"system\" */\n  systemLabelText?: string;\n\n  /** Whether to collapse the info panel by default. Default: false */\n  collapseInfoPanel?: boolean;\n  /** Whether to collapse the media panel by default. Default: false */\n  collapseMediaPanel?: boolean;\n\n  // Properties from original interface that are still in use but not in the new interface\n\n  /**\n   * Sets the audio codec. Only applicable for SmallWebRTC transport.\n   * Defaults to \"default\" which uses the browser's default codec.\n   */\n  audioCodec?: string;\n\n  /**\n   * Sets the video codec. Only applicable for SmallWebRTC transport.\n   * Defaults to \"default\" which uses the browser's default codec.\n   */\n  videoCodec?: string;\n\n  /**\n   * Disables the conversation panel.\n   * The bot may still send messages, but they won't be displayed.\n   */\n  noConversation?: boolean;\n\n  /**\n   * Disables the metrics panel.\n   * The bot may still send metrics, but they won't be displayed.\n   */\n  noMetrics?: boolean;\n\n  /**\n   * Text rendering mode for bot messages.\n   * - \"karaoke\": Full text, already-spoken portion normal, upcoming portion muted (default)\n   * - \"captions\": Show only the portion that has been spoken (synced to audio)\n   * - \"instant\": Show the full LLM text immediately, no highlighting\n   * @default \"karaoke\"\n   */\n  textRenderMode?: TextRenderMode;\n\n  /**\n   * Hides the text render mode switch in the conversation panel header.\n   * @default false\n   */\n  noTextRenderModeSwitch?: boolean;\n\n  /**\n   * Custom logo component to display in the header.\n   * If provided, this will replace the default Pipecat logo.\n   */\n  logoComponent?: React.ReactNode;\n\n  /**\n   * Props to pass to the Conversation component.\n   * Allows customization of the conversation display.\n   */\n  conversationElementProps?: Partial<ConversationProps>;\n\n  /**\n   * Callback that receives the injectMessage function.\n   * This allows parent components to manually add messages to the conversation.\n   */\n  onInjectMessage?: (\n    injectMessage: (message: {\n      role: \"user\" | \"assistant\" | \"system\";\n      parts: ConversationMessage[\"parts\"];\n    }) => void,\n  ) => void;\n\n  /**\n   * Callback that receives incoming server messages.\n   * This allows parent components to subscribe to server messages from the client.\n   */\n  onServerMessage?: (data: unknown) => void;\n\n  /**\n   * @deprecated Use titleText instead\n   * Title displayed in the header. Defaults to \"Pipecat Playground\".\n   */\n  title?: string;\n}\n\n/**\n * Extract a URL string from SmallWebRTC-style connection options.\n */\nconst extractUrlFromOptions = (opts: unknown): string | undefined => {\n  if (!opts || typeof opts !== \"object\") return undefined;\n  const o = opts as Record<string, unknown>;\n  if (o.webrtcRequestParams && typeof o.webrtcRequestParams === \"object\") {\n    const params = o.webrtcRequestParams as Record<string, unknown>;\n    if (params.endpoint) return String(params.endpoint);\n  }\n  if (typeof o.webrtcUrl === \"string\") return o.webrtcUrl;\n  if (typeof o.connectionUrl === \"string\") return o.connectionUrl;\n  return undefined;\n};\n\n/**\n * Resolve a URL string to an absolute URL, using window.location.origin\n * as the base for relative paths (e.g. \"/start\").\n */\nconst resolveUrl = (url: string): string => {\n  if (typeof window === \"undefined\") return url;\n  try {\n    return new URL(url, window.location.origin).toString();\n  } catch {\n    return url;\n  }\n};\n\n/**\n * Resolve the connection URL that will be used when clicking Connect.\n * Checks startBotParams, connectParams, and transportOptions in priority order.\n */\nconst getConnectionUrl = (\n  startBotParams?: APIRequest,\n  connectParams?: unknown,\n  transportOptions?: unknown,\n): string | undefined => {\n  if (startBotParams?.endpoint)\n    return resolveUrl(String(startBotParams.endpoint));\n  const url =\n    extractUrlFromOptions(connectParams) ??\n    extractUrlFromOptions(transportOptions);\n  return url ? resolveUrl(url) : undefined;\n};\n\nconst defaultClientOptions: Partial<PipecatClientOptions> = {\n  enableCam: false,\n  enableMic: true,\n};\nconst defaultTransportOptions: React.ComponentProps<\n  typeof PipecatAppBase\n>[\"transportOptions\"] = {};\n\nexport const ConsoleTemplate: React.FC<ConsoleTemplateProps> = memo((props) => {\n  const {\n    clientOptions = defaultClientOptions,\n    connectParams,\n    noAudioOutput = false,\n    noAutoInitDevices = false,\n    onClient,\n    startBotParams,\n    startBotResponseTransformer,\n    theme,\n    transportOptions = defaultTransportOptions,\n    transportType = \"smallwebrtc\",\n  } = props;\n\n  return (\n    <PipecatAppBase\n      connectParams={connectParams}\n      initDevicesOnMount={!noAutoInitDevices}\n      onClient={onClient}\n      startBotParams={startBotParams}\n      startBotResponseTransformer={startBotResponseTransformer}\n      transportType={transportType}\n      clientOptions={clientOptions}\n      transportOptions={transportOptions}\n      themeProps={{\n        defaultTheme: theme,\n      }}\n      noAudioOutput={noAudioOutput}\n    >\n      {({ client, error, handleConnect, handleDisconnect }) =>\n        !client ? (\n          <div className=\"flex items-center justify-center h-full w-full\">\n            <SpinLoader />\n          </div>\n        ) : (\n          <ConsoleUI\n            {...props}\n            error={error}\n            handleConnect={handleConnect}\n            handleDisconnect={handleDisconnect}\n          />\n        )\n      }\n    </PipecatAppBase>\n  );\n});\n\ninterface ConsoleUIProps extends ConsoleTemplateProps {\n  error?: string | null;\n  handleConnect?: () => void | Promise<void>;\n  handleDisconnect?: () => void | Promise<void>;\n  participantId?: string;\n}\n\nconst ConsoleUI = ({\n  // Core functionality\n  // noRTVI,\n  // serverRTVIVersion,\n  noUserAudio = false,\n  noUserVideo = false,\n  noScreenControl = false,\n  noTextInput = false,\n  noBotAudio = false,\n  noBotAudioControls = false,\n  noBotVideo = false,\n  noAudioOutput = false,\n\n  // Transport and client options\n  startBotParams,\n  connectParams,\n  transportOptions,\n  transportType = \"smallwebrtc\",\n\n  // UI configuration\n  noThemeSwitch = false,\n  noLogo = false,\n  noSessionInfo = false,\n  noStatusInfo = false,\n\n  // Text labels\n  titleText = \"Pipecat Playground\",\n  assistantLabelText,\n  userLabelText,\n  systemLabelText,\n\n  // Panel collapse settings\n  collapseInfoPanel = false,\n  collapseMediaPanel = false,\n\n  // Legacy properties\n  audioCodec = \"default\",\n  videoCodec = \"default\",\n  noConversation = false,\n  noMetrics = false,\n  textRenderMode,\n  noTextRenderModeSwitch = false,\n  logoComponent,\n  conversationElementProps,\n  onInjectMessage,\n  onServerMessage,\n\n  // Passed props\n  error,\n  handleConnect,\n  handleDisconnect,\n}: ConsoleUIProps) => {\n  const [isBotAreaCollapsed, setIsBotAreaCollapsed] = useState(false);\n  const [isInfoPanelCollapsed, setIsInfoPanelCollapsed] = useState(false);\n  const [isEventsPanelCollapsed, setIsEventsPanelCollapsed] = useState(false);\n  const [participantId, setParticipantId] = useState(\"\");\n  const [sessionId, setSessionId] = useState(\"\");\n\n  const infoPanelRef = useRef<ImperativePanelHandle>(null);\n\n  const { injectMessage } = usePipecatConversation();\n  const { isCamEnabled } = usePipecatClientCamControl();\n\n  // Expose injectMessage to parent if requested\n  useEffect(() => {\n    if (onInjectMessage) onInjectMessage(injectMessage);\n  }, [onInjectMessage, injectMessage]);\n\n  const noBotArea = noBotAudio && noBotVideo;\n  const noConversationPanel = noConversation && noMetrics;\n  const noDevices = noUserAudio && noUserVideo && noScreenControl;\n  const noInfoPanel = noStatusInfo && noDevices && noSessionInfo;\n  const connectionUrl = getConnectionUrl(\n    startBotParams,\n    connectParams,\n    transportOptions,\n  );\n\n  useRTVIClientEvent(RTVIEvent.ParticipantConnected, (p) => {\n    if (p.local) setParticipantId(p.id || \"\");\n  });\n  useRTVIClientEvent(RTVIEvent.TrackStarted, (_track, p) => {\n    if (p?.id && p?.local) setParticipantId(p.id);\n  });\n  useRTVIClientEvent(RTVIEvent.ServerMessage, (data) => {\n    onServerMessage?.(data);\n  });\n  useRTVIClientEvent(RTVIEvent.BotStarted, (data) => {\n    const sessionData = data as { sessionId?: string };\n    if (sessionData?.sessionId) {\n      setSessionId(sessionData.sessionId);\n    }\n  });\n\n  return (\n    <>\n      {transportType === \"smallwebrtc\" && (\n        <SmallWebRTCCodecSetter\n          audioCodec={audioCodec}\n          transportType={transportType}\n          videoCodec={videoCodec}\n        />\n      )}\n      <div className=\"flex flex-col h-full w-full overflow-auto\">\n        <div className=\"h-min grid grid-cols-2 sm:grid-cols-[150px_1fr_150px] gap-2 items-center justify-center p-2 bg-background sm:relative top-0 w-full z-10\">\n          {noLogo ? (\n            <span className=\"h-6\" />\n          ) : (\n            (logoComponent ?? (\n              <PipecatLogo className=\"h-6 w-auto text-foreground\" />\n            ))\n          )}\n          <strong className=\"hidden sm:block text-center\">{titleText}</strong>\n          <div className=\"flex items-center justify-end gap-2 sm:gap-3 xl:gap-6\">\n            <div className=\"flex items-center gap-1\">\n              {!noThemeSwitch && <ThemeModeToggle />}\n              <Button\n                className=\"hidden sm:flex\"\n                variant={\"ghost\"}\n                isIcon\n                onClick={() => {\n                  if (isInfoPanelCollapsed) {\n                    infoPanelRef.current?.expand();\n                  } else {\n                    infoPanelRef.current?.collapse();\n                  }\n                }}\n              >\n                {isInfoPanelCollapsed ? (\n                  <PanelLeftCloseIcon />\n                ) : (\n                  <PanelRightCloseIcon />\n                )}\n              </Button>\n            </div>\n            <Tooltip>\n              <TooltipTrigger asChild>\n                <span>\n                  <ConnectButton\n                    onConnect={handleConnect}\n                    onDisconnect={handleDisconnect}\n                  />\n                </span>\n              </TooltipTrigger>\n              {connectionUrl && (\n                <TooltipContent align=\"end\" side=\"bottom\">\n                  {connectionUrl}\n                </TooltipContent>\n              )}\n            </Tooltip>\n          </div>\n        </div>\n        {error && (\n          <Banner\n            variant=\"destructive\"\n            className=\"h-min animate-in fade-in duration-300\"\n          >\n            <BannerIcon icon={CircleAlertIcon} />\n            <BannerTitle>\n              Unable to connect. Please check web console for errors.\n            </BannerTitle>\n            <BannerClose variant=\"destructive\" />\n          </Banner>\n        )}\n        <div className=\"hidden sm:block h-full\">\n          <ResizablePanelGroup direction=\"vertical\" className=\"h-full\">\n            <ResizablePanel defaultSize={70} minSize={50}>\n              <ResizablePanelGroup direction=\"horizontal\">\n                {!noBotArea && (\n                  <>\n                    <ResizablePanel\n                      className=\"flex flex-col gap-2 p-2 xl:gap-4\"\n                      defaultSize={collapseMediaPanel ? 8 : 26}\n                      maxSize={30}\n                      minSize={10}\n                      collapsible\n                      collapsedSize={8}\n                      onCollapse={() => setIsBotAreaCollapsed(true)}\n                      onExpand={() => setIsBotAreaCollapsed(false)}\n                    >\n                      {!noBotAudio && (\n                        <BotAudioPanel\n                          className={cn({\n                            \"mb-auto\": noBotVideo,\n                          })}\n                          collapsed={isBotAreaCollapsed}\n                          noControls={noBotAudioControls || noAudioOutput}\n                        />\n                      )}\n                      {!noBotVideo && (\n                        <BotVideoPanel\n                          className={cn({\n                            \"mt-auto\": noBotAudio,\n                          })}\n                          collapsed={isBotAreaCollapsed}\n                        />\n                      )}\n                    </ResizablePanel>\n                    {(!noConversationPanel || !noInfoPanel) && (\n                      <ResizableHandle withHandle />\n                    )}\n                  </>\n                )}\n                {!noConversationPanel && (\n                  <>\n                    <ResizablePanel\n                      className=\"h-full p-2\"\n                      defaultSize={collapseInfoPanel ? 70 : 47}\n                      minSize={30}\n                    >\n                      <ConversationPanel\n                        noConversation={noConversation}\n                        noMetrics={noMetrics}\n                        noTextInput={noTextInput}\n                        textRenderMode={textRenderMode}\n                        noTextRenderModeSwitch={noTextRenderModeSwitch}\n                        conversationElementProps={{\n                          ...conversationElementProps,\n                          assistantLabel: assistantLabelText,\n                          clientLabel: userLabelText,\n                          systemLabel: systemLabelText,\n                        }}\n                      />\n                    </ResizablePanel>\n                    {!noInfoPanel && <ResizableHandle withHandle />}\n                  </>\n                )}\n                {!noInfoPanel && (\n                  <ResizablePanel\n                    id=\"info-panel\"\n                    ref={infoPanelRef}\n                    collapsible\n                    collapsedSize={4}\n                    defaultSize={collapseInfoPanel ? 4 : 27}\n                    minSize={15}\n                    onCollapse={() => setIsInfoPanelCollapsed(true)}\n                    onExpand={() => setIsInfoPanelCollapsed(false)}\n                    className=\"p-2\"\n                  >\n                    {isInfoPanelCollapsed ? (\n                      <div className=\"flex flex-col items-center justify-center gap-4 h-full\">\n                        {!noStatusInfo && (\n                          <Popover>\n                            <PopoverTrigger asChild>\n                              <Button variant=\"ghost\" isIcon>\n                                <ChevronsLeftRightEllipsisIcon size={16} />\n                              </Button>\n                            </PopoverTrigger>\n                            <PopoverContent side=\"left\">\n                              <ClientStatus />\n                            </PopoverContent>\n                          </Popover>\n                        )}\n                        {!noDevices && (\n                          <Popover>\n                            <PopoverTrigger asChild>\n                              <Button variant=\"ghost\" isIcon>\n                                <MicIcon size={16} />\n                              </Button>\n                            </PopoverTrigger>\n                            <PopoverContent\n                              className=\"flex flex-col gap-2\"\n                              side=\"left\"\n                            >\n                              {!noUserAudio && <UserAudioControl />}\n                              {!noUserVideo && (\n                                <UserVideoControl noVideo={!isCamEnabled} />\n                              )}\n                              {!noScreenControl && <UserScreenControl />}\n                            </PopoverContent>\n                          </Popover>\n                        )}\n                        {!noSessionInfo && (\n                          <Popover>\n                            <PopoverTrigger asChild>\n                              <Button variant=\"ghost\" isIcon>\n                                <InfoIcon size={16} />\n                              </Button>\n                            </PopoverTrigger>\n                            <PopoverContent side=\"left\">\n                              <SessionInfo\n                                participantId={participantId}\n                                sessionId={sessionId}\n                              />\n                            </PopoverContent>\n                          </Popover>\n                        )}\n                      </div>\n                    ) : (\n                      <InfoPanel\n                        noSessionInfo={noSessionInfo}\n                        noStatusInfo={noStatusInfo}\n                        noUserAudio={noUserAudio}\n                        noUserVideo={noUserVideo}\n                        noScreenControl={noScreenControl}\n                        participantId={participantId}\n                        sessionId={sessionId}\n                      />\n                    )}\n                  </ResizablePanel>\n                )}\n              </ResizablePanelGroup>\n            </ResizablePanel>\n            <ResizableHandle withHandle />\n            <ResizablePanel\n              collapsible\n              collapsedSize={4}\n              minSize={7}\n              onCollapse={() => setIsEventsPanelCollapsed(true)}\n              onExpand={() => setIsEventsPanelCollapsed(false)}\n            >\n              <EventsPanel collapsed={isEventsPanelCollapsed} />\n            </ResizablePanel>\n          </ResizablePanelGroup>\n        </div>\n        <Tabs\n          defaultValue={\n            noBotArea ? (noConversationPanel ? \"info\" : \"conversation\") : \"bot\"\n          }\n          className=\"flex flex-col gap-0 h-full sm:hidden overflow-hidden\"\n        >\n          <div className=\"flex flex-col overflow-hidden flex-1\">\n            {!noBotArea && (\n              <TabsContent\n                value=\"bot\"\n                className=\"flex-1 overflow-auto flex flex-col gap-4 p-2\"\n              >\n                {!noBotAudio && (\n                  <BotAudioPanel\n                    noControls={noBotAudioControls || noAudioOutput}\n                  />\n                )}\n                {!noBotVideo && <BotVideoPanel />}\n              </TabsContent>\n            )}\n            {!noConversationPanel && (\n              <TabsContent\n                value=\"conversation\"\n                className=\"flex-1 overflow-auto\"\n              >\n                <ConversationPanel\n                  noConversation={noConversation}\n                  noMetrics={noMetrics}\n                  noTextInput={noTextInput}\n                  textRenderMode={textRenderMode}\n                  noTextRenderModeSwitch={noTextRenderModeSwitch}\n                />\n              </TabsContent>\n            )}\n            <TabsContent value=\"info\" className=\"flex-1 overflow-auto p-2\">\n              <InfoPanel\n                noUserAudio={noUserAudio}\n                noUserVideo={noUserVideo}\n                noScreenControl={noScreenControl}\n                participantId={participantId}\n                sessionId={sessionId}\n              />\n            </TabsContent>\n            <TabsContent value=\"events\" className=\"flex-1 overflow-auto\">\n              <EventsPanel />\n            </TabsContent>\n          </div>\n          <TabsList className=\"w-full h-12 rounded-none z-10 mt-auto shrink-0\">\n            {!noBotArea && (\n              <TabsTrigger value=\"bot\">\n                <BotIcon />\n              </TabsTrigger>\n            )}\n            {!noConversationPanel && (\n              <TabsTrigger value=\"conversation\">\n                <MessagesSquareIcon />\n              </TabsTrigger>\n            )}\n            <TabsTrigger value=\"info\">\n              <InfoIcon />\n            </TabsTrigger>\n            <TabsTrigger value=\"events\">\n              <ChevronsLeftRightEllipsisIcon />\n            </TabsTrigger>\n          </TabsList>\n        </Tabs>\n      </div>\n    </>\n  );\n};\n","import { UserAudioControl } from \"@/components/elements\";\nimport {\n  PipecatAppBase,\n  type PipecatBaseChildProps,\n} from \"@/components/PipecatAppBase\";\nimport {\n  Button,\n  Card,\n  CardContent,\n  Divider,\n  ErrorCard,\n  Input,\n  SpinLoader,\n} from \"@/components/ui\";\nimport { usePipecatConnectionState } from \"@/hooks\";\nimport { cn } from \"@/lib/utils\";\nimport { TransportConnectionParams } from \"@pipecat-ai/client-js\";\nimport { ChevronDownIcon, SendIcon } from \"lucide-react\";\nimport { memo, useCallback, useEffect, useState } from \"react\";\n\nexport interface WidgetTemplateProps {\n  /**\n   * The URL of the Pipecat server to connect to.\n   */\n  serverUrl?: string;\n  /**\n   * Debounce time in milliseconds for the send function.\n   * @default 300\n   */\n  debounceTime?: number;\n\n  /**\n   * The label of the toggle button.\n   * @default \"Open\"\n   */\n  toggleButtonLabel?: string;\n\n  classNames?: {\n    container?: string;\n    toggleContainer?: string;\n    toggleButton?: string;\n    widgetContainer?: string;\n  };\n\n  connectParams?: TransportConnectionParams;\n}\n\nconst TextInput = ({ debounceTime = 300 }: { debounceTime?: number }) => {\n  const [isSending, setIsSending] = useState(false);\n  const [message, setMessage] = useState(\"\");\n  const { state } = usePipecatConnectionState();\n\n  const handleSend = useCallback(() => {\n    setIsSending(true);\n    console.log(message);\n    setMessage(\"\");\n    setIsSending(false);\n  }, [message]);\n\n  useEffect(() => {\n    if (!message.trim()) return;\n\n    const timeoutId = setTimeout(() => {\n      handleSend();\n    }, debounceTime);\n\n    return () => clearTimeout(timeoutId);\n  }, [message, debounceTime, handleSend]);\n\n  const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    setMessage(e.target.value);\n  };\n\n  return (\n    <div className=\"flex flex-row gap-2\">\n      <Input\n        placeholder=\"Type message...\"\n        value={message}\n        onChange={handleInputChange}\n        disabled={isSending || state !== \"connected\"}\n        className=\"flex-1\"\n        size=\"lg\"\n      />\n      <Button\n        onClick={handleSend}\n        disabled={isSending || state !== \"connected\"}\n        isLoading={isSending}\n        size=\"lg\"\n        isIcon\n      >\n        <SendIcon />\n      </Button>\n    </div>\n  );\n};\n\nconst WidgetPanel = (props: WidgetTemplateProps) => {\n  return (\n    <Card\n      withGradientBorder\n      className={cn(\n        \"w-full self-end justify-self-end max-w-md z-20 animate-in fade-in-0 slide-in-from-bottom-2 duration-300\",\n        props.classNames?.widgetContainer,\n      )}\n      shadow=\"xlong\"\n      size=\"lg\"\n      rounded=\"xl\"\n    >\n      <CardContent>\n        <TextInput debounceTime={props.debounceTime} />\n        <Divider size=\"md\" />\n        <UserAudioControl size=\"lg\" />\n      </CardContent>\n    </Card>\n  );\n};\n\nexport const WidgetTemplate: React.FC<WidgetTemplateProps> = memo(\n  ({ classNames, toggleButtonLabel = \"Open\", connectParams, ...rest }) => {\n    const [isOpen, setIsOpen] = useState(false);\n\n    const widgetComp = (\n      <PipecatAppBase\n        connectParams={connectParams || {}}\n        transportType=\"smallwebrtc\"\n        noThemeProvider\n        connectOnMount\n      >\n        {({ client, error }: PipecatBaseChildProps) => {\n          return !client ? (\n            <SpinLoader />\n          ) : error ? (\n            <ErrorCard>{error}</ErrorCard>\n          ) : (\n            <WidgetPanel {...rest} />\n          );\n        }}\n      </PipecatAppBase>\n    );\n\n    return (\n      <div\n        className={cn(\"relative flex flex-col gap-4\", classNames?.container)}\n      >\n        {isOpen && widgetComp}\n\n        <Card\n          rounded=\"xl\"\n          className={cn(\n            \"justify-self-end self-end z-20 duration-300 transition-discrete transition-all overflow-hidden\",\n            isOpen ? \"shadow-xshort\" : \"shadow-xlong\",\n            classNames?.toggleContainer,\n          )}\n        >\n          <CardContent>\n            <Button\n              onClick={() => setIsOpen(!isOpen)}\n              isIcon={isOpen}\n              size=\"lg\"\n              className={cn(classNames?.toggleButton)}\n            >\n              {isOpen ? <ChevronDownIcon /> : toggleButtonLabel}\n            </Button>\n          </CardContent>\n        </Card>\n      </div>\n    );\n  },\n);\n"]}