@poovit-banton/speech-recognition-sdk 1.0.0 → 1.0.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"speech-recognition-sdk.umd.js","sources":["../../src/lib/utils/index.ts","../../src/lib/hooks/useSpeechRecognition.ts","../../node_modules/react/cjs/react-jsx-runtime.production.js","../../node_modules/react/cjs/react-jsx-runtime.development.js","../../node_modules/react/jsx-runtime.js","../../src/lib/assets/microphon.svg","../../src/lib/assets/pause.svg","../../src/lib/assets/bg-ai-speech.svg","../../src/lib/components/SpeechModal.tsx","../../src/lib/components/SpeechWidget.tsx","../../src/lib/components/SpeechProvider.tsx","../../src/lib/components/SpeechButton.tsx","../../src/lib/components/TranscriptDisplay.tsx"],"sourcesContent":["/**\n * Speech Recognition SDK Utilities\n */\n\n/**\n * Check if browser supports Web Speech API\n */\nexport function isSpeechRecognitionSupported(): boolean {\n if (typeof window === \"undefined\") return false;\n\n return !!(\n window.SpeechRecognition ||\n (window as typeof window & { webkitSpeechRecognition?: unknown })\n .webkitSpeechRecognition\n );\n}\n\n/**\n * Get the SpeechRecognition constructor\n */\nexport function getSpeechRecognition(): typeof SpeechRecognition | null {\n if (typeof window === \"undefined\") return null;\n\n return (\n window.SpeechRecognition ||\n (window as typeof window & { webkitSpeechRecognition?: typeof SpeechRecognition })\n .webkitSpeechRecognition ||\n null\n );\n}\n\n/**\n * Request microphone permission\n */\nexport async function requestMicrophonePermission(): Promise<boolean> {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n // Stop all tracks after getting permission\n stream.getTracks().forEach((track) => track.stop());\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if microphone is available\n */\nexport async function isMicrophoneAvailable(): Promise<boolean> {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.some((device) => device.kind === \"audioinput\");\n } catch {\n return false;\n }\n}\n\n/**\n * Get supported languages for speech recognition\n * Note: Actual support depends on browser\n */\nexport function getSupportedLanguages(): string[] {\n return [\n \"th-TH\", // Thai\n \"en-US\", // English (US)\n \"en-GB\", // English (UK)\n \"en-AU\", // English (Australia)\n \"zh-CN\", // Chinese (Simplified)\n \"zh-TW\", // Chinese (Traditional)\n \"ja-JP\", // Japanese\n \"ko-KR\", // Korean\n \"vi-VN\", // Vietnamese\n \"id-ID\", // Indonesian\n \"ms-MY\", // Malay\n \"fr-FR\", // French\n \"de-DE\", // German\n \"es-ES\", // Spanish\n \"pt-BR\", // Portuguese (Brazil)\n \"ru-RU\", // Russian\n \"ar-SA\", // Arabic\n \"hi-IN\", // Hindi\n ];\n}\n\n/**\n * Format confidence score as percentage\n */\nexport function formatConfidence(confidence: number): string {\n return `${Math.round(confidence * 100)}%`;\n}\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport type {\n SpeechRecognitionConfig,\n SpeechRecognitionCallbacks,\n UseSpeechRecognitionReturn,\n} from \"../types\";\nimport {\n getSpeechRecognition,\n isSpeechRecognitionSupported,\n requestMicrophonePermission,\n} from \"../utils\";\n\nconst DEFAULT_CONFIG: SpeechRecognitionConfig = {\n language: \"th-TH\",\n continuous: true,\n interimResults: true,\n maxAlternatives: 1,\n};\n\nexport interface UseSpeechRecognitionOptions {\n /** Configuration for speech recognition */\n config?: SpeechRecognitionConfig;\n /** Event callbacks */\n callbacks?: SpeechRecognitionCallbacks;\n}\n\n/**\n * Custom hook for speech recognition\n *\n * @example\n * ```tsx\n * const {\n * transcript,\n * isListening,\n * startListening,\n * stopListening,\n * resetTranscript\n * } = useSpeechRecognition({\n * config: { language: 'th-TH' },\n * callbacks: {\n * onResult: (result) => console.log(result)\n * }\n * });\n * ```\n */\nexport function useSpeechRecognition(\n options: UseSpeechRecognitionOptions = {}\n): UseSpeechRecognitionReturn {\n const { config = {}, callbacks = {} } = options;\n\n // State\n const [isListening, setIsListening] = useState(false);\n const [transcript, setTranscript] = useState(\"\");\n const [interimTranscript, setInterimTranscript] = useState(\"\");\n const [finalTranscript, setFinalTranscript] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [isMicrophoneAvailable, setIsMicrophoneAvailable] = useState(true);\n\n // Refs\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const callbacksRef = useRef(callbacks);\n\n // Update callbacks ref\n useEffect(() => {\n callbacksRef.current = callbacks;\n }, [callbacks]);\n\n // Check support\n const isSupported = isSpeechRecognitionSupported();\n\n // Start listening\n const startListening = useCallback(\n async (overrideConfig?: SpeechRecognitionConfig) => {\n if (!isSupported) {\n setError(\"Speech recognition is not supported in this browser\");\n return;\n }\n\n // Request microphone permission first\n const hasPermission = await requestMicrophonePermission();\n if (!hasPermission) {\n setError(\"Microphone permission denied\");\n setIsMicrophoneAvailable(false);\n return;\n }\n\n // Stop existing recognition\n if (recognitionRef.current) {\n recognitionRef.current.abort();\n }\n\n // Create new recognition with merged config\n const SpeechRecognitionClass = getSpeechRecognition();\n if (!SpeechRecognitionClass) return;\n\n const recognition = new SpeechRecognitionClass();\n const mergedConfig = { ...DEFAULT_CONFIG, ...config, ...overrideConfig };\n\n recognition.lang = mergedConfig.language || \"th-TH\";\n recognition.continuous = mergedConfig.continuous ?? true;\n recognition.interimResults = mergedConfig.interimResults ?? true;\n recognition.maxAlternatives = mergedConfig.maxAlternatives ?? 1;\n\n // Event handlers\n recognition.onstart = () => {\n setIsListening(true);\n setError(null);\n callbacksRef.current.onStart?.();\n };\n\n recognition.onend = () => {\n setIsListening(false);\n callbacksRef.current.onEnd?.();\n };\n\n recognition.onerror = (event) => {\n const errorMessage = getErrorMessage(event.error);\n setError(errorMessage);\n setIsListening(false);\n callbacksRef.current.onError?.(errorMessage);\n };\n\n recognition.onresult = (event) => {\n let interim = \"\";\n let final = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n const text = result[0].transcript;\n\n if (result.isFinal) {\n final += text;\n callbacksRef.current.onResult?.({\n transcript: text,\n confidence: result[0].confidence,\n isFinal: true,\n });\n } else {\n interim += text;\n }\n }\n\n setInterimTranscript(interim);\n setFinalTranscript((prev) => {\n const newFinal = prev + final;\n const fullTranscript = newFinal + interim;\n setTranscript(fullTranscript);\n callbacksRef.current.onTranscriptChange?.(fullTranscript);\n return newFinal;\n });\n };\n\n recognitionRef.current = recognition;\n recognition.start();\n },\n [isSupported, config]\n );\n\n // Stop listening\n const stopListening = useCallback(() => {\n if (recognitionRef.current) {\n recognitionRef.current.stop();\n }\n }, []);\n\n // Abort listening\n const abortListening = useCallback(() => {\n if (recognitionRef.current) {\n recognitionRef.current.abort();\n }\n setIsListening(false);\n }, []);\n\n // Reset transcript\n const resetTranscript = useCallback(() => {\n setTranscript(\"\");\n setInterimTranscript(\"\");\n setFinalTranscript(\"\");\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (recognitionRef.current) {\n recognitionRef.current.abort();\n }\n };\n }, []);\n\n return {\n // State\n isListening,\n transcript,\n interimTranscript,\n finalTranscript,\n isSupported,\n isMicrophoneAvailable,\n error,\n // Actions\n startListening,\n stopListening,\n abortListening,\n resetTranscript,\n };\n}\n\n/**\n * Get human-readable error message\n */\nfunction getErrorMessage(error: string): string {\n const errorMessages: Record<string, string> = {\n \"not-allowed\": \"Microphone permission was denied\",\n \"no-speech\": \"No speech was detected\",\n \"audio-capture\": \"No microphone was found\",\n network: \"Network error occurred\",\n aborted: \"Speech recognition was aborted\",\n \"language-not-supported\": \"Language is not supported\",\n \"service-not-allowed\": \"Speech recognition service is not allowed\",\n };\n\n return errorMessages[error] || `Speech recognition error: ${error}`;\n}\n\nexport default useSpeechRecognition;\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","export default \"data:image/svg+xml,%3csvg%20width='117'%20height='120'%20viewBox='0%200%20117%20120'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='%23FF8800'%20/%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='url(%23paint0_radial_6015_131977)'%20/%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='url(%23paint1_radial_6015_131977)'%20fill-opacity='0.4'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20fill='%23FF8800'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20fill='url(%23paint2_radial_6015_131977)'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20fill='url(%23paint3_radial_6015_131977)'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20fill='url(%23paint4_radial_6015_131977)'%20fill-opacity='0.3'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20stroke='url(%23paint5_linear_6015_131977)'%20stroke-width='1.81818'%20/%3e%3cg%20opacity='0.4'%3e%3cpath%20d='M27.2731%20104.474C27.0272%2082.1726%209.92689%2079.0823%203.63672%2079.4341C25.2722%2077.2252%2027.1558%2041.2543%2027.2731%2031.9004C27.4055%2041.4094%2029.3496%2077.2327%2050.9094%2079.4379C44.6231%2079.0861%2027.5341%2082.2028%2027.2731%20104.478V104.474Z'%20fill='url(%23paint6_radial_6015_131977)'%20/%3e%3c/g%3e%3cg%20opacity='0.4'%3e%3cg%20clip-path='url(%23clip0_6015_131977)'%3e%3cpath%20d='M87.2716%2014.546C87.4985%2035.1318%20103.284%2037.9843%20109.09%2037.6596C89.1186%2039.6987%2087.3798%2072.9027%2087.2716%2081.5371C87.1494%2072.7595%2085.3547%2039.6917%2065.4533%2037.6561C71.2561%2037.9809%2087.0306%2035.1039%2087.2716%2014.5425L87.2716%2014.546Z'%20fill='url(%23paint7_radial_6015_131977)'%20/%3e%3c/g%3e%3c/g%3e%3cg%20clip-path='url(%23clip1_6015_131977)'%20filter='url(%23filter0_i_6015_131977)'%20%3e%3cpath%20d='M77.1274%2060.0186C77.1274%2058.8913%2076.2654%2058.0293%2075.1381%2058.0293C74.0108%2058.0293%2073.1488%2058.8913%2073.1488%2060.0186C73.1488%2067.7769%2066.8493%2074.0764%2059.0911%2074.0764C51.3328%2074.0764%2045.0333%2067.7769%2045.0333%2060.0186C45.0333%2058.8913%2044.1713%2058.0293%2043.044%2058.0293C41.9167%2058.0293%2041.0547%2058.8913%2041.0547%2060.0186C41.0547%2069.2357%2047.9509%2076.994%2057.1017%2077.9887V83.2935H49.8739C48.7467%2083.2935%2047.8846%2084.1555%2047.8846%2085.2828C47.8846%2086.41%2048.7467%2087.2721%2049.8739%2087.2721H68.3082C69.4354%2087.2721%2070.2975%2086.41%2070.2975%2085.2828C70.2975%2084.1555%2069.4354%2083.2935%2068.3082%2083.2935H61.0804V77.9887C70.2312%2076.994%2077.1274%2069.2357%2077.1274%2060.0186Z'%20fill='white'%20/%3e%3cpath%20d='M59.0933%2030.9082C52.9928%2030.9082%2048.0195%2035.8815%2048.0195%2041.982V59.9521C48.0195%2066.1189%2052.9928%2071.0259%2059.0933%2071.0922C65.1939%2071.0922%2070.1671%2066.1189%2070.1671%2060.0184V41.982C70.1671%2035.8815%2065.1939%2030.9082%2059.0933%2030.9082Z'%20fill='white'%20/%3e%3c/g%3e%3cdefs%3e%3cfilter%20id='filter0_i_6015_131977'%20x='30.9102'%20y='30.9082'%20width='56.3633'%20height='58.1815'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%20%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'%20/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='BackgroundImageFix'%20result='shape'%20/%3e%3cfeColorMatrix%20in='SourceAlpha'%20type='matrix'%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%20127%200'%20result='hardAlpha'%20/%3e%3cfeOffset%20dy='1.81818'%20/%3e%3cfeGaussianBlur%20stdDeviation='0.909091'%20/%3e%3cfeComposite%20in2='hardAlpha'%20operator='arithmetic'%20k2='-1'%20k3='1'%20/%3e%3cfeColorMatrix%20type='matrix'%20values='0%200%200%200%200.937087%200%200%200%200%200.449802%200%200%200%200%200%200%200%200%201%200'%20/%3e%3cfeBlend%20mode='normal'%20in2='shape'%20result='effect1_innerShadow_6015_131977'%20/%3e%3c/filter%3e%3cradialGradient%20id='paint0_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-107.107%20232.727%20-57.2274%20-199.178%20110.413%20-150.909)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20offset='0.67589'%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='1'%20stop-color='%23DBFF00'%20stop-opacity='0.38'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint1_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(25.124%20-134.545%2037.8392%2053.435%2043.6364%20120)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20stop-opacity='0.73'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.12'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint2_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-107.107%20232.727%20-57.2274%20-199.178%20110.413%20-154.545)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20offset='0.67589'%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='1'%20stop-color='%23FFC700'%20stop-opacity='0.38'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint3_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(45.6198%20-45.4545%2027.7487%20210.613%206.61157%20116.364)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='%23F6FB22'%20stop-opacity='0.51'%20/%3e%3cstop%20offset='1'%20stop-color='%23FF9E45'%20stop-opacity='0'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint4_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-36.3636%2036.3636%20-36.3636%20-275%20112.397%2036.3637)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0'%20/%3e%3c/radialGradient%3e%3clinearGradient%20id='paint5_linear_6015_131977'%20x1='58.1818'%20y1='0'%20x2='58.1818'%20y2='116.364'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='1'%20stop-color='%23FF7A00'%20stop-opacity='0'%20/%3e%3c/linearGradient%3e%3cradialGradient%20id='paint6_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(10.2066%20-83.9173%2015.3722%2033.328%2021.364%20104.478)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.2'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint7_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-9.42152%2077.4625%20-14.1898%20-30.7644%2092.7261%2014.5425)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.1'%20/%3e%3c/radialGradient%3e%3cclipPath%20id='clip0_6015_131977'%3e%3crect%20width='43.6366'%20height='66.9911'%20fill='white'%20transform='translate(109.09%2081.5371)%20rotate(180)'%20/%3e%3c/clipPath%3e%3cclipPath%20id='clip1_6015_131977'%3e%3crect%20width='56.3636'%20height='56.3636'%20fill='white'%20transform='translate(30.9102%2030.9082)'%20/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='117'%20height='120'%20viewBox='0%200%20117%20120'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20%3e%3cg%20filter='url(%23filter0_i_6104_131024)'%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='%23FF8800'%20/%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='url(%23paint0_radial_6104_131024)'%20/%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='url(%23paint1_radial_6104_131024)'%20fill-opacity='0.4'%20/%3e%3c/g%3e%3crect%20x='1.08067'%20y='1.08067'%20width='114.202'%20height='114.202'%20rx='57.1011'%20fill='white'%20stroke='url(%23paint2_linear_6104_131024)'%20stroke-width='2.16135'%20/%3e%3cg%20filter='url(%23filter1_d_6104_131024)'%3e%3cpath%20d='M49.7119%2041.0605C52.0993%2041.0605%2054.0352%2042.9964%2054.0352%2045.3838V75.6426C54.0351%2078.0299%2052.0992%2079.9648%2049.7119%2079.9648H41.0664C38.6793%2079.9646%2036.7442%2078.0297%2036.7441%2075.6426V45.3838C36.7441%2042.9966%2038.6793%2041.0608%2041.0664%2041.0605H49.7119ZM75.6484%2041.0605C78.0358%2041.0605%2079.9707%2042.9964%2079.9707%2045.3838V75.6426C79.9706%2078.0299%2078.0357%2079.9648%2075.6484%2079.9648H67.0029C64.6157%2079.9648%2062.6808%2078.0298%2062.6807%2075.6426V45.3838C62.6807%2042.9965%2064.6156%2041.0606%2067.0029%2041.0605H75.6484Z'%20fill='%23FBEDD9'%20/%3e%3cpath%20d='M49.7119%2041.0605C52.0993%2041.0605%2054.0352%2042.9964%2054.0352%2045.3838V75.6426C54.0351%2078.0299%2052.0992%2079.9648%2049.7119%2079.9648H41.0664C38.6793%2079.9646%2036.7442%2078.0297%2036.7441%2075.6426V45.3838C36.7441%2042.9966%2038.6793%2041.0608%2041.0664%2041.0605H49.7119ZM75.6484%2041.0605C78.0358%2041.0605%2079.9707%2042.9964%2079.9707%2045.3838V75.6426C79.9706%2078.0299%2078.0357%2079.9648%2075.6484%2079.9648H67.0029C64.6157%2079.9648%2062.6808%2078.0298%2062.6807%2075.6426V45.3838C62.6807%2042.9965%2064.6156%2041.0606%2067.0029%2041.0605H75.6484Z'%20fill='%23FF7A00'%20/%3e%3cpath%20d='M49.7119%2041.0605C52.0993%2041.0605%2054.0352%2042.9964%2054.0352%2045.3838V75.6426C54.0351%2078.0299%2052.0992%2079.9648%2049.7119%2079.9648H41.0664C38.6793%2079.9646%2036.7442%2078.0297%2036.7441%2075.6426V45.3838C36.7441%2042.9966%2038.6793%2041.0608%2041.0664%2041.0605H49.7119ZM75.6484%2041.0605C78.0358%2041.0605%2079.9707%2042.9964%2079.9707%2045.3838V75.6426C79.9706%2078.0299%2078.0357%2079.9648%2075.6484%2079.9648H67.0029C64.6157%2079.9648%2062.6808%2078.0298%2062.6807%2075.6426V45.3838C62.6807%2042.9965%2064.6156%2041.0606%2067.0029%2041.0605H75.6484Z'%20fill='url(%23paint3_radial_6104_131024)'%20fill-opacity='0.4'%20/%3e%3c/g%3e%3cdefs%3e%3cfilter%20id='filter0_i_6104_131024'%20x='0'%20y='3.63672'%20width='116.363'%20height='116.363'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%20%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'%20/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='BackgroundImageFix'%20result='shape'%20/%3e%3cfeColorMatrix%20in='SourceAlpha'%20type='matrix'%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%20127%200'%20result='hardAlpha'%20/%3e%3cfeOffset%20/%3e%3cfeGaussianBlur%20stdDeviation='3.63636'%20/%3e%3cfeComposite%20in2='hardAlpha'%20operator='arithmetic'%20k2='-1'%20k3='1'%20/%3e%3cfeColorMatrix%20type='matrix'%20values='0%200%200%200%201%200%200%200%200%201%200%200%200%200%201%200%200%200%201%200'%20/%3e%3cfeBlend%20mode='normal'%20in2='shape'%20result='effect1_innerShadow_6104_131024'%20/%3e%3c/filter%3e%3cfilter%20id='filter1_d_6104_131024'%20x='34.5828'%20y='38.8992'%20width='47.5493'%20height='43.227'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%20%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'%20/%3e%3cfeColorMatrix%20in='SourceAlpha'%20type='matrix'%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%20127%200'%20result='hardAlpha'%20/%3e%3cfeOffset%20/%3e%3cfeGaussianBlur%20stdDeviation='1.08067'%20/%3e%3cfeComposite%20in2='hardAlpha'%20operator='out'%20/%3e%3cfeColorMatrix%20type='matrix'%20values='0%200%200%200%201%200%200%200%200%200.565%200%200%200%200%200%200%200%200%201%200'%20/%3e%3cfeBlend%20mode='normal'%20in2='BackgroundImageFix'%20result='effect1_dropShadow_6104_131024'%20/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='effect1_dropShadow_6104_131024'%20result='shape'%20/%3e%3c/filter%3e%3cradialGradient%20id='paint0_radial_6104_131024'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-107.107%20232.727%20-57.2274%20-199.178%20110.413%20-150.909)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20offset='0.67589'%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='1'%20stop-color='%23DBFF00'%20stop-opacity='0.38'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint1_radial_6104_131024'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(25.124%20-134.545%2037.8392%2053.435%2043.6364%20120)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20stop-opacity='0.73'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.12'%20/%3e%3c/radialGradient%3e%3clinearGradient%20id='paint2_linear_6104_131024'%20x1='58.1818'%20y1='0'%20x2='58.1818'%20y2='116.364'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='0.515'%20stop-color='%23FCEAD2'%20/%3e%3cstop%20offset='1'%20stop-color='%23FF7A00'%20/%3e%3c/linearGradient%3e%3cradialGradient%20id='paint3_radial_6104_131024'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(9.33301%20-44.9831%2014.0564%2017.8651%2052.9541%2079.9648)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20stop-opacity='0.73'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.12'%20/%3e%3c/radialGradient%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='640'%20height='640'%20viewBox='0%200%20640%20640'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20filter='url(%23filter0_f_5207_91652)'%3e%3cg%20filter='url(%23filter1_f_5207_91652)'%3e%3crect%20x='45'%20y='45'%20width='550'%20height='550'%20rx='275'%20fill='url(%23paint0_linear_5207_91652)'/%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cfilter%20id='filter0_f_5207_91652'%20x='-32'%20y='-32'%20width='704'%20height='704'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='BackgroundImageFix'%20result='shape'/%3e%3cfeGaussianBlur%20stdDeviation='16'%20result='effect1_foregroundBlur_5207_91652'/%3e%3c/filter%3e%3cfilter%20id='filter1_f_5207_91652'%20x='41.4052'%20y='41.4052'%20width='557.19'%20height='557.19'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='BackgroundImageFix'%20result='shape'/%3e%3cfeGaussianBlur%20stdDeviation='1.79739'%20result='effect1_foregroundBlur_5207_91652'/%3e%3c/filter%3e%3clinearGradient%20id='paint0_linear_5207_91652'%20x1='320'%20y1='45'%20x2='326.74'%20y2='605.784'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0.177383'%20stop-color='%23EBDDFF'/%3e%3cstop%20offset='0.755511'%20stop-color='%23FEBB63'/%3e%3cstop%20offset='1'%20stop-color='%23FF7A00'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\"","import React, { useEffect, useRef } from \"react\";\nimport microphoneSvg from \"../assets/microphon.svg\";\nimport pauseSvg from \"../assets/pause.svg\";\nimport bgAiSpeechSvg from \"../assets/bg-ai-speech.svg\";\n\nexport interface SpeechModalProps {\n /** Whether modal is open */\n isOpen: boolean;\n /** Close modal handler */\n onClose: () => void;\n /** Whether currently listening */\n isListening: boolean;\n /** Current transcript */\n transcript: string;\n /** Start listening handler */\n onStartListening: () => void;\n /** Stop listening handler */\n onStopListening: () => void;\n /** Reset transcript handler */\n onResetTranscript: () => void;\n /** Generate/Submit handler */\n onGenerate: (transcript: string) => void;\n /** Whether generating/loading */\n isGenerating?: boolean;\n /** Modal title */\n title?: string;\n /** Generate button text */\n generateButtonText?: string;\n /** Placeholder text */\n placeholder?: string;\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n overlay: {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n backdropFilter: \"blur(8px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 9999,\n padding: \"20px\",\n },\n modal: {\n backgroundColor: \"#ffffff\",\n borderRadius: \"32px\",\n padding: \"40px\",\n width: \"100%\",\n maxWidth: \"480px\",\n maxHeight: \"90vh\",\n overflow: \"auto\",\n boxShadow: \"0 25px 80px rgba(0, 0, 0, 0.15)\",\n position: \"relative\" as const,\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: \"32px\",\n },\n title: {\n fontSize: \"18px\",\n fontWeight: 600,\n color: \"#1f2937\",\n margin: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n closeButton: {\n background: \"transparent\",\n border: \"none\",\n color: \"#9ca3af\",\n cursor: \"pointer\",\n padding: \"8px\",\n borderRadius: \"8px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.2s\",\n },\n micSection: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n alignItems: \"center\",\n gap: \"24px\",\n marginBottom: \"32px\",\n position: \"relative\" as const,\n },\n bgCircle: {\n position: \"absolute\" as const,\n width: \"280px\",\n height: \"280px\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 0,\n opacity: 0.8,\n transition: \"opacity 0.3s ease\",\n },\n micButton: {\n width: \"120px\",\n height: \"120px\",\n borderRadius: \"50%\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"transparent\",\n padding: 0,\n position: \"relative\" as const,\n zIndex: 1,\n transition: \"transform 0.2s ease\",\n },\n micImage: {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\" as const,\n },\n statusText: {\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#6b7280\",\n textAlign: \"center\" as const,\n position: \"relative\" as const,\n zIndex: 1,\n },\n statusTextActive: {\n color: \"#FF7A00\",\n fontWeight: 600,\n },\n transcriptBox: {\n background: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"16px\",\n padding: \"20px\",\n minHeight: \"100px\",\n maxHeight: \"160px\",\n overflow: \"auto\",\n marginBottom: \"24px\",\n },\n transcriptText: {\n fontSize: \"15px\",\n lineHeight: 1.7,\n color: \"#1f2937\",\n margin: 0,\n wordWrap: \"break-word\" as const,\n },\n placeholderText: {\n fontSize: \"14px\",\n color: \"#9ca3af\",\n textAlign: \"center\" as const,\n margin: 0,\n padding: \"16px 0\",\n },\n actions: {\n display: \"flex\",\n justifyContent: \"center\",\n },\n generateButton: {\n padding: \"14px 48px\",\n borderRadius: \"100px\",\n border: \"2px solid #9333ea\",\n background: \"transparent\",\n color: \"#9333ea\",\n fontSize: \"15px\",\n fontWeight: 600,\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n },\n generateButtonDisabled: {\n opacity: 0.4,\n cursor: \"not-allowed\",\n borderColor: \"#d1d5db\",\n color: \"#9ca3af\",\n },\n loadingOverlay: {\n position: \"absolute\" as const,\n inset: 0,\n background: \"rgba(255, 255, 255, 0.95)\",\n borderRadius: \"32px\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"24px\",\n zIndex: 10,\n },\n loadingBars: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"12px\",\n width: \"200px\",\n },\n loadingBar: {\n height: \"12px\",\n borderRadius: \"6px\",\n background: \"linear-gradient(90deg, #e5e7eb 0%, #d1d5db 50%, #e5e7eb 100%)\",\n backgroundSize: \"200% 100%\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n },\n loadingText: {\n fontSize: \"16px\",\n fontWeight: 600,\n color: \"#6b7280\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n sparkleIcon: {\n color: \"#9333ea\",\n },\n footer: {\n marginTop: \"24px\",\n textAlign: \"center\" as const,\n fontSize: \"12px\",\n color: \"#9ca3af\",\n },\n};\n\n// Keyframes CSS\nconst keyframesStyle = `\n @keyframes shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n @keyframes fadeIn {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n }\n @keyframes pulse-glow {\n 0%, 100% { opacity: 0.8; transform: translate(-50%, -50%) scale(1); }\n 50% { opacity: 1; transform: translate(-50%, -50%) scale(1.05); }\n }\n`;\n\nconst CloseIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"24\" height=\"24\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\nconst SparkleIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"20\" height=\"20\">\n <path d=\"M12 2L9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2z\" />\n </svg>\n);\n\nconst AISparkleIcon = () => (\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 2L10.5 8.5L4 10L10.5 11.5L12 18L13.5 11.5L20 10L13.5 8.5L12 2Z\"\n fill=\"#9333ea\"\n />\n <path d=\"M5 14L4 17L7 16L5 14Z\" fill=\"#9333ea\" opacity=\"0.6\" />\n <path d=\"M19 14L20 17L17 16L19 14Z\" fill=\"#9333ea\" opacity=\"0.6\" />\n </svg>\n);\n\nexport function SpeechModal({\n isOpen,\n onClose,\n isListening,\n transcript,\n onStartListening,\n onStopListening,\n onResetTranscript,\n onGenerate,\n isGenerating = false,\n title = \"AI Speech-to-Data\",\n generateButtonText = \"Generate\",\n placeholder = \"Click the microphone and start speaking...\",\n}: SpeechModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && isOpen && !isGenerating) {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen, onClose, isGenerating]);\n\n // Close on overlay click\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isGenerating) {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n const handleMicClick = () => {\n if (isGenerating) return;\n if (isListening) {\n onStopListening();\n } else {\n onResetTranscript();\n onStartListening();\n }\n };\n\n const handleGenerate = () => {\n if (transcript && !isGenerating) {\n onGenerate(transcript);\n }\n };\n\n return (\n <>\n <style>{keyframesStyle}</style>\n <div style={styles.overlay} onClick={handleOverlayClick}>\n <div\n ref={modalRef}\n style={{\n ...styles.modal,\n animation: \"fadeIn 0.25s ease-out\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Loading Overlay */}\n {isGenerating && (\n <div style={styles.loadingOverlay}>\n <AISparkleIcon />\n <div style={styles.loadingBars}>\n <div style={{ ...styles.loadingBar, width: \"100%\" }} />\n <div style={{ ...styles.loadingBar, width: \"80%\" }} />\n <div style={{ ...styles.loadingBar, width: \"90%\" }} />\n <div style={{ ...styles.loadingBar, width: \"70%\" }} />\n </div>\n <span style={styles.loadingText}>\n <span style={styles.sparkleIcon}>✨</span>\n AI Analyzing\n </span>\n </div>\n )}\n\n {/* Header */}\n <div style={styles.header}>\n <h2 style={styles.title}>\n <span style={{ fontSize: \"20px\" }}>✨</span>\n {title}\n </h2>\n <button\n style={styles.closeButton}\n onClick={onClose}\n disabled={isGenerating}\n onMouseOver={(e) => {\n if (!isGenerating) {\n e.currentTarget.style.background = \"#f3f4f6\";\n }\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <CloseIcon />\n </button>\n </div>\n\n {/* Mic Section */}\n <div style={styles.micSection}>\n {/* Background glow */}\n <img\n src={bgAiSpeechSvg}\n alt=\"\"\n style={{\n ...styles.bgCircle,\n opacity: isListening ? 1 : 0.6,\n animation: isListening\n ? \"pulse-glow 2s ease-in-out infinite\"\n : \"none\",\n }}\n />\n\n {/* Mic Button */}\n <button\n style={styles.micButton}\n onClick={handleMicClick}\n disabled={isGenerating}\n onMouseOver={(e) => {\n if (!isGenerating) {\n e.currentTarget.style.transform = \"scale(1.05)\";\n }\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.transform = \"scale(1)\";\n }}\n >\n <img\n src={isListening ? pauseSvg : microphoneSvg}\n alt={isListening ? \"Stop\" : \"Start recording\"}\n style={styles.micImage}\n />\n </button>\n\n {/* Status Text */}\n <p\n style={{\n ...styles.statusText,\n ...(isListening ? styles.statusTextActive : {}),\n }}\n >\n {isListening ? \"AI is listening.\" : \"Generate result\"}\n </p>\n </div>\n\n {/* Transcript Box - Only show if there's transcript or not listening */}\n {(transcript || !isListening) && !isGenerating && (\n <div style={styles.transcriptBox}>\n {transcript ? (\n <p style={styles.transcriptText}>{transcript}</p>\n ) : (\n <p style={styles.placeholderText}>{placeholder}</p>\n )}\n </div>\n )}\n\n {/* Generate Button */}\n {!isGenerating && (\n <div style={styles.actions}>\n <button\n style={{\n ...styles.generateButton,\n ...(!transcript ? styles.generateButtonDisabled : {}),\n }}\n onClick={handleGenerate}\n disabled={!transcript || isGenerating}\n onMouseOver={(e) => {\n if (transcript && !isGenerating) {\n e.currentTarget.style.background = \"#9333ea\";\n e.currentTarget.style.color = \"white\";\n }\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = transcript\n ? \"#9333ea\"\n : \"#9ca3af\";\n }}\n >\n <SparkleIcon />\n {generateButtonText}\n </button>\n </div>\n )}\n\n {/* Footer */}\n <div style={styles.footer}>\n <span>\n Powered by <strong>DFM</strong>\n </span>\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport default SpeechModal;\n","import React, { useState, useCallback } from \"react\";\nimport { useSpeechRecognition } from \"../hooks/useSpeechRecognition\";\nimport { SpeechModal } from \"./SpeechModal\";\nimport type { SpeechRecognitionConfig } from \"../types\";\nimport microphoneSvg from \"../assets/microphon.svg\";\n\nexport type WidgetPosition =\n | \"bottom-left\"\n | \"bottom-right\"\n | \"top-left\"\n | \"top-right\"\n | {\n top?: number | string;\n right?: number | string;\n bottom?: number | string;\n left?: number | string;\n };\n\nexport interface SpeechWidgetProps {\n /** Whether the widget is enabled/visible */\n enabled?: boolean;\n /** Position of the floating button */\n position?: WidgetPosition;\n /** Speech recognition config */\n config?: SpeechRecognitionConfig;\n /** Called when generate is clicked with transcript */\n onGenerate?: (transcript: string) => Promise<string> | string;\n /** Called when generation is complete */\n onGenerateComplete?: (response: string) => void;\n /** Called on generation error */\n onGenerateError?: (error: Error) => void;\n /** Modal title */\n modalTitle?: string;\n /** Generate button text */\n generateButtonText?: string;\n /** Custom button content */\n buttonContent?: React.ReactNode;\n /** Button size */\n buttonSize?: number;\n /** Custom button style */\n buttonStyle?: React.CSSProperties;\n /** Z-index for the widget */\n zIndex?: number;\n}\n\nconst getPositionStyles = (position: WidgetPosition): React.CSSProperties => {\n if (typeof position === \"object\") {\n return {\n top: position.top,\n right: position.right,\n bottom: position.bottom,\n left: position.left,\n };\n }\n\n const positions: Record<string, React.CSSProperties> = {\n \"bottom-left\": { bottom: \"24px\", left: \"24px\" },\n \"bottom-right\": { bottom: \"24px\", right: \"24px\" },\n \"top-left\": { top: \"24px\", left: \"24px\" },\n \"top-right\": { top: \"24px\", right: \"24px\" },\n };\n\n return positions[position] || positions[\"bottom-left\"];\n};\n\n/**\n * Floating speech recognition widget\n *\n * @example\n * ```tsx\n * <SpeechWidget\n * enabled={true}\n * position=\"bottom-left\"\n * onGenerate={async (transcript) => {\n * const response = await callAPI(transcript);\n * return response;\n * }}\n * onGenerateComplete={(response) => {\n * console.log('Got response:', response);\n * }}\n * />\n * ```\n */\nexport function SpeechWidget({\n enabled = true,\n position = \"bottom-left\",\n config = { language: \"th-TH\", continuous: true },\n onGenerate,\n onGenerateComplete,\n onGenerateError,\n modalTitle = \"AI Speech-to-Data\",\n generateButtonText = \"Generate\",\n buttonContent,\n buttonSize = 64,\n buttonStyle,\n zIndex = 9998,\n}: SpeechWidgetProps) {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isGenerating, setIsGenerating] = useState(false);\n\n const {\n transcript,\n isListening,\n startListening,\n stopListening,\n resetTranscript,\n } = useSpeechRecognition({ config });\n\n const handleOpenModal = useCallback(() => {\n setIsModalOpen(true);\n }, []);\n\n const handleCloseModal = useCallback(() => {\n setIsModalOpen(false);\n if (isListening) {\n stopListening();\n }\n }, [isListening, stopListening]);\n\n const handleGenerate = useCallback(\n async (text: string) => {\n if (!onGenerate) {\n // If no onGenerate handler, just close modal with transcript\n onGenerateComplete?.(text);\n handleCloseModal();\n resetTranscript();\n return;\n }\n\n setIsGenerating(true);\n try {\n const response = await onGenerate(text);\n onGenerateComplete?.(response);\n handleCloseModal();\n resetTranscript();\n } catch (error) {\n onGenerateError?.(error as Error);\n } finally {\n setIsGenerating(false);\n }\n },\n [\n onGenerate,\n onGenerateComplete,\n onGenerateError,\n handleCloseModal,\n resetTranscript,\n ]\n );\n\n if (!enabled) return null;\n\n const positionStyles = getPositionStyles(position);\n\n const floatingButtonStyle: React.CSSProperties = {\n position: \"fixed\",\n ...positionStyles,\n zIndex,\n width: buttonSize,\n height: buttonSize,\n borderRadius: \"50%\",\n border: \"none\",\n cursor: \"pointer\",\n background: \"transparent\",\n padding: 0,\n transition: \"all 0.3s ease\",\n filter: \"drop-shadow(0 4px 12px rgba(255, 122, 0, 0.4))\",\n ...buttonStyle,\n };\n\n return (\n <>\n {/* Floating Button */}\n <button\n style={floatingButtonStyle}\n onClick={handleOpenModal}\n aria-label=\"Open voice input\"\n onMouseOver={(e) => {\n e.currentTarget.style.transform = \"scale(1.1)\";\n e.currentTarget.style.filter =\n \"drop-shadow(0 6px 20px rgba(255, 122, 0, 0.5))\";\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.transform = \"scale(1)\";\n e.currentTarget.style.filter =\n \"drop-shadow(0 4px 12px rgba(255, 122, 0, 0.4))\";\n }}\n >\n {buttonContent || (\n <img\n src={microphoneSvg}\n alt=\"Voice input\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </button>\n\n {/* Modal */}\n <SpeechModal\n isOpen={isModalOpen}\n onClose={handleCloseModal}\n isListening={isListening}\n transcript={transcript}\n onStartListening={startListening}\n onStopListening={stopListening}\n onResetTranscript={resetTranscript}\n onGenerate={handleGenerate}\n isGenerating={isGenerating}\n title={modalTitle}\n generateButtonText={generateButtonText}\n />\n </>\n );\n}\n\nexport default SpeechWidget;\n","import React, { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport { useSpeechRecognition } from \"../hooks/useSpeechRecognition\";\nimport { SpeechWidget, type WidgetPosition } from \"./SpeechWidget\";\nimport type {\n SpeechRecognitionConfig,\n SpeechRecognitionCallbacks,\n UseSpeechRecognitionReturn,\n} from \"../types\";\n\ninterface SpeechContextValue extends UseSpeechRecognitionReturn {\n /** Whether speech widget is enabled */\n isWidgetEnabled: boolean;\n /** Enable/disable the widget */\n setWidgetEnabled: (enabled: boolean) => void;\n /** Toggle widget enabled state */\n toggleWidget: () => void;\n}\n\nconst SpeechContext = createContext<SpeechContextValue | null>(null);\n\nexport interface SpeechProviderProps {\n children: React.ReactNode;\n /** Default configuration for speech recognition */\n config?: SpeechRecognitionConfig;\n /** Event callbacks */\n callbacks?: SpeechRecognitionCallbacks;\n /** Whether to show the floating widget */\n showWidget?: boolean;\n /** Initial widget enabled state */\n widgetEnabled?: boolean;\n /** Widget position */\n widgetPosition?: WidgetPosition;\n /** Widget button size */\n widgetButtonSize?: number;\n /** Widget z-index */\n widgetZIndex?: number;\n /** Modal title */\n modalTitle?: string;\n /** Generate button text */\n generateButtonText?: string;\n /** Called when generate is clicked */\n onGenerate?: (transcript: string) => Promise<string> | string;\n /** Called when generation completes */\n onGenerateComplete?: (response: string) => void;\n /** Called on generation error */\n onGenerateError?: (error: Error) => void;\n}\n\n/**\n * Provider component for speech recognition context with optional floating widget\n *\n * @example\n * ```tsx\n * <SpeechProvider\n * config={{ language: 'th-TH' }}\n * showWidget\n * widgetEnabled\n * widgetPosition=\"bottom-left\"\n * onGenerate={async (transcript) => {\n * const response = await myAPI(transcript);\n * return response;\n * }}\n * onGenerateComplete={(response) => {\n * console.log('Response:', response);\n * }}\n * >\n * <App />\n * </SpeechProvider>\n * ```\n */\nexport function SpeechProvider({\n children,\n config,\n callbacks,\n showWidget = false,\n widgetEnabled: initialWidgetEnabled = true,\n widgetPosition = \"bottom-left\",\n widgetButtonSize = 60,\n widgetZIndex = 9998,\n modalTitle,\n generateButtonText,\n onGenerate,\n onGenerateComplete,\n onGenerateError,\n}: SpeechProviderProps) {\n const [isWidgetEnabled, setIsWidgetEnabled] = useState(initialWidgetEnabled);\n\n const speechRecognition = useSpeechRecognition({ config, callbacks });\n\n const setWidgetEnabled = useCallback((enabled: boolean) => {\n setIsWidgetEnabled(enabled);\n }, []);\n\n const toggleWidget = useCallback(() => {\n setIsWidgetEnabled((prev) => !prev);\n }, []);\n\n const value = useMemo(\n () => ({\n ...speechRecognition,\n isWidgetEnabled,\n setWidgetEnabled,\n toggleWidget,\n }),\n [speechRecognition, isWidgetEnabled, setWidgetEnabled, toggleWidget]\n );\n\n return (\n <SpeechContext.Provider value={value}>\n {children}\n {showWidget && (\n <SpeechWidget\n enabled={isWidgetEnabled}\n position={widgetPosition}\n config={config}\n buttonSize={widgetButtonSize}\n zIndex={widgetZIndex}\n modalTitle={modalTitle}\n generateButtonText={generateButtonText}\n onGenerate={onGenerate}\n onGenerateComplete={onGenerateComplete}\n onGenerateError={onGenerateError}\n />\n )}\n </SpeechContext.Provider>\n );\n}\n\n/**\n * Hook to access speech recognition context\n *\n * @example\n * ```tsx\n * const {\n * transcript,\n * isListening,\n * startListening,\n * isWidgetEnabled,\n * toggleWidget\n * } = useSpeechContext();\n * ```\n */\nexport function useSpeechContext(): SpeechContextValue {\n const context = useContext(SpeechContext);\n\n if (!context) {\n throw new Error(\"useSpeechContext must be used within a SpeechProvider\");\n }\n\n return context;\n}\n\nexport default SpeechProvider;\n","import React from \"react\";\nimport type { SpeechRecognitionConfig } from \"../types\";\nimport microphoneSvg from \"../assets/microphon.svg\";\nimport pauseSvg from \"../assets/pause.svg\";\n\nexport interface SpeechButtonProps {\n /** Whether currently listening */\n isListening: boolean;\n /** Handler to start listening */\n onStart: (config?: SpeechRecognitionConfig) => void;\n /** Handler to stop listening */\n onStop: () => void;\n /** Button disabled state */\n disabled?: boolean;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Custom start icon */\n startIcon?: React.ReactNode;\n /** Custom stop icon */\n stopIcon?: React.ReactNode;\n /** Custom start label */\n startLabel?: string;\n /** Custom stop label */\n stopLabel?: string;\n /** Size variant */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether to use custom SVG assets */\n useAssets?: boolean;\n}\n\nconst sizeMap = {\n sm: 60,\n md: 100,\n lg: 140,\n};\n\nconst defaultStyles: Record<string, React.CSSProperties> = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n border: \"none\",\n borderRadius: \"50%\",\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n background: \"transparent\",\n padding: 0,\n },\n disabled: {\n opacity: 0.5,\n cursor: \"not-allowed\",\n },\n};\n\nconst MicIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"32\" height=\"32\">\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm-1-9c0-.55.45-1 1-1s1 .45 1 1v6c0 .55-.45 1-1 1s-1-.45-1-1V5z\" />\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\n </svg>\n);\n\nconst StopIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"32\" height=\"32\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" />\n </svg>\n);\n\n/**\n * Pre-styled speech recognition button component\n *\n * @example\n * ```tsx\n * const { isListening, startListening, stopListening } = useSpeechRecognition();\n *\n * <SpeechButton\n * isListening={isListening}\n * onStart={startListening}\n * onStop={stopListening}\n * useAssets\n * />\n * ```\n */\nexport function SpeechButton({\n isListening,\n onStart,\n onStop,\n disabled = false,\n className,\n style,\n startIcon,\n stopIcon,\n startLabel,\n stopLabel,\n size = \"md\",\n useAssets = true,\n}: SpeechButtonProps) {\n const handleClick = () => {\n if (disabled) return;\n if (isListening) {\n onStop();\n } else {\n onStart();\n }\n };\n\n const buttonSize = sizeMap[size];\n\n const buttonStyle: React.CSSProperties = {\n ...defaultStyles.button,\n width: buttonSize,\n height: buttonSize,\n ...(disabled && defaultStyles.disabled),\n filter: useAssets ? \"drop-shadow(0 4px 12px rgba(255, 122, 0, 0.4))\" : undefined,\n ...style,\n };\n\n // Use assets (SVG images)\n if (useAssets) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={className}\n style={buttonStyle}\n aria-label={isListening ? \"Stop recording\" : \"Start recording\"}\n >\n <img\n src={isListening ? pauseSvg : microphoneSvg}\n alt={isListening ? \"Stop\" : \"Start\"}\n style={{ width: \"100%\", height: \"100%\" }}\n />\n </button>\n );\n }\n\n // Use inline SVG icons\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={className}\n style={{\n ...buttonStyle,\n background: isListening\n ? \"linear-gradient(135deg, #ef4444 0%, #dc2626 100%)\"\n : \"linear-gradient(135deg, #667eea 0%, #764ba2 100%)\",\n color: \"white\",\n boxShadow: isListening\n ? \"0 10px 40px rgba(239, 68, 68, 0.4)\"\n : \"0 10px 40px rgba(102, 126, 234, 0.4)\",\n }}\n aria-label={isListening ? \"Stop recording\" : \"Start recording\"}\n >\n <span style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: \"4px\" }}>\n {isListening ? (stopIcon || <StopIcon />) : (startIcon || <MicIcon />)}\n {(startLabel || stopLabel) && (\n <span style={{ fontSize: size === \"sm\" ? \"10px\" : size === \"md\" ? \"12px\" : \"14px\" }}>\n {isListening ? stopLabel || \"Stop\" : startLabel || \"Start\"}\n </span>\n )}\n </span>\n </button>\n );\n}\n\nexport default SpeechButton;\n","import React from \"react\";\n\nexport interface TranscriptDisplayProps {\n /** The transcript text to display */\n transcript: string;\n /** Placeholder text when transcript is empty */\n placeholder?: string;\n /** Whether currently listening */\n isListening?: boolean;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Handler to reset transcript */\n onReset?: () => void;\n /** Show reset button */\n showResetButton?: boolean;\n /** Maximum height before scrolling */\n maxHeight?: string | number;\n}\n\nconst defaultStyles: Record<string, React.CSSProperties> = {\n container: {\n width: \"100%\",\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: \"12px\",\n },\n title: {\n fontSize: \"18px\",\n fontWeight: 600,\n margin: 0,\n },\n resetButton: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 16px\",\n borderRadius: \"8px\",\n border: \"1px solid #374151\",\n background: \"transparent\",\n color: \"#9ca3af\",\n fontSize: \"14px\",\n cursor: \"pointer\",\n },\n box: {\n background: \"rgba(255, 255, 255, 0.03)\",\n border: \"1px solid #374151\",\n borderRadius: \"16px\",\n padding: \"24px\",\n minHeight: \"150px\",\n overflowY: \"auto\" as const,\n },\n text: {\n fontSize: \"18px\",\n lineHeight: 1.75,\n margin: 0,\n wordWrap: \"break-word\" as const,\n },\n placeholder: {\n color: \"#6b7280\",\n fontSize: \"16px\",\n textAlign: \"center\" as const,\n margin: 0,\n padding: \"32px 0\",\n },\n};\n\nconst ResetIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"16\" height=\"16\">\n <path d=\"M17.65 6.35A7.958 7.958 0 0012 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08A5.99 5.99 0 0112 18c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\" />\n </svg>\n);\n\n/**\n * Component to display speech recognition transcript\n *\n * @example\n * ```tsx\n * const { transcript, isListening, resetTranscript } = useSpeechRecognition();\n *\n * <TranscriptDisplay\n * transcript={transcript}\n * isListening={isListening}\n * onReset={resetTranscript}\n * showResetButton\n * />\n * ```\n */\nexport function TranscriptDisplay({\n transcript,\n placeholder = \"Click the microphone to start speaking...\",\n isListening = false,\n className,\n style,\n onReset,\n showResetButton = true,\n maxHeight = \"300px\",\n}: TranscriptDisplayProps) {\n const boxStyle: React.CSSProperties = {\n ...defaultStyles.box,\n maxHeight,\n ...style,\n };\n\n return (\n <div className={className} style={defaultStyles.container}>\n <div style={defaultStyles.header}>\n <h2 style={defaultStyles.title}>📝 Transcript</h2>\n {showResetButton && onReset && (\n <button\n type=\"button\"\n onClick={onReset}\n disabled={!transcript}\n style={{\n ...defaultStyles.resetButton,\n opacity: transcript ? 1 : 0.5,\n cursor: transcript ? \"pointer\" : \"not-allowed\",\n }}\n >\n <ResetIcon />\n Clear\n </button>\n )}\n </div>\n <div style={boxStyle}>\n {transcript ? (\n <p style={defaultStyles.text}>{transcript}</p>\n ) : (\n <p style={defaultStyles.placeholder}>\n {isListening\n ? \"🎧 Listening... Speak now!\"\n : placeholder}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nexport default TranscriptDisplay;\n"],"names":["isSpeechRecognitionSupported","getSpeechRecognition","requestMicrophonePermission","track","isMicrophoneAvailable","device","getSupportedLanguages","formatConfidence","confidence","DEFAULT_CONFIG","useSpeechRecognition","options","config","callbacks","isListening","setIsListening","useState","transcript","setTranscript","interimTranscript","setInterimTranscript","finalTranscript","setFinalTranscript","error","setError","setIsMicrophoneAvailable","recognitionRef","useRef","callbacksRef","useEffect","isSupported","startListening","useCallback","overrideConfig","SpeechRecognitionClass","recognition","mergedConfig","event","errorMessage","getErrorMessage","interim","final","i","result","text","prev","newFinal","fullTranscript","stopListening","abortListening","resetTranscript","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","microphoneSvg","pauseSvg","bgAiSpeechSvg","styles","keyframesStyle","CloseIcon","jsx","SparkleIcon","AISparkleIcon","jsxs","SpeechModal","isOpen","onClose","onStartListening","onStopListening","onResetTranscript","onGenerate","isGenerating","title","generateButtonText","placeholder","modalRef","handleEscape","e","handleOverlayClick","handleMicClick","handleGenerate","Fragment","getPositionStyles","position","positions","SpeechWidget","enabled","onGenerateComplete","onGenerateError","modalTitle","buttonContent","buttonSize","buttonStyle","zIndex","isModalOpen","setIsModalOpen","setIsGenerating","handleOpenModal","handleCloseModal","response","floatingButtonStyle","SpeechContext","createContext","SpeechProvider","showWidget","initialWidgetEnabled","widgetPosition","widgetButtonSize","widgetZIndex","isWidgetEnabled","setIsWidgetEnabled","speechRecognition","setWidgetEnabled","toggleWidget","useMemo","useSpeechContext","context","useContext","sizeMap","defaultStyles","MicIcon","StopIcon","SpeechButton","onStart","onStop","disabled","className","style","startIcon","stopIcon","startLabel","stopLabel","size","useAssets","handleClick","ResetIcon","TranscriptDisplay","onReset","showResetButton","maxHeight","boxStyle"],"mappings":"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","x_google_ignoreList":[2,3,4]}
1
+ {"version":3,"file":"speech-recognition-sdk.umd.js","sources":["../../src/lib/utils/index.ts","../../src/lib/hooks/useSpeechRecognition.ts","../../src/lib/assets/microphon.svg","../../src/lib/assets/pause.svg","../../src/lib/assets/bg-ai-speech.svg","../../src/lib/components/SpeechModal.tsx","../../src/lib/components/SpeechWidget.tsx","../../src/lib/components/SpeechProvider.tsx","../../src/lib/components/SpeechButton.tsx","../../src/lib/components/TranscriptDisplay.tsx"],"sourcesContent":["/**\n * Speech Recognition SDK Utilities\n */\n\n/**\n * Check if browser supports Web Speech API\n */\nexport function isSpeechRecognitionSupported(): boolean {\n if (typeof window === \"undefined\") return false;\n\n return !!(\n window.SpeechRecognition ||\n (window as typeof window & { webkitSpeechRecognition?: unknown })\n .webkitSpeechRecognition\n );\n}\n\n/**\n * Get the SpeechRecognition constructor\n */\nexport function getSpeechRecognition(): typeof SpeechRecognition | null {\n if (typeof window === \"undefined\") return null;\n\n return (\n window.SpeechRecognition ||\n (window as typeof window & { webkitSpeechRecognition?: typeof SpeechRecognition })\n .webkitSpeechRecognition ||\n null\n );\n}\n\n/**\n * Request microphone permission\n */\nexport async function requestMicrophonePermission(): Promise<boolean> {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n // Stop all tracks after getting permission\n stream.getTracks().forEach((track) => track.stop());\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if microphone is available\n */\nexport async function isMicrophoneAvailable(): Promise<boolean> {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.some((device) => device.kind === \"audioinput\");\n } catch {\n return false;\n }\n}\n\n/**\n * Get supported languages for speech recognition\n * Note: Actual support depends on browser\n */\nexport function getSupportedLanguages(): string[] {\n return [\n \"th-TH\", // Thai\n \"en-US\", // English (US)\n \"en-GB\", // English (UK)\n \"en-AU\", // English (Australia)\n \"zh-CN\", // Chinese (Simplified)\n \"zh-TW\", // Chinese (Traditional)\n \"ja-JP\", // Japanese\n \"ko-KR\", // Korean\n \"vi-VN\", // Vietnamese\n \"id-ID\", // Indonesian\n \"ms-MY\", // Malay\n \"fr-FR\", // French\n \"de-DE\", // German\n \"es-ES\", // Spanish\n \"pt-BR\", // Portuguese (Brazil)\n \"ru-RU\", // Russian\n \"ar-SA\", // Arabic\n \"hi-IN\", // Hindi\n ];\n}\n\n/**\n * Format confidence score as percentage\n */\nexport function formatConfidence(confidence: number): string {\n return `${Math.round(confidence * 100)}%`;\n}\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport type {\n SpeechRecognitionConfig,\n SpeechRecognitionCallbacks,\n UseSpeechRecognitionReturn,\n} from \"../types\";\nimport {\n getSpeechRecognition,\n isSpeechRecognitionSupported,\n requestMicrophonePermission,\n} from \"../utils\";\n\nconst DEFAULT_CONFIG: SpeechRecognitionConfig = {\n language: \"th-TH\",\n continuous: true,\n interimResults: true,\n maxAlternatives: 1,\n};\n\nexport interface UseSpeechRecognitionOptions {\n /** Configuration for speech recognition */\n config?: SpeechRecognitionConfig;\n /** Event callbacks */\n callbacks?: SpeechRecognitionCallbacks;\n}\n\n/**\n * Custom hook for speech recognition\n *\n * @example\n * ```tsx\n * const {\n * transcript,\n * isListening,\n * startListening,\n * stopListening,\n * resetTranscript\n * } = useSpeechRecognition({\n * config: { language: 'th-TH' },\n * callbacks: {\n * onResult: (result) => console.log(result)\n * }\n * });\n * ```\n */\nexport function useSpeechRecognition(\n options: UseSpeechRecognitionOptions = {}\n): UseSpeechRecognitionReturn {\n const { config = {}, callbacks = {} } = options;\n\n // State\n const [isListening, setIsListening] = useState(false);\n const [transcript, setTranscript] = useState(\"\");\n const [interimTranscript, setInterimTranscript] = useState(\"\");\n const [finalTranscript, setFinalTranscript] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [isMicrophoneAvailable, setIsMicrophoneAvailable] = useState(true);\n\n // Refs\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const callbacksRef = useRef(callbacks);\n\n // Update callbacks ref\n useEffect(() => {\n callbacksRef.current = callbacks;\n }, [callbacks]);\n\n // Check support\n const isSupported = isSpeechRecognitionSupported();\n\n // Start listening\n const startListening = useCallback(\n async (overrideConfig?: SpeechRecognitionConfig) => {\n if (!isSupported) {\n setError(\"Speech recognition is not supported in this browser\");\n return;\n }\n\n // Request microphone permission first\n const hasPermission = await requestMicrophonePermission();\n if (!hasPermission) {\n setError(\"Microphone permission denied\");\n setIsMicrophoneAvailable(false);\n return;\n }\n\n // Stop existing recognition\n if (recognitionRef.current) {\n recognitionRef.current.abort();\n }\n\n // Create new recognition with merged config\n const SpeechRecognitionClass = getSpeechRecognition();\n if (!SpeechRecognitionClass) return;\n\n const recognition = new SpeechRecognitionClass();\n const mergedConfig = { ...DEFAULT_CONFIG, ...config, ...overrideConfig };\n\n recognition.lang = mergedConfig.language || \"th-TH\";\n recognition.continuous = mergedConfig.continuous ?? true;\n recognition.interimResults = mergedConfig.interimResults ?? true;\n recognition.maxAlternatives = mergedConfig.maxAlternatives ?? 1;\n\n // Event handlers\n recognition.onstart = () => {\n setIsListening(true);\n setError(null);\n callbacksRef.current.onStart?.();\n };\n\n recognition.onend = () => {\n setIsListening(false);\n callbacksRef.current.onEnd?.();\n };\n\n recognition.onerror = (event) => {\n const errorMessage = getErrorMessage(event.error);\n setError(errorMessage);\n setIsListening(false);\n callbacksRef.current.onError?.(errorMessage);\n };\n\n recognition.onresult = (event) => {\n let interim = \"\";\n let final = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n const text = result[0].transcript;\n\n if (result.isFinal) {\n final += text;\n callbacksRef.current.onResult?.({\n transcript: text,\n confidence: result[0].confidence,\n isFinal: true,\n });\n } else {\n interim += text;\n }\n }\n\n setInterimTranscript(interim);\n setFinalTranscript((prev) => {\n const newFinal = prev + final;\n const fullTranscript = newFinal + interim;\n setTranscript(fullTranscript);\n callbacksRef.current.onTranscriptChange?.(fullTranscript);\n return newFinal;\n });\n };\n\n recognitionRef.current = recognition;\n recognition.start();\n },\n [isSupported, config]\n );\n\n // Stop listening\n const stopListening = useCallback(() => {\n if (recognitionRef.current) {\n recognitionRef.current.stop();\n }\n }, []);\n\n // Abort listening\n const abortListening = useCallback(() => {\n if (recognitionRef.current) {\n recognitionRef.current.abort();\n }\n setIsListening(false);\n }, []);\n\n // Reset transcript\n const resetTranscript = useCallback(() => {\n setTranscript(\"\");\n setInterimTranscript(\"\");\n setFinalTranscript(\"\");\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (recognitionRef.current) {\n recognitionRef.current.abort();\n }\n };\n }, []);\n\n return {\n // State\n isListening,\n transcript,\n interimTranscript,\n finalTranscript,\n isSupported,\n isMicrophoneAvailable,\n error,\n // Actions\n startListening,\n stopListening,\n abortListening,\n resetTranscript,\n };\n}\n\n/**\n * Get human-readable error message\n */\nfunction getErrorMessage(error: string): string {\n const errorMessages: Record<string, string> = {\n \"not-allowed\": \"Microphone permission was denied\",\n \"no-speech\": \"No speech was detected\",\n \"audio-capture\": \"No microphone was found\",\n network: \"Network error occurred\",\n aborted: \"Speech recognition was aborted\",\n \"language-not-supported\": \"Language is not supported\",\n \"service-not-allowed\": \"Speech recognition service is not allowed\",\n };\n\n return errorMessages[error] || `Speech recognition error: ${error}`;\n}\n\nexport default useSpeechRecognition;\n","export default \"data:image/svg+xml,%3csvg%20width='117'%20height='120'%20viewBox='0%200%20117%20120'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='%23FF8800'%20/%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='url(%23paint0_radial_6015_131977)'%20/%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='url(%23paint1_radial_6015_131977)'%20fill-opacity='0.4'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20fill='%23FF8800'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20fill='url(%23paint2_radial_6015_131977)'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20fill='url(%23paint3_radial_6015_131977)'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20fill='url(%23paint4_radial_6015_131977)'%20fill-opacity='0.3'%20/%3e%3crect%20x='0.909091'%20y='0.909091'%20width='114.545'%20height='114.545'%20rx='57.2727'%20stroke='url(%23paint5_linear_6015_131977)'%20stroke-width='1.81818'%20/%3e%3cg%20opacity='0.4'%3e%3cpath%20d='M27.2731%20104.474C27.0272%2082.1726%209.92689%2079.0823%203.63672%2079.4341C25.2722%2077.2252%2027.1558%2041.2543%2027.2731%2031.9004C27.4055%2041.4094%2029.3496%2077.2327%2050.9094%2079.4379C44.6231%2079.0861%2027.5341%2082.2028%2027.2731%20104.478V104.474Z'%20fill='url(%23paint6_radial_6015_131977)'%20/%3e%3c/g%3e%3cg%20opacity='0.4'%3e%3cg%20clip-path='url(%23clip0_6015_131977)'%3e%3cpath%20d='M87.2716%2014.546C87.4985%2035.1318%20103.284%2037.9843%20109.09%2037.6596C89.1186%2039.6987%2087.3798%2072.9027%2087.2716%2081.5371C87.1494%2072.7595%2085.3547%2039.6917%2065.4533%2037.6561C71.2561%2037.9809%2087.0306%2035.1039%2087.2716%2014.5425L87.2716%2014.546Z'%20fill='url(%23paint7_radial_6015_131977)'%20/%3e%3c/g%3e%3c/g%3e%3cg%20clip-path='url(%23clip1_6015_131977)'%20filter='url(%23filter0_i_6015_131977)'%20%3e%3cpath%20d='M77.1274%2060.0186C77.1274%2058.8913%2076.2654%2058.0293%2075.1381%2058.0293C74.0108%2058.0293%2073.1488%2058.8913%2073.1488%2060.0186C73.1488%2067.7769%2066.8493%2074.0764%2059.0911%2074.0764C51.3328%2074.0764%2045.0333%2067.7769%2045.0333%2060.0186C45.0333%2058.8913%2044.1713%2058.0293%2043.044%2058.0293C41.9167%2058.0293%2041.0547%2058.8913%2041.0547%2060.0186C41.0547%2069.2357%2047.9509%2076.994%2057.1017%2077.9887V83.2935H49.8739C48.7467%2083.2935%2047.8846%2084.1555%2047.8846%2085.2828C47.8846%2086.41%2048.7467%2087.2721%2049.8739%2087.2721H68.3082C69.4354%2087.2721%2070.2975%2086.41%2070.2975%2085.2828C70.2975%2084.1555%2069.4354%2083.2935%2068.3082%2083.2935H61.0804V77.9887C70.2312%2076.994%2077.1274%2069.2357%2077.1274%2060.0186Z'%20fill='white'%20/%3e%3cpath%20d='M59.0933%2030.9082C52.9928%2030.9082%2048.0195%2035.8815%2048.0195%2041.982V59.9521C48.0195%2066.1189%2052.9928%2071.0259%2059.0933%2071.0922C65.1939%2071.0922%2070.1671%2066.1189%2070.1671%2060.0184V41.982C70.1671%2035.8815%2065.1939%2030.9082%2059.0933%2030.9082Z'%20fill='white'%20/%3e%3c/g%3e%3cdefs%3e%3cfilter%20id='filter0_i_6015_131977'%20x='30.9102'%20y='30.9082'%20width='56.3633'%20height='58.1815'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%20%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'%20/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='BackgroundImageFix'%20result='shape'%20/%3e%3cfeColorMatrix%20in='SourceAlpha'%20type='matrix'%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%20127%200'%20result='hardAlpha'%20/%3e%3cfeOffset%20dy='1.81818'%20/%3e%3cfeGaussianBlur%20stdDeviation='0.909091'%20/%3e%3cfeComposite%20in2='hardAlpha'%20operator='arithmetic'%20k2='-1'%20k3='1'%20/%3e%3cfeColorMatrix%20type='matrix'%20values='0%200%200%200%200.937087%200%200%200%200%200.449802%200%200%200%200%200%200%200%200%201%200'%20/%3e%3cfeBlend%20mode='normal'%20in2='shape'%20result='effect1_innerShadow_6015_131977'%20/%3e%3c/filter%3e%3cradialGradient%20id='paint0_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-107.107%20232.727%20-57.2274%20-199.178%20110.413%20-150.909)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20offset='0.67589'%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='1'%20stop-color='%23DBFF00'%20stop-opacity='0.38'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint1_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(25.124%20-134.545%2037.8392%2053.435%2043.6364%20120)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20stop-opacity='0.73'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.12'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint2_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-107.107%20232.727%20-57.2274%20-199.178%20110.413%20-154.545)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20offset='0.67589'%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='1'%20stop-color='%23FFC700'%20stop-opacity='0.38'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint3_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(45.6198%20-45.4545%2027.7487%20210.613%206.61157%20116.364)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='%23F6FB22'%20stop-opacity='0.51'%20/%3e%3cstop%20offset='1'%20stop-color='%23FF9E45'%20stop-opacity='0'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint4_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-36.3636%2036.3636%20-36.3636%20-275%20112.397%2036.3637)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0'%20/%3e%3c/radialGradient%3e%3clinearGradient%20id='paint5_linear_6015_131977'%20x1='58.1818'%20y1='0'%20x2='58.1818'%20y2='116.364'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='1'%20stop-color='%23FF7A00'%20stop-opacity='0'%20/%3e%3c/linearGradient%3e%3cradialGradient%20id='paint6_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(10.2066%20-83.9173%2015.3722%2033.328%2021.364%20104.478)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.2'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint7_radial_6015_131977'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-9.42152%2077.4625%20-14.1898%20-30.7644%2092.7261%2014.5425)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.1'%20/%3e%3c/radialGradient%3e%3cclipPath%20id='clip0_6015_131977'%3e%3crect%20width='43.6366'%20height='66.9911'%20fill='white'%20transform='translate(109.09%2081.5371)%20rotate(180)'%20/%3e%3c/clipPath%3e%3cclipPath%20id='clip1_6015_131977'%3e%3crect%20width='56.3636'%20height='56.3636'%20fill='white'%20transform='translate(30.9102%2030.9082)'%20/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='117'%20height='120'%20viewBox='0%200%20117%20120'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20%3e%3cg%20filter='url(%23filter0_i_6104_131024)'%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='%23FF8800'%20/%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='url(%23paint0_radial_6104_131024)'%20/%3e%3crect%20y='3.63672'%20width='116.364'%20height='116.364'%20rx='58.1818'%20fill='url(%23paint1_radial_6104_131024)'%20fill-opacity='0.4'%20/%3e%3c/g%3e%3crect%20x='1.08067'%20y='1.08067'%20width='114.202'%20height='114.202'%20rx='57.1011'%20fill='white'%20stroke='url(%23paint2_linear_6104_131024)'%20stroke-width='2.16135'%20/%3e%3cg%20filter='url(%23filter1_d_6104_131024)'%3e%3cpath%20d='M49.7119%2041.0605C52.0993%2041.0605%2054.0352%2042.9964%2054.0352%2045.3838V75.6426C54.0351%2078.0299%2052.0992%2079.9648%2049.7119%2079.9648H41.0664C38.6793%2079.9646%2036.7442%2078.0297%2036.7441%2075.6426V45.3838C36.7441%2042.9966%2038.6793%2041.0608%2041.0664%2041.0605H49.7119ZM75.6484%2041.0605C78.0358%2041.0605%2079.9707%2042.9964%2079.9707%2045.3838V75.6426C79.9706%2078.0299%2078.0357%2079.9648%2075.6484%2079.9648H67.0029C64.6157%2079.9648%2062.6808%2078.0298%2062.6807%2075.6426V45.3838C62.6807%2042.9965%2064.6156%2041.0606%2067.0029%2041.0605H75.6484Z'%20fill='%23FBEDD9'%20/%3e%3cpath%20d='M49.7119%2041.0605C52.0993%2041.0605%2054.0352%2042.9964%2054.0352%2045.3838V75.6426C54.0351%2078.0299%2052.0992%2079.9648%2049.7119%2079.9648H41.0664C38.6793%2079.9646%2036.7442%2078.0297%2036.7441%2075.6426V45.3838C36.7441%2042.9966%2038.6793%2041.0608%2041.0664%2041.0605H49.7119ZM75.6484%2041.0605C78.0358%2041.0605%2079.9707%2042.9964%2079.9707%2045.3838V75.6426C79.9706%2078.0299%2078.0357%2079.9648%2075.6484%2079.9648H67.0029C64.6157%2079.9648%2062.6808%2078.0298%2062.6807%2075.6426V45.3838C62.6807%2042.9965%2064.6156%2041.0606%2067.0029%2041.0605H75.6484Z'%20fill='%23FF7A00'%20/%3e%3cpath%20d='M49.7119%2041.0605C52.0993%2041.0605%2054.0352%2042.9964%2054.0352%2045.3838V75.6426C54.0351%2078.0299%2052.0992%2079.9648%2049.7119%2079.9648H41.0664C38.6793%2079.9646%2036.7442%2078.0297%2036.7441%2075.6426V45.3838C36.7441%2042.9966%2038.6793%2041.0608%2041.0664%2041.0605H49.7119ZM75.6484%2041.0605C78.0358%2041.0605%2079.9707%2042.9964%2079.9707%2045.3838V75.6426C79.9706%2078.0299%2078.0357%2079.9648%2075.6484%2079.9648H67.0029C64.6157%2079.9648%2062.6808%2078.0298%2062.6807%2075.6426V45.3838C62.6807%2042.9965%2064.6156%2041.0606%2067.0029%2041.0605H75.6484Z'%20fill='url(%23paint3_radial_6104_131024)'%20fill-opacity='0.4'%20/%3e%3c/g%3e%3cdefs%3e%3cfilter%20id='filter0_i_6104_131024'%20x='0'%20y='3.63672'%20width='116.363'%20height='116.363'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%20%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'%20/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='BackgroundImageFix'%20result='shape'%20/%3e%3cfeColorMatrix%20in='SourceAlpha'%20type='matrix'%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%20127%200'%20result='hardAlpha'%20/%3e%3cfeOffset%20/%3e%3cfeGaussianBlur%20stdDeviation='3.63636'%20/%3e%3cfeComposite%20in2='hardAlpha'%20operator='arithmetic'%20k2='-1'%20k3='1'%20/%3e%3cfeColorMatrix%20type='matrix'%20values='0%200%200%200%201%200%200%200%200%201%200%200%200%200%201%200%200%200%201%200'%20/%3e%3cfeBlend%20mode='normal'%20in2='shape'%20result='effect1_innerShadow_6104_131024'%20/%3e%3c/filter%3e%3cfilter%20id='filter1_d_6104_131024'%20x='34.5828'%20y='38.8992'%20width='47.5493'%20height='43.227'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%20%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'%20/%3e%3cfeColorMatrix%20in='SourceAlpha'%20type='matrix'%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%20127%200'%20result='hardAlpha'%20/%3e%3cfeOffset%20/%3e%3cfeGaussianBlur%20stdDeviation='1.08067'%20/%3e%3cfeComposite%20in2='hardAlpha'%20operator='out'%20/%3e%3cfeColorMatrix%20type='matrix'%20values='0%200%200%200%201%200%200%200%200%200.565%200%200%200%200%200%200%200%200%201%200'%20/%3e%3cfeBlend%20mode='normal'%20in2='BackgroundImageFix'%20result='effect1_dropShadow_6104_131024'%20/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='effect1_dropShadow_6104_131024'%20result='shape'%20/%3e%3c/filter%3e%3cradialGradient%20id='paint0_radial_6104_131024'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(-107.107%20232.727%20-57.2274%20-199.178%20110.413%20-150.909)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20offset='0.67589'%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='1'%20stop-color='%23DBFF00'%20stop-opacity='0.38'%20/%3e%3c/radialGradient%3e%3cradialGradient%20id='paint1_radial_6104_131024'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(25.124%20-134.545%2037.8392%2053.435%2043.6364%20120)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20stop-opacity='0.73'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.12'%20/%3e%3c/radialGradient%3e%3clinearGradient%20id='paint2_linear_6104_131024'%20x1='58.1818'%20y1='0'%20x2='58.1818'%20y2='116.364'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='%23FF7A00'%20/%3e%3cstop%20offset='0.515'%20stop-color='%23FCEAD2'%20/%3e%3cstop%20offset='1'%20stop-color='%23FF7A00'%20/%3e%3c/linearGradient%3e%3cradialGradient%20id='paint3_radial_6104_131024'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='matrix(9.33301%20-44.9831%2014.0564%2017.8651%2052.9541%2079.9648)'%20gradientUnits='userSpaceOnUse'%20%3e%3cstop%20stop-color='white'%20stop-opacity='0.73'%20/%3e%3cstop%20offset='1'%20stop-color='white'%20stop-opacity='0.12'%20/%3e%3c/radialGradient%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='640'%20height='640'%20viewBox='0%200%20640%20640'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20filter='url(%23filter0_f_5207_91652)'%3e%3cg%20filter='url(%23filter1_f_5207_91652)'%3e%3crect%20x='45'%20y='45'%20width='550'%20height='550'%20rx='275'%20fill='url(%23paint0_linear_5207_91652)'/%3e%3c/g%3e%3c/g%3e%3cdefs%3e%3cfilter%20id='filter0_f_5207_91652'%20x='-32'%20y='-32'%20width='704'%20height='704'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='BackgroundImageFix'%20result='shape'/%3e%3cfeGaussianBlur%20stdDeviation='16'%20result='effect1_foregroundBlur_5207_91652'/%3e%3c/filter%3e%3cfilter%20id='filter1_f_5207_91652'%20x='41.4052'%20y='41.4052'%20width='557.19'%20height='557.19'%20filterUnits='userSpaceOnUse'%20color-interpolation-filters='sRGB'%3e%3cfeFlood%20flood-opacity='0'%20result='BackgroundImageFix'/%3e%3cfeBlend%20mode='normal'%20in='SourceGraphic'%20in2='BackgroundImageFix'%20result='shape'/%3e%3cfeGaussianBlur%20stdDeviation='1.79739'%20result='effect1_foregroundBlur_5207_91652'/%3e%3c/filter%3e%3clinearGradient%20id='paint0_linear_5207_91652'%20x1='320'%20y1='45'%20x2='326.74'%20y2='605.784'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0.177383'%20stop-color='%23EBDDFF'/%3e%3cstop%20offset='0.755511'%20stop-color='%23FEBB63'/%3e%3cstop%20offset='1'%20stop-color='%23FF7A00'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\"","import React, { useEffect, useRef } from \"react\";\nimport microphoneSvg from \"../assets/microphon.svg\";\nimport pauseSvg from \"../assets/pause.svg\";\nimport bgAiSpeechSvg from \"../assets/bg-ai-speech.svg\";\n\nexport interface SpeechModalProps {\n /** Whether modal is open */\n isOpen: boolean;\n /** Close modal handler */\n onClose: () => void;\n /** Whether currently listening */\n isListening: boolean;\n /** Current transcript */\n transcript: string;\n /** Start listening handler */\n onStartListening: () => void;\n /** Stop listening handler */\n onStopListening: () => void;\n /** Reset transcript handler */\n onResetTranscript: () => void;\n /** Generate/Submit handler */\n onGenerate: (transcript: string) => void;\n /** Whether generating/loading */\n isGenerating?: boolean;\n /** Modal title */\n title?: string;\n /** Generate button text */\n generateButtonText?: string;\n /** Placeholder text */\n placeholder?: string;\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n overlay: {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n backdropFilter: \"blur(8px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 9999,\n padding: \"20px\",\n },\n modal: {\n backgroundColor: \"#ffffff\",\n borderRadius: \"32px\",\n padding: \"40px\",\n width: \"100%\",\n maxWidth: \"480px\",\n maxHeight: \"90vh\",\n overflow: \"auto\",\n boxShadow: \"0 25px 80px rgba(0, 0, 0, 0.15)\",\n position: \"relative\" as const,\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: \"32px\",\n },\n title: {\n fontSize: \"18px\",\n fontWeight: 600,\n color: \"#1f2937\",\n margin: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n closeButton: {\n background: \"transparent\",\n border: \"none\",\n color: \"#9ca3af\",\n cursor: \"pointer\",\n padding: \"8px\",\n borderRadius: \"8px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"all 0.2s\",\n },\n micSection: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n alignItems: \"center\",\n gap: \"24px\",\n marginBottom: \"32px\",\n position: \"relative\" as const,\n },\n bgCircle: {\n position: \"absolute\" as const,\n width: \"280px\",\n height: \"280px\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 0,\n opacity: 0.8,\n transition: \"opacity 0.3s ease\",\n },\n micButton: {\n width: \"120px\",\n height: \"120px\",\n borderRadius: \"50%\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"transparent\",\n padding: 0,\n position: \"relative\" as const,\n zIndex: 1,\n transition: \"transform 0.2s ease\",\n },\n micImage: {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\" as const,\n },\n statusText: {\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#6b7280\",\n textAlign: \"center\" as const,\n position: \"relative\" as const,\n zIndex: 1,\n },\n statusTextActive: {\n color: \"#FF7A00\",\n fontWeight: 600,\n },\n transcriptBox: {\n background: \"#f9fafb\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"16px\",\n padding: \"20px\",\n minHeight: \"100px\",\n maxHeight: \"160px\",\n overflow: \"auto\",\n marginBottom: \"24px\",\n },\n transcriptText: {\n fontSize: \"15px\",\n lineHeight: 1.7,\n color: \"#1f2937\",\n margin: 0,\n wordWrap: \"break-word\" as const,\n },\n placeholderText: {\n fontSize: \"14px\",\n color: \"#9ca3af\",\n textAlign: \"center\" as const,\n margin: 0,\n padding: \"16px 0\",\n },\n actions: {\n display: \"flex\",\n justifyContent: \"center\",\n },\n generateButton: {\n padding: \"14px 48px\",\n borderRadius: \"100px\",\n border: \"2px solid #9333ea\",\n background: \"transparent\",\n color: \"#9333ea\",\n fontSize: \"15px\",\n fontWeight: 600,\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n },\n generateButtonDisabled: {\n opacity: 0.4,\n cursor: \"not-allowed\",\n borderColor: \"#d1d5db\",\n color: \"#9ca3af\",\n },\n loadingOverlay: {\n position: \"absolute\" as const,\n inset: 0,\n background: \"rgba(255, 255, 255, 0.95)\",\n borderRadius: \"32px\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"24px\",\n zIndex: 10,\n },\n loadingBars: {\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: \"12px\",\n width: \"200px\",\n },\n loadingBar: {\n height: \"12px\",\n borderRadius: \"6px\",\n background: \"linear-gradient(90deg, #e5e7eb 0%, #d1d5db 50%, #e5e7eb 100%)\",\n backgroundSize: \"200% 100%\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n },\n loadingText: {\n fontSize: \"16px\",\n fontWeight: 600,\n color: \"#6b7280\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n },\n sparkleIcon: {\n color: \"#9333ea\",\n },\n footer: {\n marginTop: \"24px\",\n textAlign: \"center\" as const,\n fontSize: \"12px\",\n color: \"#9ca3af\",\n },\n};\n\n// Keyframes CSS\nconst keyframesStyle = `\n @keyframes shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n @keyframes fadeIn {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n }\n @keyframes pulse-glow {\n 0%, 100% { opacity: 0.8; transform: translate(-50%, -50%) scale(1); }\n 50% { opacity: 1; transform: translate(-50%, -50%) scale(1.05); }\n }\n`;\n\nconst CloseIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"24\" height=\"24\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\nconst SparkleIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"20\" height=\"20\">\n <path d=\"M12 2L9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2z\" />\n </svg>\n);\n\nconst AISparkleIcon = () => (\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 2L10.5 8.5L4 10L10.5 11.5L12 18L13.5 11.5L20 10L13.5 8.5L12 2Z\"\n fill=\"#9333ea\"\n />\n <path d=\"M5 14L4 17L7 16L5 14Z\" fill=\"#9333ea\" opacity=\"0.6\" />\n <path d=\"M19 14L20 17L17 16L19 14Z\" fill=\"#9333ea\" opacity=\"0.6\" />\n </svg>\n);\n\nexport function SpeechModal({\n isOpen,\n onClose,\n isListening,\n transcript,\n onStartListening,\n onStopListening,\n onResetTranscript,\n onGenerate,\n isGenerating = false,\n title = \"AI Speech-to-Data\",\n generateButtonText = \"Generate\",\n placeholder = \"Click the microphone and start speaking...\",\n}: SpeechModalProps) {\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && isOpen && !isGenerating) {\n onClose();\n }\n };\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen, onClose, isGenerating]);\n\n // Close on overlay click\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !isGenerating) {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n const handleMicClick = () => {\n if (isGenerating) return;\n if (isListening) {\n onStopListening();\n } else {\n onResetTranscript();\n onStartListening();\n }\n };\n\n const handleGenerate = () => {\n if (transcript && !isGenerating) {\n onGenerate(transcript);\n }\n };\n\n return (\n <>\n <style>{keyframesStyle}</style>\n <div style={styles.overlay} onClick={handleOverlayClick}>\n <div\n ref={modalRef}\n style={{\n ...styles.modal,\n animation: \"fadeIn 0.25s ease-out\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Loading Overlay */}\n {isGenerating && (\n <div style={styles.loadingOverlay}>\n <AISparkleIcon />\n <div style={styles.loadingBars}>\n <div style={{ ...styles.loadingBar, width: \"100%\" }} />\n <div style={{ ...styles.loadingBar, width: \"80%\" }} />\n <div style={{ ...styles.loadingBar, width: \"90%\" }} />\n <div style={{ ...styles.loadingBar, width: \"70%\" }} />\n </div>\n <span style={styles.loadingText}>\n <span style={styles.sparkleIcon}>✨</span>\n AI Analyzing\n </span>\n </div>\n )}\n\n {/* Header */}\n <div style={styles.header}>\n <h2 style={styles.title}>\n <span style={{ fontSize: \"20px\" }}>✨</span>\n {title}\n </h2>\n <button\n style={styles.closeButton}\n onClick={onClose}\n disabled={isGenerating}\n onMouseOver={(e) => {\n if (!isGenerating) {\n e.currentTarget.style.background = \"#f3f4f6\";\n }\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <CloseIcon />\n </button>\n </div>\n\n {/* Mic Section */}\n <div style={styles.micSection}>\n {/* Background glow */}\n <img\n src={bgAiSpeechSvg}\n alt=\"\"\n style={{\n ...styles.bgCircle,\n opacity: isListening ? 1 : 0.6,\n animation: isListening\n ? \"pulse-glow 2s ease-in-out infinite\"\n : \"none\",\n }}\n />\n\n {/* Mic Button */}\n <button\n style={styles.micButton}\n onClick={handleMicClick}\n disabled={isGenerating}\n onMouseOver={(e) => {\n if (!isGenerating) {\n e.currentTarget.style.transform = \"scale(1.05)\";\n }\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.transform = \"scale(1)\";\n }}\n >\n <img\n src={isListening ? pauseSvg : microphoneSvg}\n alt={isListening ? \"Stop\" : \"Start recording\"}\n style={styles.micImage}\n />\n </button>\n\n {/* Status Text */}\n <p\n style={{\n ...styles.statusText,\n ...(isListening ? styles.statusTextActive : {}),\n }}\n >\n {isListening ? \"AI is listening.\" : \"Generate result\"}\n </p>\n </div>\n\n {/* Transcript Box - Only show if there's transcript or not listening */}\n {(transcript || !isListening) && !isGenerating && (\n <div style={styles.transcriptBox}>\n {transcript ? (\n <p style={styles.transcriptText}>{transcript}</p>\n ) : (\n <p style={styles.placeholderText}>{placeholder}</p>\n )}\n </div>\n )}\n\n {/* Generate Button */}\n {!isGenerating && (\n <div style={styles.actions}>\n <button\n style={{\n ...styles.generateButton,\n ...(!transcript ? styles.generateButtonDisabled : {}),\n }}\n onClick={handleGenerate}\n disabled={!transcript || isGenerating}\n onMouseOver={(e) => {\n if (transcript && !isGenerating) {\n e.currentTarget.style.background = \"#9333ea\";\n e.currentTarget.style.color = \"white\";\n }\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = transcript\n ? \"#9333ea\"\n : \"#9ca3af\";\n }}\n >\n <SparkleIcon />\n {generateButtonText}\n </button>\n </div>\n )}\n\n {/* Footer */}\n <div style={styles.footer}>\n <span>\n Powered by <strong>DFM</strong>\n </span>\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport default SpeechModal;\n","import React, { useState, useCallback } from \"react\";\nimport { useSpeechRecognition } from \"../hooks/useSpeechRecognition\";\nimport { SpeechModal } from \"./SpeechModal\";\nimport type { SpeechRecognitionConfig } from \"../types\";\nimport microphoneSvg from \"../assets/microphon.svg\";\n\nexport type WidgetPosition =\n | \"bottom-left\"\n | \"bottom-right\"\n | \"top-left\"\n | \"top-right\"\n | {\n top?: number | string;\n right?: number | string;\n bottom?: number | string;\n left?: number | string;\n };\n\nexport interface SpeechWidgetProps {\n /** Whether the widget is enabled/visible */\n enabled?: boolean;\n /** Position of the floating button */\n position?: WidgetPosition;\n /** Speech recognition config */\n config?: SpeechRecognitionConfig;\n /** Called when generate is clicked with transcript */\n onGenerate?: (transcript: string) => Promise<string> | string;\n /** Called when generation is complete */\n onGenerateComplete?: (response: string) => void;\n /** Called on generation error */\n onGenerateError?: (error: Error) => void;\n /** Modal title */\n modalTitle?: string;\n /** Generate button text */\n generateButtonText?: string;\n /** Custom button content */\n buttonContent?: React.ReactNode;\n /** Button size */\n buttonSize?: number;\n /** Custom button style */\n buttonStyle?: React.CSSProperties;\n /** Z-index for the widget */\n zIndex?: number;\n}\n\nconst getPositionStyles = (position: WidgetPosition): React.CSSProperties => {\n if (typeof position === \"object\") {\n return {\n top: position.top,\n right: position.right,\n bottom: position.bottom,\n left: position.left,\n };\n }\n\n const positions: Record<string, React.CSSProperties> = {\n \"bottom-left\": { bottom: \"24px\", left: \"24px\" },\n \"bottom-right\": { bottom: \"24px\", right: \"24px\" },\n \"top-left\": { top: \"24px\", left: \"24px\" },\n \"top-right\": { top: \"24px\", right: \"24px\" },\n };\n\n return positions[position] || positions[\"bottom-left\"];\n};\n\n/**\n * Floating speech recognition widget\n *\n * @example\n * ```tsx\n * <SpeechWidget\n * enabled={true}\n * position=\"bottom-left\"\n * onGenerate={async (transcript) => {\n * const response = await callAPI(transcript);\n * return response;\n * }}\n * onGenerateComplete={(response) => {\n * console.log('Got response:', response);\n * }}\n * />\n * ```\n */\nexport function SpeechWidget({\n enabled = true,\n position = \"bottom-left\",\n config = { language: \"th-TH\", continuous: true },\n onGenerate,\n onGenerateComplete,\n onGenerateError,\n modalTitle = \"AI Speech-to-Data\",\n generateButtonText = \"Generate\",\n buttonContent,\n buttonSize = 64,\n buttonStyle,\n zIndex = 9998,\n}: SpeechWidgetProps) {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isGenerating, setIsGenerating] = useState(false);\n\n const {\n transcript,\n isListening,\n startListening,\n stopListening,\n resetTranscript,\n } = useSpeechRecognition({ config });\n\n const handleOpenModal = useCallback(() => {\n setIsModalOpen(true);\n }, []);\n\n const handleCloseModal = useCallback(() => {\n setIsModalOpen(false);\n if (isListening) {\n stopListening();\n }\n }, [isListening, stopListening]);\n\n const handleGenerate = useCallback(\n async (text: string) => {\n if (!onGenerate) {\n // If no onGenerate handler, just close modal with transcript\n onGenerateComplete?.(text);\n handleCloseModal();\n resetTranscript();\n return;\n }\n\n setIsGenerating(true);\n try {\n const response = await onGenerate(text);\n onGenerateComplete?.(response);\n handleCloseModal();\n resetTranscript();\n } catch (error) {\n onGenerateError?.(error as Error);\n } finally {\n setIsGenerating(false);\n }\n },\n [\n onGenerate,\n onGenerateComplete,\n onGenerateError,\n handleCloseModal,\n resetTranscript,\n ]\n );\n\n if (!enabled) return null;\n\n const positionStyles = getPositionStyles(position);\n\n const floatingButtonStyle: React.CSSProperties = {\n position: \"fixed\",\n ...positionStyles,\n zIndex,\n width: buttonSize,\n height: buttonSize,\n borderRadius: \"50%\",\n border: \"none\",\n cursor: \"pointer\",\n background: \"transparent\",\n padding: 0,\n transition: \"all 0.3s ease\",\n filter: \"drop-shadow(0 4px 12px rgba(255, 122, 0, 0.4))\",\n ...buttonStyle,\n };\n\n return (\n <>\n {/* Floating Button */}\n <button\n style={floatingButtonStyle}\n onClick={handleOpenModal}\n aria-label=\"Open voice input\"\n onMouseOver={(e) => {\n e.currentTarget.style.transform = \"scale(1.1)\";\n e.currentTarget.style.filter =\n \"drop-shadow(0 6px 20px rgba(255, 122, 0, 0.5))\";\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.transform = \"scale(1)\";\n e.currentTarget.style.filter =\n \"drop-shadow(0 4px 12px rgba(255, 122, 0, 0.4))\";\n }}\n >\n {buttonContent || (\n <img\n src={microphoneSvg}\n alt=\"Voice input\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </button>\n\n {/* Modal */}\n <SpeechModal\n isOpen={isModalOpen}\n onClose={handleCloseModal}\n isListening={isListening}\n transcript={transcript}\n onStartListening={startListening}\n onStopListening={stopListening}\n onResetTranscript={resetTranscript}\n onGenerate={handleGenerate}\n isGenerating={isGenerating}\n title={modalTitle}\n generateButtonText={generateButtonText}\n />\n </>\n );\n}\n\nexport default SpeechWidget;\n","import React, { createContext, useContext, useState, useCallback, useMemo } from \"react\";\nimport { useSpeechRecognition } from \"../hooks/useSpeechRecognition\";\nimport { SpeechWidget, type WidgetPosition } from \"./SpeechWidget\";\nimport type {\n SpeechRecognitionConfig,\n SpeechRecognitionCallbacks,\n UseSpeechRecognitionReturn,\n} from \"../types\";\n\ninterface SpeechContextValue extends UseSpeechRecognitionReturn {\n /** Whether speech widget is enabled */\n isWidgetEnabled: boolean;\n /** Enable/disable the widget */\n setWidgetEnabled: (enabled: boolean) => void;\n /** Toggle widget enabled state */\n toggleWidget: () => void;\n}\n\nconst SpeechContext = createContext<SpeechContextValue | null>(null);\n\nexport interface SpeechProviderProps {\n children: React.ReactNode;\n /** Default configuration for speech recognition */\n config?: SpeechRecognitionConfig;\n /** Event callbacks */\n callbacks?: SpeechRecognitionCallbacks;\n /** Whether to show the floating widget */\n showWidget?: boolean;\n /** Initial widget enabled state */\n widgetEnabled?: boolean;\n /** Widget position */\n widgetPosition?: WidgetPosition;\n /** Widget button size */\n widgetButtonSize?: number;\n /** Widget z-index */\n widgetZIndex?: number;\n /** Modal title */\n modalTitle?: string;\n /** Generate button text */\n generateButtonText?: string;\n /** Called when generate is clicked */\n onGenerate?: (transcript: string) => Promise<string> | string;\n /** Called when generation completes */\n onGenerateComplete?: (response: string) => void;\n /** Called on generation error */\n onGenerateError?: (error: Error) => void;\n}\n\n/**\n * Provider component for speech recognition context with optional floating widget\n *\n * @example\n * ```tsx\n * <SpeechProvider\n * config={{ language: 'th-TH' }}\n * showWidget\n * widgetEnabled\n * widgetPosition=\"bottom-left\"\n * onGenerate={async (transcript) => {\n * const response = await myAPI(transcript);\n * return response;\n * }}\n * onGenerateComplete={(response) => {\n * console.log('Response:', response);\n * }}\n * >\n * <App />\n * </SpeechProvider>\n * ```\n */\nexport function SpeechProvider({\n children,\n config,\n callbacks,\n showWidget = false,\n widgetEnabled: initialWidgetEnabled = true,\n widgetPosition = \"bottom-left\",\n widgetButtonSize = 60,\n widgetZIndex = 9998,\n modalTitle,\n generateButtonText,\n onGenerate,\n onGenerateComplete,\n onGenerateError,\n}: SpeechProviderProps) {\n const [isWidgetEnabled, setIsWidgetEnabled] = useState(initialWidgetEnabled);\n\n const speechRecognition = useSpeechRecognition({ config, callbacks });\n\n const setWidgetEnabled = useCallback((enabled: boolean) => {\n setIsWidgetEnabled(enabled);\n }, []);\n\n const toggleWidget = useCallback(() => {\n setIsWidgetEnabled((prev) => !prev);\n }, []);\n\n const value = useMemo(\n () => ({\n ...speechRecognition,\n isWidgetEnabled,\n setWidgetEnabled,\n toggleWidget,\n }),\n [speechRecognition, isWidgetEnabled, setWidgetEnabled, toggleWidget]\n );\n\n return (\n <SpeechContext.Provider value={value}>\n {children}\n {showWidget && (\n <SpeechWidget\n enabled={isWidgetEnabled}\n position={widgetPosition}\n config={config}\n buttonSize={widgetButtonSize}\n zIndex={widgetZIndex}\n modalTitle={modalTitle}\n generateButtonText={generateButtonText}\n onGenerate={onGenerate}\n onGenerateComplete={onGenerateComplete}\n onGenerateError={onGenerateError}\n />\n )}\n </SpeechContext.Provider>\n );\n}\n\n/**\n * Hook to access speech recognition context\n *\n * @example\n * ```tsx\n * const {\n * transcript,\n * isListening,\n * startListening,\n * isWidgetEnabled,\n * toggleWidget\n * } = useSpeechContext();\n * ```\n */\nexport function useSpeechContext(): SpeechContextValue {\n const context = useContext(SpeechContext);\n\n if (!context) {\n throw new Error(\"useSpeechContext must be used within a SpeechProvider\");\n }\n\n return context;\n}\n\nexport default SpeechProvider;\n","import React from \"react\";\nimport type { SpeechRecognitionConfig } from \"../types\";\nimport microphoneSvg from \"../assets/microphon.svg\";\nimport pauseSvg from \"../assets/pause.svg\";\n\nexport interface SpeechButtonProps {\n /** Whether currently listening */\n isListening: boolean;\n /** Handler to start listening */\n onStart: (config?: SpeechRecognitionConfig) => void;\n /** Handler to stop listening */\n onStop: () => void;\n /** Button disabled state */\n disabled?: boolean;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Custom start icon */\n startIcon?: React.ReactNode;\n /** Custom stop icon */\n stopIcon?: React.ReactNode;\n /** Custom start label */\n startLabel?: string;\n /** Custom stop label */\n stopLabel?: string;\n /** Size variant */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether to use custom SVG assets */\n useAssets?: boolean;\n}\n\nconst sizeMap = {\n sm: 60,\n md: 100,\n lg: 140,\n};\n\nconst defaultStyles: Record<string, React.CSSProperties> = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n border: \"none\",\n borderRadius: \"50%\",\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n background: \"transparent\",\n padding: 0,\n },\n disabled: {\n opacity: 0.5,\n cursor: \"not-allowed\",\n },\n};\n\nconst MicIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"32\" height=\"32\">\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm-1-9c0-.55.45-1 1-1s1 .45 1 1v6c0 .55-.45 1-1 1s-1-.45-1-1V5z\" />\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\n </svg>\n);\n\nconst StopIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"32\" height=\"32\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" />\n </svg>\n);\n\n/**\n * Pre-styled speech recognition button component\n *\n * @example\n * ```tsx\n * const { isListening, startListening, stopListening } = useSpeechRecognition();\n *\n * <SpeechButton\n * isListening={isListening}\n * onStart={startListening}\n * onStop={stopListening}\n * useAssets\n * />\n * ```\n */\nexport function SpeechButton({\n isListening,\n onStart,\n onStop,\n disabled = false,\n className,\n style,\n startIcon,\n stopIcon,\n startLabel,\n stopLabel,\n size = \"md\",\n useAssets = true,\n}: SpeechButtonProps) {\n const handleClick = () => {\n if (disabled) return;\n if (isListening) {\n onStop();\n } else {\n onStart();\n }\n };\n\n const buttonSize = sizeMap[size];\n\n const buttonStyle: React.CSSProperties = {\n ...defaultStyles.button,\n width: buttonSize,\n height: buttonSize,\n ...(disabled && defaultStyles.disabled),\n filter: useAssets ? \"drop-shadow(0 4px 12px rgba(255, 122, 0, 0.4))\" : undefined,\n ...style,\n };\n\n // Use assets (SVG images)\n if (useAssets) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={className}\n style={buttonStyle}\n aria-label={isListening ? \"Stop recording\" : \"Start recording\"}\n >\n <img\n src={isListening ? pauseSvg : microphoneSvg}\n alt={isListening ? \"Stop\" : \"Start\"}\n style={{ width: \"100%\", height: \"100%\" }}\n />\n </button>\n );\n }\n\n // Use inline SVG icons\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={className}\n style={{\n ...buttonStyle,\n background: isListening\n ? \"linear-gradient(135deg, #ef4444 0%, #dc2626 100%)\"\n : \"linear-gradient(135deg, #667eea 0%, #764ba2 100%)\",\n color: \"white\",\n boxShadow: isListening\n ? \"0 10px 40px rgba(239, 68, 68, 0.4)\"\n : \"0 10px 40px rgba(102, 126, 234, 0.4)\",\n }}\n aria-label={isListening ? \"Stop recording\" : \"Start recording\"}\n >\n <span style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: \"4px\" }}>\n {isListening ? (stopIcon || <StopIcon />) : (startIcon || <MicIcon />)}\n {(startLabel || stopLabel) && (\n <span style={{ fontSize: size === \"sm\" ? \"10px\" : size === \"md\" ? \"12px\" : \"14px\" }}>\n {isListening ? stopLabel || \"Stop\" : startLabel || \"Start\"}\n </span>\n )}\n </span>\n </button>\n );\n}\n\nexport default SpeechButton;\n","import React from \"react\";\n\nexport interface TranscriptDisplayProps {\n /** The transcript text to display */\n transcript: string;\n /** Placeholder text when transcript is empty */\n placeholder?: string;\n /** Whether currently listening */\n isListening?: boolean;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n /** Handler to reset transcript */\n onReset?: () => void;\n /** Show reset button */\n showResetButton?: boolean;\n /** Maximum height before scrolling */\n maxHeight?: string | number;\n}\n\nconst defaultStyles: Record<string, React.CSSProperties> = {\n container: {\n width: \"100%\",\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: \"12px\",\n },\n title: {\n fontSize: \"18px\",\n fontWeight: 600,\n margin: 0,\n },\n resetButton: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"8px 16px\",\n borderRadius: \"8px\",\n border: \"1px solid #374151\",\n background: \"transparent\",\n color: \"#9ca3af\",\n fontSize: \"14px\",\n cursor: \"pointer\",\n },\n box: {\n background: \"rgba(255, 255, 255, 0.03)\",\n border: \"1px solid #374151\",\n borderRadius: \"16px\",\n padding: \"24px\",\n minHeight: \"150px\",\n overflowY: \"auto\" as const,\n },\n text: {\n fontSize: \"18px\",\n lineHeight: 1.75,\n margin: 0,\n wordWrap: \"break-word\" as const,\n },\n placeholder: {\n color: \"#6b7280\",\n fontSize: \"16px\",\n textAlign: \"center\" as const,\n margin: 0,\n padding: \"32px 0\",\n },\n};\n\nconst ResetIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"16\" height=\"16\">\n <path d=\"M17.65 6.35A7.958 7.958 0 0012 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08A5.99 5.99 0 0112 18c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\" />\n </svg>\n);\n\n/**\n * Component to display speech recognition transcript\n *\n * @example\n * ```tsx\n * const { transcript, isListening, resetTranscript } = useSpeechRecognition();\n *\n * <TranscriptDisplay\n * transcript={transcript}\n * isListening={isListening}\n * onReset={resetTranscript}\n * showResetButton\n * />\n * ```\n */\nexport function TranscriptDisplay({\n transcript,\n placeholder = \"Click the microphone to start speaking...\",\n isListening = false,\n className,\n style,\n onReset,\n showResetButton = true,\n maxHeight = \"300px\",\n}: TranscriptDisplayProps) {\n const boxStyle: React.CSSProperties = {\n ...defaultStyles.box,\n maxHeight,\n ...style,\n };\n\n return (\n <div className={className} style={defaultStyles.container}>\n <div style={defaultStyles.header}>\n <h2 style={defaultStyles.title}>📝 Transcript</h2>\n {showResetButton && onReset && (\n <button\n type=\"button\"\n onClick={onReset}\n disabled={!transcript}\n style={{\n ...defaultStyles.resetButton,\n opacity: transcript ? 1 : 0.5,\n cursor: transcript ? \"pointer\" : \"not-allowed\",\n }}\n >\n <ResetIcon />\n Clear\n </button>\n )}\n </div>\n <div style={boxStyle}>\n {transcript ? (\n <p style={defaultStyles.text}>{transcript}</p>\n ) : (\n <p style={defaultStyles.placeholder}>\n {isListening\n ? \"🎧 Listening... Speak now!\"\n : placeholder}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nexport default TranscriptDisplay;\n"],"names":["isSpeechRecognitionSupported","getSpeechRecognition","requestMicrophonePermission","track","isMicrophoneAvailable","device","getSupportedLanguages","formatConfidence","confidence","DEFAULT_CONFIG","useSpeechRecognition","options","config","callbacks","isListening","setIsListening","useState","transcript","setTranscript","interimTranscript","setInterimTranscript","finalTranscript","setFinalTranscript","error","setError","setIsMicrophoneAvailable","recognitionRef","useRef","callbacksRef","useEffect","isSupported","startListening","useCallback","overrideConfig","SpeechRecognitionClass","recognition","mergedConfig","event","errorMessage","getErrorMessage","interim","final","i","result","text","prev","newFinal","fullTranscript","stopListening","abortListening","resetTranscript","microphoneSvg","pauseSvg","bgAiSpeechSvg","styles","keyframesStyle","CloseIcon","jsx","SparkleIcon","AISparkleIcon","jsxs","SpeechModal","isOpen","onClose","onStartListening","onStopListening","onResetTranscript","onGenerate","isGenerating","title","generateButtonText","placeholder","modalRef","handleEscape","e","handleOverlayClick","handleMicClick","handleGenerate","Fragment","getPositionStyles","position","positions","SpeechWidget","enabled","onGenerateComplete","onGenerateError","modalTitle","buttonContent","buttonSize","buttonStyle","zIndex","isModalOpen","setIsModalOpen","setIsGenerating","handleOpenModal","handleCloseModal","response","floatingButtonStyle","SpeechContext","createContext","SpeechProvider","children","showWidget","initialWidgetEnabled","widgetPosition","widgetButtonSize","widgetZIndex","isWidgetEnabled","setIsWidgetEnabled","speechRecognition","setWidgetEnabled","toggleWidget","value","useMemo","useSpeechContext","context","useContext","sizeMap","defaultStyles","MicIcon","StopIcon","SpeechButton","onStart","onStop","disabled","className","style","startIcon","stopIcon","startLabel","stopLabel","size","useAssets","handleClick","ResetIcon","TranscriptDisplay","onReset","showResetButton","maxHeight","boxStyle"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poovit-banton/speech-recognition-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "React SDK for speech recognition using Web Speech API",
5
5
  "type": "module",
6
6
  "main": "./dist/lib/speech-recognition-sdk.cjs.js",