@corti/dictation-web 0.0.0-rc.359 → 0.0.0-test.571

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.
Files changed (223) hide show
  1. package/README.md +163 -102
  2. package/dist/CortiDictation.d.ts +6 -2
  3. package/dist/CortiDictation.js +36 -14
  4. package/dist/CortiDictation.js.map +1 -1
  5. package/dist/bundle.js +3888 -1787
  6. package/dist/components/audio-visualiser.d.ts +5 -3
  7. package/dist/components/audio-visualiser.js +38 -46
  8. package/dist/components/audio-visualiser.js.map +1 -1
  9. package/dist/components/corti-dictation.d.ts +136 -0
  10. package/dist/components/corti-dictation.js +273 -0
  11. package/dist/components/corti-dictation.js.map +1 -0
  12. package/dist/components/device-selector.d.ts +14 -0
  13. package/dist/components/device-selector.js +75 -0
  14. package/dist/components/device-selector.js.map +1 -0
  15. package/dist/components/keybinding-selector.d.ts +14 -0
  16. package/dist/components/keybinding-selector.js +81 -0
  17. package/dist/components/keybinding-selector.js.map +1 -0
  18. package/dist/components/language-selector.d.ts +15 -0
  19. package/dist/components/language-selector.js +74 -0
  20. package/dist/components/language-selector.js.map +1 -0
  21. package/dist/components/mode-selector.d.ts +14 -0
  22. package/dist/components/mode-selector.js +73 -0
  23. package/dist/components/mode-selector.js.map +1 -0
  24. package/dist/components/recording-button.d.ts +31 -0
  25. package/dist/components/recording-button.js +262 -0
  26. package/dist/components/recording-button.js.map +1 -0
  27. package/dist/components/settings-menu.d.ts +12 -14
  28. package/dist/components/settings-menu.js +68 -153
  29. package/dist/components/settings-menu.js.map +1 -1
  30. package/dist/constants.d.ts +8 -2
  31. package/dist/constants.js +38 -12
  32. package/dist/constants.js.map +1 -1
  33. package/dist/contexts/dictation-context.d.ts +107 -0
  34. package/dist/contexts/dictation-context.js +290 -0
  35. package/dist/contexts/dictation-context.js.map +1 -0
  36. package/dist/controllers/DictationController.d.ts +35 -0
  37. package/dist/controllers/DictationController.js +130 -0
  38. package/dist/controllers/DictationController.js.map +1 -0
  39. package/dist/controllers/MediaController.d.ts +31 -0
  40. package/dist/controllers/MediaController.js +99 -0
  41. package/dist/controllers/MediaController.js.map +1 -0
  42. package/dist/controllers/devices-controller.d.ts +26 -0
  43. package/dist/controllers/devices-controller.js +99 -0
  44. package/dist/controllers/devices-controller.js.map +1 -0
  45. package/dist/controllers/dictation-controller.d.ts +29 -0
  46. package/dist/controllers/dictation-controller.js +179 -0
  47. package/dist/controllers/dictation-controller.js.map +1 -0
  48. package/dist/controllers/keybinding-controller.d.ts +17 -0
  49. package/dist/controllers/keybinding-controller.js +80 -0
  50. package/dist/controllers/keybinding-controller.js.map +1 -0
  51. package/dist/controllers/languages-controller.d.ts +26 -0
  52. package/dist/controllers/languages-controller.js +83 -0
  53. package/dist/controllers/languages-controller.js.map +1 -0
  54. package/dist/controllers/media-controller.d.ts +24 -0
  55. package/dist/controllers/media-controller.js +115 -0
  56. package/dist/controllers/media-controller.js.map +1 -0
  57. package/dist/index.d.ts +11 -1
  58. package/dist/index.js +39 -3
  59. package/dist/index.js.map +1 -1
  60. package/dist/package.json +14 -0
  61. package/dist/src/components/audio-visualiser.d.ts +14 -0
  62. package/dist/src/components/audio-visualiser.js +57 -0
  63. package/dist/src/components/audio-visualiser.js.map +1 -0
  64. package/dist/src/components/corti-dictation.d.ts +123 -0
  65. package/dist/src/components/corti-dictation.js +224 -0
  66. package/dist/src/components/corti-dictation.js.map +1 -0
  67. package/dist/src/components/device-selector.d.ts +24 -0
  68. package/dist/src/components/device-selector.js +106 -0
  69. package/dist/src/components/device-selector.js.map +1 -0
  70. package/dist/src/components/language-selector.d.ts +24 -0
  71. package/dist/src/components/language-selector.js +100 -0
  72. package/dist/src/components/language-selector.js.map +1 -0
  73. package/dist/src/components/recording-button.d.ts +37 -0
  74. package/dist/src/components/recording-button.js +203 -0
  75. package/dist/src/components/recording-button.js.map +1 -0
  76. package/dist/src/components/settings-menu.d.ts +16 -0
  77. package/dist/src/components/settings-menu.js +80 -0
  78. package/dist/src/components/settings-menu.js.map +1 -0
  79. package/dist/src/constants.d.ts +4 -0
  80. package/dist/src/constants.js +37 -0
  81. package/dist/src/constants.js.map +1 -0
  82. package/dist/src/contexts/dictation-context.d.ts +97 -0
  83. package/dist/src/contexts/dictation-context.js +208 -0
  84. package/dist/src/contexts/dictation-context.js.map +1 -0
  85. package/dist/src/controllers/DictationController.d.ts +35 -0
  86. package/dist/src/controllers/DictationController.js +130 -0
  87. package/dist/src/controllers/DictationController.js.map +1 -0
  88. package/dist/src/controllers/MediaController.d.ts +31 -0
  89. package/dist/src/controllers/MediaController.js +99 -0
  90. package/dist/src/controllers/MediaController.js.map +1 -0
  91. package/dist/src/icons/icons.d.ts +17 -0
  92. package/dist/src/icons/icons.js +158 -0
  93. package/dist/src/icons/icons.js.map +1 -0
  94. package/dist/src/styles/ComponentStyles.d.ts +2 -0
  95. package/dist/src/styles/ComponentStyles.js +18 -0
  96. package/dist/src/styles/ComponentStyles.js.map +1 -0
  97. package/dist/src/styles/audio-visualiser.d.ts +2 -0
  98. package/dist/src/styles/audio-visualiser.js +33 -0
  99. package/dist/src/styles/audio-visualiser.js.map +1 -0
  100. package/dist/src/styles/buttons.d.ts +2 -0
  101. package/dist/src/styles/buttons.js +52 -0
  102. package/dist/src/styles/buttons.js.map +1 -0
  103. package/dist/src/styles/callout.d.ts +2 -0
  104. package/dist/src/styles/callout.js +23 -0
  105. package/dist/src/styles/callout.js.map +1 -0
  106. package/dist/src/styles/default-theme.d.ts +2 -0
  107. package/dist/src/styles/default-theme.js +50 -0
  108. package/dist/src/styles/default-theme.js.map +1 -0
  109. package/dist/src/styles/recording-button.d.ts +2 -0
  110. package/dist/src/styles/recording-button.js +8 -0
  111. package/dist/src/styles/recording-button.js.map +1 -0
  112. package/dist/src/styles/select.d.ts +2 -0
  113. package/dist/src/styles/select.js +36 -0
  114. package/dist/src/styles/select.js.map +1 -0
  115. package/dist/src/styles/settings-menu.d.ts +2 -0
  116. package/dist/src/styles/settings-menu.js +34 -0
  117. package/dist/src/styles/settings-menu.js.map +1 -0
  118. package/dist/src/types.d.ts +7 -0
  119. package/dist/src/types.js +2 -0
  120. package/dist/src/types.js.map +1 -0
  121. package/dist/src/utils/auth.d.ts +9 -0
  122. package/dist/src/utils/auth.js +21 -0
  123. package/dist/src/utils/auth.js.map +1 -0
  124. package/dist/src/utils/converters.d.ts +4 -0
  125. package/dist/src/utils/converters.js +8 -0
  126. package/dist/src/utils/converters.js.map +1 -0
  127. package/dist/src/utils/devices.d.ts +26 -0
  128. package/dist/src/utils/devices.js +53 -0
  129. package/dist/src/utils/devices.js.map +1 -0
  130. package/dist/src/utils/events.d.ts +44 -0
  131. package/dist/src/utils/events.js +88 -0
  132. package/dist/src/utils/events.js.map +1 -0
  133. package/dist/src/utils/languages.d.ts +7 -0
  134. package/dist/src/utils/languages.js +29 -0
  135. package/dist/src/utils/languages.js.map +1 -0
  136. package/dist/src/utils/media.d.ts +6 -0
  137. package/dist/src/utils/media.js +39 -0
  138. package/dist/src/utils/media.js.map +1 -0
  139. package/dist/src/utils/token.d.ts +13 -0
  140. package/dist/src/utils/token.js +60 -0
  141. package/dist/src/utils/token.js.map +1 -0
  142. package/dist/src/utils/validation.d.ts +1 -0
  143. package/dist/src/utils/validation.js +7 -0
  144. package/dist/src/utils/validation.js.map +1 -0
  145. package/dist/stories/audio-visualiser.stories.d.ts +39 -0
  146. package/dist/stories/audio-visualiser.stories.js +71 -0
  147. package/dist/stories/audio-visualiser.stories.js.map +1 -0
  148. package/dist/stories/corti-dictation.stories.d.ts +27 -0
  149. package/dist/stories/corti-dictation.stories.js +129 -0
  150. package/dist/stories/corti-dictation.stories.js.map +1 -0
  151. package/dist/stories/device-selector.stories.d.ts +18 -0
  152. package/dist/stories/device-selector.stories.js +84 -0
  153. package/dist/stories/device-selector.stories.js.map +1 -0
  154. package/dist/stories/language-selector.stories.d.ts +18 -0
  155. package/dist/stories/language-selector.stories.js +53 -0
  156. package/dist/stories/language-selector.stories.js.map +1 -0
  157. package/dist/stories/recording-button.stories.d.ts +27 -0
  158. package/dist/stories/recording-button.stories.js +90 -0
  159. package/dist/stories/recording-button.stories.js.map +1 -0
  160. package/dist/stories/settings-menu.stories.d.ts +23 -0
  161. package/dist/stories/settings-menu.stories.js +156 -0
  162. package/dist/stories/settings-menu.stories.js.map +1 -0
  163. package/dist/styles/ComponentStyles.js +6 -41
  164. package/dist/styles/ComponentStyles.js.map +1 -1
  165. package/dist/styles/audio-visualiser.d.ts +2 -0
  166. package/dist/styles/audio-visualiser.js +33 -0
  167. package/dist/styles/audio-visualiser.js.map +1 -0
  168. package/dist/styles/buttons.js +19 -26
  169. package/dist/styles/buttons.js.map +1 -1
  170. package/dist/styles/callout.js +7 -17
  171. package/dist/styles/callout.js.map +1 -1
  172. package/dist/styles/component-styles.d.ts +3 -0
  173. package/dist/styles/component-styles.js +32 -0
  174. package/dist/styles/component-styles.js.map +1 -0
  175. package/dist/styles/default-theme.d.ts +2 -0
  176. package/dist/styles/default-theme.js +14 -0
  177. package/dist/styles/default-theme.js.map +1 -0
  178. package/dist/styles/keybinding-selector.d.ts +2 -0
  179. package/dist/styles/keybinding-selector.js +72 -0
  180. package/dist/styles/keybinding-selector.js.map +1 -0
  181. package/dist/styles/mode-selector.d.ts +2 -0
  182. package/dist/styles/mode-selector.js +54 -0
  183. package/dist/styles/mode-selector.js.map +1 -0
  184. package/dist/styles/recording-button.d.ts +2 -0
  185. package/dist/styles/recording-button.js +8 -0
  186. package/dist/styles/recording-button.js.map +1 -0
  187. package/dist/styles/select.d.ts +1 -1
  188. package/dist/styles/select.js +14 -18
  189. package/dist/styles/select.js.map +1 -1
  190. package/dist/styles/settings-menu.d.ts +2 -0
  191. package/dist/styles/settings-menu.js +42 -0
  192. package/dist/styles/settings-menu.js.map +1 -0
  193. package/dist/tsconfig.stories.tsbuildinfo +1 -0
  194. package/dist/types.d.ts +9 -8
  195. package/dist/types.js.map +1 -1
  196. package/dist/utils/auth.d.ts +9 -0
  197. package/dist/utils/auth.js +21 -0
  198. package/dist/utils/auth.js.map +1 -0
  199. package/dist/utils/converters.d.ts +4 -0
  200. package/dist/utils/converters.js +8 -0
  201. package/dist/utils/converters.js.map +1 -0
  202. package/dist/utils/devices.d.ts +26 -0
  203. package/dist/utils/devices.js +53 -0
  204. package/dist/utils/devices.js.map +1 -0
  205. package/dist/utils/events.d.ts +53 -0
  206. package/dist/utils/events.js +102 -0
  207. package/dist/utils/events.js.map +1 -0
  208. package/dist/utils/keybinding.d.ts +49 -0
  209. package/dist/utils/keybinding.js +140 -0
  210. package/dist/utils/keybinding.js.map +1 -0
  211. package/dist/utils/languages.d.ts +8 -0
  212. package/dist/utils/languages.js +29 -0
  213. package/dist/utils/languages.js.map +1 -0
  214. package/dist/utils/media.d.ts +6 -0
  215. package/dist/utils/media.js +39 -0
  216. package/dist/utils/media.js.map +1 -0
  217. package/dist/utils/token.d.ts +13 -0
  218. package/dist/utils/token.js +60 -0
  219. package/dist/utils/token.js.map +1 -0
  220. package/dist/utils/validation.d.ts +1 -0
  221. package/dist/utils/validation.js +7 -0
  222. package/dist/utils/validation.js.map +1 -0
  223. package/package.json +29 -55
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictation-controller.js","sourceRoot":"","sources":["../../src/controllers/dictation-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Corti, CortiClient, CortiWebSocketProxyClient } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { DEFAULT_DICTATION_CONFIG } from \"../constants.js\";\nimport type { ProxyOptions } from \"../types.js\";\n\ntype TranscribeSocket = Awaited<\n ReturnType<CortiClient[\"transcribe\"][\"connect\"]>\n>;\n\ninterface DictationControllerHost extends ReactiveControllerHost {\n _accessToken?: string;\n _authConfig?: Corti.BearerOptions;\n _region?: string;\n _tenantName?: string;\n _socketUrl?: string;\n _socketProxy?: ProxyOptions;\n _dictationConfig?: Corti.TranscribeConfig;\n}\n\nexport type TranscribeMessage =\n | Corti.TranscribeConfigStatusMessage\n | Corti.TranscribeUsageMessage\n | Corti.TranscribeEndedMessage\n | Corti.TranscribeErrorMessage\n | Corti.TranscribeTranscriptMessage\n | Corti.TranscribeCommandMessage\n | Corti.TranscribeFlushedMessage;\n\ninterface WebSocketCallbacks {\n onMessage?: (message: TranscribeMessage) => void;\n onError?: (error: Error) => void;\n onClose?: (event: unknown) => void;\n onNetworkActivity?: (direction: \"sent\" | \"received\", data: unknown) => void;\n}\n\nexport class DictationController implements ReactiveController {\n host: DictationControllerHost;\n\n #cortiClient: CortiClient | null = null;\n #webSocket: TranscribeSocket | null = null;\n #closeTimeout?: number;\n #callbacks?: WebSocketCallbacks;\n #lastDictationConfig: Corti.TranscribeConfig | null = null;\n #lastSocketUrl?: string;\n #lastSocketProxy?: ProxyOptions;\n\n constructor(host: DictationControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n #configHasChanged(): boolean {\n return (\n JSON.stringify(this.host._dictationConfig) !==\n JSON.stringify(this.#lastDictationConfig) ||\n this.host._socketUrl !== this.#lastSocketUrl ||\n JSON.stringify(this.host._socketProxy) !==\n JSON.stringify(this.#lastSocketProxy)\n );\n }\n\n async connect(\n mediaRecorder: MediaRecorder | null,\n dictationConfig: Corti.TranscribeConfig = DEFAULT_DICTATION_CONFIG,\n callbacks: WebSocketCallbacks = {},\n ): Promise<boolean> {\n if (!mediaRecorder) {\n throw new Error(\"MediaRecorder is required to connect\");\n }\n\n const newConnection =\n this.#configHasChanged() ||\n this.#webSocket?.readyState !== WebSocket.OPEN;\n\n if (newConnection) {\n this.cleanup();\n\n if (this.#webSocket?.readyState === WebSocket.OPEN) {\n throw new Error(\"Already connected. Disconnect before reconnecting.\");\n }\n\n this.#webSocket =\n this.host._socketUrl || this.host._socketProxy\n ? await this.#connectProxy(dictationConfig)\n : await this.#connectAuth(dictationConfig);\n\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n configuration: dictationConfig,\n type: \"config\",\n });\n\n this.#lastDictationConfig = this.host._dictationConfig || null;\n this.#lastSocketUrl = this.host._socketUrl;\n this.#lastSocketProxy = this.host._socketProxy;\n }\n\n this.#callbacks = callbacks;\n this.#setupMediaRecorder(mediaRecorder);\n this.#setupWebSocketHandlers(callbacks);\n\n return newConnection;\n }\n\n async #connectProxy(\n dictationConfig: Corti.TranscribeConfig,\n ): Promise<TranscribeSocket> {\n const proxyOptions = this.host._socketProxy || {\n url: this.host._socketUrl || \"\",\n };\n\n if (!proxyOptions.url) {\n throw new Error(\"Proxy URL is required when using proxy client\");\n }\n\n return await CortiWebSocketProxyClient.transcribe.connect({\n configuration: dictationConfig,\n proxy: proxyOptions,\n });\n }\n\n async #connectAuth(\n dictationConfig: Corti.TranscribeConfig,\n ): Promise<TranscribeSocket> {\n if (!this.host._authConfig && !this.host._accessToken) {\n throw new Error(\n \"Auth configuration or access token is required to connect\",\n );\n }\n\n // Use authConfig if available, otherwise create one from accessToken\n const auth: Corti.BearerOptions = this.host._authConfig || {\n accessToken: this.host._accessToken || \"\",\n refreshAccessToken: () => ({\n accessToken: this.host._accessToken || \"\",\n }),\n };\n\n this.#cortiClient = new CortiClient({\n auth,\n environment: this.host._region,\n tenantName: this.host._tenantName,\n });\n\n return await this.#cortiClient.transcribe.connect({\n configuration: dictationConfig,\n });\n }\n\n #setupWebSocketHandlers(callbacks: WebSocketCallbacks): void {\n if (!this.#webSocket) {\n throw new Error(\"WebSocket not initialized\");\n }\n\n this.#webSocket.on(\"message\", (message: TranscribeMessage) => {\n callbacks.onNetworkActivity?.(\"received\", message);\n\n if (callbacks.onMessage) {\n callbacks.onMessage(message);\n }\n });\n\n this.#webSocket.on(\"error\", (event: Error) => {\n if (callbacks.onError) {\n callbacks.onError(event);\n }\n });\n\n this.#webSocket.on(\"close\", (event: unknown) => {\n if (callbacks.onClose) {\n callbacks.onClose(event);\n }\n });\n }\n\n #setupMediaRecorder(mediaRecorder: MediaRecorder): void {\n mediaRecorder.ondataavailable = (event) => {\n this.#webSocket?.sendAudio(event.data);\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n size: event.data.size,\n type: \"audio\",\n });\n };\n }\n\n async disconnect(onClose?: (event: unknown) => void): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n if (!this.#webSocket || this.#webSocket.readyState !== WebSocket.OPEN) {\n resolve();\n return;\n }\n\n this.#webSocket.on(\"close\", (event) => {\n if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n if (onClose) {\n onClose(event);\n }\n\n resolve();\n });\n\n this.#webSocket.on(\"message\", (message) => {\n this.#callbacks?.onNetworkActivity?.(\"received\", message);\n\n if (this.#callbacks?.onMessage) {\n this.#callbacks?.onMessage(message);\n }\n\n if (message.type === \"flushed\") {\n if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n resolve();\n return;\n }\n });\n\n this.#webSocket.sendFlush({ type: \"flush\" });\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"flush\" });\n\n this.#closeTimeout = window.setTimeout(() => {\n // Reject the promise before closing the web socket, so the promise rejects before close event fires\n reject(new Error(\"Audio processing timeout\"));\n\n if (this.#webSocket?.readyState === WebSocket.OPEN) {\n this.#webSocket.close();\n }\n }, 10000);\n });\n }\n\n cleanup(): void {\n if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n if (this.#webSocket?.readyState === WebSocket.OPEN) {\n this.#webSocket.close();\n }\n\n this.#webSocket = null;\n this.#cortiClient = null;\n this.#lastDictationConfig = null;\n this.#lastSocketUrl = undefined;\n this.#lastSocketProxy = undefined;\n }\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { ReactiveController, ReactiveControllerHost } from "lit";
2
+ import type { DictationMode } from "../types.js";
3
+ interface KeybindingControllerHost extends ReactiveControllerHost {
4
+ _keybinding?: string | null;
5
+ _mode?: DictationMode;
6
+ startRecording(): void;
7
+ stopRecording(): void;
8
+ toggleRecording(): void;
9
+ }
10
+ export declare class KeybindingController implements ReactiveController {
11
+ #private;
12
+ host: KeybindingControllerHost;
13
+ constructor(host: KeybindingControllerHost);
14
+ hostConnected(): void;
15
+ hostDisconnected(): void;
16
+ }
17
+ export {};
@@ -0,0 +1,80 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
7
+ if (kind === "m") throw new TypeError("Private method is not writable");
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
10
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
+ };
12
+ var _KeybindingController_instances, _KeybindingController_keydownHandler, _KeybindingController_keyupHandler, _KeybindingController_blurHandler, _KeybindingController_setupListeners, _KeybindingController_removeListeners;
13
+ import { matchesKeybinding, shouldIgnoreKeybinding, } from "../utils/keybinding.js";
14
+ export class KeybindingController {
15
+ constructor(host) {
16
+ _KeybindingController_instances.add(this);
17
+ _KeybindingController_keydownHandler.set(this, void 0);
18
+ _KeybindingController_keyupHandler.set(this, void 0);
19
+ _KeybindingController_blurHandler.set(this, void 0);
20
+ this.host = host;
21
+ host.addController(this);
22
+ }
23
+ hostConnected() {
24
+ __classPrivateFieldGet(this, _KeybindingController_instances, "m", _KeybindingController_setupListeners).call(this);
25
+ }
26
+ hostDisconnected() {
27
+ __classPrivateFieldGet(this, _KeybindingController_instances, "m", _KeybindingController_removeListeners).call(this);
28
+ }
29
+ }
30
+ _KeybindingController_keydownHandler = new WeakMap(), _KeybindingController_keyupHandler = new WeakMap(), _KeybindingController_blurHandler = new WeakMap(), _KeybindingController_instances = new WeakSet(), _KeybindingController_setupListeners = function _KeybindingController_setupListeners() {
31
+ __classPrivateFieldGet(this, _KeybindingController_instances, "m", _KeybindingController_removeListeners).call(this);
32
+ __classPrivateFieldSet(this, _KeybindingController_keydownHandler, (event) => {
33
+ if (!this.host._keybinding) {
34
+ return;
35
+ }
36
+ if (shouldIgnoreKeybinding(document.activeElement)) {
37
+ return;
38
+ }
39
+ if (matchesKeybinding(event, this.host._keybinding)) {
40
+ event.preventDefault();
41
+ if (this.host._mode === "push-to-talk") {
42
+ this.host.startRecording();
43
+ }
44
+ if (this.host._mode === "toggle-to-talk") {
45
+ this.host.toggleRecording();
46
+ }
47
+ }
48
+ }, "f");
49
+ __classPrivateFieldSet(this, _KeybindingController_keyupHandler, (event) => {
50
+ if (!this.host._keybinding) {
51
+ return;
52
+ }
53
+ if (this.host._mode === "push-to-talk" &&
54
+ matchesKeybinding(event, this.host._keybinding)) {
55
+ this.host.stopRecording();
56
+ }
57
+ }, "f");
58
+ __classPrivateFieldSet(this, _KeybindingController_blurHandler, () => {
59
+ if (this.host._mode === "push-to-talk") {
60
+ this.host.stopRecording();
61
+ }
62
+ }, "f");
63
+ window.addEventListener("keydown", __classPrivateFieldGet(this, _KeybindingController_keydownHandler, "f"));
64
+ window.addEventListener("keyup", __classPrivateFieldGet(this, _KeybindingController_keyupHandler, "f"));
65
+ window.addEventListener("blur", __classPrivateFieldGet(this, _KeybindingController_blurHandler, "f"));
66
+ }, _KeybindingController_removeListeners = function _KeybindingController_removeListeners() {
67
+ if (__classPrivateFieldGet(this, _KeybindingController_keydownHandler, "f")) {
68
+ window.removeEventListener("keydown", __classPrivateFieldGet(this, _KeybindingController_keydownHandler, "f"));
69
+ __classPrivateFieldSet(this, _KeybindingController_keydownHandler, undefined, "f");
70
+ }
71
+ if (__classPrivateFieldGet(this, _KeybindingController_keyupHandler, "f")) {
72
+ window.removeEventListener("keyup", __classPrivateFieldGet(this, _KeybindingController_keyupHandler, "f"));
73
+ __classPrivateFieldSet(this, _KeybindingController_keyupHandler, undefined, "f");
74
+ }
75
+ if (__classPrivateFieldGet(this, _KeybindingController_blurHandler, "f")) {
76
+ window.removeEventListener("blur", __classPrivateFieldGet(this, _KeybindingController_blurHandler, "f"));
77
+ __classPrivateFieldSet(this, _KeybindingController_blurHandler, undefined, "f");
78
+ }
79
+ };
80
+ //# sourceMappingURL=keybinding-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keybinding-controller.js","sourceRoot":"","sources":["../../src/controllers/keybinding-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { DictationMode } from \"../types.js\";\nimport {\n matchesKeybinding,\n shouldIgnoreKeybinding,\n} from \"../utils/keybinding.js\";\n\ninterface KeybindingControllerHost extends ReactiveControllerHost {\n _keybinding?: string | null;\n _mode?: DictationMode;\n startRecording(): void;\n stopRecording(): void;\n toggleRecording(): void;\n}\n\nexport class KeybindingController implements ReactiveController {\n host: KeybindingControllerHost;\n\n #keydownHandler?: (event: KeyboardEvent) => void;\n #keyupHandler?: (event: KeyboardEvent) => void;\n #blurHandler?: () => void;\n\n constructor(host: KeybindingControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostConnected(): void {\n this.#setupListeners();\n }\n\n hostDisconnected(): void {\n this.#removeListeners();\n }\n\n #setupListeners(): void {\n this.#removeListeners();\n\n this.#keydownHandler = (event: KeyboardEvent) => {\n if (!this.host._keybinding) {\n return;\n }\n\n if (shouldIgnoreKeybinding(document.activeElement)) {\n return;\n }\n\n if (matchesKeybinding(event, this.host._keybinding)) {\n event.preventDefault();\n\n if (this.host._mode === \"push-to-talk\") {\n this.host.startRecording();\n }\n\n if (this.host._mode === \"toggle-to-talk\") {\n this.host.toggleRecording();\n }\n }\n };\n\n this.#keyupHandler = (event: KeyboardEvent) => {\n if (!this.host._keybinding) {\n return;\n }\n\n if (\n this.host._mode === \"push-to-talk\" &&\n matchesKeybinding(event, this.host._keybinding)\n ) {\n this.host.stopRecording();\n }\n };\n\n this.#blurHandler = () => {\n if (this.host._mode === \"push-to-talk\") {\n this.host.stopRecording();\n }\n };\n\n window.addEventListener(\"keydown\", this.#keydownHandler);\n window.addEventListener(\"keyup\", this.#keyupHandler);\n window.addEventListener(\"blur\", this.#blurHandler);\n }\n\n #removeListeners(): void {\n if (this.#keydownHandler) {\n window.removeEventListener(\"keydown\", this.#keydownHandler);\n this.#keydownHandler = undefined;\n }\n\n if (this.#keyupHandler) {\n window.removeEventListener(\"keyup\", this.#keyupHandler);\n this.#keyupHandler = undefined;\n }\n\n if (this.#blurHandler) {\n window.removeEventListener(\"blur\", this.#blurHandler);\n this.#blurHandler = undefined;\n }\n }\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import type { Corti } from "@corti/sdk";
2
+ import type { ReactiveController, ReactiveControllerHost } from "lit";
3
+ interface LanguagesControllerHost extends ReactiveControllerHost {
4
+ region?: string;
5
+ dictationConfig?: Corti.TranscribeConfig;
6
+ dispatchEvent(event: CustomEvent): boolean;
7
+ requestUpdate(): void;
8
+ _languages?: Corti.TranscribeSupportedLanguage[];
9
+ }
10
+ /**
11
+ * Controller that manages automatic language loading based on region.
12
+ * Loads languages when they're not present and handles region changes.
13
+ * Reacts to updates and automatically loads languages when needed.
14
+ */
15
+ export declare class LanguagesController implements ReactiveController {
16
+ #private;
17
+ host: LanguagesControllerHost;
18
+ constructor(host: LanguagesControllerHost);
19
+ initialize(): void;
20
+ hostUpdate(): void;
21
+ /**
22
+ * Clear the auto-loaded flag (when languages are set externally)
23
+ */
24
+ clearAutoLoadedFlag(): void;
25
+ }
26
+ export {};
@@ -0,0 +1,83 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _LanguagesController_instances, _LanguagesController_autoLoadedLanguages, _LanguagesController_loadingLanguages, _LanguagesController_previousRegion, _LanguagesController_initialized, _LanguagesController_loadLanguages;
13
+ import { errorEvent, languagesChangedEvent } from "../utils/events.js";
14
+ import { getLanguagesByRegion } from "../utils/languages.js";
15
+ /**
16
+ * Controller that manages automatic language loading based on region.
17
+ * Loads languages when they're not present and handles region changes.
18
+ * Reacts to updates and automatically loads languages when needed.
19
+ */
20
+ export class LanguagesController {
21
+ constructor(host) {
22
+ _LanguagesController_instances.add(this);
23
+ _LanguagesController_autoLoadedLanguages.set(this, false);
24
+ _LanguagesController_loadingLanguages.set(this, false);
25
+ _LanguagesController_previousRegion.set(this, void 0);
26
+ _LanguagesController_initialized.set(this, false);
27
+ this.host = host;
28
+ host.addController(this);
29
+ }
30
+ initialize() {
31
+ __classPrivateFieldSet(this, _LanguagesController_initialized, true, "f");
32
+ if (this.host._languages === undefined) {
33
+ __classPrivateFieldGet(this, _LanguagesController_instances, "m", _LanguagesController_loadLanguages).call(this);
34
+ }
35
+ }
36
+ hostUpdate() {
37
+ // Only react to updates after initialization
38
+ if (!__classPrivateFieldGet(this, _LanguagesController_initialized, "f")) {
39
+ return;
40
+ }
41
+ // When region changes, reload languages if they were auto-loaded
42
+ if ((__classPrivateFieldGet(this, _LanguagesController_previousRegion, "f") !== this.host.region &&
43
+ __classPrivateFieldGet(this, _LanguagesController_autoLoadedLanguages, "f")) ||
44
+ this.host._languages === undefined) {
45
+ __classPrivateFieldGet(this, _LanguagesController_instances, "m", _LanguagesController_loadLanguages).call(this);
46
+ }
47
+ __classPrivateFieldSet(this, _LanguagesController_previousRegion, this.host.region, "f");
48
+ }
49
+ /**
50
+ * Clear the auto-loaded flag (when languages are set externally)
51
+ */
52
+ clearAutoLoadedFlag() {
53
+ __classPrivateFieldSet(this, _LanguagesController_autoLoadedLanguages, false, "f");
54
+ }
55
+ }
56
+ _LanguagesController_autoLoadedLanguages = new WeakMap(), _LanguagesController_loadingLanguages = new WeakMap(), _LanguagesController_previousRegion = new WeakMap(), _LanguagesController_initialized = new WeakMap(), _LanguagesController_instances = new WeakSet(), _LanguagesController_loadLanguages = async function _LanguagesController_loadLanguages() {
57
+ if (__classPrivateFieldGet(this, _LanguagesController_loadingLanguages, "f")) {
58
+ return;
59
+ }
60
+ __classPrivateFieldSet(this, _LanguagesController_loadingLanguages, true, "f");
61
+ try {
62
+ const { languages, defaultLanguage } = getLanguagesByRegion(this.host.region);
63
+ __classPrivateFieldSet(this, _LanguagesController_autoLoadedLanguages, true, "f");
64
+ this.host._languages = languages;
65
+ const previousLanguage = this.host.dictationConfig?.primaryLanguage;
66
+ const selectedLanguage = previousLanguage && languages.includes(previousLanguage)
67
+ ? previousLanguage
68
+ : defaultLanguage;
69
+ this.host.dictationConfig = {
70
+ ...this.host.dictationConfig,
71
+ primaryLanguage: selectedLanguage || "en",
72
+ };
73
+ this.host.requestUpdate();
74
+ this.host.dispatchEvent(languagesChangedEvent(languages, selectedLanguage));
75
+ }
76
+ catch (error) {
77
+ this.host.dispatchEvent(errorEvent(error));
78
+ }
79
+ finally {
80
+ __classPrivateFieldSet(this, _LanguagesController_loadingLanguages, false, "f");
81
+ }
82
+ };
83
+ //# sourceMappingURL=languages-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"languages-controller.js","sourceRoot":"","sources":["../../src/controllers/languages-controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAU7D;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IAO9B,YAAY,IAA6B;;QALzC,mDAAgC,KAAK,EAAC;QACtC,gDAA6B,KAAK,EAAC;QACnC,sDAAyB;QACzB,2CAAwB,KAAK,EAAC;QAG5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,uBAAA,IAAI,oCAAgB,IAAI,MAAA,CAAC;QAEzB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACvC,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB,CAAC;QACxB,CAAC;IACH,CAAC;IAED,UAAU;QACR,6CAA6C;QAC7C,IAAI,CAAC,uBAAA,IAAI,wCAAa,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,IACE,CAAC,uBAAA,IAAI,2CAAgB,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;YACxC,uBAAA,IAAI,gDAAqB,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAClC,CAAC;YACD,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB,CAAC;QACxB,CAAC;QAED,uBAAA,IAAI,uCAAmB,IAAI,CAAC,IAAI,CAAC,MAAM,MAAA,CAAC;IAC1C,CAAC;IAuCD;;OAEG;IACH,mBAAmB;QACjB,uBAAA,IAAI,4CAAwB,KAAK,MAAA,CAAC;IACpC,CAAC;CACF;6SA3CC,KAAK;IACH,IAAI,uBAAA,IAAI,6CAAkB,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,yCAAqB,IAAI,MAAA,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,oBAAoB,CACzD,IAAI,CAAC,IAAI,CAAC,MAAM,CACjB,CAAC;QAEF,uBAAA,IAAI,4CAAwB,IAAI,MAAA,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAEjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC;QACpE,MAAM,gBAAgB,GACpB,gBAAgB,IAAI,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACtD,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,eAAe,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG;YAC1B,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe;YAC5B,eAAe,EAAE,gBAAgB,IAAI,IAAI;SAC1C,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CACnD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,uBAAA,IAAI,yCAAqB,KAAK,MAAA,CAAC;IACjC,CAAC;AACH,CAAC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { errorEvent, languagesChangedEvent } from \"../utils/events.js\";\nimport { getLanguagesByRegion } from \"../utils/languages.js\";\n\ninterface LanguagesControllerHost extends ReactiveControllerHost {\n region?: string;\n dictationConfig?: Corti.TranscribeConfig;\n dispatchEvent(event: CustomEvent): boolean;\n requestUpdate(): void;\n _languages?: Corti.TranscribeSupportedLanguage[];\n}\n\n/**\n * Controller that manages automatic language loading based on region.\n * Loads languages when they're not present and handles region changes.\n * Reacts to updates and automatically loads languages when needed.\n */\nexport class LanguagesController implements ReactiveController {\n host: LanguagesControllerHost;\n #autoLoadedLanguages: boolean = false;\n #loadingLanguages: boolean = false;\n #previousRegion?: string;\n #initialized: boolean = false;\n\n constructor(host: LanguagesControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n initialize(): void {\n this.#initialized = true;\n\n if (this.host._languages === undefined) {\n this.#loadLanguages();\n }\n }\n\n hostUpdate(): void {\n // Only react to updates after initialization\n if (!this.#initialized) {\n return;\n }\n\n // When region changes, reload languages if they were auto-loaded\n if (\n (this.#previousRegion !== this.host.region &&\n this.#autoLoadedLanguages) ||\n this.host._languages === undefined\n ) {\n this.#loadLanguages();\n }\n\n this.#previousRegion = this.host.region;\n }\n\n async #loadLanguages(): Promise<void> {\n if (this.#loadingLanguages) {\n return;\n }\n\n this.#loadingLanguages = true;\n\n try {\n const { languages, defaultLanguage } = getLanguagesByRegion(\n this.host.region,\n );\n\n this.#autoLoadedLanguages = true;\n this.host._languages = languages;\n\n const previousLanguage = this.host.dictationConfig?.primaryLanguage;\n const selectedLanguage =\n previousLanguage && languages.includes(previousLanguage)\n ? previousLanguage\n : defaultLanguage;\n\n this.host.dictationConfig = {\n ...this.host.dictationConfig,\n primaryLanguage: selectedLanguage || \"en\",\n };\n\n this.host.requestUpdate();\n this.host.dispatchEvent(\n languagesChangedEvent(languages, selectedLanguage),\n );\n } catch (error) {\n this.host.dispatchEvent(errorEvent(error));\n } finally {\n this.#loadingLanguages = false;\n }\n }\n\n /**\n * Clear the auto-loaded flag (when languages are set externally)\n */\n clearAutoLoadedFlag(): void {\n this.#autoLoadedLanguages = false;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import type { ReactiveController, ReactiveControllerHost } from "lit";
2
+ interface MediaControllerHost extends ReactiveControllerHost {
3
+ _selectedDevice?: MediaDeviceInfo;
4
+ _debug_displayAudio?: boolean;
5
+ }
6
+ export declare class MediaController implements ReactiveController {
7
+ #private;
8
+ host: MediaControllerHost;
9
+ constructor(host: MediaControllerHost);
10
+ hostDisconnected(): void;
11
+ initialize(onTrackEnded?: () => void): Promise<void>;
12
+ getAudioLevel(): number;
13
+ startAudioLevelMonitoring(onAudioLevelChange?: (level: number) => void): void;
14
+ stopAudioLevelMonitoring(): void;
15
+ cleanup(): Promise<void>;
16
+ /**
17
+ * Stops the media recorder and waits for all buffered data to be flushed.
18
+ * This ensures the final ondataavailable event fires before resolving.
19
+ */
20
+ stopRecording(): Promise<void>;
21
+ get mediaRecorder(): MediaRecorder | null;
22
+ get audioLevel(): number;
23
+ }
24
+ export {};
@@ -0,0 +1,115 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _MediaController_mediaStream, _MediaController_audioContext, _MediaController_analyser, _MediaController_mediaRecorder, _MediaController_visualiserInterval, _MediaController_audioLevel, _MediaController_onTrackEnded, _MediaController_onAudioLevelChange;
13
+ import { calculateAudioLevel, createAudioAnalyzer, getMediaStream, } from "../utils/media.js";
14
+ export class MediaController {
15
+ constructor(host) {
16
+ _MediaController_mediaStream.set(this, null);
17
+ _MediaController_audioContext.set(this, null);
18
+ _MediaController_analyser.set(this, null);
19
+ _MediaController_mediaRecorder.set(this, null);
20
+ _MediaController_visualiserInterval.set(this, void 0);
21
+ _MediaController_audioLevel.set(this, 0);
22
+ _MediaController_onTrackEnded.set(this, void 0);
23
+ _MediaController_onAudioLevelChange.set(this, void 0);
24
+ this.host = host;
25
+ host.addController(this);
26
+ }
27
+ hostDisconnected() {
28
+ this.cleanup();
29
+ }
30
+ async initialize(onTrackEnded) {
31
+ await this.cleanup();
32
+ __classPrivateFieldSet(this, _MediaController_onTrackEnded, onTrackEnded, "f");
33
+ __classPrivateFieldSet(this, _MediaController_mediaStream, await getMediaStream(this.host._selectedDevice?.deviceId, this.host._debug_displayAudio), "f");
34
+ __classPrivateFieldGet(this, _MediaController_mediaStream, "f").getTracks().forEach((track) => {
35
+ track.addEventListener("ended", () => {
36
+ if (__classPrivateFieldGet(this, _MediaController_onTrackEnded, "f")) {
37
+ __classPrivateFieldGet(this, _MediaController_onTrackEnded, "f").call(this);
38
+ }
39
+ });
40
+ });
41
+ const { audioContext, analyser } = createAudioAnalyzer(__classPrivateFieldGet(this, _MediaController_mediaStream, "f"));
42
+ __classPrivateFieldSet(this, _MediaController_audioContext, audioContext, "f");
43
+ __classPrivateFieldSet(this, _MediaController_analyser, analyser, "f");
44
+ __classPrivateFieldSet(this, _MediaController_mediaRecorder, new MediaRecorder(__classPrivateFieldGet(this, _MediaController_mediaStream, "f")), "f");
45
+ }
46
+ getAudioLevel() {
47
+ return __classPrivateFieldGet(this, _MediaController_analyser, "f") ? calculateAudioLevel(__classPrivateFieldGet(this, _MediaController_analyser, "f")) : 0;
48
+ }
49
+ startAudioLevelMonitoring(onAudioLevelChange) {
50
+ this.stopAudioLevelMonitoring();
51
+ __classPrivateFieldSet(this, _MediaController_onAudioLevelChange, onAudioLevelChange, "f");
52
+ __classPrivateFieldSet(this, _MediaController_visualiserInterval, window.setInterval(() => {
53
+ __classPrivateFieldSet(this, _MediaController_audioLevel, this.getAudioLevel() * 3, "f");
54
+ this.host.requestUpdate();
55
+ if (__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f")) {
56
+ __classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f").call(this, __classPrivateFieldGet(this, _MediaController_audioLevel, "f"));
57
+ }
58
+ }, 150), "f");
59
+ }
60
+ stopAudioLevelMonitoring() {
61
+ if (__classPrivateFieldGet(this, _MediaController_visualiserInterval, "f")) {
62
+ clearInterval(__classPrivateFieldGet(this, _MediaController_visualiserInterval, "f"));
63
+ __classPrivateFieldSet(this, _MediaController_visualiserInterval, undefined, "f");
64
+ }
65
+ __classPrivateFieldSet(this, _MediaController_audioLevel, 0, "f");
66
+ this.host.requestUpdate();
67
+ if (__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f")) {
68
+ __classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f").call(this, __classPrivateFieldGet(this, _MediaController_audioLevel, "f"));
69
+ }
70
+ }
71
+ async cleanup() {
72
+ this.stopAudioLevelMonitoring();
73
+ if (__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f")?.state === "recording") {
74
+ __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").stop();
75
+ }
76
+ if (__classPrivateFieldGet(this, _MediaController_mediaStream, "f")) {
77
+ __classPrivateFieldGet(this, _MediaController_mediaStream, "f").getTracks().forEach((track) => {
78
+ track.stop();
79
+ });
80
+ __classPrivateFieldSet(this, _MediaController_mediaStream, null, "f");
81
+ }
82
+ if (__classPrivateFieldGet(this, _MediaController_audioContext, "f") && __classPrivateFieldGet(this, _MediaController_audioContext, "f").state !== "closed") {
83
+ await __classPrivateFieldGet(this, _MediaController_audioContext, "f").close();
84
+ }
85
+ __classPrivateFieldSet(this, _MediaController_audioContext, null, "f");
86
+ __classPrivateFieldSet(this, _MediaController_analyser, null, "f");
87
+ __classPrivateFieldSet(this, _MediaController_mediaRecorder, null, "f");
88
+ __classPrivateFieldSet(this, _MediaController_onTrackEnded, undefined, "f");
89
+ __classPrivateFieldSet(this, _MediaController_onAudioLevelChange, undefined, "f");
90
+ }
91
+ /**
92
+ * Stops the media recorder and waits for all buffered data to be flushed.
93
+ * This ensures the final ondataavailable event fires before resolving.
94
+ */
95
+ async stopRecording() {
96
+ return new Promise((resolve) => {
97
+ if (!__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f") || __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").state !== "recording") {
98
+ resolve();
99
+ return;
100
+ }
101
+ __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").onstop = () => {
102
+ resolve();
103
+ };
104
+ __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").stop();
105
+ });
106
+ }
107
+ get mediaRecorder() {
108
+ return __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f");
109
+ }
110
+ get audioLevel() {
111
+ return __classPrivateFieldGet(this, _MediaController_audioLevel, "f");
112
+ }
113
+ }
114
+ _MediaController_mediaStream = new WeakMap(), _MediaController_audioContext = new WeakMap(), _MediaController_analyser = new WeakMap(), _MediaController_mediaRecorder = new WeakMap(), _MediaController_visualiserInterval = new WeakMap(), _MediaController_audioLevel = new WeakMap(), _MediaController_onTrackEnded = new WeakMap(), _MediaController_onAudioLevelChange = new WeakMap();
115
+ //# sourceMappingURL=media-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-controller.js","sourceRoot":"","sources":["../../src/controllers/media-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport {\n calculateAudioLevel,\n createAudioAnalyzer,\n getMediaStream,\n} from \"../utils/media.js\";\n\ninterface MediaControllerHost extends ReactiveControllerHost {\n _selectedDevice?: MediaDeviceInfo;\n _debug_displayAudio?: boolean;\n}\n\nexport class MediaController implements ReactiveController {\n host: MediaControllerHost;\n\n #mediaStream: MediaStream | null = null;\n #audioContext: AudioContext | null = null;\n #analyser: AnalyserNode | null = null;\n #mediaRecorder: MediaRecorder | null = null;\n #visualiserInterval?: number;\n #audioLevel: number = 0;\n #onTrackEnded?: () => void;\n #onAudioLevelChange?: (level: number) => void;\n\n constructor(host: MediaControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n async initialize(onTrackEnded?: () => void): Promise<void> {\n await this.cleanup();\n\n this.#onTrackEnded = onTrackEnded;\n this.#mediaStream = await getMediaStream(\n this.host._selectedDevice?.deviceId,\n this.host._debug_displayAudio,\n );\n\n this.#mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.addEventListener(\"ended\", () => {\n if (this.#onTrackEnded) {\n this.#onTrackEnded();\n }\n });\n });\n\n const { audioContext, analyser } = createAudioAnalyzer(this.#mediaStream);\n\n this.#audioContext = audioContext;\n this.#analyser = analyser;\n\n this.#mediaRecorder = new MediaRecorder(this.#mediaStream);\n }\n\n getAudioLevel(): number {\n return this.#analyser ? calculateAudioLevel(this.#analyser) : 0;\n }\n\n startAudioLevelMonitoring(\n onAudioLevelChange?: (level: number) => void,\n ): void {\n this.stopAudioLevelMonitoring();\n\n this.#onAudioLevelChange = onAudioLevelChange;\n\n this.#visualiserInterval = window.setInterval(() => {\n this.#audioLevel = this.getAudioLevel() * 3;\n this.host.requestUpdate();\n\n if (this.#onAudioLevelChange) {\n this.#onAudioLevelChange(this.#audioLevel);\n }\n }, 150);\n }\n\n stopAudioLevelMonitoring(): void {\n if (this.#visualiserInterval) {\n clearInterval(this.#visualiserInterval);\n this.#visualiserInterval = undefined;\n }\n\n this.#audioLevel = 0;\n this.host.requestUpdate();\n\n if (this.#onAudioLevelChange) {\n this.#onAudioLevelChange(this.#audioLevel);\n }\n }\n\n async cleanup(): Promise<void> {\n this.stopAudioLevelMonitoring();\n\n if (this.#mediaRecorder?.state === \"recording\") {\n this.#mediaRecorder.stop();\n }\n\n if (this.#mediaStream) {\n this.#mediaStream.getTracks().forEach((track) => {\n track.stop();\n });\n this.#mediaStream = null;\n }\n\n if (this.#audioContext && this.#audioContext.state !== \"closed\") {\n await this.#audioContext.close();\n }\n\n this.#audioContext = null;\n\n this.#analyser = null;\n this.#mediaRecorder = null;\n this.#onTrackEnded = undefined;\n this.#onAudioLevelChange = undefined;\n }\n\n /**\n * Stops the media recorder and waits for all buffered data to be flushed.\n * This ensures the final ondataavailable event fires before resolving.\n */\n async stopRecording(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this.#mediaRecorder || this.#mediaRecorder.state !== \"recording\") {\n resolve();\n return;\n }\n\n this.#mediaRecorder.onstop = () => {\n resolve();\n };\n\n this.#mediaRecorder.stop();\n });\n }\n\n get mediaRecorder(): MediaRecorder | null {\n return this.#mediaRecorder;\n }\n\n get audioLevel(): number {\n return this.#audioLevel;\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,12 @@
1
- import CortiDictation from './CortiDictation.js';
1
+ import { CortiDictation } from "./components/corti-dictation.js";
2
+ export { CortiDictation } from "./components/corti-dictation.js";
3
+ export { DictationDeviceSelector } from "./components/device-selector.js";
4
+ export { DictationKeybindingSelector } from "./components/keybinding-selector.js";
5
+ export { DictationLanguageSelector } from "./components/language-selector.js";
6
+ export { DictationModeSelector } from "./components/mode-selector.js";
7
+ export { DictationRecordingButton } from "./components/recording-button.js";
8
+ export { DictationSettingsMenu } from "./components/settings-menu.js";
9
+ export { DictationRoot } from "./contexts/dictation-context.js";
10
+ export type { ConfigurableSettings, DictationMode, Keybinding, RecordingState, } from "./types.js";
11
+ export type { AudioLevelChangedEventDetail, CommandEventDetail, ErrorEventDetail, KeybindingChangedEventDetail, LanguageChangedEventDetail, LanguagesChangedEventDetail, ModeChangedEventDetail, NetworkActivityEventDetail, RecordingDevicesChangedEventDetail, RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, } from "./utils/events.js";
2
12
  export default CortiDictation;
