@speechos/client 0.2.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +68 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/form-detector.d.ts +17 -1
- package/dist/form-detector.d.ts.map +1 -0
- package/dist/form-detector.test.d.ts +5 -0
- package/dist/form-detector.test.d.ts.map +1 -0
- package/dist/index.cjs +6847 -317
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +20 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.iife.js +6761 -1713
- package/dist/index.iife.js.map +1 -1
- package/dist/index.iife.min.js +2126 -392
- package/dist/index.iife.min.js.map +1 -1
- package/dist/index.js +6766 -250
- package/dist/index.js.map +1 -1
- package/dist/speechos.d.ts +48 -5
- package/dist/speechos.d.ts.map +1 -0
- package/dist/speechos.test.d.ts +5 -0
- package/dist/speechos.test.d.ts.map +1 -0
- package/dist/stores/audio-settings.d.ts +45 -0
- package/dist/stores/audio-settings.d.ts.map +1 -0
- package/dist/stores/index.d.ts +15 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/language-settings.d.ts +106 -0
- package/dist/stores/language-settings.d.ts.map +1 -0
- package/dist/stores/snippets-store.d.ts +72 -0
- package/dist/stores/snippets-store.d.ts.map +1 -0
- package/dist/stores/snippets-store.test.d.ts +5 -0
- package/dist/stores/snippets-store.test.d.ts.map +1 -0
- package/dist/stores/transcript-store.d.ts +54 -0
- package/dist/stores/transcript-store.d.ts.map +1 -0
- package/dist/stores/transcript-store.test.d.ts +5 -0
- package/dist/stores/transcript-store.test.d.ts.map +1 -0
- package/dist/stores/vocabulary-store.d.ts +63 -0
- package/dist/stores/vocabulary-store.d.ts.map +1 -0
- package/dist/stores/vocabulary-store.test.d.ts +5 -0
- package/dist/stores/vocabulary-store.test.d.ts.map +1 -0
- package/dist/text-input-handler.d.ts +73 -0
- package/dist/text-input-handler.d.ts.map +1 -0
- package/dist/text-input-handler.test.d.ts +5 -0
- package/dist/text-input-handler.test.d.ts.map +1 -0
- package/dist/ui/action-bubbles.d.ts +6 -1
- package/dist/ui/action-bubbles.d.ts.map +1 -0
- package/dist/ui/audio-level-meter.d.ts +31 -0
- package/dist/ui/audio-level-meter.d.ts.map +1 -0
- package/dist/ui/audio-visualizer.d.ts +29 -0
- package/dist/ui/audio-visualizer.d.ts.map +1 -0
- package/dist/ui/icons.d.ts +31 -0
- package/dist/ui/icons.d.ts.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/mic-button.d.ts +3 -0
- package/dist/ui/mic-button.d.ts.map +1 -0
- package/dist/ui/settings-button.d.ts +1 -0
- package/dist/ui/settings-button.d.ts.map +1 -0
- package/dist/ui/settings-modal.d.ts +14 -14
- package/dist/ui/settings-modal.d.ts.map +1 -0
- package/dist/ui/styles/modal-styles.d.ts +10 -0
- package/dist/ui/styles/modal-styles.d.ts.map +1 -0
- package/dist/ui/styles/theme.d.ts +1 -0
- package/dist/ui/styles/theme.d.ts.map +1 -0
- package/dist/ui/tabs/about-tab.d.ts +14 -0
- package/dist/ui/tabs/about-tab.d.ts.map +1 -0
- package/dist/ui/tabs/help-tab.d.ts +14 -0
- package/dist/ui/tabs/help-tab.d.ts.map +1 -0
- package/dist/ui/tabs/history-tab.d.ts +26 -0
- package/dist/ui/tabs/history-tab.d.ts.map +1 -0
- package/dist/ui/tabs/index.d.ts +10 -0
- package/dist/ui/tabs/index.d.ts.map +1 -0
- package/dist/ui/tabs/settings-tab.d.ts +42 -0
- package/dist/ui/tabs/settings-tab.d.ts.map +1 -0
- package/dist/ui/tabs/snippets-tab.d.ts +34 -0
- package/dist/ui/tabs/snippets-tab.d.ts.map +1 -0
- package/dist/ui/tabs/vocabulary-tab.d.ts +30 -0
- package/dist/ui/tabs/vocabulary-tab.d.ts.map +1 -0
- package/dist/ui/widget.d.ts +23 -0
- package/dist/ui/widget.d.ts.map +1 -0
- package/dist/ui/widget.test.d.ts +6 -0
- package/dist/ui/widget.test.d.ts.map +1 -0
- package/package.json +8 -9
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["element: Element | null","event: FocusEvent","formDetector: FormDetector","config: SpeechOSConfig","events","userId: string","SpeechOSClass"],"sources":["../src/form-detector.ts","../src/speechos.ts","../src/index.ts"],"sourcesContent":["/**\n * Form field focus detection for SpeechOS Client SDK\n * Detects when users focus on form fields and manages widget visibility\n */\n\nimport { events, state } from \"@speechos/core\";\n\n/**\n * Check if an element is a form field that we should track\n */\nfunction isFormField(element: Element | null): element is HTMLElement {\n if (!element || !(element instanceof HTMLElement)) {\n return false;\n }\n\n const tagName = element.tagName.toLowerCase();\n\n // Check for input, textarea\n if (tagName === \"input\" || tagName === \"textarea\") {\n // Exclude certain input types that don't accept text\n if (tagName === \"input\") {\n const type = (element as HTMLInputElement).type.toLowerCase();\n const excludedTypes = [\n \"checkbox\",\n \"radio\",\n \"submit\",\n \"button\",\n \"reset\",\n \"file\",\n \"hidden\",\n ];\n if (excludedTypes.includes(type)) {\n return false;\n }\n }\n return true;\n }\n\n // Check for contenteditable\n if (\n element.isContentEditable ||\n element.getAttribute(\"contenteditable\") === \"true\"\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Form detector class that manages focus tracking\n */\nexport class FormDetector {\n private isActive = false;\n private focusHandler: ((event: FocusEvent) => void) | null = null;\n private blurHandler: ((event: FocusEvent) => void) | null = null;\n\n /**\n * Start detecting form field focus events\n */\n start(): void {\n if (this.isActive) {\n console.warn(\"FormDetector is already active\");\n return;\n }\n\n // Create event handlers\n this.focusHandler = (event: FocusEvent) => {\n const target = event.target as Element | null;\n\n if (isFormField(target)) {\n state.setFocusedElement(target);\n state.show();\n events.emit(\"form:focus\", { element: target });\n }\n };\n\n this.blurHandler = (event: FocusEvent) => {\n const target = event.target as Element | null;\n\n if (isFormField(target)) {\n // Check relatedTarget (where focus is going) immediately\n const relatedTarget = event.relatedTarget as Element | null;\n const widget = document.querySelector(\"speechos-widget\");\n\n // If focus is going to another form field or the widget, don't hide\n const goingToFormField = isFormField(relatedTarget);\n const goingToWidget =\n widget &&\n (widget.contains(relatedTarget) ||\n widget.shadowRoot?.contains(relatedTarget) ||\n relatedTarget === widget);\n\n if (goingToFormField || goingToWidget) {\n return;\n }\n\n // Delay hiding to allow for any edge cases\n setTimeout(() => {\n // Double-check: verify focus is still not on a form field or widget\n const activeElement = document.activeElement;\n const isWidgetFocused =\n widget &&\n (widget.contains(activeElement) ||\n widget.shadowRoot?.contains(activeElement));\n\n // Only hide if no form field is focused AND widget isn't focused\n if (!isFormField(activeElement) && !isWidgetFocused) {\n state.setFocusedElement(null);\n state.hide();\n events.emit(\"form:blur\", { element: null });\n }\n }, 150);\n }\n };\n\n // Attach listeners to document\n document.addEventListener(\"focusin\", this.focusHandler, true);\n document.addEventListener(\"focusout\", this.blurHandler, true);\n\n this.isActive = true;\n }\n\n /**\n * Stop detecting form field focus events\n */\n stop(): void {\n if (!this.isActive) {\n return;\n }\n\n // Remove event listeners\n if (this.focusHandler) {\n document.removeEventListener(\"focusin\", this.focusHandler, true);\n this.focusHandler = null;\n }\n\n if (this.blurHandler) {\n document.removeEventListener(\"focusout\", this.blurHandler, true);\n this.blurHandler = null;\n }\n\n // Reset state\n state.setFocusedElement(null);\n state.hide();\n\n this.isActive = false;\n }\n\n /**\n * Check if the detector is currently active\n */\n get active(): boolean {\n return this.isActive;\n }\n}\n\n// Export singleton instance\nexport const formDetector: FormDetector = new FormDetector();\n","/**\n * Main SpeechOS Client SDK class\n * Composes core logic with UI components\n */\n\nimport type { SpeechOSConfig, SpeechOSState, SpeechOSEventMap } from \"@speechos/core\";\nimport {\n setConfig,\n getConfig,\n updateUserId,\n state,\n events,\n livekit,\n SpeechOSEventEmitter,\n} from \"@speechos/core\";\nimport { formDetector } from \"./form-detector.js\";\nimport \"./ui/index.js\"; // Auto-registers components\n\n/**\n * Main SpeechOS class for initializing and managing the SDK with UI\n */\nexport class SpeechOS {\n private static instance: SpeechOS | null = null;\n private static widgetElement: HTMLElement | null = null;\n private static isInitialized = false;\n\n /**\n * Initialize the SpeechOS SDK\n * @param config - Configuration options\n * @returns Promise that resolves when initialization is complete\n * @throws Error if configuration is invalid (e.g., missing apiKey)\n */\n static async init(config: SpeechOSConfig = {}): Promise<void> {\n if (this.isInitialized) {\n console.warn(\"SpeechOS is already initialized\");\n return;\n }\n\n try {\n // Validate and set configuration\n setConfig(config);\n } catch (error) {\n // Configuration errors are fatal - log and re-throw\n const errorMessage =\n error instanceof Error ? error.message : \"Invalid configuration\";\n console.error(`[SpeechOS] Error: ${errorMessage} (init_config)`);\n\n // Emit error event before throwing\n events.emit(\"error\", {\n code: \"init_config\",\n message: errorMessage,\n source: \"init\",\n });\n\n throw error;\n }\n\n const finalConfig = getConfig();\n\n // Create singleton instance\n this.instance = new SpeechOS();\n\n // Fetch LiveKit token\n try {\n if (finalConfig.debug) {\n console.log(\"[SpeechOS] Fetching LiveKit token...\");\n }\n await livekit.fetchToken();\n if (finalConfig.debug) {\n console.log(\"[SpeechOS] LiveKit token fetched successfully\");\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to fetch token\";\n console.error(`[SpeechOS] Error: ${errorMessage} (init_token_fetch)`);\n\n // Emit error event for consumers\n events.emit(\"error\", {\n code: \"init_token_fetch\",\n message: errorMessage,\n source: \"init\",\n });\n\n // Continue initialization even if token fetch fails\n // The token will be fetched again when needed\n }\n\n // Start form detection\n formDetector.start();\n\n // Create and mount widget\n this.mountWidget();\n\n this.isInitialized = true;\n\n // Log initialization in debug mode\n if (finalConfig.debug) {\n console.log(\"[SpeechOS] Initialized with config:\", finalConfig);\n }\n }\n\n /**\n * Destroy the SpeechOS SDK and clean up resources\n */\n static async destroy(): Promise<void> {\n if (!this.isInitialized) {\n console.warn(\"SpeechOS is not initialized\");\n return;\n }\n\n // Stop form detection\n formDetector.stop();\n\n // Disconnect from LiveKit (also clears token)\n await livekit.disconnect();\n\n // Remove widget from DOM\n this.unmountWidget();\n\n // Clear all event listeners\n events.clear();\n\n // Reset state\n state.reset();\n\n // Clear instance\n this.instance = null;\n this.isInitialized = false;\n\n const config = getConfig();\n if (config.debug) {\n console.log(\"[SpeechOS] Destroyed and cleaned up\");\n }\n }\n\n /**\n * Check if SpeechOS is initialized\n */\n static get initialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Get the current state\n */\n static getState(): SpeechOSState {\n return state.getState();\n }\n\n /**\n * Get the event emitter for external listeners\n */\n static get events(): SpeechOSEventEmitter {\n return events;\n }\n\n /**\n * Mount the widget to the DOM\n */\n private static mountWidget(): void {\n if (this.widgetElement) {\n console.warn(\"Widget is already mounted\");\n return;\n }\n\n // Create widget element\n const widget = document.createElement(\"speechos-widget\");\n this.widgetElement = widget;\n\n // Append to body\n document.body.appendChild(widget);\n }\n\n /**\n * Unmount the widget from the DOM\n */\n private static unmountWidget(): void {\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n }\n\n /**\n * Show the widget programmatically\n */\n static show(): void {\n state.show();\n }\n\n /**\n * Hide the widget programmatically\n */\n static hide(): void {\n state.hide();\n }\n\n /**\n * Identify the current user\n * Can be called after init() to associate sessions with a user identifier.\n * Clears the cached token so the next voice session uses the new userId.\n *\n * @param userId - User identifier from your system (e.g., user ID, email)\n *\n * @example\n * // Initialize SDK early\n * SpeechOS.init({ apiKey: 'xxx' });\n *\n * // Later, after user logs in\n * SpeechOS.identify('user_123');\n */\n static identify(userId: string): void {\n if (!this.isInitialized) {\n console.warn(\n \"SpeechOS.identify() called before init(). Call init() first.\"\n );\n return;\n }\n\n const config = getConfig();\n\n // Update the userId in config\n updateUserId(userId);\n\n // Clear cached token so next session gets a fresh one with the new userId\n livekit.clearToken();\n\n if (config.debug) {\n console.log(`[SpeechOS] User identified: ${userId}`);\n }\n }\n\n /**\n * Private constructor to prevent direct instantiation\n */\n private constructor() {\n // Singleton pattern - use SpeechOS.init() instead\n }\n}\n\n// Export singleton class as default\nexport default SpeechOS;\n","/**\n * @speechos/client\n *\n * Vanilla JS client SDK for embedding SpeechOS into web applications.\n * Includes Web Components UI and DOM-based form detection.\n */\n\nimport { SpeechOS as SpeechOSClass } from \"./speechos.js\";\n\n// Re-export everything from core\nexport {\n events,\n state,\n getConfig,\n setConfig,\n resetConfig,\n livekit,\n transcriptStore,\n DEFAULT_HOST,\n} from \"@speechos/core\";\n\nexport type {\n SpeechOSConfig,\n SpeechOSState,\n SpeechOSAction,\n SpeechOSEventMap,\n StateChangeCallback,\n UnsubscribeFn,\n RecordingState,\n TranscriptEntry,\n TranscriptAction,\n} from \"@speechos/core\";\n\n// Client-specific exports\nexport { formDetector, FormDetector } from \"./form-detector.js\";\n\n// Version\nexport const VERSION = \"0.1.0\";\n\n// Main SDK class\nexport { SpeechOSClass as SpeechOS };\nexport default SpeechOSClass;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/form-detector.ts","../src/config.ts","../src/text-input-handler.ts","../src/stores/language-settings.ts","../src/stores/snippets-store.ts","../src/stores/vocabulary-store.ts","../src/stores/audio-settings.ts","../../../node_modules/tslib/tslib.es6.js","../../../node_modules/@lit/reactive-element/css-tag.js","../../../node_modules/@lit/reactive-element/reactive-element.js","../../../node_modules/lit-html/lit-html.js","../../../node_modules/lit-element/lit-element.js","../../../node_modules/@lit/reactive-element/decorators/custom-element.js","../../../node_modules/@lit/reactive-element/decorators/property.js","../../../node_modules/@lit/reactive-element/decorators/state.js","../src/ui/styles/theme.ts","../src/stores/transcript-store.ts","../../../node_modules/lit-html/directive.js","../../../node_modules/lit-html/directives/unsafe-html.js","../src/ui/icons.ts","../src/ui/audio-visualizer.ts","../src/ui/mic-button.ts","../src/ui/action-bubbles.ts","../src/ui/settings-button.ts","../src/ui/styles/modal-styles.ts","../src/ui/tabs/history-tab.ts","../src/ui/tabs/help-tab.ts","../src/ui/tabs/about-tab.ts","../src/ui/audio-level-meter.ts","../src/ui/tabs/settings-tab.ts","../src/ui/tabs/snippets-tab.ts","../src/ui/tabs/vocabulary-tab.ts","../src/ui/settings-modal.ts","../src/ui/widget.ts","../src/speechos.ts","../src/index.ts"],"sourcesContent":["/**\n * Form field focus detection for SpeechOS Client SDK\n * Detects when users focus on form fields and manages widget visibility\n */\n\nimport { events, state } from \"@speechos/core\";\n\n/**\n * Check if an element is a form field that we should track\n */\nfunction isFormField(element: Element | null): element is HTMLElement {\n if (!element || !(element instanceof HTMLElement)) {\n return false;\n }\n\n const tagName = element.tagName.toLowerCase();\n\n // Check for input, textarea\n if (tagName === \"input\" || tagName === \"textarea\") {\n // Exclude certain input types that don't accept text\n if (tagName === \"input\") {\n const type = (element as HTMLInputElement).type.toLowerCase();\n const excludedTypes = [\n \"checkbox\",\n \"radio\",\n \"submit\",\n \"button\",\n \"reset\",\n \"file\",\n \"hidden\",\n ];\n if (excludedTypes.includes(type)) {\n return false;\n }\n }\n return true;\n }\n\n // Check for contenteditable\n if (\n element.isContentEditable ||\n element.getAttribute(\"contenteditable\") === \"true\"\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Interface for form detector implementations\n * Allows swapping out the default form detection behavior\n */\nexport interface FormDetectorInterface {\n /** Start detecting form field focus events */\n start(): void;\n /** Stop detecting form field focus events */\n stop(): void;\n /** Whether the detector is currently active */\n readonly active: boolean;\n}\n\n/**\n * Form detector class that manages focus tracking\n */\nexport class FormDetector implements FormDetectorInterface {\n private isActive = false;\n private focusHandler: ((event: FocusEvent) => void) | null = null;\n private blurHandler: ((event: FocusEvent) => void) | null = null;\n private touchHandler: ((event: TouchEvent) => void) | null = null;\n private mouseDownHandler: ((event: MouseEvent) => void) | null = null;\n private isWidgetBeingInteracted = false;\n\n /**\n * Start detecting form field focus events\n */\n start(): void {\n if (this.isActive) {\n console.warn(\"FormDetector is already active\");\n return;\n }\n\n // Create event handlers\n this.focusHandler = (event: FocusEvent) => {\n const target = event.target as Element | null;\n\n if (isFormField(target)) {\n state.setFocusedElement(target);\n state.show();\n events.emit(\"form:focus\", { element: target });\n }\n };\n\n this.blurHandler = (event: FocusEvent) => {\n const target = event.target as Element | null;\n\n if (isFormField(target)) {\n // If widget is being interacted with (touch or mouse), don't process blur\n if (this.isWidgetBeingInteracted) {\n console.log(\"[SpeechOS] blurHandler: widget being interacted, skipping\");\n return;\n }\n\n // Check relatedTarget (where focus is going) immediately\n const relatedTarget = event.relatedTarget as Element | null;\n const widget = document.querySelector(\"speechos-widget\");\n\n // If focus is going to another form field or the widget, don't hide\n const goingToFormField = isFormField(relatedTarget);\n const goingToWidget =\n widget &&\n (widget.contains(relatedTarget) ||\n widget.shadowRoot?.contains(relatedTarget) ||\n relatedTarget === widget);\n // If focus is going to an element with data-speechos-no-close, don't hide\n const goingToNoCloseElement = Boolean(\n relatedTarget?.closest(\"[data-speechos-no-close]\")\n );\n\n console.log(\"[SpeechOS] blurHandler:\", {\n relatedTarget,\n goingToFormField,\n goingToWidget,\n goingToNoCloseElement,\n });\n\n if (goingToFormField || goingToWidget || goingToNoCloseElement) {\n console.log(\"[SpeechOS] blurHandler: early return, not hiding\");\n return;\n }\n\n // Delay hiding to allow for any edge cases\n setTimeout(() => {\n // If widget is being interacted with, don't hide\n if (this.isWidgetBeingInteracted) {\n return;\n }\n\n // Double-check: verify focus is still not on a form field or widget\n const activeElement = document.activeElement;\n const isWidgetFocused =\n widget &&\n (widget.contains(activeElement) ||\n widget.shadowRoot?.contains(activeElement));\n // Check if focus is on an element with data-speechos-no-close\n const isNoCloseElementFocused = Boolean(\n activeElement?.closest(\"[data-speechos-no-close]\")\n );\n\n // Only hide if no form field is focused AND widget isn't focused AND not a no-close element\n if (\n !isFormField(activeElement) &&\n !isWidgetFocused &&\n !isNoCloseElementFocused\n ) {\n state.setFocusedElement(null);\n state.hide();\n events.emit(\"form:blur\", { element: null });\n }\n }, 150);\n }\n };\n\n // Helper to check if event is on the widget\n const isWidgetInteraction = (\n target: Node | null,\n composedPath: EventTarget[]\n ): boolean => {\n const widget = document.querySelector(\"speechos-widget\");\n if (!widget) return false;\n\n return (\n composedPath.includes(widget) ||\n widget.contains(target) ||\n widget.shadowRoot?.contains(target) ||\n false\n );\n };\n\n // Track touch interactions with the widget (mobile support)\n this.touchHandler = (event: TouchEvent) => {\n const target = event.target as Node | null;\n const composedPath = event.composedPath ? event.composedPath() : [];\n\n if (isWidgetInteraction(target, composedPath)) {\n this.isWidgetBeingInteracted = true;\n // Reset flag after a delay to allow click/tap to process\n setTimeout(() => {\n this.isWidgetBeingInteracted = false;\n }, 300);\n }\n };\n\n // Track mouse interactions with the widget (desktop support)\n this.mouseDownHandler = (event: MouseEvent) => {\n const target = event.target as Node | null;\n const composedPath = event.composedPath ? event.composedPath() : [];\n\n if (isWidgetInteraction(target, composedPath)) {\n this.isWidgetBeingInteracted = true;\n // Reset flag after a delay to allow click to process\n setTimeout(() => {\n this.isWidgetBeingInteracted = false;\n }, 300);\n }\n };\n\n // Attach listeners to document\n document.addEventListener(\"focusin\", this.focusHandler, true);\n document.addEventListener(\"focusout\", this.blurHandler, true);\n document.addEventListener(\"touchstart\", this.touchHandler, true);\n document.addEventListener(\"mousedown\", this.mouseDownHandler, true);\n\n this.isActive = true;\n }\n\n /**\n * Stop detecting form field focus events\n */\n stop(): void {\n if (!this.isActive) {\n return;\n }\n\n // Remove event listeners\n if (this.focusHandler) {\n document.removeEventListener(\"focusin\", this.focusHandler, true);\n this.focusHandler = null;\n }\n\n if (this.blurHandler) {\n document.removeEventListener(\"focusout\", this.blurHandler, true);\n this.blurHandler = null;\n }\n\n if (this.touchHandler) {\n document.removeEventListener(\"touchstart\", this.touchHandler, true);\n this.touchHandler = null;\n }\n\n if (this.mouseDownHandler) {\n document.removeEventListener(\"mousedown\", this.mouseDownHandler, true);\n this.mouseDownHandler = null;\n }\n\n // Reset state\n this.isWidgetBeingInteracted = false;\n state.setFocusedElement(null);\n state.hide();\n\n this.isActive = false;\n }\n\n /**\n * Check if the detector is currently active\n */\n get active(): boolean {\n return this.isActive;\n }\n}\n\n// Export singleton instance\nexport const formDetector: FormDetector = new FormDetector();\n","/**\n * Client configuration for SpeechOS\n * Extends core config with UI/widget-specific options\n */\n\nimport type { SpeechOSCoreConfig, CommandDefinition } from \"@speechos/core\";\nimport type { FormDetectorInterface } from \"./form-detector.js\";\nimport type { TextInputHandlerInterface } from \"./text-input-handler.js\";\n\n/**\n * Configuration options for SpeechOS Client\n * Extends core config with widget-specific options\n */\nexport interface SpeechOSClientConfig extends SpeechOSCoreConfig {\n /** Command definitions for voice command matching. If provided, shows Command button in widget. */\n commands?: CommandDefinition[];\n /** Custom z-index for widget overlay (default: 999999) */\n zIndex?: number;\n /**\n * Form detection behavior:\n * - true (default): Enable automatic form field detection\n * - false: Disable automatic detection (manual control only)\n * - FormDetectorInterface: Custom implementation\n */\n formDetection?: boolean | FormDetectorInterface;\n /**\n * Custom text input handler for cursor/selection detection and text operations.\n * Default: handles input, textarea, and contenteditable elements.\n */\n textInputHandler?: TextInputHandlerInterface;\n}\n\n/**\n * Resolved client config with defaults applied\n */\nexport interface ResolvedClientConfig {\n commands: CommandDefinition[];\n zIndex: number;\n}\n\n/**\n * Default client configuration values\n */\nconst defaultClientConfig: ResolvedClientConfig = {\n commands: [],\n zIndex: 999999,\n};\n\n/**\n * Current client configuration singleton\n */\nlet currentClientConfig: ResolvedClientConfig = { ...defaultClientConfig };\n\n/**\n * Validate and resolve client-specific config\n * @param config - User-provided configuration\n * @returns Resolved client configuration\n */\nexport function validateClientConfig(config: SpeechOSClientConfig): ResolvedClientConfig {\n const resolved: ResolvedClientConfig = {\n commands: config.commands ?? defaultClientConfig.commands,\n zIndex: config.zIndex ?? defaultClientConfig.zIndex,\n };\n\n // Validate zIndex\n if (typeof resolved.zIndex !== \"number\" || resolved.zIndex < 0) {\n console.warn(\n `Invalid zIndex \"${resolved.zIndex}\". Using default ${defaultClientConfig.zIndex}.`\n );\n resolved.zIndex = defaultClientConfig.zIndex;\n }\n\n return resolved;\n}\n\n/**\n * Set the client configuration\n * @param config - Client configuration to set\n */\nexport function setClientConfig(config: SpeechOSClientConfig): void {\n currentClientConfig = validateClientConfig(config);\n}\n\n/**\n * Get the current client configuration\n */\nexport function getClientConfig(): ResolvedClientConfig {\n return { ...currentClientConfig };\n}\n\n/**\n * Reset client configuration to defaults\n */\nexport function resetClientConfig(): void {\n currentClientConfig = { ...defaultClientConfig };\n}\n\n/**\n * Check if commands are configured (for showing Command button in widget)\n */\nexport function hasCommands(): boolean {\n return currentClientConfig.commands.length > 0;\n}\n\n/**\n * Get configured commands\n */\nexport function getCommands(): CommandDefinition[] {\n return [...currentClientConfig.commands];\n}\n\n/**\n * Get widget z-index\n */\nexport function getZIndex(): number {\n return currentClientConfig.zIndex;\n}\n","/**\n * Text input handler for SpeechOS Client SDK\n * Abstracts cursor/selection detection and text insertion/replacement operations\n */\n\nimport { state, events } from \"@speechos/core\";\n\n/**\n * Selection/cursor position info from an element\n */\nexport interface SelectionInfo {\n /** Start position of cursor/selection */\n start: number | null;\n /** End position of cursor/selection */\n end: number | null;\n /** Selected text (empty string if just cursor) */\n text: string;\n}\n\n/**\n * Interface for handling text input operations (cursor detection, text insertion)\n * Allows customization of how the widget interacts with form elements\n */\nexport interface TextInputHandlerInterface {\n /**\n * Get the current cursor/selection position from an element\n */\n getSelection(element: HTMLElement): SelectionInfo;\n\n /**\n * Get content from an element (selected portion if selection exists, otherwise full content)\n */\n getContent(element: HTMLElement, selection?: SelectionInfo): string;\n\n /**\n * Insert text at the cursor position (for dictation)\n */\n insertText(element: HTMLElement, text: string, cursorPosition?: SelectionInfo): void;\n\n /**\n * Replace content/selection with new text (for edit)\n */\n replaceContent(element: HTMLElement, text: string, selection?: SelectionInfo): void;\n}\n\n/**\n * Check if an input element supports selection APIs\n */\nfunction supportsSelection(element: HTMLInputElement | HTMLTextAreaElement): boolean {\n if (element.tagName.toLowerCase() === \"textarea\") {\n return true;\n }\n const supportedTypes = [\"text\", \"search\", \"url\", \"tel\", \"password\"];\n return supportedTypes.includes((element as HTMLInputElement).type || \"text\");\n}\n\n/**\n * Default implementation of TextInputHandler\n * Handles input, textarea, and contenteditable elements\n */\nexport class DefaultTextInputHandler implements TextInputHandlerInterface {\n /**\n * Get the current cursor/selection position from an element\n */\n getSelection(element: HTMLElement): SelectionInfo {\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === \"input\" || tagName === \"textarea\") {\n const inputEl = element as HTMLInputElement | HTMLTextAreaElement;\n if (supportsSelection(inputEl)) {\n const start = inputEl.selectionStart;\n const end = inputEl.selectionEnd;\n const text = start !== null && end !== null && start !== end\n ? inputEl.value.substring(start, end)\n : \"\";\n return { start, end, text };\n } else {\n // For input types that don't support selection, use end of value\n const length = inputEl.value.length;\n return { start: length, end: length, text: \"\" };\n }\n }\n\n if (element.isContentEditable) {\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const selectedText = selection.toString();\n return {\n start: 0,\n end: selectedText.length,\n text: selectedText,\n };\n }\n return { start: null, end: null, text: \"\" };\n }\n\n return { start: null, end: null, text: \"\" };\n }\n\n /**\n * Get content from an element (selected portion if selection exists, otherwise full content)\n */\n getContent(element: HTMLElement, selection?: SelectionInfo): string {\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === \"input\" || tagName === \"textarea\") {\n const inputEl = element as HTMLInputElement | HTMLTextAreaElement;\n const fullContent = inputEl.value;\n\n if (selection) {\n const start = selection.start ?? 0;\n const end = selection.end ?? fullContent.length;\n const hasSelection = start !== end;\n if (hasSelection) {\n return fullContent.substring(start, end);\n }\n }\n return fullContent;\n }\n\n if (element.isContentEditable) {\n const windowSelection = window.getSelection();\n if (windowSelection && windowSelection.toString().length > 0) {\n return windowSelection.toString();\n }\n return element.textContent || \"\";\n }\n\n return \"\";\n }\n\n /**\n * Insert text at the cursor position (for dictation)\n */\n insertText(element: HTMLElement, text: string, cursorPosition?: SelectionInfo): void {\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === \"input\" || tagName === \"textarea\") {\n const inputEl = element as HTMLInputElement | HTMLTextAreaElement;\n const start = cursorPosition?.start ?? inputEl.value.length;\n const end = cursorPosition?.end ?? inputEl.value.length;\n\n const before = inputEl.value.substring(0, start);\n const after = inputEl.value.substring(end);\n inputEl.value = before + text + after;\n\n if (supportsSelection(inputEl)) {\n const newCursorPos = start + text.length;\n inputEl.setSelectionRange(newCursorPos, newCursorPos);\n }\n\n inputEl.dispatchEvent(new Event(\"input\", { bubbles: true }));\n inputEl.focus();\n state.setFocusedElement(inputEl);\n } else if (element.isContentEditable) {\n element.focus();\n state.setFocusedElement(element);\n\n const textNode = document.createTextNode(text);\n element.appendChild(textNode);\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(textNode);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n\n events.emit(\"transcription:inserted\", { text, element });\n }\n\n /**\n * Replace content/selection with new text (for edit)\n */\n replaceContent(element: HTMLElement, text: string, selection?: SelectionInfo): void {\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === \"input\" || tagName === \"textarea\") {\n const inputEl = element as HTMLInputElement | HTMLTextAreaElement;\n inputEl.focus();\n\n if (supportsSelection(inputEl)) {\n const selectionStart = selection?.start ?? 0;\n const selectionEnd = selection?.end ?? inputEl.value.length;\n const hasSelection = selectionStart !== selectionEnd;\n\n if (hasSelection) {\n inputEl.setSelectionRange(selectionStart, selectionEnd);\n } else {\n inputEl.setSelectionRange(0, inputEl.value.length);\n }\n document.execCommand(\"insertText\", false, text);\n } else {\n inputEl.value = text;\n inputEl.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n\n state.setFocusedElement(inputEl);\n } else if (element.isContentEditable) {\n element.focus();\n state.setFocusedElement(element);\n\n const hasSelection =\n selection?.start !== null &&\n selection?.end !== null &&\n selection?.start !== selection?.end;\n\n if (!hasSelection) {\n const windowSelection = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(element);\n windowSelection?.removeAllRanges();\n windowSelection?.addRange(range);\n }\n\n document.execCommand(\"insertText\", false, text);\n }\n }\n}\n\n// Export singleton instance\nexport const defaultTextInputHandler: TextInputHandlerInterface = new DefaultTextInputHandler();\n\n// Current active handler (can be swapped via config)\nlet currentTextInputHandler: TextInputHandlerInterface = defaultTextInputHandler;\n\n/**\n * Set the text input handler\n */\nexport function setTextInputHandler(handler: TextInputHandlerInterface): void {\n currentTextInputHandler = handler;\n}\n\n/**\n * Get the current text input handler\n */\nexport function getTextInputHandler(): TextInputHandlerInterface {\n return currentTextInputHandler;\n}\n\n/**\n * Reset to default text input handler\n */\nexport function resetTextInputHandler(): void {\n currentTextInputHandler = defaultTextInputHandler;\n}\n","/**\n * Language settings store\n * Persists input language preferences to localStorage\n */\n\nimport { events } from \"@speechos/core\";\n\nconst STORAGE_KEY = \"speechos_language_settings\";\n\nexport interface LanguageOption {\n /** Display name of the language */\n name: string;\n /** Primary language code */\n code: string;\n /** All available locale variants */\n variants: string[];\n}\n\n/**\n * Supported input languages for speech recognition\n * Each language has a name, primary code, and available variants\n * Sorted alphabetically by name for dropdown display\n */\nexport const SUPPORTED_LANGUAGES: LanguageOption[] = [\n { name: \"Bulgarian\", code: \"bg\", variants: [\"bg\"] },\n { name: \"Catalan\", code: \"ca\", variants: [\"ca\"] },\n { name: \"Chinese\", code: \"zh\", variants: [\"zh\"] },\n { name: \"Czech\", code: \"cs\", variants: [\"cs\"] },\n { name: \"Danish\", code: \"da\", variants: [\"da\", \"da-DK\"] },\n { name: \"Dutch\", code: \"nl\", variants: [\"nl\"] },\n { name: \"English (Australia)\", code: \"en-AU\", variants: [\"en-AU\"] },\n { name: \"English (India)\", code: \"en-IN\", variants: [\"en-IN\"] },\n { name: \"English (New Zealand)\", code: \"en-NZ\", variants: [\"en-NZ\"] },\n { name: \"English (UK)\", code: \"en-GB\", variants: [\"en-GB\"] },\n { name: \"English (US)\", code: \"en-US\", variants: [\"en\", \"en-US\"] },\n { name: \"Estonian\", code: \"et\", variants: [\"et\"] },\n { name: \"Finnish\", code: \"fi\", variants: [\"fi\"] },\n { name: \"Flemish\", code: \"nl-BE\", variants: [\"nl-BE\"] },\n { name: \"French\", code: \"fr\", variants: [\"fr\", \"fr-CA\"] },\n { name: \"German\", code: \"de\", variants: [\"de\"] },\n { name: \"German (Switzerland)\", code: \"de-CH\", variants: [\"de-CH\"] },\n { name: \"Greek\", code: \"el\", variants: [\"el\"] },\n { name: \"Hindi\", code: \"hi\", variants: [\"hi\"] },\n { name: \"Hungarian\", code: \"hu\", variants: [\"hu\"] },\n { name: \"Indonesian\", code: \"id\", variants: [\"id\"] },\n { name: \"Italian\", code: \"it\", variants: [\"it\"] },\n { name: \"Japanese\", code: \"ja\", variants: [\"ja\"] },\n { name: \"Korean\", code: \"ko\", variants: [\"ko\", \"ko-KR\"] },\n { name: \"Latvian\", code: \"lv\", variants: [\"lv\"] },\n { name: \"Lithuanian\", code: \"lt\", variants: [\"lt\"] },\n { name: \"Malay\", code: \"ms\", variants: [\"ms\"] },\n { name: \"Norwegian\", code: \"no\", variants: [\"no\"] },\n { name: \"Polish\", code: \"pl\", variants: [\"pl\"] },\n { name: \"Portuguese\", code: \"pt\", variants: [\"pt\", \"pt-BR\", \"pt-PT\"] },\n { name: \"Romanian\", code: \"ro\", variants: [\"ro\"] },\n { name: \"Russian\", code: \"ru\", variants: [\"ru\"] },\n { name: \"Slovak\", code: \"sk\", variants: [\"sk\"] },\n { name: \"Spanish\", code: \"es\", variants: [\"es\", \"es-419\"] },\n { name: \"Swedish\", code: \"sv\", variants: [\"sv\", \"sv-SE\"] },\n { name: \"Turkish\", code: \"tr\", variants: [\"tr\"] },\n { name: \"Ukrainian\", code: \"uk\", variants: [\"uk\"] },\n { name: \"Vietnamese\", code: \"vi\", variants: [\"vi\"] },\n];\n\nexport interface LanguageSettings {\n /** Selected input language code for speech recognition (e.g., \"en-US\", \"es\", \"fr\") */\n inputLanguageCode: string;\n /** Selected output language code for transcription formatting (e.g., \"en-US\", \"es\", \"fr\") */\n outputLanguageCode: string;\n /** Whether to apply AI formatting to transcripts (removes filler words, adds punctuation) */\n smartFormat: boolean;\n}\n\nconst defaultSettings: LanguageSettings = {\n inputLanguageCode: \"en-US\",\n outputLanguageCode: \"en-US\",\n smartFormat: true,\n};\n\n/**\n * Get current language settings from localStorage\n */\nexport function getLanguageSettings(): LanguageSettings {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return { ...defaultSettings };\n return { ...defaultSettings, ...JSON.parse(stored) };\n } catch {\n return { ...defaultSettings };\n }\n}\n\n/**\n * Save language settings to localStorage\n */\nfunction saveLanguageSettings(settings: LanguageSettings): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n } catch {\n // localStorage full or unavailable - silently fail\n }\n}\n\n/**\n * Get the selected input language code for speech recognition\n * Returns \"en-US\" (American English) by default\n */\nexport function getInputLanguageCode(): string {\n return getLanguageSettings().inputLanguageCode;\n}\n\n/**\n * Set the selected input language code for speech recognition\n */\nexport function setInputLanguageCode(languageCode: string): void {\n const settings = getLanguageSettings();\n if (settings.inputLanguageCode !== languageCode) {\n settings.inputLanguageCode = languageCode;\n saveLanguageSettings(settings);\n events.emit(\"settings:changed\", { setting: \"language\" });\n }\n}\n\n/**\n * Get the selected output language code for transcription formatting\n * Returns \"en-US\" (American English) by default\n */\nexport function getOutputLanguageCode(): string {\n return getLanguageSettings().outputLanguageCode;\n}\n\n/**\n * Set the selected output language code for transcription formatting\n */\nexport function setOutputLanguageCode(languageCode: string): void {\n const settings = getLanguageSettings();\n if (settings.outputLanguageCode !== languageCode) {\n settings.outputLanguageCode = languageCode;\n saveLanguageSettings(settings);\n events.emit(\"settings:changed\", { setting: \"language\" });\n }\n}\n\n/**\n * Get the language option for a given code\n */\nexport function getLanguageByCode(code: string): LanguageOption | undefined {\n return SUPPORTED_LANGUAGES.find(\n (lang) => lang.code === code || lang.variants.includes(code)\n );\n}\n\n/**\n * Get the display name for the input language\n */\nexport function getInputLanguageName(): string {\n const code = getInputLanguageCode();\n const lang = getLanguageByCode(code);\n return lang?.name || \"English\";\n}\n\n/**\n * Get the display name for the output language\n */\nexport function getOutputLanguageName(): string {\n const code = getOutputLanguageCode();\n const lang = getLanguageByCode(code);\n return lang?.name || \"English\";\n}\n\n/**\n * Get whether smart formatting is enabled\n * Returns true by default (AI formatting removes filler words, adds punctuation)\n */\nexport function getSmartFormatEnabled(): boolean {\n return getLanguageSettings().smartFormat;\n}\n\n/**\n * Set whether smart formatting is enabled\n */\nexport function setSmartFormatEnabled(enabled: boolean): void {\n const settings = getLanguageSettings();\n if (settings.smartFormat !== enabled) {\n settings.smartFormat = enabled;\n saveLanguageSettings(settings);\n events.emit(\"settings:changed\", { setting: \"smartFormat\" });\n }\n}\n\n/**\n * Legacy alias for getInputLanguageCode\n * @deprecated Use getInputLanguageCode instead\n */\nexport function getLanguageCode(): string {\n return getInputLanguageCode();\n}\n\n/**\n * Legacy alias for setInputLanguageCode\n * @deprecated Use setInputLanguageCode instead\n */\nexport function setLanguageCode(languageCode: string): void {\n setInputLanguageCode(languageCode);\n}\n\n/**\n * Legacy alias for getInputLanguageName\n * @deprecated Use getInputLanguageName instead\n */\nexport function getLanguageName(): string {\n return getInputLanguageName();\n}\n\n/**\n * Reset language settings to defaults\n */\nexport function resetLanguageSettings(): void {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Silently fail\n }\n}\n\nexport const languageSettings: {\n getLanguageSettings: typeof getLanguageSettings;\n getInputLanguageCode: typeof getInputLanguageCode;\n setInputLanguageCode: typeof setInputLanguageCode;\n getOutputLanguageCode: typeof getOutputLanguageCode;\n setOutputLanguageCode: typeof setOutputLanguageCode;\n getLanguageByCode: typeof getLanguageByCode;\n getInputLanguageName: typeof getInputLanguageName;\n getOutputLanguageName: typeof getOutputLanguageName;\n getSmartFormatEnabled: typeof getSmartFormatEnabled;\n setSmartFormatEnabled: typeof setSmartFormatEnabled;\n resetLanguageSettings: typeof resetLanguageSettings;\n SUPPORTED_LANGUAGES: typeof SUPPORTED_LANGUAGES;\n // Legacy aliases\n getLanguageCode: typeof getLanguageCode;\n setLanguageCode: typeof setLanguageCode;\n getLanguageName: typeof getLanguageName;\n} = {\n getLanguageSettings,\n getInputLanguageCode,\n setInputLanguageCode,\n getOutputLanguageCode,\n setOutputLanguageCode,\n getLanguageByCode,\n getInputLanguageName,\n getOutputLanguageName,\n getSmartFormatEnabled,\n setSmartFormatEnabled,\n resetLanguageSettings,\n SUPPORTED_LANGUAGES,\n // Legacy aliases\n getLanguageCode,\n setLanguageCode,\n getLanguageName,\n};\n","/**\n * Snippets store\n * Persists text snippets to localStorage for voice-triggered text expansion\n */\n\nimport { events } from \"@speechos/core\";\n\nconst STORAGE_KEY = \"speechos_snippets\";\nconst MAX_SNIPPETS = 25;\nconst MAX_TRIGGER_LENGTH = 30;\nconst MAX_EXPANSION_LENGTH = 300;\n\nexport interface Snippet {\n id: string;\n /** Trigger phrase spoken to activate the snippet (max 30 chars) */\n trigger: string;\n /** Text that replaces the trigger phrase (max 300 chars) */\n expansion: string;\n /** Timestamp when snippet was created */\n createdAt: number;\n}\n\nexport interface SnippetValidationError {\n field: \"trigger\" | \"expansion\" | \"limit\";\n message: string;\n}\n\nexport type AddSnippetResult =\n | { success: true; snippet: Snippet }\n | { success: false; error: SnippetValidationError };\n\n/**\n * Generate a unique ID for snippet entries\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Get all snippets from localStorage\n */\nexport function getSnippets(): Snippet[] {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return [];\n const entries = JSON.parse(stored) as Snippet[];\n // Return newest first\n return entries.sort((a, b) => b.createdAt - a.createdAt);\n } catch {\n return [];\n }\n}\n\n/**\n * Save snippets to localStorage\n */\nfunction saveSnippets(snippets: Snippet[]): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(snippets));\n } catch {\n // localStorage full or unavailable - silently fail\n }\n}\n\n/**\n * Validate a trigger phrase\n */\nfunction validateTrigger(\n trigger: string,\n existingSnippets: Snippet[],\n excludeId?: string\n): SnippetValidationError | null {\n const trimmed = trigger.trim();\n\n if (!trimmed) {\n return { field: \"trigger\", message: \"Trigger phrase is required.\" };\n }\n\n if (trimmed.length > MAX_TRIGGER_LENGTH) {\n return {\n field: \"trigger\",\n message: `Trigger must be ${MAX_TRIGGER_LENGTH} characters or less.`,\n };\n }\n\n const duplicate = existingSnippets.find(\n (s) =>\n s.trigger.toLowerCase() === trimmed.toLowerCase() && s.id !== excludeId\n );\n if (duplicate) {\n return { field: \"trigger\", message: \"This trigger phrase already exists.\" };\n }\n\n return null;\n}\n\n/**\n * Validate expansion text\n */\nfunction validateExpansion(expansion: string): SnippetValidationError | null {\n const trimmed = expansion.trim();\n\n if (!trimmed) {\n return { field: \"expansion\", message: \"Expansion text is required.\" };\n }\n\n if (trimmed.length > MAX_EXPANSION_LENGTH) {\n return {\n field: \"expansion\",\n message: `Expansion must be ${MAX_EXPANSION_LENGTH} characters or less.`,\n };\n }\n\n return null;\n}\n\n/**\n * Add a new snippet\n */\nexport function addSnippet(\n trigger: string,\n expansion: string\n): AddSnippetResult {\n const snippets = getSnippets();\n\n // Check limit\n if (snippets.length >= MAX_SNIPPETS) {\n return {\n success: false,\n error: {\n field: \"limit\",\n message: `You've reached the ${MAX_SNIPPETS} snippet limit. Delete unused snippets to add more.`,\n },\n };\n }\n\n // Validate trigger\n const triggerError = validateTrigger(trigger, snippets);\n if (triggerError) {\n return { success: false, error: triggerError };\n }\n\n // Validate expansion\n const expansionError = validateExpansion(expansion);\n if (expansionError) {\n return { success: false, error: expansionError };\n }\n\n const snippet: Snippet = {\n id: generateId(),\n trigger: trigger.trim(),\n expansion: expansion.trim(),\n createdAt: Date.now(),\n };\n\n snippets.unshift(snippet);\n saveSnippets(snippets);\n events.emit(\"settings:changed\", { setting: \"snippets\" });\n\n return { success: true, snippet };\n}\n\n/**\n * Update an existing snippet\n */\nexport function updateSnippet(\n id: string,\n trigger: string,\n expansion: string\n): AddSnippetResult {\n const snippets = getSnippets();\n const index = snippets.findIndex((s) => s.id === id);\n\n if (index === -1) {\n return {\n success: false,\n error: { field: \"trigger\", message: \"Snippet not found.\" },\n };\n }\n\n // Validate trigger (exclude current snippet from duplicate check)\n const triggerError = validateTrigger(trigger, snippets, id);\n if (triggerError) {\n return { success: false, error: triggerError };\n }\n\n // Validate expansion\n const expansionError = validateExpansion(expansion);\n if (expansionError) {\n return { success: false, error: expansionError };\n }\n\n snippets[index] = {\n ...snippets[index],\n trigger: trigger.trim(),\n expansion: expansion.trim(),\n };\n\n saveSnippets(snippets);\n events.emit(\"settings:changed\", { setting: \"snippets\" });\n\n return { success: true, snippet: snippets[index] };\n}\n\n/**\n * Delete a snippet by ID\n */\nexport function deleteSnippet(id: string): void {\n const snippets = getSnippets().filter((s) => s.id !== id);\n saveSnippets(snippets);\n events.emit(\"settings:changed\", { setting: \"snippets\" });\n}\n\n/**\n * Clear all snippets\n */\nexport function clearSnippets(): void {\n try {\n localStorage.removeItem(STORAGE_KEY);\n events.emit(\"settings:changed\", { setting: \"snippets\" });\n } catch {\n // Silently fail\n }\n}\n\n/**\n * Get snippet count info\n */\nexport function getSnippetCount(): { current: number; max: number } {\n return { current: getSnippets().length, max: MAX_SNIPPETS };\n}\n\n/**\n * Check if at snippet limit\n */\nexport function isAtSnippetLimit(): boolean {\n return getSnippets().length >= MAX_SNIPPETS;\n}\n\nexport const snippetsStore: {\n getSnippets: typeof getSnippets;\n addSnippet: typeof addSnippet;\n updateSnippet: typeof updateSnippet;\n deleteSnippet: typeof deleteSnippet;\n clearSnippets: typeof clearSnippets;\n getSnippetCount: typeof getSnippetCount;\n isAtSnippetLimit: typeof isAtSnippetLimit;\n MAX_SNIPPETS: typeof MAX_SNIPPETS;\n MAX_TRIGGER_LENGTH: typeof MAX_TRIGGER_LENGTH;\n MAX_EXPANSION_LENGTH: typeof MAX_EXPANSION_LENGTH;\n} = {\n getSnippets,\n addSnippet,\n updateSnippet,\n deleteSnippet,\n clearSnippets,\n getSnippetCount,\n isAtSnippetLimit,\n MAX_SNIPPETS,\n MAX_TRIGGER_LENGTH,\n MAX_EXPANSION_LENGTH,\n};\n","/**\n * Vocabulary store\n * Persists custom vocabulary terms to localStorage for improved transcription accuracy\n */\n\nimport { events } from \"@speechos/core\";\n\nconst STORAGE_KEY = \"speechos_vocabulary\";\nconst MAX_TERMS = 50;\nconst MAX_TERM_LENGTH = 50;\n\nexport interface VocabularyTerm {\n id: string;\n /** The term or phrase to recognize (max 50 chars) */\n term: string;\n /** Timestamp when term was added */\n createdAt: number;\n}\n\nexport interface VocabularyValidationError {\n field: \"term\" | \"limit\";\n message: string;\n}\n\nexport type AddTermResult =\n | { success: true; term: VocabularyTerm }\n | { success: false; error: VocabularyValidationError };\n\n/**\n * Generate a unique ID for vocabulary entries\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Get all vocabulary terms from localStorage\n */\nexport function getVocabulary(): VocabularyTerm[] {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return [];\n const entries = JSON.parse(stored) as VocabularyTerm[];\n // Return newest first\n return entries.sort((a, b) => b.createdAt - a.createdAt);\n } catch {\n return [];\n }\n}\n\n/**\n * Save vocabulary to localStorage\n */\nfunction saveVocabulary(terms: VocabularyTerm[]): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(terms));\n } catch {\n // localStorage full or unavailable - silently fail\n }\n}\n\n/**\n * Validate a term\n */\nfunction validateTerm(\n term: string,\n existingTerms: VocabularyTerm[]\n): VocabularyValidationError | null {\n const trimmed = term.trim();\n\n if (!trimmed) {\n return { field: \"term\", message: \"Term is required.\" };\n }\n\n if (trimmed.length > MAX_TERM_LENGTH) {\n return {\n field: \"term\",\n message: `Term must be ${MAX_TERM_LENGTH} characters or less.`,\n };\n }\n\n const duplicate = existingTerms.find(\n (t) => t.term.toLowerCase() === trimmed.toLowerCase()\n );\n if (duplicate) {\n return {\n field: \"term\",\n message: \"This term is already in your vocabulary.\",\n };\n }\n\n return null;\n}\n\n/**\n * Add a new vocabulary term\n */\nexport function addTerm(term: string): AddTermResult {\n const terms = getVocabulary();\n\n // Check limit\n if (terms.length >= MAX_TERMS) {\n return {\n success: false,\n error: {\n field: \"limit\",\n message: `You've reached the ${MAX_TERMS} term limit. Remove unused terms to add more.`,\n },\n };\n }\n\n // Validate term\n const termError = validateTerm(term, terms);\n if (termError) {\n return { success: false, error: termError };\n }\n\n const vocabularyTerm: VocabularyTerm = {\n id: generateId(),\n term: term.trim(),\n createdAt: Date.now(),\n };\n\n terms.unshift(vocabularyTerm);\n saveVocabulary(terms);\n events.emit(\"settings:changed\", { setting: \"vocabulary\" });\n\n return { success: true, term: vocabularyTerm };\n}\n\n/**\n * Delete a term by ID\n */\nexport function deleteTerm(id: string): void {\n const terms = getVocabulary().filter((t) => t.id !== id);\n saveVocabulary(terms);\n events.emit(\"settings:changed\", { setting: \"vocabulary\" });\n}\n\n/**\n * Clear all vocabulary\n */\nexport function clearVocabulary(): void {\n try {\n localStorage.removeItem(STORAGE_KEY);\n events.emit(\"settings:changed\", { setting: \"vocabulary\" });\n } catch {\n // Silently fail\n }\n}\n\n/**\n * Get vocabulary count info\n */\nexport function getVocabularyCount(): { current: number; max: number } {\n return { current: getVocabulary().length, max: MAX_TERMS };\n}\n\n/**\n * Check if at term limit\n */\nexport function isAtVocabularyLimit(): boolean {\n return getVocabulary().length >= MAX_TERMS;\n}\n\nexport const vocabularyStore: {\n getVocabulary: typeof getVocabulary;\n addTerm: typeof addTerm;\n deleteTerm: typeof deleteTerm;\n clearVocabulary: typeof clearVocabulary;\n getVocabularyCount: typeof getVocabularyCount;\n isAtVocabularyLimit: typeof isAtVocabularyLimit;\n MAX_TERMS: typeof MAX_TERMS;\n MAX_TERM_LENGTH: typeof MAX_TERM_LENGTH;\n} = {\n getVocabulary,\n addTerm,\n deleteTerm,\n clearVocabulary,\n getVocabularyCount,\n isAtVocabularyLimit,\n MAX_TERMS,\n MAX_TERM_LENGTH,\n};\n","/**\n * Audio settings store\n * Persists audio device preferences to localStorage\n */\n\nconst STORAGE_KEY = \"speechos_audio_settings\";\n\nexport interface AudioSettings {\n /** Selected audio input device ID (empty string = system default) */\n deviceId: string;\n}\n\nconst defaultSettings: AudioSettings = {\n deviceId: \"\",\n};\n\n/**\n * Get current audio settings from localStorage\n */\nexport function getAudioSettings(): AudioSettings {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return { ...defaultSettings };\n return { ...defaultSettings, ...JSON.parse(stored) };\n } catch {\n return { ...defaultSettings };\n }\n}\n\n/**\n * Save audio settings to localStorage\n */\nfunction saveAudioSettings(settings: AudioSettings): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n } catch {\n // localStorage full or unavailable - silently fail\n }\n}\n\n/**\n * Get the selected audio device ID\n * Returns empty string for system default\n */\nexport function getAudioDeviceId(): string {\n return getAudioSettings().deviceId;\n}\n\n/**\n * Set the selected audio device ID\n * Pass empty string to use system default\n */\nexport function setAudioDeviceId(deviceId: string): void {\n const settings = getAudioSettings();\n settings.deviceId = deviceId;\n saveAudioSettings(settings);\n}\n\n/**\n * Get list of available audio input devices\n * Requires microphone permission to get device labels\n */\nexport async function getAudioInputDevices(): Promise<MediaDeviceInfo[]> {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === \"audioinput\");\n } catch {\n return [];\n }\n}\n\n/**\n * Check if the selected device is still available\n * Returns true if the device exists or if using system default\n */\nexport async function isSelectedDeviceAvailable(): Promise<boolean> {\n const deviceId = getAudioDeviceId();\n if (!deviceId) return true; // System default is always \"available\"\n\n const devices = await getAudioInputDevices();\n return devices.some((device) => device.deviceId === deviceId);\n}\n\n/**\n * Reset audio settings to defaults\n */\nexport function resetAudioSettings(): void {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Silently fail\n }\n}\n\nexport const audioSettings: {\n getAudioSettings: typeof getAudioSettings;\n getAudioDeviceId: typeof getAudioDeviceId;\n setAudioDeviceId: typeof setAudioDeviceId;\n getAudioInputDevices: typeof getAudioInputDevices;\n isSelectedDeviceAvailable: typeof isSelectedDeviceAvailable;\n resetAudioSettings: typeof resetAudioSettings;\n} = {\n getAudioSettings,\n getAudioDeviceId,\n setAudioDeviceId,\n getAudioInputDevices,\n isSelectedDeviceAvailable,\n resetAudioSettings,\n};\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","/**\n * Shared styles and CSS variables for SpeechOS UI components\n */\n\nimport { css, type CSSResult } from 'lit';\n\n/**\n * CSS variables and theme tokens\n * These can be customized by the host application\n */\nexport const themeStyles: CSSResult = css`\n :host {\n /* Color tokens */\n --speechos-primary: #10B981;\n --speechos-primary-hover: #059669;\n --speechos-primary-active: #047857;\n\n --speechos-bg: #ffffff;\n --speechos-bg-hover: #f9fafb;\n --speechos-surface: #f3f4f6;\n\n --speechos-text: #111827;\n --speechos-text-secondary: #6b7280;\n\n --speechos-border: #e5e7eb;\n --speechos-shadow: rgba(0, 0, 0, 0.1);\n --speechos-shadow-lg: rgba(0, 0, 0, 0.15);\n\n /* Spacing */\n --speechos-spacing-xs: 4px;\n --speechos-spacing-sm: 8px;\n --speechos-spacing-md: 12px;\n --speechos-spacing-lg: 16px;\n --speechos-spacing-xl: 24px;\n\n /* Border radius */\n --speechos-radius-sm: 6px;\n --speechos-radius-md: 8px;\n --speechos-radius-lg: 12px;\n --speechos-radius-full: 9999px;\n\n /* Transitions */\n --speechos-transition-fast: 150ms ease;\n --speechos-transition-base: 200ms ease;\n --speechos-transition-slow: 300ms ease;\n\n /* Z-index */\n --speechos-z-base: 999999;\n --speechos-z-popup: 1000000;\n }\n`;\n\n/**\n * Common animation keyframes\n */\nexport const animations: CSSResult = css`\n @keyframes speechos-fadeIn {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @keyframes speechos-fadeOut {\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: translateY(8px);\n }\n }\n\n @keyframes speechos-pulse {\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.8;\n transform: scale(0.95);\n }\n }\n\n @keyframes speechos-slideUp {\n from {\n opacity: 0;\n transform: translateY(12px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes speechos-scaleIn {\n from {\n opacity: 0;\n transform: scale(0.9);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n`;\n\n/**\n * Utility styles for common patterns\n */\nexport const utilityStyles: CSSResult = css`\n .speechos-hidden {\n display: none !important;\n }\n\n .speechos-visible {\n display: block;\n }\n\n .speechos-fade-in {\n animation: speechos-fadeIn var(--speechos-transition-base) forwards;\n }\n\n .speechos-fade-out {\n animation: speechos-fadeOut var(--speechos-transition-base) forwards;\n }\n\n .speechos-pulse {\n animation: speechos-pulse 2s ease-in-out infinite;\n }\n`;\n","/**\n * Transcript history store\n * Persists transcripts to localStorage for viewing in the settings modal\n */\n\nimport type { CommandDefinition, CommandResult } from \"@speechos/core\";\n\nexport type TranscriptAction = \"dictate\" | \"edit\" | \"command\";\n\nexport interface TranscriptEntry {\n id: string;\n text: string;\n timestamp: number;\n action: TranscriptAction;\n /** Original text before edit (only for edit actions) */\n originalText?: string;\n /** The raw transcript of what the user said (for command actions) */\n inputText?: string;\n /** The matched command result (for command actions) */\n commandResult?: CommandResult | null;\n /** The command definitions that were available (for command actions) */\n commandConfig?: CommandDefinition[];\n}\n\nconst STORAGE_KEY = \"speechos_transcripts\";\nconst MAX_ENTRIES = 50;\n\n/**\n * Generate a unique ID for transcript entries\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Get all transcripts from localStorage\n */\nexport function getTranscripts(): TranscriptEntry[] {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return [];\n const entries = JSON.parse(stored) as TranscriptEntry[];\n // Return newest first\n return entries.sort((a, b) => b.timestamp - a.timestamp);\n } catch {\n return [];\n }\n}\n\n/**\n * Options for saving a command transcript\n */\nexport interface SaveCommandOptions {\n /** The raw transcript of what the user said */\n inputText?: string;\n /** The matched command result */\n commandResult?: CommandResult | null;\n /** The command definitions that were available */\n commandConfig?: CommandDefinition[];\n}\n\n/**\n * Save a new transcript entry\n */\nexport function saveTranscript(\n text: string,\n action: TranscriptAction,\n originalTextOrOptions?: string | SaveCommandOptions\n): TranscriptEntry {\n const entry: TranscriptEntry = {\n id: generateId(),\n text,\n timestamp: Date.now(),\n action,\n };\n\n // Handle edit action with originalText string\n if (action === \"edit\" && typeof originalTextOrOptions === \"string\") {\n entry.originalText = originalTextOrOptions;\n }\n\n // Handle command action with options object\n if (action === \"command\" && typeof originalTextOrOptions === \"object\") {\n const options = originalTextOrOptions as SaveCommandOptions;\n if (options.inputText !== undefined) entry.inputText = options.inputText;\n if (options.commandResult !== undefined) entry.commandResult = options.commandResult;\n if (options.commandConfig !== undefined) entry.commandConfig = options.commandConfig;\n }\n\n const entries = getTranscripts();\n entries.unshift(entry);\n\n // Prune to max entries\n const pruned = entries.slice(0, MAX_ENTRIES);\n\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(pruned));\n } catch {\n // localStorage full or unavailable - silently fail\n }\n\n return entry;\n}\n\n/**\n * Clear all transcript history\n */\nexport function clearTranscripts(): void {\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch {\n // Silently fail\n }\n}\n\n/**\n * Delete a single transcript by ID\n */\nexport function deleteTranscript(id: string): void {\n const entries = getTranscripts().filter((e) => e.id !== id);\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(entries));\n } catch {\n // Silently fail\n }\n}\n\nexport const transcriptStore: {\n getTranscripts: typeof getTranscripts;\n saveTranscript: typeof saveTranscript;\n clearTranscripts: typeof clearTranscripts;\n deleteTranscript: typeof deleteTranscript;\n} = {\n getTranscripts: getTranscripts,\n saveTranscript: saveTranscript,\n clearTranscripts: clearTranscripts,\n deleteTranscript: deleteTranscript,\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{nothing as t,noChange as i}from\"../lit-html.js\";import{directive as r,Directive as s,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends s{constructor(i){if(super(i),this.it=t,i.type!==n.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=r(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n","/**\n * Icon imports and templates using inline SVG\n */\n\nimport { html, type TemplateResult } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\n/**\n * Helper to create an SVG icon template\n */\nfunction createIcon(paths: string, size = 20): TemplateResult {\n const svgString = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"${size}\"\n height=\"${size}\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n style=\"display: block;\"\n >\n ${paths}\n </svg>\n `;\n\n return html`${unsafeHTML(svgString)}`;\n}\n\n/**\n * Microphone icon for the main button\n * Lucide Mic icon paths\n */\nexport const micIcon = (size = 20): TemplateResult =>\n createIcon(\n '<path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\"/><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/><line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"/>',\n size\n );\n\n/**\n * Message square icon for dictate action\n * Lucide MessageSquare icon paths\n */\nexport const dictateIcon = (size = 18): TemplateResult =>\n createIcon(\n '<path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>',\n size\n );\n\n/**\n * Pencil icon for edit action\n * Lucide Pencil icon paths\n */\nexport const editIcon = (size = 18): TemplateResult =>\n createIcon(\n '<path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\"/><path d=\"m15 5 4 4\"/>',\n size\n );\n\n/**\n * Stop/Square icon for stopping recording\n * Lucide Square icon (filled)\n */\nexport const stopIcon = (size = 18): TemplateResult => {\n const svgString = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"${size}\"\n height=\"${size}\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n stroke=\"none\"\n style=\"display: block;\"\n >\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" />\n </svg>\n `;\n return html`${unsafeHTML(svgString)}`;\n};\n\n/**\n * Loader/spinner icon for connecting state\n */\nexport const loaderIcon = (size = 20): TemplateResult => {\n const svgString = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"${size}\"\n height=\"${size}\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n style=\"display: block; animation: spin 1s linear infinite;\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/>\n </svg>\n `;\n return html`${unsafeHTML(svgString)}`;\n};\n\n/**\n * Check icon for \"Keep\" action\n * Lucide Check icon paths\n */\nexport const checkIcon = (size = 18): TemplateResult =>\n createIcon('<path d=\"M20 6 9 17l-5-5\"/>', size);\n\n/**\n * Undo icon for \"Undo\" action\n * Lucide Undo2 icon paths\n */\nexport const undoIcon = (size = 18): TemplateResult =>\n createIcon(\n '<path d=\"M9 14 4 9l5-5\"/><path d=\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\"/>',\n size\n );\n\n/**\n * Refresh icon for \"Continue editing\" action\n * Lucide RefreshCw icon paths\n */\nexport const refreshIcon = (size = 18): TemplateResult =>\n createIcon(\n '<path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M8 16H3v5\"/>',\n size\n );\n\n/**\n * X icon for cancel action\n * Lucide X icon paths\n */\nexport const xIcon = (size = 14): TemplateResult =>\n createIcon('<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>', size);\n\n/**\n * More vertical (three dots) icon for settings button\n * Lucide MoreVertical icon paths\n */\nexport const moreVerticalIcon = (size = 16): TemplateResult =>\n createIcon(\n '<circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"12\" cy=\"5\" r=\"1\"/><circle cx=\"12\" cy=\"19\" r=\"1\"/>',\n size\n );\n\n/**\n * Clipboard/list icon for transcripts tab\n * Lucide ClipboardList icon paths\n */\nexport const clipboardIcon = (size = 16): TemplateResult =>\n createIcon(\n '<rect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\"/><path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"/><path d=\"M12 11h4\"/><path d=\"M12 16h4\"/><path d=\"M8 11h.01\"/><path d=\"M8 16h.01\"/>',\n size\n );\n\n/**\n * Help circle icon for help tab\n * Lucide HelpCircle icon paths\n */\nexport const helpCircleIcon = (size = 16): TemplateResult =>\n createIcon(\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"/><path d=\"M12 17h.01\"/>',\n size\n );\n\n/**\n * Info icon for about tab\n * Lucide Info icon paths\n */\nexport const infoIcon = (size = 16): TemplateResult =>\n createIcon(\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/>',\n size\n );\n\n/**\n * Settings/cog icon for settings tab\n * Lucide Settings icon paths\n */\nexport const settingsIcon = (size = 16): TemplateResult =>\n createIcon(\n '<path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n size\n );\n\n/**\n * Trash icon for delete action\n * Lucide Trash2 icon paths\n */\nexport const trashIcon = (size = 14): TemplateResult =>\n createIcon(\n '<path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/><line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\"/><line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\"/>',\n size\n );\n\n/**\n * External link icon\n * Lucide ExternalLink icon paths\n */\nexport const externalLinkIcon = (size = 14): TemplateResult =>\n createIcon(\n '<path d=\"M15 3h6v6\"/><path d=\"M10 14 21 3\"/><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/>',\n size\n );\n\n/**\n * Copy icon\n * Lucide Copy icon paths\n */\nexport const copyIcon = (size = 14): TemplateResult =>\n createIcon(\n '<rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>',\n size\n );\n\n/**\n * Globe icon for language selection\n * Lucide Globe icon paths\n */\nexport const globeIcon = (size = 18): TemplateResult =>\n createIcon(\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\"/><path d=\"M2 12h20\"/>',\n size\n );\n\n/**\n * Scissors icon for snippets\n * Lucide Scissors icon paths\n */\nexport const scissorsIcon = (size = 16): TemplateResult =>\n createIcon(\n '<circle cx=\"6\" cy=\"6\" r=\"3\"/><path d=\"M8.12 8.12 12 12\"/><path d=\"M20 4 8.12 15.88\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><path d=\"M14.8 14.8 20 20\"/>',\n size\n );\n\n/**\n * Book open icon for vocabulary\n * Lucide BookOpen icon paths\n */\nexport const bookOpenIcon = (size = 16): TemplateResult =>\n createIcon(\n '<path d=\"M12 7v14\"/><path d=\"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/>',\n size\n );\n\n/**\n * Plus icon for add buttons\n * Lucide Plus icon paths\n */\nexport const plusIcon = (size = 16): TemplateResult =>\n createIcon('<path d=\"M5 12h14\"/><path d=\"M12 5v14\"/>', size);\n\n/**\n * Sparkles icon for AI/smart features\n * Lucide Sparkles icon paths\n */\nexport const sparklesIcon = (size = 18): TemplateResult =>\n createIcon(\n '<path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\"/><path d=\"M20 3v4\"/><path d=\"M22 5h-4\"/><path d=\"M4 17v2\"/><path d=\"M5 18H3\"/>',\n size\n );\n\n/**\n * Zap/lightning icon for command action\n * Lucide Zap icon paths - represents quick command execution\n */\nexport const commandIcon = (size = 18): TemplateResult =>\n createIcon(\n '<path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\"/>',\n size\n );\n","/**\n * Compact audio visualizer component\n * A minimal inline audio amplitude visualization for the listening state\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { themeStyles } from \"./styles/theme.js\";\nimport { getAudioDeviceId } from \"../stores/audio-settings.js\";\n\nconst NUM_BARS = 5;\nconst SMOOTHING = 0.8;\n\n@customElement(\"speechos-audio-visualizer\")\nexport class SpeechOSAudioVisualizer extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .visualizer {\n display: flex;\n align-items: flex-end;\n justify-content: center;\n gap: 2px;\n height: 18px;\n padding: 4px 8px;\n background: #1f2937;\n border-radius: 6px;\n }\n\n .bar {\n width: 3px;\n min-height: 3px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 1.5px;\n transition: height 50ms ease-out, background 100ms ease;\n }\n\n .bar.active {\n background: var(--speechos-primary);\n }\n `,\n ];\n\n @property({ type: Boolean })\n active = false;\n\n @state()\n private levels: number[] = new Array(NUM_BARS).fill(0);\n\n private mediaStream: MediaStream | null = null;\n private audioContext: AudioContext | null = null;\n private analyser: AnalyserNode | null = null;\n private animationId: number | null = null;\n private dataArray: Uint8Array<ArrayBuffer> | null = null;\n private smoothedLevels: number[] = new Array(NUM_BARS).fill(0);\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(\"active\")) {\n if (this.active) {\n this.startMonitoring();\n } else {\n this.stopMonitoring();\n }\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopMonitoring();\n }\n\n private async startMonitoring(): Promise<void> {\n try {\n // Stop any existing monitoring\n this.stopMonitoring();\n\n // Get device preference\n const deviceId = getAudioDeviceId();\n\n // Request microphone access\n const constraints: MediaStreamConstraints = {\n audio: deviceId ? { deviceId: { exact: deviceId } } : true,\n };\n\n this.mediaStream =\n await navigator.mediaDevices.getUserMedia(constraints);\n\n // Create audio context and analyser\n this.audioContext = new AudioContext();\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = 128;\n this.analyser.smoothingTimeConstant = SMOOTHING;\n\n // Connect microphone to analyser\n const source = this.audioContext.createMediaStreamSource(this.mediaStream);\n source.connect(this.analyser);\n\n // Create data array for frequency data\n this.dataArray = new Uint8Array(this.analyser.frequencyBinCount);\n\n // Start animation loop\n this.updateLevels();\n } catch (err) {\n console.error(\"[SpeechOS] Audio visualizer error:\", err);\n }\n }\n\n private stopMonitoring(): void {\n // Cancel animation\n if (this.animationId !== null) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n\n // Close audio context\n if (this.audioContext) {\n this.audioContext.close().catch(() => {});\n this.audioContext = null;\n }\n\n // Stop media stream tracks\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach((track) => track.stop());\n this.mediaStream = null;\n }\n\n this.analyser = null;\n this.dataArray = null;\n\n // Reset levels\n this.levels = new Array(NUM_BARS).fill(0);\n this.smoothedLevels = new Array(NUM_BARS).fill(0);\n }\n\n private updateLevels(): void {\n if (!this.analyser || !this.dataArray) return;\n\n // Get frequency data\n this.analyser.getByteFrequencyData(this.dataArray);\n\n // Calculate levels for each bar\n // Use lower frequencies for speech (roughly 85-255 Hz range)\n const binCount = this.dataArray.length;\n const binsPerBar = Math.floor(binCount / (NUM_BARS * 2));\n\n const newLevels: number[] = [];\n\n for (let i = 0; i < NUM_BARS; i++) {\n const startBin = i * binsPerBar;\n const endBin = startBin + binsPerBar;\n\n // Get average value for this bar's frequency range\n let sum = 0;\n for (let j = startBin; j < endBin && j < binCount; j++) {\n sum += this.dataArray[j];\n }\n const avg = sum / binsPerBar;\n\n // Normalize to 0-1 range with some gain\n const normalized = Math.min(1, (avg / 255) * 1.8);\n\n // Apply smoothing\n this.smoothedLevels[i] =\n this.smoothedLevels[i] * 0.3 + normalized * 0.7;\n\n newLevels.push(this.smoothedLevels[i]);\n }\n\n this.levels = newLevels;\n\n // Continue animation loop\n this.animationId = requestAnimationFrame(() => this.updateLevels());\n }\n\n private getBarClass(level: number): string {\n if (level < 0.05) return \"\";\n return \"active\";\n }\n\n render() {\n if (!this.active) {\n return html``;\n }\n\n return html`\n <div class=\"visualizer\">\n ${this.levels.map(\n (level) => html`\n <div\n class=\"bar ${this.getBarClass(level)}\"\n style=\"height: ${Math.max(3, level * 16)}px\"\n ></div>\n `\n )}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-audio-visualizer\": SpeechOSAudioVisualizer;\n }\n}\n","/**\n * Microphone button component\n * A circular button that toggles the action bubbles and handles recording states\n */\n\nimport {\n LitElement,\n html,\n css,\n type CSSResultGroup,\n type TemplateResult,\n} from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { themeStyles, animations } from \"./styles/theme.js\";\nimport { micIcon, stopIcon, loaderIcon, xIcon } from \"./icons.js\";\nimport type { RecordingState, SpeechOSAction } from \"@speechos/core\";\nimport \"./audio-visualizer.js\";\n\n@customElement(\"speechos-mic-button\")\nexport class SpeechOSMicButton extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n animations,\n css`\n :host {\n display: inline-block;\n }\n\n .button-wrapper {\n position: relative;\n }\n\n .mic-button {\n width: 56px;\n height: 56px;\n border-radius: var(--speechos-radius-full);\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n overflow: hidden;\n }\n\n .mic-button:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 20px rgba(16, 185, 129, 0.5);\n }\n\n .mic-button:active {\n transform: scale(0.98);\n }\n\n /* Expanded state - bubbles visible */\n .mic-button.expanded {\n background: linear-gradient(135deg, #059669 0%, #047857 100%);\n }\n\n /* Connecting state - Siri-style metallic spinner */\n .mic-button.connecting {\n background: radial-gradient(\n circle at 30% 30%,\n #34d399 0%,\n #10b981 40%,\n #059669 70%,\n #047857 100%\n );\n cursor: wait;\n box-shadow: 0 0 20px rgba(16, 185, 129, 0.4),\n 0 0 40px rgba(16, 185, 129, 0.2),\n inset 0 0 20px rgba(255, 255, 255, 0.1);\n }\n\n .mic-button.connecting .button-icon {\n opacity: 0.9;\n animation: connecting-breathe 2s ease-in-out infinite;\n }\n\n @keyframes connecting-breathe {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 0.85;\n }\n 50% {\n transform: scale(0.92);\n opacity: 1;\n }\n }\n\n /* Siri-style spinning metallic ring */\n .siri-ring {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 72px;\n height: 72px;\n transform: translate(-50%, -50%);\n pointer-events: none;\n border-radius: 50%;\n }\n\n /* Outer spinning gradient ring */\n .siri-ring::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: 50%;\n padding: 3px;\n background: conic-gradient(\n from 0deg,\n transparent 0deg,\n rgba(52, 211, 153, 0.1) 30deg,\n rgba(16, 185, 129, 0.8) 90deg,\n rgba(255, 255, 255, 0.95) 120deg,\n rgba(52, 211, 153, 0.9) 150deg,\n rgba(16, 185, 129, 0.6) 180deg,\n rgba(5, 150, 105, 0.3) 210deg,\n transparent 270deg,\n rgba(110, 231, 183, 0.2) 300deg,\n rgba(16, 185, 129, 0.5) 330deg,\n transparent 360deg\n );\n -webkit-mask: linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: siri-spin 1.8s linear infinite;\n filter: blur(0.5px);\n }\n\n /* Inner shimmer layer - counter-rotating */\n .siri-ring::after {\n content: \"\";\n position: absolute;\n inset: 4px;\n border-radius: 50%;\n padding: 2px;\n background: conic-gradient(\n from 180deg,\n transparent 0deg,\n rgba(167, 243, 208, 0.3) 60deg,\n rgba(255, 255, 255, 0.7) 90deg,\n rgba(110, 231, 183, 0.5) 120deg,\n transparent 180deg,\n rgba(52, 211, 153, 0.2) 240deg,\n rgba(255, 255, 255, 0.5) 270deg,\n rgba(16, 185, 129, 0.4) 300deg,\n transparent 360deg\n );\n -webkit-mask: linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: siri-spin-reverse 2.4s linear infinite;\n opacity: 0.7;\n }\n\n @keyframes siri-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes siri-spin-reverse {\n from {\n transform: rotate(360deg);\n }\n to {\n transform: rotate(0deg);\n }\n }\n\n /* Ambient glow pulse behind the ring */\n .siri-glow {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 90px;\n height: 90px;\n transform: translate(-50%, -50%);\n pointer-events: none;\n border-radius: 50%;\n background: radial-gradient(\n circle,\n rgba(16, 185, 129, 0.4) 0%,\n rgba(16, 185, 129, 0.15) 40%,\n transparent 70%\n );\n animation: siri-glow-pulse 2s ease-in-out infinite;\n filter: blur(8px);\n }\n\n @keyframes siri-glow-pulse {\n 0%,\n 100% {\n opacity: 0.6;\n transform: translate(-50%, -50%) scale(1);\n }\n 50% {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1.15);\n }\n }\n\n /* Recording state - red with pulse */\n .mic-button.recording {\n background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4);\n }\n\n .mic-button.recording:hover {\n background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);\n box-shadow: 0 6px 16px rgba(239, 68, 68, 0.5);\n }\n\n /* Pulse ring animation for recording */\n .pulse-ring {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n pointer-events: none;\n }\n\n .pulse-ring::before,\n .pulse-ring::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background: rgba(239, 68, 68, 0.4);\n animation: pulse-ring 1.5s ease-out infinite;\n }\n\n .pulse-ring::after {\n animation-delay: 0.5s;\n }\n\n @keyframes pulse-ring {\n 0% {\n transform: scale(1);\n opacity: 0.6;\n }\n 100% {\n transform: scale(1.8);\n opacity: 0;\n }\n }\n\n /* Processing state (transcribing) - Siri-style amber */\n .mic-button.processing {\n background: radial-gradient(\n circle at 30% 30%,\n #fbbf24 0%,\n #f59e0b 40%,\n #d97706 70%,\n #b45309 100%\n );\n box-shadow: 0 0 20px rgba(245, 158, 11, 0.4),\n 0 0 40px rgba(245, 158, 11, 0.2),\n inset 0 0 20px rgba(255, 255, 255, 0.1);\n cursor: wait;\n }\n\n .mic-button.processing .button-icon {\n opacity: 0.9;\n animation: processing-breathe 2s ease-in-out infinite;\n }\n\n @keyframes processing-breathe {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 0.85;\n }\n 50% {\n transform: scale(0.92);\n opacity: 1;\n }\n }\n\n /* Processing state (editing) - Siri-style purple */\n .mic-button.processing.editing {\n background: radial-gradient(\n circle at 30% 30%,\n #a78bfa 0%,\n #8b5cf6 40%,\n #7c3aed 70%,\n #6d28d9 100%\n );\n box-shadow: 0 0 20px rgba(139, 92, 246, 0.4),\n 0 0 40px rgba(139, 92, 246, 0.2),\n inset 0 0 20px rgba(255, 255, 255, 0.1);\n }\n\n /* Siri-style spinning ring for transcribing (amber) */\n .siri-ring-transcribe {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 72px;\n height: 72px;\n transform: translate(-50%, -50%);\n pointer-events: none;\n border-radius: 50%;\n }\n\n .siri-ring-transcribe::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: 50%;\n padding: 3px;\n background: conic-gradient(\n from 0deg,\n transparent 0deg,\n rgba(251, 191, 36, 0.1) 30deg,\n rgba(245, 158, 11, 0.8) 90deg,\n rgba(255, 255, 255, 0.95) 120deg,\n rgba(251, 191, 36, 0.9) 150deg,\n rgba(245, 158, 11, 0.6) 180deg,\n rgba(217, 119, 6, 0.3) 210deg,\n transparent 270deg,\n rgba(252, 211, 77, 0.2) 300deg,\n rgba(245, 158, 11, 0.5) 330deg,\n transparent 360deg\n );\n -webkit-mask: linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: siri-spin 1.8s linear infinite;\n filter: blur(0.5px);\n }\n\n .siri-ring-transcribe::after {\n content: \"\";\n position: absolute;\n inset: 4px;\n border-radius: 50%;\n padding: 2px;\n background: conic-gradient(\n from 180deg,\n transparent 0deg,\n rgba(253, 230, 138, 0.3) 60deg,\n rgba(255, 255, 255, 0.7) 90deg,\n rgba(252, 211, 77, 0.5) 120deg,\n transparent 180deg,\n rgba(251, 191, 36, 0.2) 240deg,\n rgba(255, 255, 255, 0.5) 270deg,\n rgba(245, 158, 11, 0.4) 300deg,\n transparent 360deg\n );\n -webkit-mask: linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: siri-spin-reverse 2.4s linear infinite;\n opacity: 0.7;\n }\n\n /* Ambient glow for transcribing */\n .siri-glow-transcribe {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 90px;\n height: 90px;\n transform: translate(-50%, -50%);\n pointer-events: none;\n border-radius: 50%;\n background: radial-gradient(\n circle,\n rgba(245, 158, 11, 0.4) 0%,\n rgba(245, 158, 11, 0.15) 40%,\n transparent 70%\n );\n animation: siri-glow-pulse 2s ease-in-out infinite;\n filter: blur(8px);\n }\n\n /* Siri-style spinning ring for editing (purple) */\n .siri-ring-edit {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 72px;\n height: 72px;\n transform: translate(-50%, -50%);\n pointer-events: none;\n border-radius: 50%;\n }\n\n .siri-ring-edit::before {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: 50%;\n padding: 3px;\n background: conic-gradient(\n from 0deg,\n transparent 0deg,\n rgba(167, 139, 250, 0.1) 30deg,\n rgba(139, 92, 246, 0.8) 90deg,\n rgba(255, 255, 255, 0.95) 120deg,\n rgba(167, 139, 250, 0.9) 150deg,\n rgba(139, 92, 246, 0.6) 180deg,\n rgba(124, 58, 237, 0.3) 210deg,\n transparent 270deg,\n rgba(196, 181, 253, 0.2) 300deg,\n rgba(139, 92, 246, 0.5) 330deg,\n transparent 360deg\n );\n -webkit-mask: linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: siri-spin 1.8s linear infinite;\n filter: blur(0.5px);\n }\n\n .siri-ring-edit::after {\n content: \"\";\n position: absolute;\n inset: 4px;\n border-radius: 50%;\n padding: 2px;\n background: conic-gradient(\n from 180deg,\n transparent 0deg,\n rgba(221, 214, 254, 0.3) 60deg,\n rgba(255, 255, 255, 0.7) 90deg,\n rgba(196, 181, 253, 0.5) 120deg,\n transparent 180deg,\n rgba(167, 139, 250, 0.2) 240deg,\n rgba(255, 255, 255, 0.5) 270deg,\n rgba(139, 92, 246, 0.4) 300deg,\n transparent 360deg\n );\n -webkit-mask: linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0);\n -webkit-mask-composite: xor;\n mask-composite: exclude;\n animation: siri-spin-reverse 2.4s linear infinite;\n opacity: 0.7;\n }\n\n /* Ambient glow for editing */\n .siri-glow-edit {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 90px;\n height: 90px;\n transform: translate(-50%, -50%);\n pointer-events: none;\n border-radius: 50%;\n background: radial-gradient(\n circle,\n rgba(139, 92, 246, 0.4) 0%,\n rgba(139, 92, 246, 0.15) 40%,\n transparent 70%\n );\n animation: siri-glow-pulse 2s ease-in-out infinite;\n filter: blur(8px);\n }\n\n /* Error state */\n .mic-button.error {\n background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4);\n cursor: pointer;\n }\n\n .mic-button.error:hover {\n background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);\n box-shadow: 0 6px 20px rgba(239, 68, 68, 0.5);\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n .button-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n z-index: 1;\n transition: transform 0.2s ease;\n }\n\n /* Status label bubble above button - always centered */\n .status-label {\n position: absolute;\n bottom: calc(\n 100% + var(--speechos-spacing-md)\n ); /* Same spacing as bubbles above */\n left: 50%;\n transform: translateX(-50%) scale(0.8);\n font-size: 11px;\n font-weight: 600;\n color: white;\n white-space: nowrap;\n opacity: 0;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 6px 12px;\n border-radius: 20px;\n background: #374151;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 44px;\n min-height: 28px;\n }\n\n /* Pop-in animation when visible */\n .status-label.visible {\n opacity: 1;\n transform: translateX(-50%) scale(1);\n }\n\n /* When showing visualizer, remove pill background */\n .status-label.visualizer {\n background: transparent;\n padding: 0;\n box-shadow: none;\n min-width: auto;\n min-height: auto;\n }\n\n /* Recording state - red bubble with dot indicator */\n .status-label.recording {\n background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);\n padding-left: 20px; /* Make room for the pulsing dot */\n }\n\n /* Subtle pulse animation for the label */\n .status-label.recording::after {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 8px;\n width: 6px;\n height: 6px;\n background: white;\n border-radius: 50%;\n transform: translateY(-50%);\n animation: label-pulse 1s ease-in-out infinite;\n }\n\n @keyframes label-pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n }\n\n /* Cancel button - positioned to the right of the main mic button */\n .cancel-button {\n position: absolute;\n top: 50%;\n right: -44px;\n transform: translateY(-50%) scale(0.6);\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: rgba(24, 24, 27, 0.8);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid rgba(63, 63, 70, 0.5);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: rgba(161, 161, 170, 1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);\n pointer-events: none;\n opacity: 0;\n }\n\n .cancel-button.visible {\n opacity: 1;\n transform: translateY(-50%) scale(1);\n pointer-events: auto;\n }\n\n .cancel-button:hover {\n transform: translateY(-50%) scale(1.15);\n background: rgba(39, 39, 42, 0.9);\n border-color: rgba(63, 63, 70, 0.8);\n color: rgba(250, 250, 250, 1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n }\n\n .cancel-button:active {\n transform: translateY(-50%) scale(0.95);\n }\n\n .cancel-button svg {\n stroke-width: 2.5;\n }\n\n /* Close/dismiss button - positioned to the right of the main mic button */\n .close-button {\n position: absolute;\n top: 50%;\n right: -44px;\n transform: translateY(-50%) scale(0.6);\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: rgba(24, 24, 27, 0.8);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid rgba(63, 63, 70, 0.5);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: rgba(161, 161, 170, 1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);\n pointer-events: none;\n opacity: 0;\n }\n\n .close-button.visible {\n opacity: 1;\n transform: translateY(-50%) scale(1);\n pointer-events: auto;\n }\n\n .close-button:hover {\n transform: translateY(-50%) scale(1.15);\n background: rgba(39, 39, 42, 0.9);\n border-color: rgba(63, 63, 70, 0.8);\n color: rgba(250, 250, 250, 1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n }\n\n .close-button:active {\n transform: translateY(-50%) scale(0.95);\n }\n\n .close-button svg {\n stroke-width: 2.5;\n }\n\n /* Error message display */\n .error-message {\n position: absolute;\n bottom: 72px; /* Above button */\n left: 50%;\n transform: translateX(-50%) translateY(8px);\n max-width: 280px;\n font-size: 13px;\n color: white;\n white-space: normal;\n text-align: center;\n padding: 12px 16px;\n border-radius: 12px;\n background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);\n transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);\n pointer-events: none;\n opacity: 0;\n line-height: 1.4;\n }\n\n .error-message.visible {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n\n /* Retry button */\n .retry-button {\n display: block;\n margin: 8px auto 0;\n padding: 6px 12px;\n background: rgba(255, 255, 255, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.3);\n border-radius: 6px;\n color: white;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s;\n pointer-events: auto;\n }\n\n .retry-button:hover {\n background: rgba(255, 255, 255, 0.3);\n border-color: rgba(255, 255, 255, 0.5);\n }\n\n /* Mobile styles - 30% larger */\n @media (max-width: 768px) and (hover: none) {\n .mic-button {\n width: 73px;\n height: 73px;\n }\n\n .button-icon {\n transform: scale(1.3);\n }\n\n .mic-button.connecting .button-icon {\n animation: connecting-breathe-mobile 2s ease-in-out infinite;\n }\n\n @keyframes connecting-breathe-mobile {\n 0%,\n 100% {\n transform: scale(1.3);\n opacity: 0.85;\n }\n 50% {\n transform: scale(1.2);\n opacity: 1;\n }\n }\n\n .mic-button.processing .button-icon {\n animation: processing-breathe-mobile 2s ease-in-out infinite;\n }\n\n @keyframes processing-breathe-mobile {\n 0%,\n 100% {\n transform: scale(1.3);\n opacity: 0.85;\n }\n 50% {\n transform: scale(1.2);\n opacity: 1;\n }\n }\n\n .siri-ring {\n width: 94px;\n height: 94px;\n }\n\n .siri-glow {\n width: 117px;\n height: 117px;\n }\n\n .siri-ring-transcribe {\n width: 94px;\n height: 94px;\n }\n\n .siri-glow-transcribe {\n width: 117px;\n height: 117px;\n }\n\n .siri-ring-edit {\n width: 94px;\n height: 94px;\n }\n\n .siri-glow-edit {\n width: 117px;\n height: 117px;\n }\n\n .cancel-button {\n width: 42px;\n height: 42px;\n right: -56px;\n }\n\n .cancel-button svg {\n transform: scale(1.3);\n }\n\n .close-button {\n width: 42px;\n height: 42px;\n right: -56px;\n }\n\n .close-button svg {\n transform: scale(1.3);\n }\n\n .status-label {\n font-size: 14px;\n padding: 8px 16px;\n }\n\n .status-label.recording {\n padding-left: 26px;\n }\n\n .status-label.recording::after {\n width: 8px;\n height: 8px;\n left: 10px;\n }\n\n .error-message {\n font-size: 15px;\n padding: 14px 18px;\n max-width: 300px;\n bottom: 94px;\n }\n\n .retry-button {\n padding: 8px 14px;\n font-size: 14px;\n }\n }\n `,\n ];\n\n @property({ type: Boolean })\n expanded = false;\n\n @property({ type: String })\n recordingState: RecordingState = \"idle\";\n\n @property({ type: String })\n activeAction: SpeechOSAction | null = null;\n\n @property({ type: String })\n editPreviewText: string = \"\";\n\n @property({ type: String })\n errorMessage: string | null = null;\n\n private handleClick(e: Event): void {\n e.stopPropagation();\n e.preventDefault();\n\n // Different behavior based on recording state\n if (this.recordingState === \"recording\") {\n // Stop recording\n this.dispatchEvent(\n new CustomEvent(\"stop-recording\", {\n bubbles: true,\n composed: true,\n })\n );\n } else if (this.recordingState === \"idle\") {\n // Toggle bubbles menu\n this.dispatchEvent(\n new CustomEvent(\"mic-click\", {\n bubbles: true,\n composed: true,\n })\n );\n } else if (this.recordingState === \"error\") {\n // Clear error on click\n this.dispatchEvent(\n new CustomEvent(\"cancel-operation\", {\n bubbles: true,\n composed: true,\n })\n );\n }\n // Do nothing during connecting or processing states\n }\n\n private handleCancel(e: Event): void {\n e.stopPropagation();\n e.preventDefault();\n\n this.dispatchEvent(\n new CustomEvent(\"cancel-operation\", {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private stopEvent(e: Event): void {\n e.stopPropagation();\n }\n\n private handleClose(e: Event): void {\n e.stopPropagation();\n e.preventDefault();\n\n this.dispatchEvent(\n new CustomEvent(\"close-widget\", {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private handleRetry(e: Event): void {\n e.stopPropagation();\n e.preventDefault();\n\n this.dispatchEvent(\n new CustomEvent(\"retry-connection\", {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private getButtonClass(): string {\n const classes = [\"mic-button\"];\n\n if (this.expanded && this.recordingState === \"idle\") {\n classes.push(\"expanded\");\n }\n\n if (this.recordingState !== \"idle\") {\n classes.push(this.recordingState);\n // Add editing class for purple styling during edit processing\n if (\n this.recordingState === \"processing\" &&\n this.activeAction === \"edit\"\n ) {\n classes.push(\"editing\");\n }\n }\n\n return classes.join(\" \");\n }\n\n private renderIcon(): TemplateResult {\n switch (this.recordingState) {\n case \"connecting\":\n return loaderIcon(24);\n case \"recording\":\n return stopIcon(20);\n case \"processing\":\n return loaderIcon(24);\n case \"error\":\n return xIcon(20);\n default:\n return micIcon(24);\n }\n }\n\n private getAriaLabel(): string {\n switch (this.recordingState) {\n case \"connecting\":\n return \"Connecting...\";\n case \"recording\":\n return \"Stop recording\";\n case \"processing\":\n return \"Processing...\";\n case \"error\":\n return \"Connection error - click to dismiss\";\n default:\n return \"Open voice commands\";\n }\n }\n\n /**\n * Truncate and format preview text for display\n */\n private formatPreviewText(text: string, maxLength: number = 10): string {\n // Trim whitespace and collapse multiple spaces\n const trimmed = text.trim().replace(/\\s+/g, \" \");\n if (!trimmed) return \"\";\n\n if (trimmed.length <= maxLength) {\n return `\"${trimmed}\"`;\n }\n return `\"${trimmed.substring(0, maxLength)}…\"`;\n }\n\n private getStatusLabel(): string {\n switch (this.recordingState) {\n case \"connecting\":\n case \"processing\":\n // No text label - Siri-style animation speaks for itself\n return \"\";\n case \"recording\":\n if (this.activeAction === \"edit\" && this.editPreviewText) {\n const preview = this.formatPreviewText(this.editPreviewText);\n return `Editing ${preview}...`;\n }\n // Return empty - we'll show the audio visualizer instead\n return \"\";\n default:\n return \"\";\n }\n }\n\n private shouldShowVisualizer(): boolean {\n // Show visualizer during recording when not in edit mode with preview text\n return (\n this.recordingState === \"recording\" &&\n !(this.activeAction === \"edit\" && this.editPreviewText)\n );\n }\n\n private getStatusClass(): string {\n if (this.recordingState === \"processing\" && this.activeAction === \"edit\") {\n return \"editing\";\n }\n return this.recordingState;\n }\n\n render(): TemplateResult {\n const showPulse = this.recordingState === \"recording\";\n const showSiriConnecting = this.recordingState === \"connecting\";\n const showSiriTranscribe =\n this.recordingState === \"processing\" && this.activeAction !== \"edit\";\n const showSiriEdit =\n this.recordingState === \"processing\" && this.activeAction === \"edit\";\n const statusLabel = this.getStatusLabel();\n const showVisualizer = this.shouldShowVisualizer();\n // Show status label during recording (either visualizer or edit text)\n const showStatus = this.recordingState === \"recording\";\n const showCancel =\n this.recordingState === \"connecting\" ||\n this.recordingState === \"recording\" ||\n this.recordingState === \"processing\";\n const showError = this.recordingState === \"error\" && this.errorMessage;\n // Show close button in idle state (both solo mic and expanded)\n const showClose = this.recordingState === \"idle\";\n\n return html`\n <div class=\"button-wrapper\">\n ${showPulse ? html`<div class=\"pulse-ring\"></div>` : \"\"}\n ${showSiriConnecting\n ? html`\n <div class=\"siri-glow\"></div>\n <div class=\"siri-ring\"></div>\n `\n : \"\"}\n ${showSiriTranscribe\n ? html`\n <div class=\"siri-glow-transcribe\"></div>\n <div class=\"siri-ring-transcribe\"></div>\n `\n : \"\"}\n ${showSiriEdit\n ? html`\n <div class=\"siri-glow-edit\"></div>\n <div class=\"siri-ring-edit\"></div>\n `\n : \"\"}\n ${showError\n ? html`\n <div class=\"error-message ${showError ? \"visible\" : \"\"}\">\n ${this.errorMessage}\n <button class=\"retry-button\" @click=\"${this.handleRetry}\">\n Retry Connection\n </button>\n </div>\n `\n : \"\"}\n\n <button\n class=\"${this.getButtonClass()}\"\n @click=\"${this.handleClick}\"\n aria-label=\"${this.getAriaLabel()}\"\n title=\"${this.getAriaLabel()}\"\n ?disabled=\"${this.recordingState === \"connecting\" ||\n this.recordingState === \"processing\"}\"\n >\n <span class=\"button-icon\">${this.renderIcon()}</span>\n </button>\n\n <span\n class=\"status-label ${showStatus ? \"visible\" : \"\"} ${showVisualizer\n ? \"visualizer\"\n : this.getStatusClass()}\"\n >\n ${showVisualizer\n ? html`<speechos-audio-visualizer\n ?active=\"${showVisualizer}\"\n ></speechos-audio-visualizer>`\n : statusLabel}\n </span>\n\n <button\n class=\"close-button ${showClose ? \"visible\" : \"\"}\"\n @click=\"${this.handleClose}\"\n @mousedown=\"${this.stopEvent}\"\n aria-label=\"Close\"\n title=\"Close\"\n >\n ${xIcon(16)}\n </button>\n\n <button\n class=\"cancel-button ${showCancel ? \"visible\" : \"\"}\"\n @click=\"${this.handleCancel}\"\n @mousedown=\"${this.stopEvent}\"\n aria-label=\"Cancel\"\n title=\"Cancel\"\n >\n ${xIcon(16)}\n </button>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-mic-button\": SpeechOSMicButton;\n }\n}\n","/**\n * Action bubbles component\n * Displays available actions (Dictate, Edit) above the mic button\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { themeStyles, animations } from \"./styles/theme.js\";\nimport { dictateIcon, editIcon, commandIcon } from \"./icons.js\";\nimport { events, type SpeechOSAction } from \"@speechos/core\";\nimport { getClientConfig } from \"../config.js\";\n\ninterface ActionButton {\n id: SpeechOSAction;\n label: string;\n icon: ReturnType<typeof dictateIcon>;\n}\n\n@customElement(\"speechos-action-bubbles\")\nexport class SpeechOSActionBubbles extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n animations,\n css`\n :host {\n display: block;\n position: absolute;\n bottom: calc(100% + var(--speechos-spacing-md));\n left: 50%;\n transform: translateX(-50%);\n pointer-events: auto;\n }\n\n .bubbles-container {\n display: flex;\n gap: var(--speechos-spacing-sm);\n justify-content: center;\n }\n\n .action-button {\n display: flex;\n align-items: center;\n gap: var(--speechos-spacing-xs);\n padding: var(--speechos-spacing-sm) var(--speechos-spacing-md);\n border: none;\n border-radius: var(--speechos-radius-full);\n cursor: pointer;\n font-size: 14px;\n font-weight: 600;\n color: white;\n transition: all var(--speechos-transition-fast);\n animation: speechos-slideUp var(--speechos-transition-base) ease-out;\n white-space: nowrap;\n }\n\n /* Dictate button - Emerald (matches connecting state) */\n .action-button.dictate {\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);\n }\n\n .action-button.dictate:hover {\n background: linear-gradient(135deg, #34d399 0%, #10b981 100%);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(16, 185, 129, 0.4);\n }\n\n /* Edit button - Purple (matches editing state) */\n .action-button.edit {\n background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);\n box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);\n }\n\n .action-button.edit:hover {\n background: linear-gradient(135deg, #a78bfa 0%, #8b5cf6 100%);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(139, 92, 246, 0.4);\n }\n\n /* Command button - Amber/Orange (quick action) */\n .action-button.command {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.3);\n }\n\n .action-button.command:hover {\n background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px rgba(245, 158, 11, 0.4);\n }\n\n .action-button:active {\n transform: translateY(0);\n }\n\n .action-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n }\n\n /* Staggered animation delay */\n .action-button:nth-child(1) {\n animation-delay: 0ms;\n }\n\n .action-button:nth-child(2) {\n animation-delay: 50ms;\n }\n\n .action-button:nth-child(3) {\n animation-delay: 100ms;\n }\n\n .action-button:nth-child(4) {\n animation-delay: 150ms;\n }\n\n /* Mobile styles - 30% larger */\n @media (max-width: 768px) and (hover: none) {\n .action-button {\n padding: 10px 16px;\n font-size: 18px;\n gap: 6px;\n }\n\n .action-icon {\n transform: scale(1.3);\n }\n\n .bubbles-container {\n gap: 10px;\n }\n }\n `,\n ];\n\n @property({ type: Boolean })\n visible = false;\n\n /**\n * Get the list of available actions based on configuration.\n * Command button only appears if commands are configured.\n */\n private get actions(): ActionButton[] {\n const clientConfig = getClientConfig();\n const baseActions: ActionButton[] = [\n {\n id: \"dictate\",\n label: \"Dictate\",\n icon: dictateIcon(),\n },\n {\n id: \"edit\",\n label: \"Edit\",\n icon: editIcon(),\n },\n ];\n\n // Only show command button if commands are configured\n if (clientConfig.commands && clientConfig.commands.length > 0) {\n baseActions.push({\n id: \"command\",\n label: \"Command\",\n icon: commandIcon(),\n });\n }\n\n return baseActions;\n }\n\n private handleActionClick(e: Event, action: SpeechOSAction): void {\n // Stop propagation to prevent bubbling issues\n e.stopPropagation();\n e.preventDefault();\n\n events.emit(\"action:select\", { action });\n\n this.dispatchEvent(\n new CustomEvent(\"action-select\", {\n bubbles: true,\n composed: true,\n detail: { action },\n })\n );\n }\n\n render(): import(\"lit\").TemplateResult | string {\n if (!this.visible) {\n return html``;\n }\n\n return html`\n <div class=\"bubbles-container\">\n ${this.actions.map(\n (action) => html`\n <button\n class=\"action-button ${action.id}\"\n @click=\"${(e: Event) => this.handleActionClick(e, action.id)}\"\n aria-label=\"${action.label}\"\n title=\"${action.label}\"\n >\n <span class=\"action-icon\">${action.icon}</span>\n <span>${action.label}</span>\n </button>\n `\n )}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-action-bubbles\": SpeechOSActionBubbles;\n }\n}\n","/**\n * Settings button component\n * A small gear icon button that opens the settings modal\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { themeStyles } from \"./styles/theme.js\";\nimport { settingsIcon } from \"./icons.js\";\n\n@customElement(\"speechos-settings-button\")\nexport class SpeechOSSettingsButton extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n css`\n :host {\n display: block;\n }\n\n .settings-button {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: rgba(24, 24, 27, 0.8);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid rgba(63, 63, 70, 0.5);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: rgba(161, 161, 170, 1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);\n opacity: 0;\n transform: scale(0.6);\n pointer-events: none;\n }\n\n .settings-button.visible {\n opacity: 1;\n transform: scale(1);\n pointer-events: auto;\n }\n\n .settings-button:hover {\n background: rgba(39, 39, 42, 0.9);\n border-color: rgba(63, 63, 70, 0.8);\n color: rgba(250, 250, 250, 1);\n transform: scale(1.15);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n }\n\n .settings-button:active {\n transform: scale(0.95);\n }\n\n /* Mobile styles - 30% larger */\n @media (max-width: 768px) and (hover: none) {\n .settings-button {\n width: 42px;\n height: 42px;\n }\n\n .settings-button svg {\n transform: scale(1.3);\n }\n }\n `,\n ];\n\n @property({ type: Boolean })\n visible = false;\n\n private handleClick(e: Event): void {\n e.stopPropagation();\n e.preventDefault();\n\n this.dispatchEvent(\n new CustomEvent(\"settings-click\", {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n render(): import(\"lit\").TemplateResult {\n return html`\n <button\n class=\"settings-button ${this.visible ? \"visible\" : \"\"}\"\n @click=\"${this.handleClick}\"\n aria-label=\"Settings\"\n title=\"Settings\"\n >\n ${settingsIcon(16)}\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-settings-button\": SpeechOSSettingsButton;\n }\n}\n","/**\n * Shared styles for settings modal and tabs\n */\n\nimport { css } from \"lit\";\n\n/** Base modal layout styles */\nexport const modalLayoutStyles = css`\n :host {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: calc(var(--speechos-z-base) + 100);\n }\n\n .modal-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: calc(var(--speechos-z-base) + 100);\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n pointer-events: none;\n backdrop-filter: blur(4px);\n }\n\n .modal-overlay.open {\n opacity: 1;\n visibility: visible;\n pointer-events: auto;\n }\n\n .modal {\n background: #1a1d24;\n border-radius: 16px;\n width: 90%;\n max-width: 580px;\n height: min(560px, 85vh);\n display: flex;\n flex-direction: column;\n box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4),\n 0 0 0 1px rgba(255, 255, 255, 0.05);\n transform: scale(0.95) translateY(10px);\n transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);\n pointer-events: auto;\n overflow: hidden;\n }\n\n /* Mobile: use more of the screen */\n @media (max-width: 480px) {\n .modal {\n width: 95%;\n height: min(520px, 90vh);\n border-radius: 12px;\n }\n }\n\n .modal-overlay.open .modal {\n transform: scale(1) translateY(0);\n }\n\n .modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.06);\n background: rgba(0, 0, 0, 0.2);\n }\n\n .modal-title {\n font-size: 17px;\n font-weight: 600;\n color: white;\n margin: 0;\n letter-spacing: -0.01em;\n }\n\n .modal-logo {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .logo-icon {\n width: 28px;\n height: 28px;\n border-radius: 8px;\n background: linear-gradient(135deg, #10b981 0%, #8b5cf6 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .logo-icon svg {\n width: 16px;\n height: 16px;\n color: white;\n }\n\n .logo-text {\n font-size: 17px;\n font-weight: 500;\n color: white;\n letter-spacing: -0.02em;\n }\n\n .logo-os {\n font-weight: 700;\n background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n }\n\n .close-button {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: transparent;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: rgba(255, 255, 255, 0.5);\n transition: all 0.15s ease;\n }\n\n .close-button:hover {\n background: rgba(255, 255, 255, 0.08);\n color: white;\n }\n\n .modal-body {\n display: flex;\n flex: 1;\n overflow: hidden;\n }\n\n .sidebar {\n width: 110px;\n flex-shrink: 0;\n background: rgba(0, 0, 0, 0.25);\n border-right: 1px solid rgba(255, 255, 255, 0.06);\n padding: 12px 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n @media (max-width: 480px) {\n .sidebar {\n width: 90px;\n padding: 10px 6px;\n }\n }\n\n .sidebar-spacer {\n flex: 1;\n min-height: 8px;\n }\n\n .sidebar-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 12px 8px;\n border: none;\n border-radius: 10px;\n background: transparent;\n cursor: pointer;\n color: rgba(255, 255, 255, 0.5);\n transition: all 0.15s ease;\n position: relative;\n }\n\n .sidebar-item:hover {\n background: rgba(255, 255, 255, 0.05);\n color: rgba(255, 255, 255, 0.8);\n }\n\n .sidebar-item.active {\n background: rgba(16, 185, 129, 0.12);\n color: #34d399;\n }\n\n .sidebar-item.active::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 50%;\n transform: translateY(-50%);\n width: 3px;\n height: 24px;\n background: #34d399;\n border-radius: 0 3px 3px 0;\n }\n\n .sidebar-label {\n font-size: 11px;\n font-weight: 500;\n text-align: center;\n line-height: 1.2;\n }\n\n @media (max-width: 480px) {\n .sidebar-item {\n padding: 10px 6px;\n gap: 4px;\n }\n\n .sidebar-label {\n font-size: 10px;\n }\n }\n\n .modal-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n @media (max-width: 480px) {\n .modal-content {\n padding: 16px;\n }\n }\n`;\n\n/** Shared tab content styles */\nexport const tabContentStyles = css`\n .section-header {\n margin-bottom: 16px;\n }\n\n .section-title {\n font-size: 15px;\n font-weight: 600;\n color: white;\n margin: 0 0 6px 0;\n letter-spacing: -0.01em;\n }\n\n .section-description {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.5);\n line-height: 1.5;\n margin: 0;\n }\n\n .empty-state {\n text-align: center;\n padding: 40px 20px;\n color: rgba(255, 255, 255, 0.5);\n }\n\n .empty-state-icon {\n margin-bottom: 16px;\n opacity: 0.4;\n }\n\n .empty-state-title {\n font-size: 15px;\n font-weight: 500;\n margin-bottom: 8px;\n color: rgba(255, 255, 255, 0.7);\n }\n\n .empty-state-text {\n font-size: 13px;\n line-height: 1.5;\n }\n\n .delete-btn {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: transparent;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: rgba(255, 255, 255, 0.35);\n transition: all 0.15s ease;\n }\n\n .delete-btn:hover {\n background: rgba(239, 68, 68, 0.15);\n color: #f87171;\n }\n\n .limit-warning {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px;\n background: rgba(251, 191, 36, 0.1);\n border: 1px solid rgba(251, 191, 36, 0.2);\n border-radius: 8px;\n margin-bottom: 16px;\n }\n\n .limit-warning-icon {\n color: #fbbf24;\n flex-shrink: 0;\n }\n\n .limit-warning-text {\n font-size: 13px;\n color: #fcd34d;\n line-height: 1.4;\n }\n`;\n\n/** Form styles for add/edit forms */\nexport const formStyles = css`\n .add-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 10px 16px;\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n border: none;\n border-radius: 8px;\n color: white;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 8px rgba(16, 185, 129, 0.2);\n }\n\n .add-button:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);\n }\n\n .add-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n\n .count-badge {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.45);\n font-weight: 500;\n }\n\n .action-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .add-form {\n background: rgba(255, 255, 255, 0.04);\n border: 1px solid rgba(255, 255, 255, 0.08);\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 16px;\n }\n\n .form-group {\n margin-bottom: 14px;\n }\n\n .form-group:last-of-type {\n margin-bottom: 16px;\n }\n\n .form-label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: rgba(255, 255, 255, 0.7);\n margin-bottom: 8px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n .form-input {\n width: 100%;\n padding: 12px 14px;\n background: rgba(0, 0, 0, 0.3);\n border: 1px solid rgba(255, 255, 255, 0.08);\n border-radius: 8px;\n color: white;\n font-size: 14px;\n font-family: inherit;\n transition: all 0.15s ease;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: #34d399;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.15);\n }\n\n .form-input::placeholder {\n color: rgba(255, 255, 255, 0.3);\n }\n\n .form-input.error {\n border-color: #f87171;\n }\n\n .form-input.error:focus {\n box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.15);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n .form-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .char-count {\n font-size: 11px;\n color: rgba(255, 255, 255, 0.4);\n font-variant-numeric: tabular-nums;\n }\n\n .char-count.warning {\n color: #fbbf24;\n }\n\n .char-count.error {\n color: #f87171;\n }\n\n .form-error {\n font-size: 12px;\n color: #f87171;\n margin-top: 6px;\n }\n\n .form-actions {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n }\n\n .form-btn {\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .form-btn.cancel {\n background: transparent;\n border: 1px solid rgba(255, 255, 255, 0.15);\n color: rgba(255, 255, 255, 0.7);\n }\n\n .form-btn.cancel:hover {\n background: rgba(255, 255, 255, 0.05);\n border-color: rgba(255, 255, 255, 0.25);\n }\n\n .form-btn.save {\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n border: none;\n color: white;\n box-shadow: 0 2px 8px rgba(16, 185, 129, 0.2);\n }\n\n .form-btn.save:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);\n }\n\n .form-btn.save:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n`;\n","/**\n * History tab component - Shows transcript history with copy/delete actions\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { themeStyles } from \"../styles/theme.js\";\nimport { tabContentStyles } from \"../styles/modal-styles.js\";\nimport {\n clipboardIcon,\n dictateIcon,\n editIcon,\n commandIcon,\n copyIcon,\n trashIcon,\n} from \"../icons.js\";\nimport { transcriptStore, type TranscriptEntry } from \"../../stores/transcript-store.js\";\n\n@customElement(\"speechos-history-tab\")\nexport class SpeechOSHistoryTab extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n tabContentStyles,\n css`\n :host {\n display: block;\n }\n\n .transcripts-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .transcript-item {\n background: rgba(255, 255, 255, 0.04);\n border: 1px solid rgba(255, 255, 255, 0.06);\n border-radius: 10px;\n padding: 12px 14px;\n transition: all 0.15s ease;\n }\n\n .transcript-item:hover {\n background: rgba(255, 255, 255, 0.06);\n border-color: rgba(255, 255, 255, 0.1);\n }\n\n .transcript-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n }\n\n .transcript-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n padding: 4px 8px;\n border-radius: 6px;\n }\n\n .transcript-badge.dictate {\n background: rgba(16, 185, 129, 0.15);\n color: #34d399;\n }\n\n .transcript-badge.edit {\n background: rgba(139, 92, 246, 0.15);\n color: #a78bfa;\n }\n\n .transcript-badge.command {\n background: rgba(245, 158, 11, 0.15);\n color: #fbbf24;\n }\n\n .transcript-time {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.35);\n }\n\n .transcript-text {\n font-size: 14px;\n color: rgba(255, 255, 255, 0.85);\n line-height: 1.5;\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n\n .transcript-actions {\n display: flex;\n gap: 8px;\n margin-top: 10px;\n padding-top: 10px;\n border-top: 1px solid rgba(255, 255, 255, 0.06);\n }\n\n .transcript-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n border-radius: 6px;\n background: rgba(255, 255, 255, 0.06);\n border: none;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: rgba(255, 255, 255, 0.6);\n transition: all 0.15s ease;\n }\n\n .transcript-action-btn:hover {\n background: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.9);\n }\n\n .transcript-action-btn.copied {\n background: rgba(16, 185, 129, 0.2);\n color: #34d399;\n }\n\n .transcript-action-btn.delete:hover {\n background: rgba(239, 68, 68, 0.15);\n color: #f87171;\n }\n\n .clear-all-button {\n display: block;\n width: 100%;\n margin-top: 16px;\n padding: 10px;\n background: rgba(239, 68, 68, 0.1);\n border: 1px solid rgba(239, 68, 68, 0.15);\n border-radius: 8px;\n color: #f87171;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .clear-all-button:hover {\n background: rgba(239, 68, 68, 0.18);\n border-color: rgba(239, 68, 68, 0.25);\n }\n `,\n ];\n\n @state()\n private transcripts: TranscriptEntry[] = [];\n\n connectedCallback(): void {\n super.connectedCallback();\n this.loadTranscripts();\n }\n\n /** Reload transcripts from store */\n refresh(): void {\n this.loadTranscripts();\n }\n\n private loadTranscripts(): void {\n this.transcripts = transcriptStore.getTranscripts();\n }\n\n private formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n\n return date.toLocaleDateString();\n }\n\n private handleDelete(id: string): void {\n transcriptStore.deleteTranscript(id);\n this.loadTranscripts();\n }\n\n private handleClearAll(): void {\n transcriptStore.clearTranscripts();\n this.loadTranscripts();\n }\n\n private async handleCopy(text: string, event: Event): Promise<void> {\n const button = event.currentTarget as HTMLButtonElement;\n\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n }\n\n button.classList.add(\"copied\");\n button.textContent = \"Copied!\";\n setTimeout(() => {\n button.classList.remove(\"copied\");\n this.requestUpdate();\n }, 1000);\n }\n\n private getActionIcon(action: string) {\n switch (action) {\n case \"dictate\":\n return dictateIcon(12);\n case \"edit\":\n return editIcon(12);\n case \"command\":\n return commandIcon(12);\n default:\n return dictateIcon(12);\n }\n }\n\n private renderCommandDetails(entry: TranscriptEntry) {\n // Show the transcript text (what the user said)\n const displayText = entry.inputText || entry.text;\n return html`<div class=\"transcript-text\">${displayText}</div>`;\n }\n\n private getCopyText(entry: TranscriptEntry): string {\n if (entry.action === \"command\") {\n return entry.inputText || entry.text;\n }\n return entry.text;\n }\n\n render() {\n if (this.transcripts.length === 0) {\n return html`\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">${clipboardIcon(44)}</div>\n <div class=\"empty-state-title\">No transcripts yet</div>\n <div class=\"empty-state-text\">\n Your dictation, edit, and command history will appear here.\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"transcripts-list\">\n ${this.transcripts.map(\n (t) => html`\n <div class=\"transcript-item\">\n <div class=\"transcript-header\">\n <span class=\"transcript-badge ${t.action}\">\n ${this.getActionIcon(t.action)}\n ${t.action}\n </span>\n <span class=\"transcript-time\"\n >${this.formatTime(t.timestamp)}</span\n >\n </div>\n ${t.action === \"command\"\n ? this.renderCommandDetails(t)\n : html`<div class=\"transcript-text\">${t.text}</div>`}\n <div class=\"transcript-actions\">\n <button\n class=\"transcript-action-btn copy\"\n @click=\"${(e: Event) => this.handleCopy(this.getCopyText(t), e)}\"\n >\n ${copyIcon(12)} Copy\n </button>\n <button\n class=\"transcript-action-btn delete\"\n @click=\"${() => this.handleDelete(t.id)}\"\n >\n ${trashIcon(12)} Delete\n </button>\n </div>\n </div>\n `\n )}\n </div>\n <button class=\"clear-all-button\" @click=\"${this.handleClearAll}\">\n Clear All History\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-history-tab\": SpeechOSHistoryTab;\n }\n}\n","/**\n * Help tab component - Shows usage instructions for dictate and edit modes\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { themeStyles } from \"../styles/theme.js\";\nimport { dictateIcon, editIcon, globeIcon } from \"../icons.js\";\n\n@customElement(\"speechos-help-tab\")\nexport class SpeechOSHelpTab extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n css`\n :host {\n display: block;\n }\n\n .help-section {\n margin-bottom: 24px;\n }\n\n .help-section:last-child {\n margin-bottom: 0;\n }\n\n .help-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 15px;\n font-weight: 600;\n color: white;\n margin-bottom: 10px;\n }\n\n .help-title.dictate {\n color: #34d399;\n }\n\n .help-title.edit {\n color: #a78bfa;\n }\n\n .help-text {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.6);\n line-height: 1.6;\n margin-bottom: 10px;\n }\n\n .help-text:last-child {\n margin-bottom: 0;\n }\n\n .help-examples {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n }\n\n .help-example {\n background: rgba(255, 255, 255, 0.04);\n border: 1px solid rgba(255, 255, 255, 0.06);\n border-radius: 6px;\n padding: 8px 12px;\n font-size: 12px;\n color: rgba(255, 255, 255, 0.5);\n font-style: italic;\n }\n\n .help-title.languages {\n background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n }\n `,\n ];\n\n render() {\n return html`\n <div class=\"help-section\">\n <div class=\"help-title dictate\">${dictateIcon(18)} Dictate</div>\n <div class=\"help-text\">\n Speak naturally and your words are transcribed into polished text—no\n filler words, perfect punctuation.\n </div>\n </div>\n\n <div class=\"help-section\">\n <div class=\"help-title edit\">${editIcon(18)} Edit</div>\n <div class=\"help-text\">\n Say anything you want and we'll make it happen. Select specific text\n to edit just that part, or leave nothing selected to transform the\n entire text field.\n </div>\n <div class=\"help-text\">\n Be as specific or vague as you like—we'll interpret your intent and\n apply the changes.\n </div>\n <div class=\"help-examples\">\n <span class=\"help-example\">\"Make it shorter\"</span>\n <span class=\"help-example\">\"More professional\"</span>\n <span class=\"help-example\">\"Fix the grammar\"</span>\n <span class=\"help-example\">\"Add bullet points\"</span>\n <span class=\"help-example\">\"Rewrite this completely\"</span>\n </div>\n </div>\n\n <div class=\"help-section\">\n <div class=\"help-title languages\">${globeIcon(18)} Languages</div>\n <div class=\"help-text\">\n Configure your input and output languages in Settings. SpeechOS\n supports 33+ languages with automatic translation—speak in one\n language and get polished text in another.\n </div>\n <div class=\"help-examples\">\n <span class=\"help-example\">Speak German → English text</span>\n <span class=\"help-example\">Speak Spanish → French text</span>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-help-tab\": SpeechOSHelpTab;\n }\n}\n","/**\n * About tab component - Shows SpeechOS branding and links\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { themeStyles } from \"../styles/theme.js\";\nimport { externalLinkIcon } from \"../icons.js\";\n\n@customElement(\"speechos-about-tab\")\nexport class SpeechOSAboutTab extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n css`\n :host {\n display: block;\n }\n\n .about-logo {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 20px;\n }\n\n .logo-icon {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n background: linear-gradient(135deg, #10b981 0%, #8b5cf6 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .logo-icon svg {\n width: 20px;\n height: 20px;\n color: white;\n }\n\n .about-logo-text {\n font-size: 22px;\n font-weight: 500;\n color: white;\n letter-spacing: -0.02em;\n }\n\n .logo-os {\n font-weight: 700;\n background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n }\n\n .about-description {\n font-size: 14px;\n color: rgba(255, 255, 255, 0.65);\n line-height: 1.7;\n margin-bottom: 24px;\n }\n\n .about-description p {\n margin: 0 0 12px 0;\n }\n\n .about-description p:last-child {\n margin-bottom: 0;\n }\n\n .about-link {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 12px 18px;\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n border-radius: 10px;\n color: white;\n font-size: 14px;\n font-weight: 600;\n text-decoration: none;\n transition: all 0.2s ease;\n box-shadow: 0 4px 12px rgba(16, 185, 129, 0.25);\n }\n\n .about-link:hover {\n transform: translateY(-1px);\n box-shadow: 0 6px 16px rgba(16, 185, 129, 0.35);\n }\n `,\n ];\n\n render() {\n return html`\n <div class=\"about-logo\">\n <div class=\"logo-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z\"\n />\n </svg>\n </div>\n <div class=\"about-logo-text\">Speech<span class=\"logo-os\">OS</span></div>\n </div>\n <div class=\"about-description\">\n <p>\n SpeechOS lets you speak 4x faster than you type. Every word is\n AI-polished—no filler words, no typos, just professional text ready to\n send.\n </p>\n <p>\n Dictate naturally at 220+ words per minute. Say \"make it shorter\" or\n \"more formal\" to transform text instantly. Support for 33+ languages\n with custom vocabulary for your domain-specific terminology.\n </p>\n </div>\n <a\n href=\"https://speechos.ai\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"about-link\"\n >\n Visit SpeechOS ${externalLinkIcon(14)}\n </a>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-about-tab\": SpeechOSAboutTab;\n }\n}\n","/**\n * Audio level meter component\n * Displays real-time audio amplitude visualization for microphone input\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { themeStyles } from \"./styles/theme.js\";\n\nconst NUM_BARS = 12;\nconst SMOOTHING = 0.8;\n\n@customElement(\"speechos-audio-level-meter\")\nexport class SpeechOSAudioLevelMeter extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n css`\n :host {\n display: block;\n }\n\n .meter-container {\n display: flex;\n align-items: flex-end;\n justify-content: center;\n gap: 3px;\n height: 32px;\n padding: 8px 12px;\n background: rgba(0, 0, 0, 0.2);\n border-radius: 8px;\n }\n\n .meter-bar {\n width: 6px;\n min-height: 4px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 2px;\n transition: height 50ms ease-out, background 100ms ease;\n }\n\n .meter-bar.active {\n background: var(--speechos-primary);\n }\n\n .meter-inactive {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 32px;\n padding: 8px 12px;\n background: rgba(0, 0, 0, 0.2);\n border-radius: 8px;\n color: rgba(255, 255, 255, 0.4);\n font-size: 13px;\n }\n\n .meter-error {\n color: #f87171;\n }\n `,\n ];\n\n @property({ type: Boolean })\n active = false;\n\n @property({ type: String })\n deviceId = \"\";\n\n @state()\n private levels: number[] = new Array(NUM_BARS).fill(0);\n\n @state()\n private error: string | null = null;\n\n private mediaStream: MediaStream | null = null;\n private audioContext: AudioContext | null = null;\n private analyser: AnalyserNode | null = null;\n private animationId: number | null = null;\n private dataArray: Uint8Array<ArrayBuffer> | null = null;\n private smoothedLevels: number[] = new Array(NUM_BARS).fill(0);\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(\"active\") || changedProperties.has(\"deviceId\")) {\n if (this.active) {\n this.startMonitoring();\n } else {\n this.stopMonitoring();\n }\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopMonitoring();\n }\n\n private async startMonitoring(): Promise<void> {\n this.error = null;\n\n try {\n // Stop any existing monitoring\n this.stopMonitoring();\n\n // Request microphone access\n const constraints: MediaStreamConstraints = {\n audio: this.deviceId\n ? { deviceId: { exact: this.deviceId } }\n : true,\n };\n\n this.mediaStream = await navigator.mediaDevices.getUserMedia(constraints);\n\n // Create audio context and analyser\n this.audioContext = new AudioContext();\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = 256;\n this.analyser.smoothingTimeConstant = SMOOTHING;\n\n // Connect microphone to analyser\n const source = this.audioContext.createMediaStreamSource(this.mediaStream);\n source.connect(this.analyser);\n\n // Create data array for frequency data\n this.dataArray = new Uint8Array(this.analyser.frequencyBinCount);\n\n // Start animation loop\n this.updateLevels();\n } catch (err) {\n console.error(\"[SpeechOS] Audio monitoring error:\", err);\n if (err instanceof Error) {\n if (err.name === \"NotAllowedError\") {\n this.error = \"Microphone access denied\";\n } else if (err.name === \"NotFoundError\") {\n this.error = \"Microphone not found\";\n } else {\n this.error = \"Failed to access microphone\";\n }\n } else {\n this.error = \"Failed to access microphone\";\n }\n }\n }\n\n private stopMonitoring(): void {\n // Cancel animation\n if (this.animationId !== null) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n\n // Close audio context\n if (this.audioContext) {\n this.audioContext.close().catch(() => {});\n this.audioContext = null;\n }\n\n // Stop media stream tracks\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach((track) => track.stop());\n this.mediaStream = null;\n }\n\n this.analyser = null;\n this.dataArray = null;\n\n // Reset levels\n this.levels = new Array(NUM_BARS).fill(0);\n this.smoothedLevels = new Array(NUM_BARS).fill(0);\n }\n\n private updateLevels(): void {\n if (!this.analyser || !this.dataArray) return;\n\n // Get frequency data\n this.analyser.getByteFrequencyData(this.dataArray);\n\n // Calculate levels for each bar\n // Use lower frequencies for speech (roughly 85-255 Hz range)\n const binCount = this.dataArray.length;\n const binsPerBar = Math.floor(binCount / (NUM_BARS * 2)); // Use first half for speech frequencies\n\n const newLevels: number[] = [];\n\n for (let i = 0; i < NUM_BARS; i++) {\n const startBin = i * binsPerBar;\n const endBin = startBin + binsPerBar;\n\n // Get average value for this bar's frequency range\n let sum = 0;\n for (let j = startBin; j < endBin && j < binCount; j++) {\n sum += this.dataArray[j];\n }\n const avg = sum / binsPerBar;\n\n // Normalize to 0-1 range with some gain\n const normalized = Math.min(1, (avg / 255) * 1.5);\n\n // Apply smoothing\n this.smoothedLevels[i] =\n this.smoothedLevels[i] * 0.3 + normalized * 0.7;\n\n newLevels.push(this.smoothedLevels[i]);\n }\n\n this.levels = newLevels;\n\n // Continue animation loop\n this.animationId = requestAnimationFrame(() => this.updateLevels());\n }\n\n private getBarClass(level: number): string {\n if (level < 0.05) return \"\";\n return \"active\";\n }\n\n render() {\n if (this.error) {\n return html`\n <div class=\"meter-inactive meter-error\">${this.error}</div>\n `;\n }\n\n if (!this.active) {\n return html`\n <div class=\"meter-inactive\">Waiting for microphone access...</div>\n `;\n }\n\n return html`\n <div class=\"meter-container\">\n ${this.levels.map(\n (level) => html`\n <div\n class=\"meter-bar ${this.getBarClass(level)}\"\n style=\"height: ${Math.max(4, level * 28)}px\"\n ></div>\n `\n )}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-audio-level-meter\": SpeechOSAudioLevelMeter;\n }\n}\n","/**\n * Settings tab component - Language and microphone preferences\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { themeStyles } from \"../styles/theme.js\";\nimport { globeIcon, micIcon, sparklesIcon } from \"../icons.js\";\nimport {\n getAudioDeviceId,\n setAudioDeviceId,\n getAudioInputDevices,\n} from \"../../stores/audio-settings.js\";\nimport {\n getInputLanguageCode,\n setInputLanguageCode,\n getOutputLanguageCode,\n setOutputLanguageCode,\n getSmartFormatEnabled,\n setSmartFormatEnabled,\n SUPPORTED_LANGUAGES,\n} from \"../../stores/language-settings.js\";\nimport \"../audio-level-meter.js\";\n\n@customElement(\"speechos-settings-tab\")\nexport class SpeechOSSettingsTab extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n css`\n :host {\n display: block;\n }\n\n .settings-section {\n margin-bottom: 28px;\n }\n\n .settings-section:last-child {\n margin-bottom: 0;\n }\n\n .settings-section-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n }\n\n .settings-section-icon {\n color: #34d399;\n }\n\n .settings-section-title {\n font-size: 14px;\n font-weight: 600;\n color: white;\n }\n\n .settings-section-description {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.45);\n line-height: 1.5;\n margin-bottom: 14px;\n }\n\n .settings-select-wrapper {\n position: relative;\n margin-bottom: 12px;\n }\n\n .settings-mic-row {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .settings-mic-row .settings-select-wrapper {\n flex: 1;\n margin-bottom: 0;\n }\n\n .settings-mic-row speechos-audio-level-meter {\n width: 80px;\n flex-shrink: 0;\n }\n\n .settings-select {\n width: 100%;\n padding: 12px 40px 12px 14px;\n background: rgba(0, 0, 0, 0.3);\n border: 1px solid rgba(255, 255, 255, 0.08);\n border-radius: 10px;\n color: white;\n font-size: 14px;\n font-family: inherit;\n cursor: pointer;\n appearance: none;\n -webkit-appearance: none;\n transition: all 0.15s ease;\n }\n\n .settings-select:hover {\n border-color: rgba(255, 255, 255, 0.15);\n background: rgba(0, 0, 0, 0.4);\n }\n\n .settings-select:focus {\n outline: none;\n border-color: #34d399;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.15);\n }\n\n .settings-select option {\n background: #1a1d24;\n color: white;\n padding: 8px;\n }\n\n .settings-select-arrow {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n color: rgba(255, 255, 255, 0.4);\n }\n\n .settings-permission-note {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.4);\n margin-top: 10px;\n font-style: italic;\n }\n\n .settings-saved-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: #34d399;\n font-weight: 500;\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n .settings-saved-indicator.visible {\n opacity: 1;\n }\n\n /* Toggle switch styles */\n .settings-toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px;\n background: rgba(0, 0, 0, 0.3);\n border: 1px solid rgba(255, 255, 255, 0.08);\n border-radius: 10px;\n }\n\n .settings-toggle-label {\n font-size: 14px;\n color: white;\n }\n\n .settings-toggle {\n position: relative;\n width: 44px;\n height: 24px;\n background: rgba(255, 255, 255, 0.1);\n border-radius: 12px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .settings-toggle.active {\n background: #34d399;\n }\n\n .settings-toggle-knob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 20px;\n height: 20px;\n background: white;\n border-radius: 50%;\n transition: transform 0.2s ease;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n }\n\n .settings-toggle.active .settings-toggle-knob {\n transform: translateX(20px);\n }\n `,\n ];\n\n @state()\n private audioDevices: MediaDeviceInfo[] = [];\n\n @state()\n private selectedDeviceId: string = \"\";\n\n @state()\n private selectedInputLanguageCode: string = \"en-US\";\n\n @state()\n private selectedOutputLanguageCode: string = \"en-US\";\n\n @state()\n private isTestingMic: boolean = false;\n\n @state()\n private showSavedIndicator: boolean = false;\n\n @state()\n private permissionGranted: boolean = false;\n\n @state()\n private smartFormatEnabled: boolean = true;\n\n private savedIndicatorTimeout: ReturnType<typeof setTimeout> | null = null;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.loadSettings();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.savedIndicatorTimeout) {\n clearTimeout(this.savedIndicatorTimeout);\n }\n this.isTestingMic = false;\n }\n\n /** Called when tab becomes active */\n activate(): void {\n this.startMicPreview();\n }\n\n /** Called when tab becomes inactive */\n deactivate(): void {\n this.isTestingMic = false;\n }\n\n private async loadSettings(): Promise<void> {\n this.selectedDeviceId = getAudioDeviceId();\n this.selectedInputLanguageCode = getInputLanguageCode();\n this.selectedOutputLanguageCode = getOutputLanguageCode();\n this.smartFormatEnabled = getSmartFormatEnabled();\n await this.loadAudioDevices();\n }\n\n private async loadAudioDevices(): Promise<void> {\n try {\n const devices = await getAudioInputDevices();\n const hasLabels = devices.some(\n (d: MediaDeviceInfo) => d.label && d.label.length > 0\n );\n\n this.permissionGranted = hasLabels;\n this.audioDevices = devices;\n } catch (error) {\n console.error(\"[SpeechOS] Failed to enumerate audio devices:\", error);\n this.audioDevices = [];\n }\n }\n\n private async requestMicPermission(): Promise<void> {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n stream.getTracks().forEach((track) => track.stop());\n this.permissionGranted = true;\n await this.loadAudioDevices();\n } catch (error) {\n console.error(\"[SpeechOS] Microphone permission denied:\", error);\n }\n }\n\n private async startMicPreview(): Promise<void> {\n if (!this.permissionGranted) {\n await this.requestMicPermission();\n }\n if (this.permissionGranted) {\n this.isTestingMic = true;\n }\n }\n\n private showSaved(): void {\n this.showSavedIndicator = true;\n if (this.savedIndicatorTimeout) {\n clearTimeout(this.savedIndicatorTimeout);\n }\n this.savedIndicatorTimeout = setTimeout(() => {\n this.showSavedIndicator = false;\n }, 2000);\n }\n\n private handleInputLanguageChange(event: Event): void {\n const select = event.target as HTMLSelectElement;\n this.selectedInputLanguageCode = select.value;\n setInputLanguageCode(this.selectedInputLanguageCode);\n this.showSaved();\n }\n\n private handleOutputLanguageChange(event: Event): void {\n const select = event.target as HTMLSelectElement;\n this.selectedOutputLanguageCode = select.value;\n setOutputLanguageCode(this.selectedOutputLanguageCode);\n this.showSaved();\n }\n\n private handleDeviceChange(event: Event): void {\n const select = event.target as HTMLSelectElement;\n this.selectedDeviceId = select.value;\n setAudioDeviceId(this.selectedDeviceId);\n this.showSaved();\n\n if (this.isTestingMic) {\n this.isTestingMic = false;\n requestAnimationFrame(() => {\n this.isTestingMic = true;\n });\n }\n }\n\n private handleSmartFormatToggle(): void {\n this.smartFormatEnabled = !this.smartFormatEnabled;\n setSmartFormatEnabled(this.smartFormatEnabled);\n this.showSaved();\n }\n\n private renderLanguageSelector(\n selectedCode: string,\n onChange: (event: Event) => void\n ) {\n return html`\n <div class=\"settings-select-wrapper\">\n <select\n class=\"settings-select\"\n .value=\"${selectedCode}\"\n @change=\"${onChange}\"\n >\n ${SUPPORTED_LANGUAGES.map(\n (lang) => html`\n <option\n value=\"${lang.code}\"\n ?selected=\"${lang.code === selectedCode}\"\n >\n ${lang.name}\n </option>\n `\n )}\n </select>\n <div class=\"settings-select-arrow\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n </div>\n `;\n }\n\n private renderDeviceSelector() {\n return html`\n <div class=\"settings-select-wrapper\">\n <select\n class=\"settings-select\"\n .value=\"${this.selectedDeviceId}\"\n @change=\"${this.handleDeviceChange}\"\n >\n <option value=\"\">System Default</option>\n ${this.audioDevices.map(\n (device) => html`\n <option value=\"${device.deviceId}\">\n ${device.label || `Microphone ${device.deviceId.slice(0, 8)}`}\n </option>\n `\n )}\n </select>\n <div class=\"settings-select-arrow\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n </div>\n `;\n }\n\n private renderPermissionRequest() {\n return html`\n <div class=\"settings-select-wrapper\">\n <select class=\"settings-select\" disabled>\n <option>Requesting microphone access...</option>\n </select>\n <div class=\"settings-select-arrow\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n </div>\n <p class=\"settings-permission-note\">\n Please allow microphone access in your browser to see available devices.\n </p>\n `;\n }\n\n render() {\n return html`\n <div class=\"settings-section\">\n <div class=\"settings-section-header\">\n <span class=\"settings-section-icon\">${micIcon(18)}</span>\n <span class=\"settings-section-title\">Microphone</span>\n <span\n class=\"settings-saved-indicator ${this.showSavedIndicator\n ? \"visible\"\n : \"\"}\"\n >\n Saved\n </span>\n </div>\n <div class=\"settings-section-description\">\n Choose which microphone to use for dictation and editing.\n </div>\n ${this.permissionGranted\n ? html`\n <div class=\"settings-mic-row\">\n ${this.renderDeviceSelector()}\n <speechos-audio-level-meter\n ?active=\"${this.isTestingMic}\"\n deviceId=\"${this.selectedDeviceId}\"\n ></speechos-audio-level-meter>\n </div>\n `\n : this.renderPermissionRequest()}\n </div>\n\n <div class=\"settings-section\">\n <div class=\"settings-section-header\">\n <span class=\"settings-section-icon\">${sparklesIcon(18)}</span>\n <span class=\"settings-section-title\">Smart Format</span>\n </div>\n <div class=\"settings-section-description\">\n AI automatically removes filler words, adds punctuation, and polishes\n your text. Disable for raw transcription output. Note: disabling also\n turns off text snippets.\n </div>\n <div class=\"settings-toggle-row\">\n <span class=\"settings-toggle-label\">Enable AI formatting</span>\n <div\n class=\"settings-toggle ${this.smartFormatEnabled ? \"active\" : \"\"}\"\n @click=\"${this.handleSmartFormatToggle}\"\n role=\"switch\"\n aria-checked=\"${this.smartFormatEnabled}\"\n tabindex=\"0\"\n @keydown=\"${(e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n this.handleSmartFormatToggle();\n }\n }}\"\n >\n <div class=\"settings-toggle-knob\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"settings-section\">\n <div class=\"settings-section-header\">\n <span class=\"settings-section-icon\">${globeIcon(18)}</span>\n <span class=\"settings-section-title\">Input Language</span>\n </div>\n <div class=\"settings-section-description\">\n The language you'll be speaking. This helps improve transcription\n accuracy.\n </div>\n ${this.renderLanguageSelector(\n this.selectedInputLanguageCode,\n this.handleInputLanguageChange.bind(this)\n )}\n </div>\n\n <div class=\"settings-section\">\n <div class=\"settings-section-header\">\n <span class=\"settings-section-icon\">${globeIcon(18)}</span>\n <span class=\"settings-section-title\">Output Language</span>\n </div>\n <div class=\"settings-section-description\">\n The language for your transcribed text. Usually the same as input, but\n can differ for translation.\n </div>\n ${this.renderLanguageSelector(\n this.selectedOutputLanguageCode,\n this.handleOutputLanguageChange.bind(this)\n )}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-settings-tab\": SpeechOSSettingsTab;\n }\n}\n","/**\n * Snippets tab component - Manage text snippets that expand from trigger phrases\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { themeStyles } from \"../styles/theme.js\";\nimport { tabContentStyles, formStyles } from \"../styles/modal-styles.js\";\nimport { scissorsIcon, plusIcon, xIcon, infoIcon, editIcon } from \"../icons.js\";\nimport { snippetsStore, type Snippet } from \"../../stores/snippets-store.js\";\n\n@customElement(\"speechos-snippets-tab\")\nexport class SpeechOSSnippetsTab extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n tabContentStyles,\n formStyles,\n css`\n :host {\n display: block;\n }\n\n .snippet-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .snippet-item {\n background: rgba(255, 255, 255, 0.04);\n border: 1px solid rgba(255, 255, 255, 0.06);\n border-radius: 10px;\n padding: 14px;\n transition: all 0.15s ease;\n position: relative;\n }\n\n .snippet-item:hover {\n background: rgba(255, 255, 255, 0.06);\n border-color: rgba(255, 255, 255, 0.1);\n }\n\n .snippet-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n }\n\n .snippet-trigger-text {\n font-size: 14px;\n font-weight: 600;\n color: #34d399;\n }\n\n .snippet-trigger-text::before {\n content: '\"';\n opacity: 0.6;\n }\n\n .snippet-trigger-text::after {\n content: '\"';\n opacity: 0.6;\n }\n\n .snippet-expansion {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 13px;\n color: rgba(255, 255, 255, 0.65);\n line-height: 1.5;\n }\n\n .snippet-expansion-arrow {\n color: rgba(255, 255, 255, 0.3);\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .snippet-expansion-text {\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .snippet-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .edit-btn {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: transparent;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: rgba(255, 255, 255, 0.4);\n transition: all 0.15s ease;\n }\n\n .edit-btn:hover {\n background: rgba(52, 211, 153, 0.15);\n color: #34d399;\n }\n `,\n ];\n\n @state()\n private snippets: Snippet[] = [];\n\n @state()\n private showForm: boolean = false;\n\n @state()\n private editingId: string | null = null;\n\n @state()\n private trigger: string = \"\";\n\n @state()\n private expansion: string = \"\";\n\n @state()\n private error: string = \"\";\n\n connectedCallback(): void {\n super.connectedCallback();\n this.loadSnippets();\n }\n\n /** Reload snippets from store */\n refresh(): void {\n this.loadSnippets();\n }\n\n /** Reset form state */\n resetForm(): void {\n this.showForm = false;\n this.editingId = null;\n this.trigger = \"\";\n this.expansion = \"\";\n this.error = \"\";\n }\n\n private loadSnippets(): void {\n this.snippets = snippetsStore.getSnippets();\n }\n\n private handleAddClick(): void {\n this.editingId = null;\n this.trigger = \"\";\n this.expansion = \"\";\n this.showForm = true;\n this.error = \"\";\n }\n\n private handleEditClick(snippet: Snippet): void {\n this.editingId = snippet.id;\n this.trigger = snippet.trigger;\n this.expansion = snippet.expansion;\n this.showForm = true;\n this.error = \"\";\n }\n\n private handleCancel(): void {\n this.resetForm();\n }\n\n private handleTriggerInput(e: Event): void {\n const input = e.target as HTMLInputElement;\n this.trigger = input.value;\n this.error = \"\";\n }\n\n private handleExpansionInput(e: Event): void {\n const textarea = e.target as HTMLTextAreaElement;\n this.expansion = textarea.value;\n this.error = \"\";\n }\n\n private handleSave(): void {\n const result = this.editingId\n ? snippetsStore.updateSnippet(this.editingId, this.trigger, this.expansion)\n : snippetsStore.addSnippet(this.trigger, this.expansion);\n\n if (result.success) {\n this.loadSnippets();\n this.resetForm();\n } else {\n this.error = result.error.message;\n }\n }\n\n private handleDelete(id: string): void {\n snippetsStore.deleteSnippet(id);\n this.loadSnippets();\n }\n\n private renderForm() {\n const triggerLength = this.trigger.length;\n const expansionLength = this.expansion.length;\n const canSave =\n triggerLength > 0 &&\n triggerLength <= 30 &&\n expansionLength > 0 &&\n expansionLength <= 300;\n\n return html`\n <div class=\"add-form\">\n <div class=\"form-group\">\n <label class=\"form-label\">Trigger phrase</label>\n <input\n type=\"text\"\n class=\"form-input ${this.error && this.error.includes(\"trigger\")\n ? \"error\"\n : \"\"}\"\n placeholder=\"e.g., my email\"\n .value=\"${this.trigger}\"\n @input=\"${this.handleTriggerInput}\"\n maxlength=\"30\"\n />\n <div class=\"form-footer\">\n <span\n class=\"char-count ${triggerLength > 25\n ? \"warning\"\n : \"\"} ${triggerLength > 30 ? \"error\" : \"\"}\"\n >\n ${triggerLength}/30\n </span>\n </div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Expands to</label>\n <textarea\n class=\"form-input ${this.error && this.error.includes(\"Expansion\")\n ? \"error\"\n : \"\"}\"\n placeholder=\"e.g., john.smith@company.com\"\n .value=\"${this.expansion}\"\n @input=\"${this.handleExpansionInput}\"\n maxlength=\"300\"\n ></textarea>\n <div class=\"form-footer\">\n <span\n class=\"char-count ${expansionLength > 250\n ? \"warning\"\n : \"\"} ${expansionLength > 300 ? \"error\" : \"\"}\"\n >\n ${expansionLength}/300\n </span>\n </div>\n </div>\n\n ${this.error ? html`<div class=\"form-error\">${this.error}</div>` : \"\"}\n\n <div class=\"form-actions\">\n <button class=\"form-btn cancel\" @click=\"${this.handleCancel}\">\n Cancel\n </button>\n <button\n class=\"form-btn save\"\n ?disabled=\"${!canSave}\"\n @click=\"${this.handleSave}\"\n >\n ${this.editingId ? \"Update Snippet\" : \"Save Snippet\"}\n </button>\n </div>\n </div>\n `;\n }\n\n render() {\n const count = snippetsStore.getSnippetCount();\n const atLimit = snippetsStore.isAtSnippetLimit();\n\n return html`\n <div class=\"section-header\">\n <h3 class=\"section-title\">Text Snippets</h3>\n <p class=\"section-description\">\n Say a trigger phrase to instantly insert saved text. Perfect for\n signatures, addresses, and templates you use often.\n </p>\n </div>\n\n ${atLimit\n ? html`\n <div class=\"limit-warning\">\n <span class=\"limit-warning-icon\">${infoIcon(16)}</span>\n <span class=\"limit-warning-text\">\n You've reached the ${count.max} snippet limit. Delete unused\n snippets to add more.\n </span>\n </div>\n `\n : \"\"}\n ${this.showForm ? this.renderForm() : \"\"}\n\n <div class=\"action-row\">\n <button\n class=\"add-button\"\n ?disabled=\"${atLimit || this.showForm}\"\n @click=\"${this.handleAddClick}\"\n >\n ${plusIcon(14)} Add Snippet\n </button>\n <span class=\"count-badge\">${count.current}/${count.max} used</span>\n </div>\n\n ${this.snippets.length === 0\n ? html`\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">${scissorsIcon(44)}</div>\n <div class=\"empty-state-title\">No snippets yet</div>\n <div class=\"empty-state-text\">\n Add your first snippet to speed up your dictation.\n </div>\n </div>\n `\n : html`\n <div class=\"snippet-list\">\n ${this.snippets.map(\n (s) => html`\n <div class=\"snippet-item\">\n <div class=\"snippet-trigger\">\n <span class=\"snippet-trigger-text\">${s.trigger}</span>\n <div class=\"snippet-actions\">\n <button\n class=\"edit-btn\"\n @click=\"${() => this.handleEditClick(s)}\"\n title=\"Edit snippet\"\n >\n ${editIcon(14)}\n </button>\n <button\n class=\"delete-btn\"\n @click=\"${() => this.handleDelete(s.id)}\"\n title=\"Delete snippet\"\n >\n ${xIcon(14)}\n </button>\n </div>\n </div>\n <div class=\"snippet-expansion\">\n <span class=\"snippet-expansion-arrow\">→</span>\n <span class=\"snippet-expansion-text\">${s.expansion}</span>\n </div>\n </div>\n `\n )}\n </div>\n `}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-snippets-tab\": SpeechOSSnippetsTab;\n }\n}\n","/**\n * Vocabulary tab component - Manage custom vocabulary terms for transcription accuracy\n */\n\nimport { LitElement, html, css, type CSSResultGroup } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { themeStyles } from \"../styles/theme.js\";\nimport { tabContentStyles, formStyles } from \"../styles/modal-styles.js\";\nimport { bookOpenIcon, plusIcon, xIcon, infoIcon } from \"../icons.js\";\nimport { vocabularyStore, type VocabularyTerm } from \"../../stores/vocabulary-store.js\";\n\n@customElement(\"speechos-vocabulary-tab\")\nexport class SpeechOSVocabularyTab extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n tabContentStyles,\n formStyles,\n css`\n :host {\n display: block;\n }\n\n .vocabulary-grid {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .vocabulary-chip {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: rgba(139, 92, 246, 0.1);\n border: 1px solid rgba(139, 92, 246, 0.2);\n border-radius: 8px;\n transition: all 0.15s ease;\n }\n\n .vocabulary-chip:hover {\n background: rgba(139, 92, 246, 0.15);\n border-color: rgba(139, 92, 246, 0.3);\n }\n\n .vocabulary-chip-text {\n font-size: 13px;\n font-weight: 500;\n color: #c4b5fd;\n }\n\n .vocabulary-chip .delete-btn {\n width: 20px;\n height: 20px;\n margin: -4px -4px -4px 0;\n }\n\n .vocabulary-chip .delete-btn:hover {\n background: rgba(239, 68, 68, 0.2);\n }\n `,\n ];\n\n @state()\n private vocabulary: VocabularyTerm[] = [];\n\n @state()\n private showForm: boolean = false;\n\n @state()\n private term: string = \"\";\n\n @state()\n private error: string = \"\";\n\n connectedCallback(): void {\n super.connectedCallback();\n this.loadVocabulary();\n }\n\n /** Reload vocabulary from store */\n refresh(): void {\n this.loadVocabulary();\n }\n\n /** Reset form state */\n resetForm(): void {\n this.showForm = false;\n this.term = \"\";\n this.error = \"\";\n }\n\n private loadVocabulary(): void {\n this.vocabulary = vocabularyStore.getVocabulary();\n }\n\n private handleAddClick(): void {\n this.showForm = true;\n this.error = \"\";\n }\n\n private handleCancel(): void {\n this.resetForm();\n }\n\n private handleTermInput(e: Event): void {\n const input = e.target as HTMLInputElement;\n this.term = input.value;\n this.error = \"\";\n }\n\n private handleSave(): void {\n const result = vocabularyStore.addTerm(this.term);\n\n if (result.success) {\n this.loadVocabulary();\n this.resetForm();\n } else {\n this.error = result.error.message;\n }\n }\n\n private handleDelete(id: string): void {\n vocabularyStore.deleteTerm(id);\n this.loadVocabulary();\n }\n\n private renderForm() {\n const termLength = this.term.length;\n const canSave = termLength > 0 && termLength <= 50;\n\n return html`\n <div class=\"add-form\">\n <div class=\"form-group\">\n <label class=\"form-label\">Term</label>\n <input\n type=\"text\"\n class=\"form-input ${this.error ? \"error\" : \"\"}\"\n placeholder=\"e.g., Kubernetes\"\n .value=\"${this.term}\"\n @input=\"${this.handleTermInput}\"\n maxlength=\"50\"\n />\n <div class=\"form-footer\">\n <span\n class=\"char-count ${termLength > 40\n ? \"warning\"\n : \"\"} ${termLength > 50 ? \"error\" : \"\"}\"\n >\n ${termLength}/50\n </span>\n </div>\n </div>\n\n ${this.error ? html`<div class=\"form-error\">${this.error}</div>` : \"\"}\n\n <div class=\"form-actions\">\n <button class=\"form-btn cancel\" @click=\"${this.handleCancel}\">\n Cancel\n </button>\n <button\n class=\"form-btn save\"\n ?disabled=\"${!canSave}\"\n @click=\"${this.handleSave}\"\n >\n Add Term\n </button>\n </div>\n </div>\n `;\n }\n\n render() {\n const count = vocabularyStore.getVocabularyCount();\n const atLimit = vocabularyStore.isAtVocabularyLimit();\n\n return html`\n <div class=\"section-header\">\n <h3 class=\"section-title\">Custom Vocabulary</h3>\n <p class=\"section-description\">\n Add technical terms, names, or jargon to ensure they're always\n transcribed accurately.\n </p>\n </div>\n\n ${atLimit\n ? html`\n <div class=\"limit-warning\">\n <span class=\"limit-warning-icon\">${infoIcon(16)}</span>\n <span class=\"limit-warning-text\">\n You've reached the ${count.max} term limit. Remove unused terms\n to add more.\n </span>\n </div>\n `\n : \"\"}\n ${this.showForm ? this.renderForm() : \"\"}\n\n <div class=\"action-row\">\n <button\n class=\"add-button\"\n ?disabled=\"${atLimit || this.showForm}\"\n @click=\"${this.handleAddClick}\"\n >\n ${plusIcon(14)} Add Term\n </button>\n <span class=\"count-badge\">${count.current}/${count.max} used</span>\n </div>\n\n ${this.vocabulary.length === 0\n ? html`\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">${bookOpenIcon(44)}</div>\n <div class=\"empty-state-title\">No custom terms yet</div>\n <div class=\"empty-state-text\">\n Add words that are unique to your work.\n </div>\n </div>\n `\n : html`\n <div class=\"vocabulary-grid\">\n ${this.vocabulary.map(\n (v) => html`\n <div class=\"vocabulary-chip\">\n <span class=\"vocabulary-chip-text\">${v.term}</span>\n <button\n class=\"delete-btn\"\n @click=\"${() => this.handleDelete(v.id)}\"\n title=\"Remove term\"\n >\n ${xIcon(12)}\n </button>\n </div>\n `\n )}\n </div>\n `}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-vocabulary-tab\": SpeechOSVocabularyTab;\n }\n}\n","/**\n * Settings modal component\n * Main orchestrator for the settings modal with sidebar navigation\n */\n\nimport { LitElement, html, type CSSResultGroup } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { themeStyles } from \"./styles/theme.js\";\nimport { modalLayoutStyles } from \"./styles/modal-styles.js\";\nimport {\n xIcon,\n clipboardIcon,\n helpCircleIcon,\n infoIcon,\n settingsIcon,\n scissorsIcon,\n bookOpenIcon,\n} from \"./icons.js\";\n\n// Import tab components\nimport \"./tabs/history-tab.js\";\nimport \"./tabs/help-tab.js\";\nimport \"./tabs/about-tab.js\";\nimport \"./tabs/settings-tab.js\";\nimport \"./tabs/snippets-tab.js\";\nimport \"./tabs/vocabulary-tab.js\";\n\ntype TabId =\n | \"transcripts\"\n | \"help\"\n | \"about\"\n | \"settings\"\n | \"snippets\"\n | \"vocabulary\";\n\ninterface Tab {\n id: TabId;\n label: string;\n icon: ReturnType<typeof clipboardIcon>;\n}\n\n@customElement(\"speechos-settings-modal\")\nexport class SpeechOSSettingsModal extends LitElement {\n static styles: CSSResultGroup = [themeStyles, modalLayoutStyles];\n\n @property({ type: Boolean })\n open = false;\n\n @state()\n private activeTab: TabId = \"settings\";\n\n private mainTabs: Tab[] = [\n { id: \"settings\", label: \"Settings\", icon: settingsIcon(18) },\n { id: \"transcripts\", label: \"History\", icon: clipboardIcon(18) },\n { id: \"vocabulary\", label: \"Vocab\", icon: bookOpenIcon(18) },\n { id: \"snippets\", label: \"Snippets\", icon: scissorsIcon(18) },\n { id: \"help\", label: \"Help\", icon: helpCircleIcon(18) },\n ];\n\n private bottomTabs: Tab[] = [\n { id: \"about\", label: \"About\", icon: infoIcon(18) },\n ];\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(\"open\")) {\n if (this.open) {\n this.refreshActiveTab();\n } else {\n this.resetTabs();\n }\n }\n }\n\n private refreshActiveTab(): void {\n const tab = this.getTabElement();\n if (tab && \"refresh\" in tab) {\n (tab as { refresh: () => void }).refresh();\n }\n if (tab && \"activate\" in tab) {\n (tab as { activate: () => void }).activate();\n }\n }\n\n private resetTabs(): void {\n // Reset form states in tabs that have forms\n const snippetsTab = this.shadowRoot?.querySelector(\"speechos-snippets-tab\");\n const vocabTab = this.shadowRoot?.querySelector(\"speechos-vocabulary-tab\");\n const settingsTab = this.shadowRoot?.querySelector(\"speechos-settings-tab\");\n\n if (snippetsTab && \"resetForm\" in snippetsTab) {\n (snippetsTab as { resetForm: () => void }).resetForm();\n }\n if (vocabTab && \"resetForm\" in vocabTab) {\n (vocabTab as { resetForm: () => void }).resetForm();\n }\n if (settingsTab && \"deactivate\" in settingsTab) {\n (settingsTab as { deactivate: () => void }).deactivate();\n }\n }\n\n private getTabElement(): Element | null {\n const selectors: Record<TabId, string> = {\n transcripts: \"speechos-history-tab\",\n help: \"speechos-help-tab\",\n about: \"speechos-about-tab\",\n settings: \"speechos-settings-tab\",\n snippets: \"speechos-snippets-tab\",\n vocabulary: \"speechos-vocabulary-tab\",\n };\n return this.shadowRoot?.querySelector(selectors[this.activeTab]) ?? null;\n }\n\n private handleOverlayClick(e: Event): void {\n if (e.target === e.currentTarget) {\n this.close();\n }\n }\n\n private handleClose(): void {\n this.close();\n }\n\n private close(): void {\n this.dispatchEvent(\n new CustomEvent(\"modal-close\", {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private handleTabClick(tabId: TabId): void {\n // Deactivate current tab if it has deactivate method\n const currentTab = this.getTabElement();\n if (currentTab && \"deactivate\" in currentTab) {\n (currentTab as { deactivate: () => void }).deactivate();\n }\n\n this.activeTab = tabId;\n\n // Use requestUpdate to ensure the tab is rendered before activating\n this.updateComplete.then(() => {\n this.refreshActiveTab();\n });\n }\n\n private renderTabContent() {\n switch (this.activeTab) {\n case \"transcripts\":\n return html`<speechos-history-tab></speechos-history-tab>`;\n case \"help\":\n return html`<speechos-help-tab></speechos-help-tab>`;\n case \"about\":\n return html`<speechos-about-tab></speechos-about-tab>`;\n case \"settings\":\n return html`<speechos-settings-tab></speechos-settings-tab>`;\n case \"snippets\":\n return html`<speechos-snippets-tab></speechos-snippets-tab>`;\n case \"vocabulary\":\n return html`<speechos-vocabulary-tab></speechos-vocabulary-tab>`;\n }\n }\n\n render() {\n return html`\n <div\n class=\"modal-overlay ${this.open ? \"open\" : \"\"}\"\n @click=\"${this.handleOverlayClick}\"\n >\n <div class=\"modal\">\n <div class=\"modal-header\">\n <div class=\"modal-logo\">\n <div class=\"logo-icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z\"\n />\n </svg>\n </div>\n <span class=\"logo-text\"\n >Speech<span class=\"logo-os\">OS</span></span\n >\n </div>\n <button\n class=\"close-button\"\n @click=\"${this.handleClose}\"\n aria-label=\"Close\"\n >\n ${xIcon(16)}\n </button>\n </div>\n\n <div class=\"modal-body\">\n <nav class=\"sidebar\">\n ${this.mainTabs.map(\n (tab) => html`\n <button\n class=\"sidebar-item ${this.activeTab === tab.id\n ? \"active\"\n : \"\"}\"\n @click=\"${() => this.handleTabClick(tab.id)}\"\n >\n ${tab.icon}\n <span class=\"sidebar-label\">${tab.label}</span>\n </button>\n `\n )}\n <div class=\"sidebar-spacer\"></div>\n ${this.bottomTabs.map(\n (tab) => html`\n <button\n class=\"sidebar-item ${this.activeTab === tab.id\n ? \"active\"\n : \"\"}\"\n @click=\"${() => this.handleTabClick(tab.id)}\"\n >\n ${tab.icon}\n <span class=\"sidebar-label\">${tab.label}</span>\n </button>\n `\n )}\n </nav>\n\n <div class=\"modal-content\">${this.renderTabContent()}</div>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-settings-modal\": SpeechOSSettingsModal;\n }\n}\n","/**\n * Main widget container component\n * Composes mic button and action bubbles with state management\n */\n\nimport {\n LitElement,\n html,\n css,\n type CSSResultGroup,\n type TemplateResult,\n} from \"lit\";\nimport { customElement, state as litState } from \"lit/decorators.js\";\nimport { themeStyles, animations } from \"./styles/theme.js\";\nimport {\n state,\n events,\n getConfig,\n getBackend,\n type SpeechOSState,\n type UnsubscribeFn,\n type CommandResult,\n type SpeechOSEventMap,\n} from \"@speechos/core\";\nimport { getClientConfig } from \"../config.js\";\nimport { getSessionSettings } from \"../speechos.js\";\nimport { transcriptStore } from \"../stores/transcript-store.js\";\n\n// Import child components\nimport \"./mic-button.js\";\nimport \"./action-bubbles.js\";\nimport \"./settings-button.js\";\nimport \"./settings-modal.js\";\n\n/**\n * Minimum duration to show the connecting animation (in milliseconds).\n * Since mic capture starts almost instantly, we enforce a minimum animation\n * duration so users can see the visual feedback before transitioning to recording.\n */\nconst MIN_CONNECTING_ANIMATION_MS = 200;\n\n@customElement(\"speechos-widget\")\nexport class SpeechOSWidget extends LitElement {\n static styles: CSSResultGroup = [\n themeStyles,\n animations,\n css`\n :host {\n position: fixed;\n bottom: var(--speechos-spacing-md); /* 12px - same as spacing above */\n z-index: var(--speechos-z-base);\n pointer-events: none;\n }\n\n :host {\n left: 50%;\n transform: translateX(-50%);\n }\n\n :host(.custom-position) {\n right: unset;\n left: unset;\n transform: none;\n }\n\n :host(.anchored-to-element) {\n position: absolute;\n bottom: unset;\n right: unset;\n left: unset;\n transform: translateX(-50%);\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .widget-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n pointer-events: auto;\n animation: speechos-fadeIn var(--speechos-transition-base);\n cursor: grab;\n position: relative;\n }\n\n .widget-container:active {\n cursor: grabbing;\n }\n\n .widget-container.hiding {\n animation: speechos-fadeOut var(--speechos-transition-base);\n }\n\n .mic-row {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .settings-button-container {\n position: absolute;\n left: -44px;\n top: 50%;\n transform: translateY(-50%);\n }\n\n /* Mobile styles - adjust positioning for larger elements */\n @media (max-width: 768px) and (hover: none) {\n .settings-button-container {\n left: -56px;\n }\n }\n `,\n ];\n\n @litState()\n private widgetState: SpeechOSState = state.getState();\n\n @litState()\n private settingsOpen = false;\n\n private stateUnsubscribe?: UnsubscribeFn;\n private errorEventUnsubscribe?: UnsubscribeFn;\n private dictationTargetElement: HTMLElement | null = null;\n private editTargetElement: HTMLElement | null = null;\n private dictationCursorStart: number | null = null;\n private dictationCursorEnd: number | null = null;\n private editSelectionStart: number | null = null;\n private editSelectionEnd: number | null = null;\n private editSelectedText: string = \"\";\n private boundClickOutsideHandler: ((event: MouseEvent) => void) | null = null;\n private modalElement: HTMLElement | null = null;\n private customPosition: { x: number; y: number } | null = null;\n private isDragging = false;\n private dragStartPos: { x: number; y: number } | null = null;\n private dragOffset = { x: 0, y: 0 };\n private boundDragMove: ((e: MouseEvent) => void) | null = null;\n private boundDragEnd: (() => void) | null = null;\n private static readonly DRAG_THRESHOLD = 5;\n private suppressNextClick = false;\n private boundViewportResizeHandler: (() => void) | null = null;\n private boundScrollHandler: (() => void) | null = null;\n private static readonly KEYBOARD_HEIGHT_THRESHOLD = 150;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.modalElement = document.createElement(\"speechos-settings-modal\");\n this.modalElement.addEventListener(\"modal-close\", () => {\n this.settingsOpen = false;\n });\n document.body.appendChild(this.modalElement);\n\n this.stateUnsubscribe = state.subscribe((newState: SpeechOSState) => {\n if (!newState.isVisible || !newState.isExpanded) {\n this.settingsOpen = false;\n }\n // Clear custom position when focused element changes (re-anchor to new element)\n if (newState.focusedElement !== this.widgetState.focusedElement) {\n this.customPosition = null;\n this.classList.remove(\"custom-position\");\n }\n this.widgetState = newState;\n this.updatePosition();\n });\n\n this.errorEventUnsubscribe = events.on(\"error\", (payload: SpeechOSEventMap[\"error\"]) => {\n if (\n this.widgetState.recordingState !== \"idle\" &&\n this.widgetState.recordingState !== \"error\"\n ) {\n state.setError(payload.message);\n getBackend().disconnect().catch(() => {});\n }\n });\n\n this.updatePosition();\n this.boundClickOutsideHandler = this.handleClickOutside.bind(this);\n document.addEventListener(\"click\", this.boundClickOutsideHandler, true);\n\n // Setup visual viewport listener for mobile keyboard handling\n if (window.visualViewport) {\n this.boundViewportResizeHandler = this.handleViewportResize.bind(this);\n window.visualViewport.addEventListener(\n \"resize\",\n this.boundViewportResizeHandler\n );\n }\n\n // Setup scroll listener to update anchored position\n this.boundScrollHandler = this.handleScroll.bind(this);\n window.addEventListener(\"scroll\", this.boundScrollHandler, {\n passive: true,\n });\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.modalElement) {\n this.modalElement.remove();\n this.modalElement = null;\n }\n if (this.stateUnsubscribe) {\n this.stateUnsubscribe();\n }\n if (this.errorEventUnsubscribe) {\n this.errorEventUnsubscribe();\n }\n if (this.boundClickOutsideHandler) {\n document.removeEventListener(\n \"click\",\n this.boundClickOutsideHandler,\n true\n );\n this.boundClickOutsideHandler = null;\n }\n if (this.boundDragMove) {\n document.removeEventListener(\"mousemove\", this.boundDragMove);\n this.boundDragMove = null;\n }\n if (this.boundDragEnd) {\n document.removeEventListener(\"mouseup\", this.boundDragEnd);\n this.boundDragEnd = null;\n }\n if (this.boundViewportResizeHandler && window.visualViewport) {\n window.visualViewport.removeEventListener(\n \"resize\",\n this.boundViewportResizeHandler\n );\n this.boundViewportResizeHandler = null;\n }\n if (this.boundScrollHandler) {\n window.removeEventListener(\"scroll\", this.boundScrollHandler);\n this.boundScrollHandler = null;\n }\n }\n\n updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(\"settingsOpen\") && this.modalElement) {\n (this.modalElement as any).open = this.settingsOpen;\n }\n }\n\n private handleClickOutside(event: MouseEvent): void {\n const target = event.target as Node;\n\n // Check if clicked element or ancestor has no-close attribute (before any other checks)\n const hasNoCloseAttr =\n target instanceof Element && target.closest(\"[data-speechos-no-close]\");\n console.log(\"[SpeechOS] handleClickOutside called\", {\n isExpanded: this.widgetState.isExpanded,\n recordingState: this.widgetState.recordingState,\n target: event.target,\n hasNoCloseAttr: !!hasNoCloseAttr,\n });\n if (hasNoCloseAttr) {\n console.log(\"[SpeechOS] Skipping due to data-speechos-no-close\");\n return;\n }\n\n if (\n !this.widgetState.isExpanded ||\n this.widgetState.recordingState !== \"idle\"\n ) {\n console.log(\"[SpeechOS] Early return - not expanded or not idle\");\n return;\n }\n\n const composedPath = event.composedPath ? event.composedPath() : [];\n const clickedInWidget =\n this.contains(target) || composedPath.includes(this);\n const clickedInModal =\n this.modalElement &&\n (this.modalElement.contains(target) ||\n composedPath.includes(this.modalElement));\n if (this.settingsOpen && clickedInModal) {\n return;\n }\n if (this.settingsOpen && !clickedInModal) {\n this.settingsOpen = false;\n return;\n }\n if (!clickedInWidget && this.isFormField(target as Element)) {\n state.setFocusedElement(target as HTMLElement);\n return;\n }\n if (!clickedInWidget) {\n getBackend().stopAutoRefresh?.();\n state.hide();\n }\n }\n\n private isFormField(element: Element | null): element is HTMLElement {\n if (!element || !(element instanceof HTMLElement)) {\n return false;\n }\n const tagName = element.tagName.toLowerCase();\n if (tagName === \"input\" || tagName === \"textarea\") {\n if (tagName === \"input\") {\n const type = (element as HTMLInputElement).type.toLowerCase();\n const excludedTypes = [\n \"checkbox\",\n \"radio\",\n \"submit\",\n \"button\",\n \"reset\",\n \"file\",\n \"hidden\",\n ];\n if (excludedTypes.includes(type)) {\n return false;\n }\n }\n return true;\n }\n if (\n element.isContentEditable ||\n element.getAttribute(\"contenteditable\") === \"true\"\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Check if the device is likely a mobile/touch device\n */\n private isMobileDevice(): boolean {\n // Check for touch support and small screen width\n const hasTouchScreen =\n \"ontouchstart\" in window || navigator.maxTouchPoints > 0;\n const isSmallScreen = window.innerWidth <= 768;\n return hasTouchScreen && isSmallScreen;\n }\n\n private updatePosition(): void {\n const clientConfig = getClientConfig();\n this.style.zIndex = String(clientConfig.zIndex);\n\n // If user has dragged the widget, keep custom position\n if (this.customPosition) {\n return;\n }\n\n const focusedElement = this.widgetState.focusedElement;\n\n // Only anchor to element on mobile devices\n if (focusedElement && this.isMobileDevice()) {\n // Position below the focused element on mobile\n this.positionBelowElement(focusedElement);\n } else {\n // Default fixed position at bottom of screen (desktop or no focused element)\n this.classList.remove(\"anchored-to-element\");\n this.style.top = \"\";\n this.style.left = \"\";\n this.style.bottom = \"12px\";\n }\n }\n\n /**\n * Position the widget below a specific element\n */\n private positionBelowElement(element: HTMLElement): void {\n const rect = element.getBoundingClientRect();\n const widgetHeight = 60; // Approximate widget height\n const gap = 8; // Gap between element and widget\n\n // Calculate position\n const top = rect.bottom + gap + window.scrollY;\n const left = rect.left + rect.width / 2 + window.scrollX;\n\n // Apply anchored positioning\n this.classList.add(\"anchored-to-element\");\n this.removeAttribute(\"position\");\n this.style.top = `${top}px`;\n this.style.left = `${left}px`;\n this.style.bottom = \"\";\n }\n\n /**\n * Handle visual viewport resize (mobile keyboard show/hide)\n * Adjusts widget position to stay above the virtual keyboard\n */\n private handleViewportResize(): void {\n if (!window.visualViewport) return;\n\n // Skip if custom position is set (user dragged the widget)\n if (this.customPosition) return;\n\n // If anchored to an element on mobile, just update position\n if (this.widgetState.focusedElement && this.isMobileDevice()) {\n this.updatePosition();\n return;\n }\n\n const keyboardHeight = window.innerHeight - window.visualViewport.height;\n\n if (keyboardHeight > SpeechOSWidget.KEYBOARD_HEIGHT_THRESHOLD) {\n // Keyboard is visible - move widget above it\n this.style.bottom = `${keyboardHeight + 12}px`;\n } else {\n // Keyboard hidden - restore default position\n this.style.bottom = \"12px\";\n }\n }\n\n /**\n * Handle scroll events to update anchored position\n */\n private handleScroll(): void {\n // Skip if custom position is set, not anchored, or not on mobile\n if (\n this.customPosition ||\n !this.widgetState.focusedElement ||\n !this.isMobileDevice()\n ) {\n return;\n }\n\n this.positionBelowElement(this.widgetState.focusedElement);\n }\n\n private handleMicClick(): void {\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n return;\n }\n if (this.widgetState.recordingState === \"idle\") {\n // If we're expanding, prefetch the token to reduce latency when user selects an action\n if (!this.widgetState.isExpanded) {\n // Fire and forget - we don't need to wait for this (LiveKit only)\n const backend = getBackend();\n backend.prefetchToken?.()?.catch((error: unknown) => {\n // Log but don't show error to user - they haven't started an action yet\n const config = getConfig();\n if (config.debug) {\n console.warn(\"[SpeechOS] Token prefetch failed:\", error);\n }\n });\n } else {\n // Widget is collapsing - stop auto-refresh since user is done with commands\n getBackend().stopAutoRefresh?.();\n }\n state.toggleExpanded();\n }\n }\n\n private async handleStopRecording(): Promise<void> {\n if (this.widgetState.activeAction === \"edit\") {\n await this.handleStopEdit();\n } else if (this.widgetState.activeAction === \"command\") {\n await this.handleStopCommand();\n } else {\n state.stopRecording();\n const config = getConfig();\n const backend = getBackend();\n try {\n const transcription: string = await this.withMinDisplayTime(\n backend.stopVoiceSession(),\n 300\n );\n if (transcription) {\n this.insertTranscription(transcription);\n transcriptStore.saveTranscript(transcription, \"dictate\");\n }\n state.completeRecording();\n events.emit(\"action:select\", { action: \"dictate\" });\n backend.disconnect().catch(() => {});\n // Start auto-refresh to keep token fresh for subsequent commands (LiveKit only)\n backend.startAutoRefresh?.();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to transcribe audio\";\n if (errorMessage !== \"Disconnected\") {\n state.setError(errorMessage);\n backend.disconnect().catch(() => {});\n }\n }\n }\n }\n\n private async handleCancelOperation(): Promise<void> {\n await getBackend().disconnect();\n if (this.widgetState.recordingState === \"error\") {\n state.clearError();\n } else {\n state.cancelRecording();\n }\n this.dictationTargetElement = null;\n this.editTargetElement = null;\n this.dictationCursorStart = null;\n this.dictationCursorEnd = null;\n this.editSelectionStart = null;\n this.editSelectionEnd = null;\n this.editSelectedText = \"\";\n }\n\n private async handleRetryConnection(): Promise<void> {\n const action = this.widgetState.activeAction;\n state.clearError();\n if (action === \"edit\") {\n await this.startEdit();\n } else if (action === \"command\") {\n await this.startCommand();\n } else {\n await this.startDictation();\n }\n }\n\n private handleCloseWidget(): void {\n getBackend().stopAutoRefresh?.();\n state.hide();\n }\n\n private handleSettingsClick(): void {\n this.settingsOpen = true;\n }\n\n private handleDragStart(e: MouseEvent): void {\n if (e.button !== 0) return;\n const composedPath = e.composedPath();\n const isInteractiveElement = composedPath.some((el) => {\n if (!(el instanceof HTMLElement)) return false;\n const tagName = el.tagName.toLowerCase();\n if (\n tagName === \"speechos-action-bubbles\" ||\n tagName === \"speechos-settings-button\"\n ) {\n return true;\n }\n if (tagName === \"button\") {\n const className = el.className || \"\";\n if (!className.includes(\"mic-button\")) {\n return true;\n }\n }\n return false;\n });\n if (isInteractiveElement) return;\n this.dragStartPos = { x: e.clientX, y: e.clientY };\n this.isDragging = false;\n const rect = this.getBoundingClientRect();\n this.dragOffset = {\n x: e.clientX - rect.left - rect.width / 2,\n y: rect.bottom - e.clientY,\n };\n this.boundDragMove = this.handleDragMove.bind(this);\n this.boundDragEnd = this.handleDragEnd.bind(this);\n document.addEventListener(\"mousemove\", this.boundDragMove);\n document.addEventListener(\"mouseup\", this.boundDragEnd);\n }\n\n private handleDragMove(e: MouseEvent): void {\n if (!this.isDragging && this.dragStartPos) {\n const dx = e.clientX - this.dragStartPos.x;\n const dy = e.clientY - this.dragStartPos.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance >= SpeechOSWidget.DRAG_THRESHOLD) {\n this.isDragging = true;\n e.preventDefault();\n } else {\n return;\n }\n }\n if (!this.isDragging) return;\n e.preventDefault();\n this.customPosition = {\n x: e.clientX - this.dragOffset.x,\n y: window.innerHeight - e.clientY - this.dragOffset.y,\n };\n this.applyCustomPosition();\n }\n\n private handleDragEnd(): void {\n if (this.isDragging) {\n this.suppressNextClick = true;\n }\n this.isDragging = false;\n this.dragStartPos = null;\n if (this.boundDragMove) {\n document.removeEventListener(\"mousemove\", this.boundDragMove);\n this.boundDragMove = null;\n }\n if (this.boundDragEnd) {\n document.removeEventListener(\"mouseup\", this.boundDragEnd);\n this.boundDragEnd = null;\n }\n }\n\n private applyCustomPosition(): void {\n if (this.customPosition) {\n this.classList.add(\"custom-position\");\n this.style.left = `${this.customPosition.x}px`;\n this.style.bottom = `${this.customPosition.y}px`;\n }\n }\n\n private insertTranscription(text: string): void {\n const target = this.dictationTargetElement;\n if (!target) {\n return;\n }\n const tagName = target.tagName.toLowerCase();\n if (tagName === \"input\" || tagName === \"textarea\") {\n const inputEl = target as HTMLInputElement | HTMLTextAreaElement;\n const start = this.dictationCursorStart ?? inputEl.value.length;\n const end = this.dictationCursorEnd ?? inputEl.value.length;\n const before = inputEl.value.substring(0, start);\n const after = inputEl.value.substring(end);\n inputEl.value = before + text + after;\n if (this.supportsSelection(inputEl)) {\n const newCursorPos = start + text.length;\n inputEl.setSelectionRange(newCursorPos, newCursorPos);\n }\n inputEl.dispatchEvent(new Event(\"input\", { bubbles: true }));\n inputEl.focus();\n state.setFocusedElement(inputEl);\n } else if (target.isContentEditable) {\n target.focus();\n state.setFocusedElement(target);\n const textNode = document.createTextNode(text);\n target.appendChild(textNode);\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(textNode);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n events.emit(\"transcription:inserted\", { text, element: target });\n this.dictationTargetElement = null;\n this.dictationCursorStart = null;\n this.dictationCursorEnd = null;\n }\n\n private handleActionSelect(event: CustomEvent): void {\n const { action } = event.detail;\n state.setActiveAction(action);\n if (action === \"dictate\") {\n this.startDictation();\n } else if (action === \"edit\") {\n this.startEdit();\n } else if (action === \"command\") {\n this.startCommand();\n } else {\n setTimeout(() => {\n state.setState({ isExpanded: false, activeAction: null });\n }, 300);\n }\n }\n\n private async withMinDisplayTime<T>(\n operation: Promise<T>,\n minTime: number\n ): Promise<T> {\n const [result] = await Promise.all([\n operation,\n new Promise((resolve) => setTimeout(resolve, minTime)),\n ]);\n return result;\n }\n\n private async startDictation(): Promise<void> {\n this.dictationTargetElement = this.widgetState.focusedElement;\n this.dictationCursorStart = null;\n this.dictationCursorEnd = null;\n if (this.dictationTargetElement) {\n const tagName = this.dictationTargetElement.tagName.toLowerCase();\n if (tagName === \"input\" || tagName === \"textarea\") {\n const inputEl = this.dictationTargetElement as\n | HTMLInputElement\n | HTMLTextAreaElement;\n if (this.supportsSelection(inputEl)) {\n this.dictationCursorStart = inputEl.selectionStart;\n this.dictationCursorEnd = inputEl.selectionEnd;\n } else {\n this.dictationCursorStart = inputEl.value.length;\n this.dictationCursorEnd = inputEl.value.length;\n }\n }\n }\n state.startRecording();\n const connectingStartTime = Date.now();\n const backend = getBackend();\n try {\n await backend.startVoiceSession({\n action: \"dictate\",\n settings: getSessionSettings(),\n onMicReady: () => {\n // Ensure minimum animation duration before transitioning to recording\n const elapsed = Date.now() - connectingStartTime;\n const remainingDelay = MIN_CONNECTING_ANIMATION_MS - elapsed;\n\n if (remainingDelay > 0) {\n setTimeout(() => {\n state.setRecordingState(\"recording\");\n }, remainingDelay);\n } else {\n state.setRecordingState(\"recording\");\n }\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Connection failed\";\n if (errorMessage !== \"Disconnected\") {\n state.setError(`Failed to connect: ${errorMessage}`);\n await backend.disconnect();\n }\n }\n }\n\n private async startEdit(): Promise<void> {\n this.editTargetElement = this.widgetState.focusedElement;\n this.editSelectionStart = null;\n this.editSelectionEnd = null;\n this.editSelectedText = \"\";\n if (this.editTargetElement) {\n const tagName = this.editTargetElement.tagName.toLowerCase();\n if (tagName === \"input\" || tagName === \"textarea\") {\n const inputEl = this.editTargetElement as\n | HTMLInputElement\n | HTMLTextAreaElement;\n if (this.supportsSelection(inputEl)) {\n this.editSelectionStart = inputEl.selectionStart;\n this.editSelectionEnd = inputEl.selectionEnd;\n const start = this.editSelectionStart ?? 0;\n const end = this.editSelectionEnd ?? 0;\n if (start !== end) {\n this.editSelectedText = inputEl.value.substring(start, end);\n }\n } else {\n this.editSelectionStart = 0;\n this.editSelectionEnd = 0;\n }\n } else if (this.editTargetElement.isContentEditable) {\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const selectedText = selection.toString();\n this.editSelectionStart = 0;\n this.editSelectionEnd = selectedText.length;\n this.editSelectedText = selectedText;\n }\n }\n }\n\n // Capture the content to edit at start time (sent with auth message)\n const inputText = this.getElementContent(this.editTargetElement);\n\n state.startRecording();\n const connectingStartTime = Date.now();\n const backend = getBackend();\n try {\n await backend.startVoiceSession({\n action: \"edit\",\n inputText: inputText,\n settings: getSessionSettings(),\n onMicReady: () => {\n // Ensure minimum animation duration before transitioning to recording\n const elapsed = Date.now() - connectingStartTime;\n const remainingDelay = MIN_CONNECTING_ANIMATION_MS - elapsed;\n\n if (remainingDelay > 0) {\n setTimeout(() => {\n state.setRecordingState(\"recording\");\n }, remainingDelay);\n } else {\n state.setRecordingState(\"recording\");\n }\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Connection failed\";\n if (errorMessage !== \"Disconnected\") {\n state.setError(`Failed to connect: ${errorMessage}`);\n await backend.disconnect();\n }\n }\n }\n\n private async handleStopEdit(): Promise<void> {\n state.stopRecording();\n const originalContent = this.getElementContent(this.editTargetElement);\n const backend = getBackend();\n try {\n const editedText: string = await this.withMinDisplayTime(\n backend.requestEditText(originalContent),\n 300\n );\n this.applyEdit(editedText);\n backend.disconnect().catch(() => {});\n // Start auto-refresh to keep token fresh for subsequent commands (LiveKit only)\n backend.startAutoRefresh?.();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to apply edit\";\n if (errorMessage !== \"Disconnected\") {\n state.setError(errorMessage);\n backend.disconnect().catch(() => {});\n }\n }\n }\n\n private async startCommand(): Promise<void> {\n state.startRecording();\n const connectingStartTime = Date.now();\n const backend = getBackend();\n const clientConfig = getClientConfig();\n const commands = clientConfig.commands;\n\n try {\n await backend.startVoiceSession({\n action: \"command\",\n commands: commands,\n settings: getSessionSettings(),\n onMicReady: () => {\n // Ensure minimum animation duration before transitioning to recording\n const elapsed = Date.now() - connectingStartTime;\n const remainingDelay = MIN_CONNECTING_ANIMATION_MS - elapsed;\n\n if (remainingDelay > 0) {\n setTimeout(() => {\n state.setRecordingState(\"recording\");\n }, remainingDelay);\n } else {\n state.setRecordingState(\"recording\");\n }\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Connection failed\";\n if (errorMessage !== \"Disconnected\") {\n state.setError(`Failed to connect: ${errorMessage}`);\n await backend.disconnect();\n }\n }\n }\n\n private async handleStopCommand(): Promise<void> {\n state.stopRecording();\n const clientConfig = getClientConfig();\n const commands = clientConfig.commands;\n const backend = getBackend();\n\n try {\n const result: CommandResult | null = await this.withMinDisplayTime(\n backend.requestCommand(commands),\n 300\n );\n\n // Get input text from the backend if available\n const inputText = (backend as { getLastInputText?: () => string | undefined }).getLastInputText?.();\n\n // Save to transcript store\n const displayText = result\n ? `${result.name}${Object.keys(result.arguments).length > 0 ? `: ${JSON.stringify(result.arguments)}` : \"\"}`\n : \"No command matched\";\n\n transcriptStore.saveTranscript(displayText, \"command\", {\n inputText,\n commandResult: result,\n commandConfig: commands,\n });\n\n // Note: command:complete event is already emitted by the backend\n // when the command_result message is received, so we don't emit here\n\n state.completeRecording();\n backend.disconnect().catch(() => {});\n // Start auto-refresh to keep token fresh for subsequent commands (LiveKit only)\n backend.startAutoRefresh?.();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to process command\";\n if (errorMessage !== \"Disconnected\") {\n state.setError(errorMessage);\n backend.disconnect().catch(() => {});\n }\n }\n }\n\n private supportsSelection(\n element: HTMLInputElement | HTMLTextAreaElement\n ): boolean {\n if (element.tagName.toLowerCase() === \"textarea\") {\n return true;\n }\n const supportedTypes = [\"text\", \"search\", \"url\", \"tel\", \"password\"];\n return supportedTypes.includes(\n (element as HTMLInputElement).type || \"text\"\n );\n }\n\n private getElementContent(element: HTMLElement | null): string {\n if (!element) {\n return \"\";\n }\n const tagName = element.tagName.toLowerCase();\n if (tagName === \"input\" || tagName === \"textarea\") {\n const inputEl = element as HTMLInputElement | HTMLTextAreaElement;\n const fullContent = inputEl.value;\n const start = this.editSelectionStart ?? 0;\n const end = this.editSelectionEnd ?? fullContent.length;\n const hasSelection = start !== end;\n if (hasSelection) {\n return fullContent.substring(start, end);\n }\n return fullContent;\n } else if (element.isContentEditable) {\n const selection = window.getSelection();\n if (selection && selection.toString().length > 0) {\n return selection.toString();\n }\n return element.textContent || \"\";\n }\n return \"\";\n }\n\n private applyEdit(editedText: string): void {\n const target = this.editTargetElement;\n if (!target) {\n state.completeRecording();\n return;\n }\n const tagName = target.tagName.toLowerCase();\n let originalContent = \"\";\n if (tagName === \"input\" || tagName === \"textarea\") {\n const inputEl = target as HTMLInputElement | HTMLTextAreaElement;\n originalContent = inputEl.value;\n inputEl.focus();\n if (this.supportsSelection(inputEl)) {\n const selectionStart = this.editSelectionStart ?? 0;\n const selectionEnd = this.editSelectionEnd ?? inputEl.value.length;\n const hasSelection = selectionStart !== selectionEnd;\n if (hasSelection) {\n inputEl.setSelectionRange(selectionStart, selectionEnd);\n } else {\n inputEl.setSelectionRange(0, inputEl.value.length);\n }\n document.execCommand(\"insertText\", false, editedText);\n } else {\n inputEl.value = editedText;\n inputEl.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n state.setFocusedElement(inputEl);\n } else if (target.isContentEditable) {\n originalContent = target.textContent || \"\";\n target.focus();\n state.setFocusedElement(target);\n const hasSelection =\n this.editSelectionStart !== null &&\n this.editSelectionEnd !== null &&\n this.editSelectionStart !== this.editSelectionEnd;\n if (!hasSelection) {\n const selection = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(target);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n document.execCommand(\"insertText\", false, editedText);\n }\n transcriptStore.saveTranscript(editedText, \"edit\", originalContent);\n events.emit(\"edit:applied\", {\n originalContent,\n editedContent: editedText,\n element: target,\n });\n state.completeRecording();\n this.editTargetElement = null;\n this.editSelectionStart = null;\n this.editSelectionEnd = null;\n this.editSelectedText = \"\";\n }\n\n render(): TemplateResult | string {\n if (!this.widgetState.isVisible) {\n this.setAttribute(\"hidden\", \"\");\n return html``;\n }\n this.removeAttribute(\"hidden\");\n const showBubbles =\n this.widgetState.isExpanded && this.widgetState.recordingState === \"idle\";\n const showSettings = this.widgetState.recordingState === \"idle\";\n return html`\n <div class=\"widget-container\" @mousedown=\"${this.handleDragStart}\">\n <speechos-action-bubbles\n ?visible=\"${showBubbles}\"\n @action-select=\"${this.handleActionSelect}\"\n ></speechos-action-bubbles>\n <div class=\"mic-row\">\n <div class=\"settings-button-container\">\n <speechos-settings-button\n ?visible=\"${showSettings}\"\n @settings-click=\"${this.handleSettingsClick}\"\n ></speechos-settings-button>\n </div>\n <speechos-mic-button\n ?expanded=\"${this.widgetState.isExpanded}\"\n recordingState=\"${this.widgetState.recordingState}\"\n activeAction=\"${this.widgetState.activeAction || \"\"}\"\n editPreviewText=\"${this.editSelectedText}\"\n errorMessage=\"${this.widgetState.errorMessage || \"\"}\"\n @mic-click=\"${this.handleMicClick}\"\n @stop-recording=\"${this.handleStopRecording}\"\n @cancel-operation=\"${this.handleCancelOperation}\"\n @retry-connection=\"${this.handleRetryConnection}\"\n @close-widget=\"${this.handleCloseWidget}\"\n ></speechos-mic-button>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"speechos-widget\": SpeechOSWidget;\n }\n}\n","/**\n * Main SpeechOS Client SDK class\n * Composes core logic with UI components\n */\n\nimport type {\n SpeechOSState,\n SessionSettings,\n} from \"@speechos/core\";\nimport {\n setConfig,\n getConfig,\n updateUserId,\n state,\n events,\n getBackend,\n SpeechOSEventEmitter,\n} from \"@speechos/core\";\nimport { formDetector, type FormDetectorInterface } from \"./form-detector.js\";\nimport { setClientConfig, getClientConfig, resetClientConfig } from \"./config.js\";\nimport type { SpeechOSClientConfig } from \"./config.js\";\nimport { setTextInputHandler, resetTextInputHandler } from \"./text-input-handler.js\";\nimport {\n getInputLanguageCode,\n getOutputLanguageCode,\n getSmartFormatEnabled,\n} from \"./stores/language-settings.js\";\nimport { getSnippets } from \"./stores/snippets-store.js\";\nimport { getVocabulary } from \"./stores/vocabulary-store.js\";\nimport { getAudioDeviceId } from \"./stores/audio-settings.js\";\nimport \"./ui/index.js\"; // Auto-registers components\n\n/**\n * Gather current user settings from stores into SessionSettings\n * Used when starting voice sessions to pass settings to core\n */\nexport function getSessionSettings(): SessionSettings {\n return {\n inputLanguageCode: getInputLanguageCode(),\n outputLanguageCode: getOutputLanguageCode(),\n smartFormat: getSmartFormatEnabled(),\n vocabulary: getVocabulary().map((v) => v.term),\n snippets: getSnippets().map((s) => ({ trigger: s.trigger, expansion: s.expansion })),\n audioDeviceId: getAudioDeviceId(),\n };\n}\n\n/**\n * Main SpeechOS class for initializing and managing the SDK with UI\n */\nexport class SpeechOS {\n private static instance: SpeechOS | null = null;\n private static widgetElement: HTMLElement | null = null;\n private static isInitialized = false;\n private static activeFormDetector: FormDetectorInterface | null = null;\n\n /**\n * Initialize the SpeechOS SDK\n * @param config - Configuration options\n * @throws Error if configuration is invalid (e.g., missing apiKey)\n */\n static init(config: SpeechOSClientConfig): void {\n if (this.isInitialized) {\n console.warn(\"SpeechOS is already initialized\");\n return;\n }\n\n try {\n // Validate and set core configuration\n setConfig(config);\n // Validate and set client-specific configuration\n setClientConfig(config);\n } catch (error) {\n // Configuration errors are fatal - log and re-throw\n const errorMessage =\n error instanceof Error ? error.message : \"Invalid configuration\";\n console.error(`[SpeechOS] Error: ${errorMessage} (init_config)`);\n\n // Emit error event before throwing\n events.emit(\"error\", {\n code: \"init_config\",\n message: errorMessage,\n source: \"init\",\n });\n\n throw error;\n }\n\n const finalConfig = getConfig();\n\n // Create singleton instance\n this.instance = new SpeechOS();\n\n // Handle form detection configuration\n const formDetection = config.formDetection ?? true;\n if (formDetection === true) {\n // Use default form detector\n formDetector.start();\n this.activeFormDetector = formDetector;\n } else if (typeof formDetection === \"object\") {\n // Use custom form detector implementation\n formDetection.start();\n this.activeFormDetector = formDetection;\n }\n // If formDetection === false, don't start any form detector\n\n // Handle custom text input handler\n if (config.textInputHandler) {\n setTextInputHandler(config.textInputHandler);\n }\n\n // Create and mount widget\n this.mountWidget();\n\n this.isInitialized = true;\n\n // Log initialization in debug mode\n if (finalConfig.debug) {\n console.log(\"[SpeechOS] Initialized with config:\", finalConfig);\n }\n }\n\n /**\n * Destroy the SpeechOS SDK and clean up resources\n */\n static async destroy(): Promise<void> {\n if (!this.isInitialized) {\n console.warn(\"SpeechOS is not initialized\");\n return;\n }\n\n // Stop form detection (whichever detector is active)\n if (this.activeFormDetector) {\n this.activeFormDetector.stop();\n this.activeFormDetector = null;\n }\n\n // Disconnect from voice backend\n await getBackend().disconnect();\n\n // Remove widget from DOM\n this.unmountWidget();\n\n // Clear all event listeners\n events.clear();\n\n // Reset state\n state.reset();\n\n // Reset client config\n resetClientConfig();\n\n // Reset text input handler to default\n resetTextInputHandler();\n\n // Clear instance\n this.instance = null;\n this.isInitialized = false;\n\n const config = getConfig();\n if (config.debug) {\n console.log(\"[SpeechOS] Destroyed and cleaned up\");\n }\n }\n\n /**\n * Check if SpeechOS is initialized\n */\n static get initialized(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Get the current state\n */\n static getState(): SpeechOSState {\n return state.getState();\n }\n\n /**\n * Get the event emitter for external listeners\n */\n static get events(): SpeechOSEventEmitter {\n return events;\n }\n\n /**\n * Get the current client configuration\n */\n static getClientConfig(): ReturnType<typeof getClientConfig> {\n return getClientConfig();\n }\n\n /**\n * Mount the widget to the DOM\n */\n private static mountWidget(): void {\n if (this.widgetElement) {\n console.warn(\"Widget is already mounted\");\n return;\n }\n\n // Create widget element\n const widget = document.createElement(\"speechos-widget\");\n this.widgetElement = widget;\n\n // Append to body\n document.body.appendChild(widget);\n }\n\n /**\n * Unmount the widget from the DOM\n */\n private static unmountWidget(): void {\n if (this.widgetElement) {\n this.widgetElement.remove();\n this.widgetElement = null;\n }\n }\n\n /**\n * Show the widget programmatically\n */\n static show(): void {\n state.show();\n }\n\n /**\n * Hide the widget programmatically\n */\n static hide(): void {\n state.hide();\n }\n\n /**\n * Show the widget positioned for a specific element.\n * On mobile, the widget will anchor below the element.\n * On desktop, the widget stays at center bottom but tracks the element for dictation/edit.\n *\n * @param element - The element to show the widget for\n *\n * @example\n * const textarea = document.querySelector('textarea');\n * SpeechOS.showFor(textarea);\n */\n static showFor(element: HTMLElement): void {\n if (!this.isInitialized) {\n console.warn(\"SpeechOS.showFor() called before init(). Call init() first.\");\n return;\n }\n state.setFocusedElement(element);\n state.show();\n }\n\n /**\n * Attach the widget to persistently track a specific element.\n * The widget will show and position relative to this element.\n * Equivalent to showFor() - the widget tracks the element until detach() is called.\n *\n * @param element - The element to attach to\n *\n * @example\n * const input = document.querySelector('input');\n * SpeechOS.attachTo(input);\n */\n static attachTo(element: HTMLElement): void {\n if (!this.isInitialized) {\n console.warn(\"SpeechOS.attachTo() called before init(). Call init() first.\");\n return;\n }\n state.setFocusedElement(element);\n state.show();\n }\n\n /**\n * Detach the widget from any attached element.\n * Returns the widget to default positioning (center bottom of screen).\n *\n * @example\n * SpeechOS.detach();\n */\n static detach(): void {\n if (!this.isInitialized) {\n console.warn(\"SpeechOS.detach() called before init(). Call init() first.\");\n return;\n }\n state.setFocusedElement(null);\n }\n\n /**\n * Identify the current user\n * Can be called after init() to associate sessions with a user identifier.\n *\n * @param userId - User identifier from your system (e.g., user ID, email)\n *\n * @example\n * // Initialize SDK\n * SpeechOS.init({ apiKey: 'xxx' });\n *\n * // Later, after user logs in\n * SpeechOS.identify('user_123');\n */\n static identify(userId: string): void {\n if (!this.isInitialized) {\n console.warn(\n \"SpeechOS.identify() called before init(). Call init() first.\"\n );\n return;\n }\n\n const config = getConfig();\n\n // Update the userId in config\n updateUserId(userId);\n\n if (config.debug) {\n console.log(`[SpeechOS] User identified: ${userId}`);\n }\n }\n\n /**\n * Private constructor to prevent direct instantiation\n */\n private constructor() {\n // Singleton pattern - use SpeechOS.init() instead\n }\n}\n\n// Export singleton class as default\nexport default SpeechOS;\n","/**\n * @speechos/client\n *\n * Vanilla JS client SDK for embedding SpeechOS into web applications.\n * Includes Web Components UI and DOM-based form detection.\n */\n\nimport { SpeechOS as SpeechOSClass, getSessionSettings } from \"./speechos.js\";\n\n// Re-export core essentials\nexport {\n events,\n state,\n getConfig,\n setConfig,\n resetConfig,\n livekit,\n DEFAULT_HOST,\n} from \"@speechos/core\";\n\n// Re-export core types\nexport type {\n SpeechOSCoreConfig,\n SpeechOSState,\n SpeechOSAction,\n SpeechOSEventMap,\n StateChangeCallback,\n UnsubscribeFn,\n RecordingState,\n SessionSettings,\n VoiceSessionOptions,\n CommandDefinition,\n CommandResult,\n} from \"@speechos/core\";\n\n// Export stores from local client package\nexport {\n transcriptStore,\n getTranscripts,\n saveTranscript,\n clearTranscripts,\n deleteTranscript,\n} from \"./stores/transcript-store.js\";\nexport type {\n TranscriptEntry,\n TranscriptAction,\n SaveCommandOptions,\n} from \"./stores/transcript-store.js\";\n\nexport {\n audioSettings,\n getAudioSettings,\n getAudioDeviceId,\n setAudioDeviceId,\n getAudioInputDevices,\n isSelectedDeviceAvailable,\n resetAudioSettings,\n} from \"./stores/audio-settings.js\";\nexport type { AudioSettings } from \"./stores/audio-settings.js\";\n\nexport {\n languageSettings,\n getLanguageSettings,\n getInputLanguageCode,\n setInputLanguageCode,\n getOutputLanguageCode,\n setOutputLanguageCode,\n getLanguageByCode,\n getInputLanguageName,\n getOutputLanguageName,\n getSmartFormatEnabled,\n setSmartFormatEnabled,\n resetLanguageSettings,\n SUPPORTED_LANGUAGES,\n // Legacy aliases\n getLanguageCode,\n setLanguageCode,\n getLanguageName,\n} from \"./stores/language-settings.js\";\nexport type { LanguageSettings, LanguageOption } from \"./stores/language-settings.js\";\n\nexport {\n snippetsStore,\n getSnippets,\n addSnippet,\n updateSnippet,\n deleteSnippet,\n clearSnippets,\n getSnippetCount,\n isAtSnippetLimit,\n} from \"./stores/snippets-store.js\";\nexport type {\n Snippet,\n SnippetValidationError,\n AddSnippetResult,\n} from \"./stores/snippets-store.js\";\n\nexport {\n vocabularyStore,\n getVocabulary,\n addTerm,\n deleteTerm,\n clearVocabulary,\n getVocabularyCount,\n isAtVocabularyLimit,\n} from \"./stores/vocabulary-store.js\";\nexport type {\n VocabularyTerm,\n VocabularyValidationError,\n AddTermResult,\n} from \"./stores/vocabulary-store.js\";\n\n// Export client config\nexport {\n getClientConfig,\n setClientConfig,\n resetClientConfig,\n hasCommands,\n getCommands,\n getZIndex,\n} from \"./config.js\";\nexport type { SpeechOSClientConfig, ResolvedClientConfig } from \"./config.js\";\n\n// Client-specific exports\nexport { formDetector, FormDetector } from \"./form-detector.js\";\nexport type { FormDetectorInterface } from \"./form-detector.js\";\n\nexport {\n defaultTextInputHandler,\n DefaultTextInputHandler,\n getTextInputHandler,\n setTextInputHandler,\n resetTextInputHandler,\n} from \"./text-input-handler.js\";\nexport type {\n TextInputHandlerInterface,\n SelectionInfo,\n} from \"./text-input-handler.js\";\n\nexport { getSessionSettings };\n\n// Version\nexport const VERSION = \"0.1.0\";\n\n// Main SDK class\nexport { SpeechOSClass as SpeechOS };\nexport default SpeechOSClass;\n"],"names":["state","events","STORAGE_KEY","defaultSettings","generateId","t","e","s","o","r","n","i","S","c","h","a","l","p","d","u","f","b","y","css","html","unsafeHTML","NUM_BARS","SMOOTHING","LitElement","property","customElement","getBackend","getConfig","litState","setConfig","updateUserId"],"mappings":"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","x_google_ignoreList":[7,8,9,10,11,12,13,14,17,18]}
|