{
	"$schema": "https://shadcn-svelte.com/schema/registry-item.json",
	"name": "realtime-transcriber-01",
	"title": "Realtime Transcriber 01",
	"type": "registry:block",
	"description": "A streaming speech-to-text block with a language selector, live partial results, copy-to-clipboard, and a ⌘K toggle. Provider-agnostic via a TranscriptionAdapter (Web Speech API demo).",
	"dependencies": [
		"@lucide/svelte"
	],
	"devDependencies": [
		"@lucide/svelte@^1.7.0",
		"tailwind-variants@^1.0.0"
	],
	"registryDependencies": [
		"badge",
		"button",
		"command",
		"popover",
		"scroll-area",
		"https://sv11.ui.twango.dev/r/shimmering-text.json"
	],
	"files": [
		{
			"content": "<script lang=\"ts\" module>\n\timport { tv } from \"tailwind-variants\";\n\timport type { TranscriptionAdapter } from \"./adapter.js\";\n\n\texport const realtimeTranscriber01Variants = tv({\n\t\tslots: {\n\t\t\troot: \"bg-card relative flex min-h-[420px] w-full flex-col items-center justify-center overflow-hidden rounded-xl border p-6\",\n\t\t\tglow: \"from-primary/5 pointer-events-none absolute inset-0 bg-gradient-to-b to-transparent\",\n\t\t\tpanel: \"z-10 flex max-w-sm flex-col items-center gap-5 text-center\",\n\t\t\theading: \"space-y-1.5\",\n\t\t\ttitle: \"text-2xl font-semibold tracking-tight\",\n\t\t\tsubtitle: \"text-muted-foreground text-sm\",\n\t\t\tkbd: \"bg-muted rounded px-1.5 py-0.5 font-mono text-[10px]\",\n\t\t\tlangButton: \"gap-2\",\n\t\t\tchevron: \"text-muted-foreground size-3.5\",\n\t\t\tpopover: \"w-56 p-0\",\n\t\t\tstartButton: \"gap-2\",\n\t\t\terrorText: \"text-destructive text-sm\",\n\t\t\tnote: \"text-muted-foreground max-w-xs text-xs\",\n\t\t\tcode: \"bg-muted rounded px-1 py-0.5\",\n\t\t\tbadge: \"text-muted-foreground font-normal\",\n\t\t\tshimmer: \"z-10 text-lg\",\n\t\t\ttranscript: \"relative z-10 flex h-full max-h-[340px] w-full max-w-2xl flex-col\",\n\t\t\tscroll: \"flex-1\",\n\t\t\tviewport: \"max-h-[300px] overflow-y-auto px-2 py-1\",\n\t\t\ttranscriptText: \"text-xl leading-relaxed\",\n\t\t\tpartialText: \"text-foreground/40\",\n\t\t\tcopyRow: \"flex justify-end pt-2\",\n\t\t\tcopyButton: \"size-7\",\n\t\t\tstopWrap: \"absolute bottom-6 left-1/2 z-10 -translate-x-1/2\",\n\t\t\tstopButton: \"gap-2 shadow-sm\",\n\t\t\tstopKbd: \"bg-background/60 rounded px-1.5 py-0.5 font-mono text-[10px]\",\n\t\t},\n\t});\n\n\texport type RealtimeTranscriber01Props = {\n\t\t/**\n\t\t * Streaming transcription backend. Defaults to a browser Web Speech API\n\t\t * adapter so the demo runs with no server (Chromium only). When provided,\n\t\t * the language selector is hidden — your adapter owns language handling.\n\t\t */\n\t\tadapter?: TranscriptionAdapter;\n\t\tclass?: string;\n\t};\n</script>\n\n<script lang=\"ts\">\n\timport GlobeIcon from \"@lucide/svelte/icons/globe\";\n\timport ChevronDownIcon from \"@lucide/svelte/icons/chevron-down\";\n\timport CopyIcon from \"@lucide/svelte/icons/copy\";\n\timport CheckIcon from \"@lucide/svelte/icons/check\";\n\timport MicIcon from \"@lucide/svelte/icons/mic\";\n\timport SquareIcon from \"@lucide/svelte/icons/square\";\n\timport { onDestroy, onMount } from \"svelte\";\n\timport { cn } from \"$UTILS$.js\";\n\timport { Button } from \"$UI$/button/index.js\";\n\timport { Badge } from \"$UI$/badge/index.js\";\n\timport { ScrollArea } from \"$UI$/scroll-area/index.js\";\n\timport { ShimmeringText } from \"$UI$/shimmering-text/index.js\";\n\timport * as Command from \"$UI$/command/index.js\";\n\timport * as Popover from \"$UI$/popover/index.js\";\n\timport { createWebSpeechAdapter, isSpeechRecognitionSupported } from \"./adapter.js\";\n\timport { LANGUAGES } from \"./languages.js\";\n\n\tlet { adapter, class: className }: RealtimeTranscriber01Props = $props();\n\n\tconst ui = realtimeTranscriber01Variants();\n\n\ttype ConnectionState = \"idle\" | \"connecting\" | \"connected\" | \"error\";\n\n\tlet connectionState = $state<ConnectionState>(\"idle\");\n\tlet committed = $state(\"\");\n\tlet partial = $state(\"\");\n\tlet error = $state(\"\");\n\tlet copied = $state(false);\n\n\tlet selectedCode = $state<string | null>(null);\n\tlet langOpen = $state(false);\n\tlet scrollViewport = $state<HTMLElement | null>(null);\n\n\tlet session: TranscriptionAdapter | null = null;\n\n\t// Optimistic until mounted so prerendered HTML doesn't flash the \"unsupported\"\n\t// note before the client can feature-detect.\n\tlet mounted = $state(false);\n\tonMount(() => (mounted = true));\n\tconst usingDemo = $derived(!adapter);\n\tconst supported = $derived(!mounted || !usingDemo || isSpeechRecognitionSupported());\n\tconst selectedName = $derived(\n\t\tLANGUAGES.find((l) => l.code === selectedCode)?.name ?? \"Auto-detect\"\n\t);\n\tconst isActive = $derived(connectionState === \"connecting\" || connectionState === \"connected\");\n\tconst isEmpty = $derived(!committed && !partial);\n\tconst transcript = $derived((committed + (partial ? \" \" + partial : \"\")).trim());\n\n\t// Auto-scroll the transcript to the bottom as new text streams in.\n\t$effect(() => {\n\t\tvoid committed;\n\t\tvoid partial;\n\t\tif (scrollViewport) scrollViewport.scrollTop = scrollViewport.scrollHeight;\n\t});\n\n\tasync function start() {\n\t\terror = \"\";\n\t\tcommitted = \"\";\n\t\tpartial = \"\";\n\t\tconnectionState = \"connecting\";\n\t\tsession = adapter ?? createWebSpeechAdapter(selectedCode ?? navigator.language ?? \"en-US\");\n\t\ttry {\n\t\t\tawait session.start({\n\t\t\t\tonConnect: () => {\n\t\t\t\t\tif (connectionState === \"connecting\") connectionState = \"connected\";\n\t\t\t\t},\n\t\t\t\tonPartialTranscript: (text) => (partial = text),\n\t\t\t\tonCommittedTranscript: (text) => {\n\t\t\t\t\tif (text) committed = (committed ? committed + \" \" + text : text).trim();\n\t\t\t\t\tpartial = \"\";\n\t\t\t\t},\n\t\t\t\tonDisconnect: () => {\n\t\t\t\t\tif (connectionState !== \"error\") connectionState = \"idle\";\n\t\t\t\t},\n\t\t\t\tonError: (err) => {\n\t\t\t\t\terror = err.message;\n\t\t\t\t\tconnectionState = \"error\";\n\t\t\t\t\tsession?.cancel();\n\t\t\t\t\tsession = null;\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (err) {\n\t\t\terror = err instanceof Error ? err.message : \"Could not start transcription.\";\n\t\t\tconnectionState = \"error\";\n\t\t\tsession = null;\n\t\t}\n\t}\n\n\tfunction stop() {\n\t\tsession?.stop();\n\t\tsession = null;\n\t\tconnectionState = \"idle\";\n\t\tpartial = \"\";\n\t}\n\n\tfunction toggle() {\n\t\tif (!supported) return;\n\t\tif (isActive) stop();\n\t\telse void start();\n\t}\n\n\tfunction onKeydown(event: KeyboardEvent) {\n\t\t// ⌘K / Ctrl+K toggles, except while typing in a field (e.g. the search box).\n\t\tconst target = event.target as HTMLElement | null;\n\t\tif (target?.tagName === \"INPUT\" || target?.tagName === \"TEXTAREA\" || target?.isContentEditable)\n\t\t\treturn;\n\t\tif ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"k\") {\n\t\t\tevent.preventDefault();\n\t\t\ttoggle();\n\t\t}\n\t}\n\n\tasync function copy() {\n\t\tif (!transcript) return;\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(transcript);\n\t\t} catch {\n\t\t\treturn; // clipboard blocked (insecure context / denied) — leave UI untouched\n\t\t}\n\t\tcopied = true;\n\t\tsetTimeout(() => (copied = false), 1500);\n\t}\n\n\tfunction selectLanguage(code: string | null) {\n\t\tselectedCode = code;\n\t\tlangOpen = false;\n\t}\n\n\tonDestroy(() => session?.cancel());\n</script>\n\n<svelte:window onkeydown={onKeydown} />\n\n<div class={cn(ui.root(), className)}>\n\t{#if isActive}\n\t\t<div class={ui.glow()} aria-hidden=\"true\"></div>\n\t{/if}\n\n\t{#if connectionState === \"idle\" || connectionState === \"error\"}\n\t\t<div class={ui.panel()}>\n\t\t\t<div class={ui.heading()}>\n\t\t\t\t<h2 class={ui.title()}>Realtime Speech to Text</h2>\n\t\t\t\t<p class={ui.subtitle()}>\n\t\t\t\t\tTranscribe your voice live as you speak. Press the button or\n\t\t\t\t\t<kbd class={ui.kbd()}>⌘K</kbd> to start.\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t{#if usingDemo}\n\t\t\t\t<Popover.Root bind:open={langOpen}>\n\t\t\t\t\t<Popover.Trigger>\n\t\t\t\t\t\t{#snippet child({ props })}\n\t\t\t\t\t\t\t<Button {...props} variant=\"outline\" size=\"sm\" class={ui.langButton()}>\n\t\t\t\t\t\t\t\t<GlobeIcon class=\"size-3.5\" />\n\t\t\t\t\t\t\t\t{selectedName}\n\t\t\t\t\t\t\t\t<ChevronDownIcon class={ui.chevron()} />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t{/snippet}\n\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t\t<Popover.Content class={ui.popover()} align=\"center\">\n\t\t\t\t\t\t<Command.Root>\n\t\t\t\t\t\t\t<Command.Input placeholder=\"Search language...\" />\n\t\t\t\t\t\t\t<Command.List>\n\t\t\t\t\t\t\t\t<Command.Empty>No language found.</Command.Empty>\n\t\t\t\t\t\t\t\t<Command.Group>\n\t\t\t\t\t\t\t\t\t{#each LANGUAGES as language (language.code ?? \"auto\")}\n\t\t\t\t\t\t\t\t\t\t<Command.Item\n\t\t\t\t\t\t\t\t\t\t\tvalue={`${language.name} ${language.code ?? \"auto\"}`}\n\t\t\t\t\t\t\t\t\t\t\tonSelect={() => selectLanguage(language.code)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<CheckIcon\n\t\t\t\t\t\t\t\t\t\t\t\tclass={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"size-4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectedCode === language.code ? \"opacity-100\" : \"opacity-0\"\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t{language.name}\n\t\t\t\t\t\t\t\t\t\t</Command.Item>\n\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t</Command.Group>\n\t\t\t\t\t\t\t</Command.List>\n\t\t\t\t\t\t</Command.Root>\n\t\t\t\t\t</Popover.Content>\n\t\t\t\t</Popover.Root>\n\t\t\t{/if}\n\n\t\t\t<Button size=\"lg\" onclick={toggle} disabled={!supported} class={ui.startButton()}>\n\t\t\t\t<MicIcon class=\"size-4\" />\n\t\t\t\tStart Transcribing\n\t\t\t</Button>\n\n\t\t\t{#if connectionState === \"error\"}\n\t\t\t\t<p class={ui.errorText()}>{error}</p>\n\t\t\t{/if}\n\n\t\t\t{#if !supported}\n\t\t\t\t<p class={ui.note()}>\n\t\t\t\t\tThis demo uses the browser Web Speech API (Chromium-based browsers). Pass an\n\t\t\t\t\t<code class={ui.code()}>adapter</code> to wire any provider.\n\t\t\t\t</p>\n\t\t\t{:else}\n\t\t\t\t<Badge variant=\"secondary\" class={ui.badge()}>\n\t\t\t\t\t{usingDemo ? \"Powered by the Web Speech API\" : \"Streaming speech to text\"}\n\t\t\t\t</Badge>\n\t\t\t{/if}\n\t\t</div>\n\t{:else if connectionState === \"connecting\"}\n\t\t<ShimmeringText text=\"Connecting...\" class={ui.shimmer()} />\n\t{:else if isEmpty}\n\t\t<ShimmeringText text=\"Say something aloud...\" class={ui.shimmer()} />\n\t{:else}\n\t\t<div class={ui.transcript()}>\n\t\t\t<ScrollArea class={ui.scroll()}>\n\t\t\t\t<div bind:this={scrollViewport} class={ui.viewport()}>\n\t\t\t\t\t<p class={ui.transcriptText()}>\n\t\t\t\t\t\t<span>{committed}</span>\n\t\t\t\t\t\t{#if partial}\n\t\t\t\t\t\t\t<span class={ui.partialText()}>{committed ? \" \" : \"\"}{partial}</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</ScrollArea>\n\t\t\t<div class={ui.copyRow()}>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclass={ui.copyButton()}\n\t\t\t\t\tonclick={copy}\n\t\t\t\t\taria-label=\"Copy transcript\"\n\t\t\t\t>\n\t\t\t\t\t{#if copied}<CheckIcon class=\"size-3.5\" />{:else}<CopyIcon class=\"size-3.5\" />{/if}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t{/if}\n\n\t{#if connectionState === \"connected\"}\n\t\t<div class={ui.stopWrap()}>\n\t\t\t<Button variant=\"secondary\" size=\"sm\" onclick={toggle} class={ui.stopButton()}>\n\t\t\t\t<SquareIcon class=\"size-3.5\" />\n\t\t\t\tStop\n\t\t\t\t<kbd class={ui.stopKbd()}>⌘K</kbd>\n\t\t\t</Button>\n\t\t</div>\n\t{/if}\n</div>\n",
			"type": "registry:block",
			"target": "components/blocks/realtime-transcriber-01/realtime-transcriber-01.svelte"
		},
		{
			"content": "// Streaming transcription adapter. The interface mirrors the one shipped with\n// the `speech-input` component, so adapters are interchangeable between the two.\n// Wire a real provider (ElevenLabs Scribe, Deepgram, etc.) by implementing this\n// interface; the bundled Web Speech adapter is a zero-backend demo default.\n\nexport interface TranscriptionAdapterCallbacks {\n\t/** Running interim text for the phrase currently being spoken. */\n\tonPartialTranscript?: (text: string) => void;\n\t/** Fired once per finalized phrase, with just that phrase. The consumer\n\t * accumulates these into the running transcript. */\n\tonCommittedTranscript?: (text: string) => void;\n\tonConnect?: () => void;\n\tonDisconnect?: () => void;\n\tonError?: (error: Error) => void;\n}\n\nexport interface TranscriptionAdapter {\n\t/** Open the connection and start capturing. Resolves once streaming. */\n\tstart(callbacks: TranscriptionAdapterCallbacks): Promise<void>;\n\t/** Stop cleanly, flushing any in-flight phrase. */\n\tstop(): void;\n\t/** Stop and discard any in-flight phrase. */\n\tcancel(): void;\n}\n\n// --- Web Speech API (not in the default TS DOM lib) ---\n\ntype SpeechRecognitionAlternative = { transcript: string };\ntype SpeechRecognitionResult = { 0: SpeechRecognitionAlternative; isFinal: boolean };\ntype SpeechRecognitionEvent = {\n\tresultIndex: number;\n\tresults: { length: number; [index: number]: SpeechRecognitionResult };\n};\ninterface SpeechRecognitionLike {\n\tcontinuous: boolean;\n\tinterimResults: boolean;\n\tlang: string;\n\tstart(): void;\n\tstop(): void;\n\tabort(): void;\n\tonstart: (() => void) | null;\n\tonresult: ((event: SpeechRecognitionEvent) => void) | null;\n\tonerror: ((event: { error: string }) => void) | null;\n\tonend: (() => void) | null;\n}\ntype SpeechRecognitionCtor = new () => SpeechRecognitionLike;\n\nexport function getSpeechRecognition(): SpeechRecognitionCtor | null {\n\tif (typeof window === \"undefined\") return null;\n\tconst w = window as unknown as {\n\t\tSpeechRecognition?: SpeechRecognitionCtor;\n\t\twebkitSpeechRecognition?: SpeechRecognitionCtor;\n\t};\n\treturn w.SpeechRecognition ?? w.webkitSpeechRecognition ?? null;\n}\n\nexport const isSpeechRecognitionSupported = () => getSpeechRecognition() !== null;\n\n/**\n * Demo TranscriptionAdapter backed by the browser SpeechRecognition. Runs fully\n * client-side with no API key (Chromium-based browsers). Continuous recognition\n * is kept alive by restarting on unexpected `onend` until `stop()`/`cancel()`.\n */\nexport function createWebSpeechAdapter(lang = \"en-US\"): TranscriptionAdapter {\n\tlet recognition: SpeechRecognitionLike | null = null;\n\tlet stopped = false;\n\tlet cb: TranscriptionAdapterCallbacks = {};\n\t// Set while start() is pending; lets a startup error reject the start() Promise\n\t// (e.g. permission denied fires onerror before onstart ever does).\n\tlet startup: { resolve: () => void; reject: (err: Error) => void } | null = null;\n\n\tfunction build() {\n\t\tconst Ctor = getSpeechRecognition()!;\n\t\tconst r = new Ctor();\n\t\tr.continuous = true;\n\t\tr.interimResults = true;\n\t\tr.lang = lang;\n\t\tr.onresult = (event) => {\n\t\t\tlet interim = \"\";\n\t\t\tfor (let i = event.resultIndex; i < event.results.length; i++) {\n\t\t\t\tconst result = event.results[i];\n\t\t\t\tconst text = result[0].transcript;\n\t\t\t\tif (result.isFinal) {\n\t\t\t\t\t// Emit only the phrase that finalized; the consumer accumulates.\n\t\t\t\t\tcb.onCommittedTranscript?.(text.trim());\n\t\t\t\t} else {\n\t\t\t\t\tinterim += text;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcb.onPartialTranscript?.(interim.trim());\n\t\t};\n\t\tr.onerror = (event) => {\n\t\t\tif (event.error === \"no-speech\" || event.error === \"aborted\") return;\n\t\t\tconst err = new Error(`Speech recognition error: ${event.error}`);\n\t\t\t// A failure before onstart means start() is still pending — reject it so\n\t\t\t// `await adapter.start()` callers hit their catch instead of hanging.\n\t\t\tif (startup) {\n\t\t\t\tconst pending = startup;\n\t\t\t\tstartup = null;\n\t\t\t\tpending.reject(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcb.onError?.(err);\n\t\t};\n\t\tr.onend = () => {\n\t\t\t// Continuous mode can end on its own after silence; restart until the\n\t\t\t// caller explicitly stops, so the session feels live.\n\t\t\tif (!stopped) {\n\t\t\t\ttry {\n\t\t\t\t\tr.start();\n\t\t\t\t} catch {\n\t\t\t\t\tcb.onDisconnect?.();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcb.onDisconnect?.();\n\t\t\t}\n\t\t};\n\t\treturn r;\n\t}\n\n\treturn {\n\t\tstart(callbacks) {\n\t\t\tcb = callbacks;\n\t\t\tstopped = false;\n\t\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\t\tconst Ctor = getSpeechRecognition();\n\t\t\t\tif (!Ctor) {\n\t\t\t\t\treject(new Error(\"SpeechRecognition is not supported in this browser.\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstartup = {\n\t\t\t\t\tresolve: () => {\n\t\t\t\t\t\tstartup = null;\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t},\n\t\t\t\t\treject: (err) => {\n\t\t\t\t\t\tstartup = null;\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\trecognition = build();\n\t\t\t\trecognition.onstart = () => {\n\t\t\t\t\tcb.onConnect?.();\n\t\t\t\t\tstartup?.resolve();\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\trecognition.start();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tstartup = null;\n\t\t\t\t\treject(err instanceof Error ? err : new Error(\"Failed to start recognition.\"));\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tstop() {\n\t\t\tstopped = true;\n\t\t\t// Settle a still-pending start() so `await adapter.start()` can't hang if\n\t\t\t// we stop before onstart fires.\n\t\t\tstartup?.resolve();\n\t\t\trecognition?.stop();\n\t\t\trecognition = null;\n\t\t},\n\t\tcancel() {\n\t\t\tstopped = true;\n\t\t\tstartup?.resolve();\n\t\t\trecognition?.abort();\n\t\t\trecognition = null;\n\t\t},\n\t};\n}\n",
			"type": "registry:block",
			"target": "components/blocks/realtime-transcriber-01/adapter.ts"
		},
		{
			"content": "export type Language = {\n\t/** BCP-47 tag passed to the recognizer, or `null` to use the browser default. */\n\tcode: string | null;\n\tname: string;\n};\n\nexport const LANGUAGES: Language[] = [\n\t{ code: null, name: \"Auto-detect\" },\n\t{ code: \"en-US\", name: \"English (US)\" },\n\t{ code: \"en-GB\", name: \"English (UK)\" },\n\t{ code: \"es-ES\", name: \"Spanish\" },\n\t{ code: \"fr-FR\", name: \"French\" },\n\t{ code: \"de-DE\", name: \"German\" },\n\t{ code: \"it-IT\", name: \"Italian\" },\n\t{ code: \"pt-BR\", name: \"Portuguese (Brazil)\" },\n\t{ code: \"nl-NL\", name: \"Dutch\" },\n\t{ code: \"pl-PL\", name: \"Polish\" },\n\t{ code: \"ru-RU\", name: \"Russian\" },\n\t{ code: \"hi-IN\", name: \"Hindi\" },\n\t{ code: \"ja-JP\", name: \"Japanese\" },\n\t{ code: \"ko-KR\", name: \"Korean\" },\n\t{ code: \"zh-CN\", name: \"Chinese (Mandarin)\" },\n\t{ code: \"ar-SA\", name: \"Arabic\" },\n];\n",
			"type": "registry:block",
			"target": "components/blocks/realtime-transcriber-01/languages.ts"
		},
		{
			"content": "import RealtimeTranscriber01 from \"./realtime-transcriber-01.svelte\";\n\nexport { RealtimeTranscriber01, RealtimeTranscriber01 as default };\nexport type { RealtimeTranscriber01Props } from \"./realtime-transcriber-01.svelte\";\nexport {\n\tcreateWebSpeechAdapter,\n\tgetSpeechRecognition,\n\tisSpeechRecognitionSupported,\n} from \"./adapter.js\";\nexport type { TranscriptionAdapter, TranscriptionAdapterCallbacks } from \"./adapter.js\";\nexport { LANGUAGES } from \"./languages.js\";\nexport type { Language } from \"./languages.js\";\n",
			"type": "registry:block",
			"target": "components/blocks/realtime-transcriber-01/index.ts"
		}
	]
}