package/dist/index.js CHANGED
@@ -1,6 +1,42 @@
1
- import CortiDictation from './CortiDictation.js';
2
- if (!customElements.get('corti-dictation')) {
3
- customElements.define('corti-dictation', CortiDictation);
1
+ import { CortiDictation } from "./components/corti-dictation.js";
2
+ import { DictationDeviceSelector } from "./components/device-selector.js";
3
+ import { DictationKeybindingSelector } from "./components/keybinding-selector.js";
4
+ import { DictationLanguageSelector } from "./components/language-selector.js";
5
+ import { DictationModeSelector } from "./components/mode-selector.js";
6
+ import { DictationRecordingButton } from "./components/recording-button.js";
7
+ import { DictationSettingsMenu } from "./components/settings-menu.js";
8
+ import { DictationRoot } from "./contexts/dictation-context.js";
9
+ if (!customElements.get("corti-dictation")) {
10
+ customElements.define("corti-dictation", CortiDictation);
4
11
  }
12
+ if (!customElements.get("dictation-recording-button")) {
13
+ customElements.define("dictation-recording-button", DictationRecordingButton);
14
+ }
15
+ if (!customElements.get("dictation-device-selector")) {
16
+ customElements.define("dictation-device-selector", DictationDeviceSelector);
17
+ }
18
+ if (!customElements.get("dictation-language-selector")) {
19
+ customElements.define("dictation-language-selector", DictationLanguageSelector);
20
+ }
21
+ if (!customElements.get("dictation-mode-selector")) {
22
+ customElements.define("dictation-mode-selector", DictationModeSelector);
23
+ }
24
+ if (!customElements.get("dictation-keybinding-selector")) {
25
+ customElements.define("dictation-keybinding-selector", DictationKeybindingSelector);
26
+ }
27
+ if (!customElements.get("dictation-settings-menu")) {
28
+ customElements.define("dictation-settings-menu", DictationSettingsMenu);
29
+ }
30
+ if (!customElements.get("dictation-root")) {
31
+ customElements.define("dictation-root", DictationRoot);
32
+ }
33
+ export { CortiDictation } from "./components/corti-dictation.js";
34
+ export { DictationDeviceSelector } from "./components/device-selector.js";
35
+ export { DictationKeybindingSelector } from "./components/keybinding-selector.js";
36
+ export { DictationLanguageSelector } from "./components/language-selector.js";
37
+ export { DictationModeSelector } from "./components/mode-selector.js";
38
+ export { DictationRecordingButton } from "./components/recording-button.js";
39
+ export { DictationSettingsMenu } from "./components/settings-menu.js";
40
+ export { DictationRoot } from "./contexts/dictation-context.js";
5
41
  export default CortiDictation;
6
42
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC3C,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC;AAED,eAAe,cAAc,CAAC","sourcesContent":["import CortiDictation from './CortiDictation.js';\n\nif (!customElements.get('corti-dictation')) {\n customElements.define('corti-dictation', CortiDictation);\n}\n\nexport default CortiDictation;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC3C,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,CAAC;IACtD,cAAc,CAAC,MAAM,CAAC,4BAA4B,EAAE,wBAAwB,CAAC,CAAC;AAChF,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC;IACrD,cAAc,CAAC,MAAM,CAAC,2BAA2B,EAAE,uBAAuB,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,CAAC;IACvD,cAAc,CAAC,MAAM,CACnB,6BAA6B,EAC7B,yBAAyB,CAC1B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC;IACnD,cAAc,CAAC,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;AAC1E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE,CAAC;IACzD,cAAc,CAAC,MAAM,CACnB,+BAA+B,EAC/B,2BAA2B,CAC5B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC;IACnD,cAAc,CAAC,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;AAC1E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAC1C,cAAc,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAuBhE,eAAe,cAAc,CAAC","sourcesContent":["import { CortiDictation } from \"./components/corti-dictation.js\";\nimport { DictationDeviceSelector } from \"./components/device-selector.js\";\nimport { DictationKeybindingSelector } from \"./components/keybinding-selector.js\";\nimport { DictationLanguageSelector } from \"./components/language-selector.js\";\nimport { DictationModeSelector } from \"./components/mode-selector.js\";\nimport { DictationRecordingButton } from \"./components/recording-button.js\";\nimport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nimport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nif (!customElements.get(\"corti-dictation\")) {\n customElements.define(\"corti-dictation\", CortiDictation);\n}\n\nif (!customElements.get(\"dictation-recording-button\")) {\n customElements.define(\"dictation-recording-button\", DictationRecordingButton);\n}\n\nif (!customElements.get(\"dictation-device-selector\")) {\n customElements.define(\"dictation-device-selector\", DictationDeviceSelector);\n}\n\nif (!customElements.get(\"dictation-language-selector\")) {\n customElements.define(\n \"dictation-language-selector\",\n DictationLanguageSelector,\n );\n}\n\nif (!customElements.get(\"dictation-mode-selector\")) {\n customElements.define(\"dictation-mode-selector\", DictationModeSelector);\n}\n\nif (!customElements.get(\"dictation-keybinding-selector\")) {\n customElements.define(\n \"dictation-keybinding-selector\",\n DictationKeybindingSelector,\n );\n}\n\nif (!customElements.get(\"dictation-settings-menu\")) {\n customElements.define(\"dictation-settings-menu\", DictationSettingsMenu);\n}\n\nif (!customElements.get(\"dictation-root\")) {\n customElements.define(\"dictation-root\", DictationRoot);\n}\n\nexport { CortiDictation } from \"./components/corti-dictation.js\";\nexport { DictationDeviceSelector } from \"./components/device-selector.js\";\nexport { DictationKeybindingSelector } from \"./components/keybinding-selector.js\";\nexport { DictationLanguageSelector } from \"./components/language-selector.js\";\nexport { DictationModeSelector } from \"./components/mode-selector.js\";\nexport { DictationRecordingButton } from \"./components/recording-button.js\";\nexport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nexport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nexport type {\n ConfigurableSettings,\n DictationMode,\n Keybinding,\n RecordingState,\n} from \"./types.js\";\nexport type {\n AudioLevelChangedEventDetail,\n CommandEventDetail,\n ErrorEventDetail,\n KeybindingChangedEventDetail,\n LanguageChangedEventDetail,\n LanguagesChangedEventDetail,\n ModeChangedEventDetail,\n NetworkActivityEventDetail,\n RecordingDevicesChangedEventDetail,\n RecordingStateChangedEventDetail,\n TranscriptEventDetail,\n UsageEventDetail,\n} from \"./utils/events.js\";\n\nexport default CortiDictation;\n"]}
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "@corti/dictation-web",
3
+ "version": "0.0.0-local",
4
+ "type": "module",
5
+ "main": "./index.js",
6
+ "module": "./index.js",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./index.js",
10
+ "types": "./index.d.ts"
11
+ },
12
+ "./*": "./*"
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ import { LitElement, type PropertyValues } from "lit";
2
+ export declare class AudioVisualiser extends LitElement {
3
+ level: number;
4
+ active: boolean;
5
+ segmentCount: number;
6
+ static styles: import("lit").CSSResult;
7
+ willUpdate(changedProperties: PropertyValues<this>): void;
8
+ render(): import("lit-html").TemplateResult<1>;
9
+ }
10
+ declare global {
11
+ interface HTMLElementTagNameMap {
12
+ "audio-visualiser": AudioVisualiser;
13
+ }
14
+ }
@@ -0,0 +1,57 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { html, LitElement } from "lit";
8
+ import { customElement, property } from "lit/decorators.js";
9
+ import { classMap } from "lit/directives/class-map.js";
10
+ import { map } from "lit/directives/map.js";
11
+ import { range } from "lit/directives/range.js";
12
+ import AudioVisualiserStyles from "../styles/audio-visualiser.js";
13
+ import { normalizeToRange } from "../utils/validation.js";
14
+ let AudioVisualiser = class AudioVisualiser extends LitElement {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.level = 0;
18
+ this.active = false;
19
+ this.segmentCount = 5;
20
+ }
21
+ willUpdate(changedProperties) {
22
+ if (changedProperties.has("level")) {
23
+ this.level = normalizeToRange(this.level);
24
+ }
25
+ }
26
+ render() {
27
+ // Each segment represents 20%. Using Math.round to fill segments.
28
+ const activeSegments = Math.round(this.level * this.segmentCount);
29
+ const segments = map(range(this.segmentCount), (i) => html `<div class=${classMap({
30
+ active: i < activeSegments,
31
+ segment: true,
32
+ })}></div>`);
33
+ return html `
34
+ <div class=${classMap({
35
+ active: this.active,
36
+ container: true,
37
+ })}>
38
+ ${segments}
39
+ </div>
40
+ `;
41
+ }
42
+ };
43
+ AudioVisualiser.styles = AudioVisualiserStyles;
44
+ __decorate([
45
+ property({ type: Number })
46
+ ], AudioVisualiser.prototype, "level", void 0);
47
+ __decorate([
48
+ property({ type: Boolean })
49
+ ], AudioVisualiser.prototype, "active", void 0);
50
+ __decorate([
51
+ property({ type: Number })
52
+ ], AudioVisualiser.prototype, "segmentCount", void 0);
53
+ AudioVisualiser = __decorate([
54
+ customElement("audio-visualiser")
55
+ ], AudioVisualiser);
56
+ export { AudioVisualiser };
57
+ //# sourceMappingURL=audio-visualiser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-visualiser.js","sourceRoot":"","sources":["../../../src/components/audio-visualiser.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAuB,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,qBAAqB,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAGnD,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU;IAAxC;;QAEL,UAAK,GAAW,CAAC,CAAC;QAGlB,WAAM,GAAY,KAAK,CAAC;QAGxB,iBAAY,GAAW,CAAC,CAAC;IA+B3B,CAAC;IA3BC,UAAU,CAAC,iBAAuC;QAChD,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,MAAM;QACJ,kEAAkE;QAClE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,GAAG,CAClB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EACxB,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,CAAA,cAAc,QAAQ,CAAC;YACzB,MAAM,EAAE,CAAC,GAAG,cAAc;YAC1B,OAAO,EAAE,IAAI;SACd,CAAC,SAAS,CACd,CAAC;QAEF,OAAO,IAAI,CAAA;mBACI,QAAQ,CAAC;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI;SAChB,CAAC;UACE,QAAQ;;KAEb,CAAC;IACJ,CAAC;;AA5BM,sBAAM,GAAG,qBAAqB,AAAxB,CAAyB;AARtC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CACT;AAGlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;+CACJ;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;qDACF;AARd,eAAe;IAD3B,aAAa,CAAC,kBAAkB,CAAC;GACrB,eAAe,CAuC3B","sourcesContent":["import { html, LitElement, type PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { map } from \"lit/directives/map.js\";\nimport { range } from \"lit/directives/range.js\";\nimport AudioVisualiserStyles from \"../styles/audio-visualiser.js\";\nimport { normalizeToRange } from \"../utils/validation.js\";\n\n@customElement(\"audio-visualiser\")\nexport class AudioVisualiser extends LitElement {\n @property({ type: Number })\n level: number = 0;\n\n @property({ type: Boolean })\n active: boolean = false;\n\n @property({ type: Number })\n segmentCount: number = 5;\n\n static styles = AudioVisualiserStyles;\n\n willUpdate(changedProperties: PropertyValues<this>): void {\n if (changedProperties.has(\"level\")) {\n this.level = normalizeToRange(this.level);\n }\n }\n\n render() {\n // Each segment represents 20%. Using Math.round to fill segments.\n const activeSegments = Math.round(this.level * this.segmentCount);\n const segments = map(\n range(this.segmentCount),\n (i) =>\n html`<div class=${classMap({\n active: i < activeSegments,\n segment: true,\n })}></div>`,\n );\n\n return html`\n <div class=${classMap({\n active: this.active,\n container: true,\n })}>\n ${segments}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"audio-visualiser\": AudioVisualiser;\n }\n}\n"]}