Props, hooks, and shared types for all Audio components. Built on the Web Audio API and MediaRecorder API.
Chat message bubble with role-based styling. Uses compound pattern with MessageContent and MessageAvatar.
Sub-components
MessageContent — Content wrapper with variant styling. MessageAvatar — Avatar with image or initials fallback.
from"user" | "assistant"—childrenReactNode—Auto-scrolling container powered by use-stick-to-bottom. Stays pinned to the bottom during streaming.
Sub-components
ConversationContent — Scrollable viewport. ConversationEmptyState — Shown when no messages exist. ConversationScrollButton — Scroll-to-bottom button.
childrenReactNode—Multi-modal chat input with auto-resize textarea, keyboard shortcuts (Enter to send), and slots for actions.
placeholderstring"Type a message…"valuestring—onValueChange(value: string) => void—onSubmit(value: string) => void—disabledbooleanfalsemaxRowsnumber5leadingReactNode—trailingReactNode—Memoized wrapper around Streamdown. Accepts all Streamdown props — renders streaming markdown with syntax highlighting and animations. Only re-renders when children changes.
Animated loading indicator with three visual variants for AI thinking states.
variant"dots" | "pulse" | "shimmer""dots"size"sm" | "md" | "lg""md"labelstring—Grid or list of clickable suggestion cards. Each suggestion has a title, optional description, icon, and value.
Suggestion type
{ title: string; description?: string; icon?: ReactNode; value?: string }
suggestionsSuggestion[]—onSelect(value: string) => void—headingstring—layout"list" | "grid""grid"columns1 | 2 | 32Thumbs up/down feedback bar with copy and regenerate actions. Designed for AI message responses.
FeedbackValue type
"positive" | "negative" | null
value"positive" | "negative" | null—onValueChange(value: FeedbackValue) => void—onCopy() => void—onRegenerate() => void—showCopybooleantrueshowRegeneratebooleantrueToken usage display with progress bar, model badge, and optional cost calculation.
usednumber—limitnumber—modelstring—costPer1knumber—showProgressbooleantrueformatNumber(n: number) => stringbuilt-insize"sm" | "md" | "lg""md"Compound audio player built on a shared context. Wrap children in AudioPlayerProvider and compose with sub-components.
AudioPlayerItem<TData>
idstring | number—srcstring—dataTData—AudioPlayerButton
itemAudioPlayerItem<TData>—AudioPlayerSpeed
speedsreadonly number[][0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]Additional sub-components: AudioPlayerProgress, AudioPlayerTime, AudioPlayerDuration, AudioPlayerSpeedButtonGroup.
Hooks: useAudioPlayer() returns the full player API. useAudioPlayerTime() returns the current time (number).
Compound timeline scrubber with draggable thumb. Compose ScrubBarContainer > ScrubBarTrack > ScrubBarProgress + ScrubBarThumb.
Sub-components
ScrubBarTrack, ScrubBarProgress, ScrubBarThumb, ScrubBarTimeLabel
durationnumber—valuenumber—onScrub(time: number) => void—onScrubStart() => void—onScrubEnd() => void—Canvas-based real-time audio waveform from microphone or stream input. Supports scrolling and static rendering modes.
activebooleanfalseprocessingbooleanfalsedeviceIdstring—barWidthnumber3barHeightnumber4barGapnumber1barRadiusnumber1.5barColorstringcurrentColorfadeEdgesbooleantruefadeWidthnumber24heightstring | number64sensitivitynumber1smoothingTimeConstantnumber0.8fftSizenumber256historySizenumber60updateRatenumber30mode"scrolling" | "static""static"onError(error: Error) => void—onStreamReady(stream: MediaStream) => void—onStreamEnd() => void—Hooks for building real-time frequency bar visualizers. This file exports three hooks — compose them to create custom bar UIs. Uses Web Audio API AnalyserNode under the hood.
useAudioVolume(mediaStream, options?) → number
Returns a single volume value (0–1) from a MediaStream.
mediaStreamMediaStream | null | undefinedoptions.fftSizenumberoptions.smoothingTimeConstantnumberoptions.minDecibelsnumberoptions.maxDecibelsnumberuseMultibandVolume(mediaStream, options?) → number[]
Splits audio into configurable frequency bands. Returns volume per band.
mediaStreamMediaStream | null | undefinedoptions.bandsnumberoptions.loPassnumberoptions.hiPassnumberoptions.updateIntervalnumberuseBarAnimator(state, columns, interval) → number[]
Returns highlighted bar indices based on agent state. Used for preset animation patterns.
stateAgentState | undefinedcolumnsnumberintervalnumberAgentState type
"connecting" | "initializing" | "listening" | "speaking" | "thinking"
Waveform family with static, scrolling, scrubber, microphone, live-microphone, and recording variants.
Utility
downsample(data, targetBars) — Downsamples audio data to a target number of bars.
Family exports: AudioScrubber, StaticWaveform, ScrollingWaveform, MicrophoneWaveform, LiveMicrophoneWaveform, and RecordingWaveform.
dataFloat32Array | number[]—barsnumber100progressnumber0playedColorstringprimaryunplayedColorstringmutedbarColorstring—barWidthnumber—barHeightnumber—gapnumber1barGapnumber1barRadiusnumber1fadeEdgesbooleanfalsefadeWidthnumber24heightnumber | string—onSeek(position: number) => void—size"sm" | "md" | "lg""md"Recording component with timer, pause/resume, and audio level meter. Uses MediaRecorder API.
RecorderState type
"idle" | "recording" | "paused" | "stopped"
onRecordingComplete(blob: Blob, url: string) => void—onStateChange(state: RecorderState) => void—onError(error: string) => void—maxDurationnumber300mimeTypestringauto-detectedshowTimerbooleantrueshowLevelbooleantruesize"sm" | "md" | "lg""md"Microphone device picker with permission request handling and mute toggle.
valuestring—onValueChange(deviceId: string) => void—mutedboolean—onMutedChange(muted: boolean) => void—disabledboolean—Multi-state voice interaction button with embedded waveform visualization.
VoiceButtonState type
"idle" | "recording" | "processing" | "success" | "error"
stateVoiceButtonState"idle"onPress() => void—labelReactNode—trailingReactNode—iconReactNode—variant"default" | "destructive" | "outline" | "secondary" | "ghost" | "link""outline"size"default" | "sm" | "lg" | "icon""default"waveformClassNamestring—feedbackDurationnumber1500SVG dot-matrix display with animation frames and preset patterns. Supports VU meter mode for audio levels.
Presets
Built-in patterns: digits, chevronLeft, chevronRight, loader, pulse, wave, snake. Utility: vu(columns, levels) generates VU meter frames.
rowsnumber—colsnumber—patternFrame—framesFrame[]—fpsnumber12autoplaybooleantrueloopbooleantruesizenumber10gapnumber2palette{ on: string; off: string }{ on: "currentColor", off: "var(--muted-foreground)" }brightnessnumber1ariaLabelstring—onFrame(index: number) => void—mode"default" | "vu""default"levelsnumber[]—Animated gradient shimmer text effect with viewport-triggered animation using motion/react.
textstring—durationnumber2delaynumber0repeatbooleantruespreadnumber2colorstring—shimmerColorstring—startOnViewbooleantrueoncebooleanfalserepeatDelaynumber0.5Syntax-highlighted code block with Shiki, copy button, optional line numbers, and language badge.
codestring—languagestring"tsx"showLineNumbersbooleanfalseshowCopybooleantruetitlestring—maxHeightnumber | string—size"sm" | "md" | "lg""md"Web Speech API powered speech-to-text input. Supports continuous mode, interim results, and custom rendering via children render prop.
SpeechInputState type
"idle" | "listening" | "processing" | "error" | "unsupported"
onTranscript(text: string, isFinal: boolean) => void—onError(error: string) => void—onStateChange(state: SpeechInputState) => void—langstring"en-US"continuousbooleanfalseinterimResultsbooleantruechildren(state, toggle) => ReactNode—Text input bar with send button and connection toggle for real-time voice/chat sessions.
AgentConnectionState type
"disconnected" | "connecting" | "connected" | "disconnecting"
onSend(message: string) => void—onConnect() => void—onDisconnect() => void—connectionStateAgentConnectionState"disconnected"placeholderstring"Type a message…"showConnectionTogglebooleantrueisSendDisabledbooleanfalseCompound transcript display with per-character highlighting, auto-scroll, and synchronized audio playback.
alignmentCharacterAlignmentResponseModel—textstring—audioSrcstring—srcstring—audioTypestring"audio/mpeg"segmentComposer(alignment) => { segments; words }—composer(alignment) => AlignmentCharacter[]—hideAudioTagsbooleantrueonPlay() => void—onPause() => void—onTimeUpdate(time: number) => void—onEnded() => void—onDurationChange(duration: number) => void—Sub-components: TranscriptViewerWords, TranscriptViewerWord, TranscriptViewerAudio, TranscriptViewerPlayPauseButton, TranscriptViewerScrubBar, and the exported hook useTranscriptViewerContext
Rich sub-component props: TranscriptViewerWords supports renderWord, renderGap, wordClassNames, and gapClassNames. TranscriptViewerScrubBar supports showTimeLabels, labelsClassName, trackClassName, progressClassName, and thumbClassName.
Selectable voice list with labels, descriptions, and audio preview playback.
Voice type
{ voiceId: string; name: string; previewUrl?: string; labels?: Record<string, string>; description?: string; category?: string }
voicesVoice[]—valuestring—onValueChange(voiceId: string) => void—placeholderstring"Select a voice…"openboolean—onOpenChange(open: boolean) => void—Self-contained canvas orb with organic state motion, glow, pulse rings, and no WebGL or remote texture dependency.
AgentState type
"idle" | "thinking" | "listening" | "talking"
colors[string, string]["#CADCFC", "#A0B9D1"]seednumber42agentState"idle" | "thinking" | "listening" | "talking""idle"volumeMode"auto" | "manual""auto"manualInputnumber—manualOutputnumber—colorsRefRefObject<[string, string]>—inputVolumeRefRefObject<number>—outputVolumeRefRefObject<number>—getInputVolume() => number—getOutputVolume() => number—intensitynumber1classNamestring—Standalone hook for controlling audio playback with play, pause, seek, volume, and speed. Returns state and actions.
isPlayingbooleancurrentTimenumberdurationnumbervolumenumberisMutedbooleanplaybackRatenumberisBufferingbooleanerrorstring | nullplay()() => voidpause()() => voidtoggle()() => voidseek(time)(time: number) => voidsetVolume(vol)(volume: number) => voidtoggleMute()() => voidsetPlaybackRate(rate)(rate: number) => voidload(src)(src: string) => voidhasEndedbooleanaudioRefRefObject<HTMLAudioElement | null>Tracks real-time volume/frequency data from a MediaStream using Web Audio API AnalyserNode.
dataUint8Array | nullanalyserAnalyserNode | nullisActivebooleanerrorstring | nullEnumerates audio input devices with permission handling, device selection, and stream management.
devicesAudioDevice[]activeDeviceIdstring | nullstreamMediaStream | nullhasPermissionbooleanisRequestingbooleanerrorstring | nullrequestPermission()() => Promise<void>selectDevice(id)(deviceId: string) => Promise<void>stopStream()() => voidSplits raw frequency data into configurable bands for equalizer-style visualization.
useMultibandVolume(data: Uint8Array | null, { bands?: number, minThreshold?: number })
bandVolumesnumber[]Provides smooth bar animation with configurable smoothing/decay. Used internally by BarVisualizer.
useBarAnimator({ targetHeights: number[], smoothing?: number, enabled?: boolean })
currentHeightsnumber[]