@corti/dictation-web 0.7.0-ambient.9 → 0.7.0

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 (242) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +110 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/{bundle.js → dist/bundle.js} +4459 -4823
  5. package/{components → dist/components}/corti-dictation.d.ts +3 -3
  6. package/{components → dist/components}/corti-dictation.js +5 -4
  7. package/dist/components/corti-dictation.js.map +1 -0
  8. package/dist/components/dictation-device-selector.d.ts +8 -0
  9. package/dist/components/dictation-device-selector.js +15 -0
  10. package/dist/components/dictation-device-selector.js.map +1 -0
  11. package/dist/components/dictation-keybinding-selector.d.ts +8 -0
  12. package/dist/components/dictation-keybinding-selector.js +15 -0
  13. package/dist/components/dictation-keybinding-selector.js.map +1 -0
  14. package/dist/components/dictation-language-selector.d.ts +8 -0
  15. package/dist/components/dictation-language-selector.js +15 -0
  16. package/dist/components/dictation-language-selector.js.map +1 -0
  17. package/{components → dist/components}/dictation-recording-button.d.ts +2 -1
  18. package/{components → dist/components}/dictation-recording-button.js +9 -4
  19. package/dist/components/dictation-recording-button.js.map +1 -0
  20. package/dist/components/dictation-settings-menu.d.ts +15 -0
  21. package/dist/components/dictation-settings-menu.js +34 -0
  22. package/dist/components/dictation-settings-menu.js.map +1 -0
  23. package/dist/constants.d.ts +2 -0
  24. package/dist/constants.js +6 -0
  25. package/dist/constants.js.map +1 -0
  26. package/{contexts → dist/contexts}/dictation-context.d.ts +1 -1
  27. package/{contexts → dist/contexts}/dictation-context.js +4 -3
  28. package/dist/contexts/dictation-context.js.map +1 -0
  29. package/{controllers → dist/controllers}/dictation-controller.d.ts +4 -4
  30. package/{controllers → dist/controllers}/dictation-controller.js +1 -1
  31. package/dist/controllers/dictation-controller.js.map +1 -0
  32. package/dist/core/.tsbuildinfo +1 -0
  33. package/{components → dist/core/components}/corti-root.d.ts +1 -1
  34. package/dist/core/components/corti-root.js.map +1 -0
  35. package/dist/core/components/device-selector-base.d.ts +9 -0
  36. package/{components/device-selector.js → dist/core/components/device-selector-base.js} +11 -17
  37. package/dist/core/components/device-selector-base.js.map +1 -0
  38. package/dist/core/components/keybinding-selector-base.d.ts +10 -0
  39. package/{components/keybinding-selector.js → dist/core/components/keybinding-selector-base.js} +21 -21
  40. package/dist/core/components/keybinding-selector-base.js.map +1 -0
  41. package/dist/core/components/language-selector-base.d.ts +10 -0
  42. package/{components/language-selector.js → dist/core/components/language-selector-base.js} +11 -18
  43. package/dist/core/components/language-selector-base.js.map +1 -0
  44. package/{components → dist/core/components}/recording-button-base.d.ts +10 -7
  45. package/{components → dist/core/components}/recording-button-base.js +17 -15
  46. package/dist/core/components/recording-button-base.js.map +1 -0
  47. package/dist/core/components/settings-menu-base.d.ts +13 -0
  48. package/{components/settings-menu.js → dist/core/components/settings-menu-base.js} +14 -36
  49. package/dist/core/components/settings-menu-base.js.map +1 -0
  50. package/{components/audio-visualiser.d.ts → dist/core/components/speech-audio-visualiser.d.ts} +3 -4
  51. package/{components/audio-visualiser.js → dist/core/components/speech-audio-visualiser.js} +11 -12
  52. package/dist/core/components/speech-audio-visualiser.js.map +1 -0
  53. package/{components/keybinding-input.d.ts → dist/core/components/speech-keybinding-input.d.ts} +3 -4
  54. package/{components/keybinding-input.js → dist/core/components/speech-keybinding-input.js} +22 -22
  55. package/dist/core/components/speech-keybinding-input.js.map +1 -0
  56. package/{constants.d.ts → dist/core/constants.d.ts} +0 -2
  57. package/{constants.js → dist/core/constants.js} +0 -14
  58. package/dist/core/constants.js.map +1 -0
  59. package/dist/core/contexts/mixins/auth-context.js.map +1 -0
  60. package/dist/core/contexts/mixins/devices-context.js.map +1 -0
  61. package/{contexts → dist/core/contexts}/mixins/keybindings-context.js +3 -2
  62. package/dist/core/contexts/mixins/keybindings-context.js.map +1 -0
  63. package/dist/core/contexts/mixins/languages-context.js.map +1 -0
  64. package/dist/core/contexts/mixins/proxy-context.js.map +1 -0
  65. package/dist/core/contexts/mixins/recording-state-context.js.map +1 -0
  66. package/dist/core/contexts/mixins/types.js.map +1 -0
  67. package/{contexts → dist/core/contexts}/root-context.d.ts +1 -1
  68. package/dist/core/contexts/root-context.js.map +1 -0
  69. package/dist/core/controllers/devices-controller.js.map +1 -0
  70. package/dist/core/controllers/keybinding-controller.js.map +1 -0
  71. package/dist/core/controllers/languages-controller.js.map +1 -0
  72. package/dist/core/controllers/media-controller.js.map +1 -0
  73. package/dist/core/controllers/socket-controller.js.map +1 -0
  74. package/{icons → dist/core/icons}/icons.d.ts +6 -6
  75. package/{icons → dist/core/icons}/icons.js +7 -7
  76. package/dist/core/icons/icons.js.map +1 -0
  77. package/dist/core/icons/index.js.map +1 -0
  78. package/dist/core/socket-messages.d.ts +4 -0
  79. package/dist/core/socket-messages.js +2 -0
  80. package/dist/core/socket-messages.js.map +1 -0
  81. package/dist/core/styles/audio-visualiser.js.map +1 -0
  82. package/dist/core/styles/buttons.js.map +1 -0
  83. package/dist/core/styles/callout.js.map +1 -0
  84. package/dist/core/styles/component-styles.js.map +1 -0
  85. package/dist/core/styles/keybinding-selector.js.map +1 -0
  86. package/dist/core/styles/recording-button.js.map +1 -0
  87. package/dist/core/styles/select.js.map +1 -0
  88. package/dist/core/styles/settings-menu.js.map +1 -0
  89. package/{types.d.ts → dist/core/types.d.ts} +0 -3
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/core/utils/auth.js.map +1 -0
  92. package/dist/core/utils/converters.js.map +1 -0
  93. package/dist/core/utils/custom-elements.d.ts +6 -0
  94. package/dist/core/utils/custom-elements.js +23 -0
  95. package/dist/core/utils/custom-elements.js.map +1 -0
  96. package/dist/core/utils/devices.js.map +1 -0
  97. package/dist/core/utils/events.js.map +1 -0
  98. package/dist/core/utils/keybinding.js.map +1 -0
  99. package/dist/core/utils/languages.js.map +1 -0
  100. package/dist/core/utils/media.js.map +1 -0
  101. package/dist/core/utils/token.js.map +1 -0
  102. package/dist/core/utils/validation.js.map +1 -0
  103. package/{index.d.ts → dist/index.d.ts} +6 -6
  104. package/dist/index.js +8 -0
  105. package/dist/index.js.map +1 -0
  106. package/package.json +19 -13
  107. package/.tsbuildinfo +0 -1
  108. package/components/ambient-recording-button.d.ts +0 -16
  109. package/components/ambient-recording-button.js +0 -68
  110. package/components/ambient-recording-button.js.map +0 -1
  111. package/components/ambient-virtual-mode-selector.d.ts +0 -14
  112. package/components/ambient-virtual-mode-selector.js +0 -69
  113. package/components/ambient-virtual-mode-selector.js.map +0 -1
  114. package/components/audio-visualiser.js.map +0 -1
  115. package/components/corti-ambient.d.ts +0 -35
  116. package/components/corti-ambient.js +0 -126
  117. package/components/corti-ambient.js.map +0 -1
  118. package/components/corti-dictation.js.map +0 -1
  119. package/components/corti-root.js.map +0 -1
  120. package/components/device-selector.d.ts +0 -15
  121. package/components/device-selector.js.map +0 -1
  122. package/components/dictation-recording-button.js.map +0 -1
  123. package/components/keybinding-input.js.map +0 -1
  124. package/components/keybinding-selector.d.ts +0 -15
  125. package/components/keybinding-selector.js.map +0 -1
  126. package/components/language-selector.d.ts +0 -16
  127. package/components/language-selector.js.map +0 -1
  128. package/components/recording-button-base.js.map +0 -1
  129. package/components/settings-menu.d.ts +0 -19
  130. package/components/settings-menu.js.map +0 -1
  131. package/constants.js.map +0 -1
  132. package/contexts/ambient-context.d.ts +0 -24
  133. package/contexts/ambient-context.js +0 -93
  134. package/contexts/ambient-context.js.map +0 -1
  135. package/contexts/dictation-context.js.map +0 -1
  136. package/contexts/mixins/auth-context.js.map +0 -1
  137. package/contexts/mixins/devices-context.js.map +0 -1
  138. package/contexts/mixins/keybindings-context.js.map +0 -1
  139. package/contexts/mixins/languages-context.js.map +0 -1
  140. package/contexts/mixins/proxy-context.js.map +0 -1
  141. package/contexts/mixins/recording-state-context.js.map +0 -1
  142. package/contexts/mixins/types.js.map +0 -1
  143. package/contexts/root-context.js.map +0 -1
  144. package/controllers/ambient-controller.d.ts +0 -16
  145. package/controllers/ambient-controller.js +0 -24
  146. package/controllers/ambient-controller.js.map +0 -1
  147. package/controllers/devices-controller.js.map +0 -1
  148. package/controllers/dictation-controller.js.map +0 -1
  149. package/controllers/keybinding-controller.js.map +0 -1
  150. package/controllers/languages-controller.js.map +0 -1
  151. package/controllers/media-controller.js.map +0 -1
  152. package/controllers/socket-controller.js.map +0 -1
  153. package/icons/icons.js.map +0 -1
  154. package/icons/index.js.map +0 -1
  155. package/index.js +0 -8
  156. package/index.js.map +0 -1
  157. package/styles/ambient-virtual-mode-selector.d.ts +0 -2
  158. package/styles/ambient-virtual-mode-selector.js +0 -101
  159. package/styles/ambient-virtual-mode-selector.js.map +0 -1
  160. package/styles/audio-visualiser.js.map +0 -1
  161. package/styles/buttons.js.map +0 -1
  162. package/styles/callout.js.map +0 -1
  163. package/styles/component-styles.js.map +0 -1
  164. package/styles/keybinding-selector.js.map +0 -1
  165. package/styles/recording-button.js.map +0 -1
  166. package/styles/select.js.map +0 -1
  167. package/styles/settings-menu.js.map +0 -1
  168. package/types.js.map +0 -1
  169. package/utils/auth.js.map +0 -1
  170. package/utils/converters.js.map +0 -1
  171. package/utils/custom-elements.d.ts +0 -6
  172. package/utils/custom-elements.js +0 -11
  173. package/utils/custom-elements.js.map +0 -1
  174. package/utils/devices.js.map +0 -1
  175. package/utils/events.js.map +0 -1
  176. package/utils/keybinding.js.map +0 -1
  177. package/utils/languages.js.map +0 -1
  178. package/utils/media.js.map +0 -1
  179. package/utils/token.js.map +0 -1
  180. package/utils/validation.js.map +0 -1
  181. /package/{components → dist/core/components}/corti-root.js +0 -0
  182. /package/{contexts → dist/core/contexts}/mixins/auth-context.d.ts +0 -0
  183. /package/{contexts → dist/core/contexts}/mixins/auth-context.js +0 -0
  184. /package/{contexts → dist/core/contexts}/mixins/devices-context.d.ts +0 -0
  185. /package/{contexts → dist/core/contexts}/mixins/devices-context.js +0 -0
  186. /package/{contexts → dist/core/contexts}/mixins/keybindings-context.d.ts +0 -0
  187. /package/{contexts → dist/core/contexts}/mixins/languages-context.d.ts +0 -0
  188. /package/{contexts → dist/core/contexts}/mixins/languages-context.js +0 -0
  189. /package/{contexts → dist/core/contexts}/mixins/proxy-context.d.ts +0 -0
  190. /package/{contexts → dist/core/contexts}/mixins/proxy-context.js +0 -0
  191. /package/{contexts → dist/core/contexts}/mixins/recording-state-context.d.ts +0 -0
  192. /package/{contexts → dist/core/contexts}/mixins/recording-state-context.js +0 -0
  193. /package/{contexts → dist/core/contexts}/mixins/types.d.ts +0 -0
  194. /package/{contexts → dist/core/contexts}/mixins/types.js +0 -0
  195. /package/{contexts → dist/core/contexts}/root-context.js +0 -0
  196. /package/{controllers → dist/core/controllers}/devices-controller.d.ts +0 -0
  197. /package/{controllers → dist/core/controllers}/devices-controller.js +0 -0
  198. /package/{controllers → dist/core/controllers}/keybinding-controller.d.ts +0 -0
  199. /package/{controllers → dist/core/controllers}/keybinding-controller.js +0 -0
  200. /package/{controllers → dist/core/controllers}/languages-controller.d.ts +0 -0
  201. /package/{controllers → dist/core/controllers}/languages-controller.js +0 -0
  202. /package/{controllers → dist/core/controllers}/media-controller.d.ts +0 -0
  203. /package/{controllers → dist/core/controllers}/media-controller.js +0 -0
  204. /package/{controllers → dist/core/controllers}/socket-controller.d.ts +0 -0
  205. /package/{controllers → dist/core/controllers}/socket-controller.js +0 -0
  206. /package/{icons → dist/core/icons}/index.d.ts +0 -0
  207. /package/{icons → dist/core/icons}/index.js +0 -0
  208. /package/{styles → dist/core/styles}/audio-visualiser.d.ts +0 -0
  209. /package/{styles → dist/core/styles}/audio-visualiser.js +0 -0
  210. /package/{styles → dist/core/styles}/buttons.d.ts +0 -0
  211. /package/{styles → dist/core/styles}/buttons.js +0 -0
  212. /package/{styles → dist/core/styles}/callout.d.ts +0 -0
  213. /package/{styles → dist/core/styles}/callout.js +0 -0
  214. /package/{styles → dist/core/styles}/component-styles.d.ts +0 -0
  215. /package/{styles → dist/core/styles}/component-styles.js +0 -0
  216. /package/{styles → dist/core/styles}/keybinding-selector.d.ts +0 -0
  217. /package/{styles → dist/core/styles}/keybinding-selector.js +0 -0
  218. /package/{styles → dist/core/styles}/recording-button.d.ts +0 -0
  219. /package/{styles → dist/core/styles}/recording-button.js +0 -0
  220. /package/{styles → dist/core/styles}/select.d.ts +0 -0
  221. /package/{styles → dist/core/styles}/select.js +0 -0
  222. /package/{styles → dist/core/styles}/settings-menu.d.ts +0 -0
  223. /package/{styles → dist/core/styles}/settings-menu.js +0 -0
  224. /package/{types.js → dist/core/types.js} +0 -0
  225. /package/{utils → dist/core/utils}/auth.d.ts +0 -0
  226. /package/{utils → dist/core/utils}/auth.js +0 -0
  227. /package/{utils → dist/core/utils}/converters.d.ts +0 -0
  228. /package/{utils → dist/core/utils}/converters.js +0 -0
  229. /package/{utils → dist/core/utils}/devices.d.ts +0 -0
  230. /package/{utils → dist/core/utils}/devices.js +0 -0
  231. /package/{utils → dist/core/utils}/events.d.ts +0 -0
  232. /package/{utils → dist/core/utils}/events.js +0 -0
  233. /package/{utils → dist/core/utils}/keybinding.d.ts +0 -0
  234. /package/{utils → dist/core/utils}/keybinding.js +0 -0
  235. /package/{utils → dist/core/utils}/languages.d.ts +0 -0
  236. /package/{utils → dist/core/utils}/languages.js +0 -0
  237. /package/{utils → dist/core/utils}/media.d.ts +0 -0
  238. /package/{utils → dist/core/utils}/media.js +0 -0
  239. /package/{utils → dist/core/utils}/token.d.ts +0 -0
  240. /package/{utils → dist/core/utils}/token.js +0 -0
  241. /package/{utils → dist/core/utils}/validation.d.ts +0 -0
  242. /package/{utils → dist/core/utils}/validation.js +0 -0
@@ -115,6 +115,6 @@ export declare class CortiRoot<TRoot extends CortiProviderRoot = CortiProviderRo
115
115
  * Call this to receive "usage" statistics or when done with the connection.
116
116
  */
117
117
  closeConnection(): Promise<void>;
118
- render(): import("lit-html").TemplateResult<1>;
118
+ render(): import("lit").TemplateResult<1>;
119
119
  }
120
120
  export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corti-root.js","sourceRoot":"","sources":["../../src/components/corti-root.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti, CortiAuth } from \"@corti/sdk\";\nimport { css, html, LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { createRef, type Ref } from \"lit/directives/ref.js\";\nimport type {\n ConfigurableSettings,\n ProxyOptions,\n RecordingState,\n} from \"../types.js\";\nimport { commaSeparatedConverter } from \"../utils/converters.js\";\n\ntype CortiProviderRoot = LitElement & {\n recordingState?: RecordingState;\n languages?: Corti.TranscribeSupportedLanguage[];\n devices?: MediaDeviceInfo[];\n selectedDevice?: MediaDeviceInfo | undefined;\n pushToTalkKeybinding?: string | null | undefined;\n toggleToTalkKeybinding?: string | null | undefined;\n};\n\ntype CortiRecordingButtonHost = LitElement & {\n startRecording(): void;\n stopRecording(): void;\n toggleRecording(): void;\n openConnection(): Promise<void>;\n closeConnection(): Promise<void>;\n};\n\n/**\n * Shared base for all-in-one Corti host elements (e.g. corti-dictation, corti-ambient).\n * Intentionally minimal; shared behavior will move here incrementally.\n */\nexport class CortiRoot<\n TRoot extends CortiProviderRoot = CortiProviderRoot,\n TRecordingButton extends CortiRecordingButtonHost = CortiRecordingButtonHost,\n> extends LitElement {\n static styles = css`\n .hidden {\n display: none;\n }\n `;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Properties\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Latest access token\n */\n @property({ type: String })\n accessToken?: string;\n\n /**\n * Authentication configuration with optional refresh mechanism.\n */\n @property({ attribute: false, type: Object })\n authConfig?: CortiAuth.AuthTokenDerivable;\n\n /**\n * WebSocket URL for proxy connection. When provided, uses CortiWebSocketProxyClient instead of CortiClient.\n */\n @property({ type: String })\n socketUrl?: string;\n\n /**\n * Socket proxy configuration object. When provided, uses CortiWebSocketProxyClient instead of CortiClient.\n */\n @property({ attribute: false, type: Object })\n socketProxy?: ProxyOptions;\n\n /**\n * Which settings should be available in the UI.\n * If an empty array is passed, the settings will be disabled entirely.\n */\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n settingsEnabled: ConfigurableSettings[] = [\"device\", \"language\"];\n\n /**\n * When false (default), clicking the start/stop button does not move focus\n * to the button, allowing textareas or other input elements to keep focus.\n * Set to true to allow the button to receive focus on click.\n */\n @property({ type: Boolean })\n allowButtonFocus: boolean = false;\n\n /**\n * List of all language codes available for use with the Web Component.\n * Default list depends on the accessToken\n */\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n set languagesSupported(value:\n | Corti.TranscribeSupportedLanguage[]\n | undefined) {\n this._languagesSupported = value;\n }\n\n get languagesSupported(): Corti.TranscribeSupportedLanguage[] {\n return (\n this._contextProviderRef.value?.languages ||\n this._languagesSupported ||\n []\n );\n }\n\n @state()\n protected _languagesSupported?: Corti.TranscribeSupportedLanguage[];\n\n /**\n * List of available recording devices\n */\n @property({ attribute: false, type: Array })\n set devices(value: MediaDeviceInfo[] | undefined) {\n this._devices = value;\n }\n\n get devices(): MediaDeviceInfo[] {\n return this._contextProviderRef.value?.devices || this._devices || [];\n }\n\n @state()\n protected _devices?: MediaDeviceInfo[];\n\n /**\n * The selected device used for recording (MediaDeviceInfo).\n */\n @property({ attribute: false, type: Object })\n set selectedDevice(value: MediaDeviceInfo | undefined) {\n this._selectedDevice = value;\n }\n\n get selectedDevice(): MediaDeviceInfo | undefined {\n return (\n this._contextProviderRef.value?.selectedDevice || this._selectedDevice\n );\n }\n\n @state()\n protected _selectedDevice?: MediaDeviceInfo;\n\n /**\n * Push-to-talk keybinding for keyboard shortcut. Single key only (e.g., \"Space\", \"k\", \"meta\", \"ctrl\").\n * Combinations with \"+\" are not supported.\n * Keydown starts recording, keyup stops recording.\n * Defaults to \"Space\" if keybinding is in settingsEnabled, otherwise undefined\n */\n @property({ type: String })\n set pushToTalkKeybinding(value: string | null | undefined) {\n this._pushToTalkKeybinding = value;\n }\n\n get pushToTalkKeybinding(): string | null | undefined {\n return (\n this._contextProviderRef.value?.pushToTalkKeybinding ||\n this._pushToTalkKeybinding\n );\n }\n\n @state()\n protected _pushToTalkKeybinding?: string | null;\n\n /**\n * Toggle-to-talk keybinding for keyboard shortcut. Single key only (e.g., \"`\", \"k\", \"meta\", \"ctrl\").\n * Combinations with \"+\" are not supported.\n * Pressing the key toggles recording on/off.\n * Defaults to \"Enter\" if keybinding is in settingsEnabled, otherwise undefined\n */\n @property({ type: String })\n set toggleToTalkKeybinding(value: string | null | undefined) {\n this._toggleToTalkKeybinding = value;\n }\n\n get toggleToTalkKeybinding(): string | null | undefined {\n return (\n this._contextProviderRef.value?.toggleToTalkKeybinding ||\n this._toggleToTalkKeybinding\n );\n }\n\n @state()\n protected _toggleToTalkKeybinding?: string | null;\n\n protected _contextProviderRef: Ref<TRoot> = createRef();\n protected _recordingButtonRef: Ref<TRecordingButton> = createRef();\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Current state of recording (stopped, recording, initializing and stopping, ).\n */\n get recordingState(): RecordingState {\n return this._contextProviderRef.value?.recordingState ?? \"stopped\";\n }\n\n /**\n * Starts a recording.\n */\n public startRecording(): void {\n this._recordingButtonRef.value?.startRecording();\n }\n\n /**\n * Stops a recording.\n */\n public stopRecording(): void {\n this._recordingButtonRef.value?.stopRecording();\n }\n\n /**\n * Starts or stops recording. Convenience layer on top of the start/stop methods.\n */\n public toggleRecording(): void {\n this._recordingButtonRef.value?.toggleRecording();\n }\n\n /**\n * Opens the WebSocket connection without starting recording.\n * Use this to pre-establish the connection before recording starts.\n */\n public async openConnection(): Promise<void> {\n await this._recordingButtonRef.value?.openConnection();\n }\n\n /**\n * Closes the WebSocket connection by sending \"end\" and waiting for \"ended\".\n * Call this to receive \"usage\" statistics or when done with the connection.\n */\n public async closeConnection(): Promise<void> {\n await this._recordingButtonRef.value?.closeConnection();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Render\n // ─────────────────────────────────────────────────────────────────────────────\n\n render() {\n return html``;\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { LitElement } from "lit";
2
+ export declare class DeviceSelectorBase extends LitElement {
3
+ #private;
4
+ _devices?: MediaDeviceInfo[];
5
+ _selectedDevice?: MediaDeviceInfo;
6
+ disabled: boolean;
7
+ static styles: import("lit").CSSResult[];
8
+ render(): import("lit").TemplateResult<1>;
9
+ }
@@ -9,18 +9,17 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
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
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _DictationDeviceSelector_instances, _DictationDeviceSelector_handleSelectDevice;
12
+ var _DeviceSelectorBase_instances, _DeviceSelectorBase_handleSelectDevice;
13
13
  import { consume } from "@lit/context";
14
14
  import { html, LitElement } from "lit";
15
15
  import { property, state } from "lit/decorators.js";
16
16
  import { devicesContext, selectedDeviceContext, } from "../contexts/mixins/devices-context.js";
17
17
  import SelectStyles from "../styles/select.js";
18
- import { dualCustomElement } from "../utils/custom-elements.js";
19
18
  import { recordingDevicesChangedEvent } from "../utils/events.js";
20
- let DictationDeviceSelector = class DictationDeviceSelector extends LitElement {
19
+ export class DeviceSelectorBase extends LitElement {
21
20
  constructor() {
22
21
  super(...arguments);
23
- _DictationDeviceSelector_instances.add(this);
22
+ _DeviceSelectorBase_instances.add(this);
24
23
  this.disabled = false;
25
24
  }
26
25
  render() {
@@ -32,7 +31,7 @@ let DictationDeviceSelector = class DictationDeviceSelector extends LitElement {
32
31
  <select
33
32
  id="device-select"
34
33
  aria-labelledby="device-select-label"
35
- @change=${__classPrivateFieldGet(this, _DictationDeviceSelector_instances, "m", _DictationDeviceSelector_handleSelectDevice)}
34
+ @change=${__classPrivateFieldGet(this, _DeviceSelectorBase_instances, "m", _DeviceSelectorBase_handleSelectDevice)}
36
35
  ?disabled=${this.disabled || !this._devices || this._devices.length === 0}
37
36
  >
38
37
  ${this._devices?.map((device) => html `
@@ -47,9 +46,8 @@ let DictationDeviceSelector = class DictationDeviceSelector extends LitElement {
47
46
  </div>
48
47
  `;
49
48
  }
50
- };
51
- _DictationDeviceSelector_instances = new WeakSet();
52
- _DictationDeviceSelector_handleSelectDevice = function _DictationDeviceSelector_handleSelectDevice(e) {
49
+ }
50
+ _DeviceSelectorBase_instances = new WeakSet(), _DeviceSelectorBase_handleSelectDevice = function _DeviceSelectorBase_handleSelectDevice(e) {
53
51
  const deviceId = e.target.value;
54
52
  const device = this._devices?.find((d) => d.deviceId === deviceId);
55
53
  if (!device) {
@@ -57,20 +55,16 @@ _DictationDeviceSelector_handleSelectDevice = function _DictationDeviceSelector_
57
55
  }
58
56
  this.dispatchEvent(recordingDevicesChangedEvent(this._devices || [], device));
59
57
  };
60
- DictationDeviceSelector.styles = SelectStyles;
58
+ DeviceSelectorBase.styles = SelectStyles;
61
59
  __decorate([
62
60
  consume({ context: devicesContext, subscribe: true }),
63
61
  state()
64
- ], DictationDeviceSelector.prototype, "_devices", void 0);
62
+ ], DeviceSelectorBase.prototype, "_devices", void 0);
65
63
  __decorate([
66
64
  consume({ context: selectedDeviceContext, subscribe: true }),
67
65
  state()
68
- ], DictationDeviceSelector.prototype, "_selectedDevice", void 0);
66
+ ], DeviceSelectorBase.prototype, "_selectedDevice", void 0);
69
67
  __decorate([
70
68
  property({ type: Boolean })
71
- ], DictationDeviceSelector.prototype, "disabled", void 0);
72
- DictationDeviceSelector = __decorate([
73
- dualCustomElement("dictation-device-selector", "ambient-device-selector")
74
- ], DictationDeviceSelector);
75
- export { DictationDeviceSelector };
76
- //# sourceMappingURL=device-selector.js.map
69
+ ], DeviceSelectorBase.prototype, "disabled", void 0);
70
+ //# sourceMappingURL=device-selector-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-selector-base.js","sourceRoot":"","sources":["../../src/components/device-selector-base.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,qBAAqB,GACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAElE,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAAlD;;;QAUE,aAAQ,GAAY,KAAK,CAAC;IA2C5B,CAAC;IA1BC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;oBAQK,uBAAA,IAAI,6EAAoB;sBACtB,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;;YAEvE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAClB,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAA;;wBAEJ,MAAM,CAAC,QAAQ;4BACX,IAAI,CAAC,eAAe,EAAE,QAAQ,KAAK,MAAM,CAAC,QAAQ;;kBAE5D,MAAM,CAAC,KAAK,IAAI,gBAAgB;;aAErC,CACF;;;KAGN,CAAC;IACJ,CAAC;;wIAtCmB,CAAQ;IAC1B,MAAM,QAAQ,GAAI,CAAC,CAAC,MAA4B,CAAC,KAAK,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAEnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,CAAC,aAAa,CAChB,4BAA4B,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,CAC1D,CAAC;AACJ,CAAC;AAbM,yBAAM,GAAG,YAAY,AAAf,CAAgB;AAT7B;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrD,KAAK,EAAE;oDACqB;AAI7B;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5D,KAAK,EAAE;2DAC0B;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oDACF","sourcesContent":["import { consume } from \"@lit/context\";\nimport { html, LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport {\n devicesContext,\n selectedDeviceContext,\n} from \"../contexts/mixins/devices-context.js\";\nimport SelectStyles from \"../styles/select.js\";\nimport { recordingDevicesChangedEvent } from \"../utils/events.js\";\n\nexport class DeviceSelectorBase extends LitElement {\n @consume({ context: devicesContext, subscribe: true })\n @state()\n _devices?: MediaDeviceInfo[];\n\n @consume({ context: selectedDeviceContext, subscribe: true })\n @state()\n _selectedDevice?: MediaDeviceInfo;\n\n @property({ type: Boolean })\n disabled: boolean = false;\n\n static styles = SelectStyles;\n\n #handleSelectDevice(e: Event): void {\n const deviceId = (e.target as HTMLSelectElement).value;\n const device = this._devices?.find((d) => d.deviceId === deviceId);\n\n if (!device) {\n return;\n }\n\n this.dispatchEvent(\n recordingDevicesChangedEvent(this._devices || [], device),\n );\n }\n\n render() {\n return html`\n <div>\n <label id=\"device-select-label\" for=\"device-select\">\n Microphone\n </label>\n <select\n id=\"device-select\"\n aria-labelledby=\"device-select-label\"\n @change=${this.#handleSelectDevice}\n ?disabled=${this.disabled || !this._devices || this._devices.length === 0}\n >\n ${this._devices?.map(\n (device) => html`\n <option\n value=${device.deviceId}\n ?selected=${this._selectedDevice?.deviceId === device.deviceId}\n >\n ${device.label || \"Unknown Device\"}\n </option>\n `,\n )}\n </select>\n </div>\n `;\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { LitElement, type TemplateResult } from "lit";
2
+ import "./speech-keybinding-input.js";
3
+ export declare class KeybindingSelectorBase extends LitElement {
4
+ _pushToTalkKeybinding?: string | null;
5
+ _toggleToTalkKeybinding?: string | null;
6
+ disabled: boolean;
7
+ static styles: import("lit").CSSResult[];
8
+ protected _renderKeybindingInputs(): TemplateResult;
9
+ render(): TemplateResult<1>;
10
+ }
@@ -9,24 +9,28 @@ import { html, LitElement } from "lit";
9
9
  import { property, state } from "lit/decorators.js";
10
10
  import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, } from "../contexts/mixins/keybindings-context.js";
11
11
  import KeybindingSelectorStyles from "../styles/keybinding-selector.js";
12
- import { dualCustomElement } from "../utils/custom-elements.js";
13
- import "./keybinding-input.js";
14
- let DictationKeybindingSelector = class DictationKeybindingSelector extends LitElement {
12
+ import "./speech-keybinding-input.js";
13
+ export class KeybindingSelectorBase extends LitElement {
15
14
  constructor() {
16
15
  super(...arguments);
17
16
  this.disabled = false;
18
17
  }
18
+ _renderKeybindingInputs() {
19
+ return html `
20
+ <speech-keybinding-input
21
+ keybindingType="toggle-to-talk"
22
+ ?disabled=${this.disabled}
23
+ ></speech-keybinding-input>
24
+ <speech-keybinding-input
25
+ keybindingType="push-to-talk"
26
+ ?disabled=${this.disabled}
27
+ ></speech-keybinding-input>
28
+ `;
29
+ }
19
30
  render() {
20
31
  return html `
21
32
  <div class="settings-group">
22
- <dictation-keybinding-input
23
- keybindingType="toggle-to-talk"
24
- ?disabled=${this.disabled}
25
- ></dictation-keybinding-input>
26
- <dictation-keybinding-input
27
- keybindingType="push-to-talk"
28
- ?disabled=${this.disabled}
29
- ></dictation-keybinding-input>
33
+ ${this._renderKeybindingInputs()}
30
34
  ${(this._toggleToTalkKeybinding || this._pushToTalkKeybinding) &&
31
35
  html `<p class="keybinding-help">
32
36
  ${html `Press ${[this._toggleToTalkKeybinding, this._pushToTalkKeybinding].join(" or ")} to start/stop recording`}
@@ -34,21 +38,17 @@ let DictationKeybindingSelector = class DictationKeybindingSelector extends LitE
34
38
  </div>
35
39
  `;
36
40
  }
37
- };
38
- DictationKeybindingSelector.styles = KeybindingSelectorStyles;
41
+ }
42
+ KeybindingSelectorBase.styles = KeybindingSelectorStyles;
39
43
  __decorate([
40
44
  consume({ context: pushToTalkKeybindingContext, subscribe: true }),
41
45
  state()
42
- ], DictationKeybindingSelector.prototype, "_pushToTalkKeybinding", void 0);
46
+ ], KeybindingSelectorBase.prototype, "_pushToTalkKeybinding", void 0);
43
47
  __decorate([
44
48
  consume({ context: toggleToTalkKeybindingContext, subscribe: true }),
45
49
  state()
46
- ], DictationKeybindingSelector.prototype, "_toggleToTalkKeybinding", void 0);
50
+ ], KeybindingSelectorBase.prototype, "_toggleToTalkKeybinding", void 0);
47
51
  __decorate([
48
52
  property({ type: Boolean })
49
- ], DictationKeybindingSelector.prototype, "disabled", void 0);
50
- DictationKeybindingSelector = __decorate([
51
- dualCustomElement("dictation-keybinding-selector", "ambient-keybinding-selector")
52
- ], DictationKeybindingSelector);
53
- export { DictationKeybindingSelector };
54
- //# sourceMappingURL=keybinding-selector.js.map
53
+ ], KeybindingSelectorBase.prototype, "disabled", void 0);
54
+ //# sourceMappingURL=keybinding-selector-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keybinding-selector-base.js","sourceRoot":"","sources":["../../src/components/keybinding-selector-base.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAuB,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,2CAA2C,CAAC;AACnD,OAAO,wBAAwB,MAAM,kCAAkC,CAAC;AACxE,OAAO,8BAA8B,CAAC;AAEtC,MAAM,OAAO,sBAAuB,SAAQ,UAAU;IAAtD;;QAUE,aAAQ,GAAY,KAAK,CAAC;IA8B5B,CAAC;IA1BW,uBAAuB;QAC/B,OAAO,IAAI,CAAA;;;oBAGK,IAAI,CAAC,QAAQ;;;;oBAIb,IAAI,CAAC,QAAQ;;KAE5B,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,uBAAuB,EAAE;UAE9B,CAAC,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,qBAAqB,CAAC;YAC5D,IAAI,CAAA;cACA,IAAI,CAAA,SAAS,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B;eAEpH;;KAEH,CAAC;IACJ,CAAC;;AA3BM,6BAAM,GAAG,wBAAwB,AAA3B,CAA4B;AATzC;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAClE,KAAK,EAAE;qEAC8B;AAItC;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACpE,KAAK,EAAE;uEACgC;AAGxC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;wDACF","sourcesContent":["import { consume } from \"@lit/context\";\nimport { html, LitElement, type TemplateResult } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport {\n pushToTalkKeybindingContext,\n toggleToTalkKeybindingContext,\n} from \"../contexts/mixins/keybindings-context.js\";\nimport KeybindingSelectorStyles from \"../styles/keybinding-selector.js\";\nimport \"./speech-keybinding-input.js\";\n\nexport class KeybindingSelectorBase extends LitElement {\n @consume({ context: pushToTalkKeybindingContext, subscribe: true })\n @state()\n _pushToTalkKeybinding?: string | null;\n\n @consume({ context: toggleToTalkKeybindingContext, subscribe: true })\n @state()\n _toggleToTalkKeybinding?: string | null;\n\n @property({ type: Boolean })\n disabled: boolean = false;\n\n static styles = KeybindingSelectorStyles;\n\n protected _renderKeybindingInputs(): TemplateResult {\n return html`\n <speech-keybinding-input\n keybindingType=\"toggle-to-talk\"\n ?disabled=${this.disabled}\n ></speech-keybinding-input>\n <speech-keybinding-input\n keybindingType=\"push-to-talk\"\n ?disabled=${this.disabled}\n ></speech-keybinding-input>\n `;\n }\n\n render() {\n return html`\n <div class=\"settings-group\">\n ${this._renderKeybindingInputs()}\n ${\n (this._toggleToTalkKeybinding || this._pushToTalkKeybinding) &&\n html`<p class=\"keybinding-help\">\n ${html`Press ${[this._toggleToTalkKeybinding, this._pushToTalkKeybinding].join(\" or \")} to start/stop recording`}\n </p>`\n }\n </div>\n `;\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { Corti } from "@corti/sdk";
2
+ import { LitElement } from "lit";
3
+ export declare class LanguageSelectorBase extends LitElement {
4
+ #private;
5
+ _languages?: Corti.TranscribeSupportedLanguage[];
6
+ _selectedLanguage?: Corti.TranscribeSupportedLanguage;
7
+ disabled: boolean;
8
+ static styles: import("lit").CSSResult[];
9
+ render(): import("lit").TemplateResult<1>;
10
+ }
@@ -9,19 +9,18 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
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
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _DictationLanguageSelector_instances, _DictationLanguageSelector_handleSelectLanguage;
12
+ var _LanguageSelectorBase_instances, _LanguageSelectorBase_handleSelectLanguage;
13
13
  import { consume } from "@lit/context";
14
14
  import { html, LitElement } from "lit";
15
15
  import { property, state } from "lit/decorators.js";
16
16
  import { languagesContext, selectedLanguageContext, } from "../contexts/mixins/languages-context.js";
17
17
  import SelectStyles from "../styles/select.js";
18
- import { dualCustomElement } from "../utils/custom-elements.js";
19
18
  import { languageChangedEvent, languagesChangedEvent, } from "../utils/events.js";
20
19
  import { getLanguageName } from "../utils/languages.js";
21
- let DictationLanguageSelector = class DictationLanguageSelector extends LitElement {
20
+ export class LanguageSelectorBase extends LitElement {
22
21
  constructor() {
23
22
  super(...arguments);
24
- _DictationLanguageSelector_instances.add(this);
23
+ _LanguageSelectorBase_instances.add(this);
25
24
  this.disabled = false;
26
25
  }
27
26
  render() {
@@ -33,7 +32,7 @@ let DictationLanguageSelector = class DictationLanguageSelector extends LitEleme
33
32
  <select
34
33
  id="language-select"
35
34
  aria-labelledby="language-select-label"
36
- @change=${__classPrivateFieldGet(this, _DictationLanguageSelector_instances, "m", _DictationLanguageSelector_handleSelectLanguage)}
35
+ @change=${__classPrivateFieldGet(this, _LanguageSelectorBase_instances, "m", _LanguageSelectorBase_handleSelectLanguage)}
37
36
  .value=${this._selectedLanguage ?? ""}
38
37
  ?disabled=${this.disabled || !this._languages || this._languages.length === 0}
39
38
  >
@@ -49,28 +48,22 @@ let DictationLanguageSelector = class DictationLanguageSelector extends LitEleme
49
48
  </div>
50
49
  `;
51
50
  }
52
- };
53
- _DictationLanguageSelector_instances = new WeakSet();
54
- _DictationLanguageSelector_handleSelectLanguage = function _DictationLanguageSelector_handleSelectLanguage(e) {
51
+ }
52
+ _LanguageSelectorBase_instances = new WeakSet(), _LanguageSelectorBase_handleSelectLanguage = function _LanguageSelectorBase_handleSelectLanguage(e) {
55
53
  const language = e.target.value;
56
54
  this.dispatchEvent(languagesChangedEvent(this._languages || [], language));
57
- // Dispatch backward compatible event
58
55
  this.dispatchEvent(languageChangedEvent(language));
59
56
  };
60
- DictationLanguageSelector.styles = SelectStyles;
57
+ LanguageSelectorBase.styles = SelectStyles;
61
58
  __decorate([
62
59
  consume({ context: languagesContext, subscribe: true }),
63
60
  state()
64
- ], DictationLanguageSelector.prototype, "_languages", void 0);
61
+ ], LanguageSelectorBase.prototype, "_languages", void 0);
65
62
  __decorate([
66
63
  consume({ context: selectedLanguageContext, subscribe: true }),
67
64
  state()
68
- ], DictationLanguageSelector.prototype, "_selectedLanguage", void 0);
65
+ ], LanguageSelectorBase.prototype, "_selectedLanguage", void 0);
69
66
  __decorate([
70
67
  property({ type: Boolean })
71
- ], DictationLanguageSelector.prototype, "disabled", void 0);
72
- DictationLanguageSelector = __decorate([
73
- dualCustomElement("dictation-language-selector", "ambient-language-selector")
74
- ], DictationLanguageSelector);
75
- export { DictationLanguageSelector };
76
- //# sourceMappingURL=language-selector.js.map
68
+ ], LanguageSelectorBase.prototype, "disabled", void 0);
69
+ //# sourceMappingURL=language-selector-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-selector-base.js","sourceRoot":"","sources":["../../src/components/language-selector-base.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAApD;;;QAUE,aAAQ,GAAY,KAAK,CAAC;IAuC5B,CAAC;IA3BC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;oBAQK,uBAAA,IAAI,mFAAsB;mBAC3B,IAAI,CAAC,iBAAiB,IAAI,EAAE;sBACzB,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;;YAE3E,IAAI,CAAC,UAAU,EAAE,GAAG,CACpB,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAA;;wBAEN,QAAQ;4BACJ,IAAI,CAAC,iBAAiB,KAAK,QAAQ;;kBAE7C,eAAe,CAAC,QAAQ,CAAC;;aAE9B,CACF;;;KAGN,CAAC;IACJ,CAAC;;kJAlCqB,CAAQ;IAC5B,MAAM,QAAQ,GAAI,CAAC,CAAC,MAA4B,CAAC,KAAK,CAAC;IAEvD,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3E,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrD,CAAC;AARM,2BAAM,GAAG,YAAY,AAAf,CAAgB;AAT7B;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACvD,KAAK,EAAE;wDACyC;AAIjD;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9D,KAAK,EAAE;+DAC8C;AAGtD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;sDACF","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport { html, LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport {\n languagesContext,\n selectedLanguageContext,\n} from \"../contexts/mixins/languages-context.js\";\nimport SelectStyles from \"../styles/select.js\";\nimport {\n languageChangedEvent,\n languagesChangedEvent,\n} from \"../utils/events.js\";\nimport { getLanguageName } from \"../utils/languages.js\";\n\nexport class LanguageSelectorBase extends LitElement {\n @consume({ context: languagesContext, subscribe: true })\n @state()\n _languages?: Corti.TranscribeSupportedLanguage[];\n\n @consume({ context: selectedLanguageContext, subscribe: true })\n @state()\n _selectedLanguage?: Corti.TranscribeSupportedLanguage;\n\n @property({ type: Boolean })\n disabled: boolean = false;\n\n static styles = SelectStyles;\n\n #handleSelectLanguage(e: Event): void {\n const language = (e.target as HTMLSelectElement).value;\n\n this.dispatchEvent(languagesChangedEvent(this._languages || [], language));\n\n this.dispatchEvent(languageChangedEvent(language));\n }\n\n render() {\n return html`\n <div>\n <label id=\"language-select-label\" for=\"language-select\">\n Spoken language\n </label>\n <select\n id=\"language-select\"\n aria-labelledby=\"language-select-label\"\n @change=${this.#handleSelectLanguage}\n .value=${this._selectedLanguage ?? \"\"}\n ?disabled=${this.disabled || !this._languages || this._languages.length === 0}\n >\n ${this._languages?.map(\n (language) => html`\n <option\n value=${language}\n ?selected=${this._selectedLanguage === language}\n >\n ${getLanguageName(language)}\n </option>\n `,\n )}\n </select>\n </div>\n `;\n }\n}\n"]}
@@ -1,12 +1,17 @@
1
1
  import type { CortiAuth } from "@corti/sdk";
2
+ import type { TemplateResult } from "lit";
2
3
  import { type CSSResultGroup, LitElement, type PropertyValues } from "lit";
3
- import type { TranscribeMessage } from "../controllers/dictation-controller.js";
4
4
  import type { SocketController, SocketControllerOutboundItem, SocketControllerWebSocket } from "../controllers/socket-controller.js";
5
- import type { ProxyOptions, RecordingSocketInboundMessage, RecordingState } from "../types.js";
6
- import "./audio-visualiser.js";
5
+ import type { RecordingSocketInboundMessage } from "../socket-messages.js";
6
+ import type { ProxyOptions, RecordingState } from "../types.js";
7
7
  import "../icons/icons.js";
8
- export declare abstract class RecordingButtonBase<TConfig, TMessage extends RecordingSocketInboundMessage = TranscribeMessage> extends LitElement {
8
+ import "./speech-audio-visualiser.js";
9
+ export declare abstract class RecordingButtonBase<TConfig, TMessage extends RecordingSocketInboundMessage = RecordingSocketInboundMessage> extends LitElement {
9
10
  #private;
11
+ _debug_displayAudio?: boolean;
12
+ _virtualMode?: boolean;
13
+ protected get _audioLevel(): number;
14
+ protected _renderAudioVisualiser(isRecording: boolean): TemplateResult;
10
15
  _recordingState: RecordingState;
11
16
  _selectedDevice?: MediaDeviceInfo;
12
17
  _accessToken?: string;
@@ -15,8 +20,6 @@ export declare abstract class RecordingButtonBase<TConfig, TMessage extends Reco
15
20
  _tenantName?: string;
16
21
  _socketUrl?: string;
17
22
  _socketProxy?: ProxyOptions;
18
- _debug_displayAudio?: boolean;
19
- _virtualMode?: boolean;
20
23
  _pushToTalkKeybinding?: string | null;
21
24
  _toggleToTalkKeybinding?: string | null;
22
25
  allowButtonFocus: boolean;
@@ -29,5 +32,5 @@ export declare abstract class RecordingButtonBase<TConfig, TMessage extends Reco
29
32
  toggleRecording(): void;
30
33
  openConnection(): Promise<void>;
31
34
  closeConnection(): Promise<void>;
32
- render(): import("lit-html").TemplateResult<1>;
35
+ render(): TemplateResult<1>;
33
36
  }
@@ -20,8 +20,6 @@ import { consume } from "@lit/context";
20
20
  import { html, LitElement, } from "lit";
21
21
  import { property, state } from "lit/decorators.js";
22
22
  import { AUDIO_CHUNK_INTERVAL_MS } from "../constants.js";
23
- import { virtualModeContext } from "../contexts/ambient-context.js";
24
- import { debugDisplayAudioContext } from "../contexts/dictation-context.js";
25
23
  import { accessTokenContext, authConfigContext, regionContext, tenantNameContext, } from "../contexts/mixins/auth-context.js";
26
24
  import { selectedDeviceContext } from "../contexts/mixins/devices-context.js";
27
25
  import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, } from "../contexts/mixins/keybindings-context.js";
@@ -32,8 +30,8 @@ import { MediaController } from "../controllers/media-controller.js";
32
30
  import ButtonStyles from "../styles/buttons.js";
33
31
  import RecordingButtonStyles from "../styles/recording-button.js";
34
32
  import { audioEventEvent, audioLevelChangedEvent, commandEvent, deltaUsageEvent, errorEvent, factsEvent, networkActivityEvent, recordingStateChangedEvent, streamClosedEvent, transcriptEvent, usageEvent, } from "../utils/events.js";
35
- import "./audio-visualiser.js";
36
33
  import "../icons/icons.js";
34
+ import "./speech-audio-visualiser.js";
37
35
  export class RecordingButtonBase extends LitElement {
38
36
  constructor() {
39
37
  super(...arguments);
@@ -109,6 +107,15 @@ export class RecordingButtonBase extends LitElement {
109
107
  __classPrivateFieldGet(this, _RecordingButtonBase_instances, "m", _RecordingButtonBase_dispatchRecordingStateChanged).call(this, this._recordingState);
110
108
  });
111
109
  }
110
+ get _audioLevel() {
111
+ return __classPrivateFieldGet(this, _RecordingButtonBase_mediaController, "f").audioLevel;
112
+ }
113
+ _renderAudioVisualiser(isRecording) {
114
+ return html `<speech-audio-visualiser
115
+ .level=${this._audioLevel}
116
+ ?active=${isRecording}
117
+ ></speech-audio-visualiser>`;
118
+ }
112
119
  update(changedProperties) {
113
120
  if (changedProperties.has("_recordingState") &&
114
121
  this._recordingState === "recording" &&
@@ -207,10 +214,7 @@ export class RecordingButtonBase extends LitElement {
207
214
  : isRecording
208
215
  ? html `<icon-recording />`
209
216
  : html `<icon-mic-on />`}
210
- <dictation-audio-visualiser
211
- .level=${__classPrivateFieldGet(this, _RecordingButtonBase_mediaController, "f").audioLevel}
212
- ?active=${isRecording}
213
- />
217
+ ${this._renderAudioVisualiser(isRecording)}
214
218
  </button>
215
219
  `;
216
220
  }
@@ -280,6 +284,12 @@ _RecordingButtonBase_mediaController = new WeakMap(), _RecordingButtonBase_keybi
280
284
  __classPrivateFieldGet(this, _RecordingButtonBase_instances, "m", _RecordingButtonBase_dispatchRecordingStateChanged).call(this, "stopped");
281
285
  };
282
286
  RecordingButtonBase.styles = [RecordingButtonStyles, ButtonStyles];
287
+ __decorate([
288
+ state()
289
+ ], RecordingButtonBase.prototype, "_debug_displayAudio", void 0);
290
+ __decorate([
291
+ state()
292
+ ], RecordingButtonBase.prototype, "_virtualMode", void 0);
283
293
  __decorate([
284
294
  consume({ context: recordingStateContext, subscribe: true }),
285
295
  state()
@@ -312,14 +322,6 @@ __decorate([
312
322
  consume({ context: socketProxyContext, subscribe: true }),
313
323
  state()
314
324
  ], RecordingButtonBase.prototype, "_socketProxy", void 0);
315
- __decorate([
316
- consume({ context: debugDisplayAudioContext, subscribe: true }),
317
- state()
318
- ], RecordingButtonBase.prototype, "_debug_displayAudio", void 0);
319
- __decorate([
320
- consume({ context: virtualModeContext, subscribe: true }),
321
- state()
322
- ], RecordingButtonBase.prototype, "_virtualMode", void 0);
323
325
  __decorate([
324
326
  consume({ context: pushToTalkKeybindingContext, subscribe: true }),
325
327
  state()
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-button-base.js","sourceRoot":"","sources":["../../src/components/recording-button-base.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CortiAuth } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport type { TemplateResult } from \"lit\";\nimport {\n type CSSResultGroup,\n html,\n LitElement,\n type PropertyValues,\n} from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { AUDIO_CHUNK_INTERVAL_MS } from \"../constants.js\";\nimport {\n accessTokenContext,\n authConfigContext,\n regionContext,\n tenantNameContext,\n} from \"../contexts/mixins/auth-context.js\";\nimport { selectedDeviceContext } from \"../contexts/mixins/devices-context.js\";\nimport {\n pushToTalkKeybindingContext,\n toggleToTalkKeybindingContext,\n} from \"../contexts/mixins/keybindings-context.js\";\nimport {\n socketProxyContext,\n socketUrlContext,\n} from \"../contexts/mixins/proxy-context.js\";\nimport { recordingStateContext } from \"../contexts/mixins/recording-state-context.js\";\nimport { KeybindingController } from \"../controllers/keybinding-controller.js\";\nimport { MediaController } from \"../controllers/media-controller.js\";\nimport type {\n SocketController,\n SocketControllerOutboundItem,\n SocketControllerWebSocket,\n} from \"../controllers/socket-controller.js\";\nimport type { RecordingSocketInboundMessage } from \"../socket-messages.js\";\nimport ButtonStyles from \"../styles/buttons.js\";\nimport RecordingButtonStyles from \"../styles/recording-button.js\";\nimport type { ProxyOptions, RecordingState } from \"../types.js\";\nimport {\n audioEventEvent,\n audioLevelChangedEvent,\n commandEvent,\n deltaUsageEvent,\n errorEvent,\n factsEvent,\n networkActivityEvent,\n type RecordingStateChangedEventDetail,\n recordingStateChangedEvent,\n streamClosedEvent,\n transcriptEvent,\n usageEvent,\n} from \"../utils/events.js\";\n\nimport \"../icons/icons.js\";\nimport \"./speech-audio-visualiser.js\";\n\nexport abstract class RecordingButtonBase<\n TConfig,\n TMessage extends\n RecordingSocketInboundMessage = RecordingSocketInboundMessage,\n> extends LitElement {\n @state()\n _debug_displayAudio?: boolean;\n\n @state()\n _virtualMode?: boolean;\n protected get _audioLevel(): number {\n return this.#mediaController.audioLevel;\n }\n\n protected _renderAudioVisualiser(isRecording: boolean): TemplateResult {\n return html`<speech-audio-visualiser\n .level=${this._audioLevel}\n ?active=${isRecording}\n ></speech-audio-visualiser>`;\n }\n\n @consume({ context: recordingStateContext, subscribe: true })\n @state()\n _recordingState: RecordingState = \"stopped\";\n\n @consume({ context: selectedDeviceContext, subscribe: true })\n @state()\n _selectedDevice?: MediaDeviceInfo;\n\n @consume({ context: accessTokenContext, subscribe: true })\n @state()\n _accessToken?: string;\n\n @consume({ context: authConfigContext, subscribe: true })\n @state()\n _authConfig?: CortiAuth.AuthTokenDerivable;\n\n @consume({ context: regionContext, subscribe: true })\n @state()\n _region?: string;\n\n @consume({ context: tenantNameContext, subscribe: true })\n @state()\n _tenantName?: string;\n\n @consume({ context: socketUrlContext, subscribe: true })\n @state()\n _socketUrl?: string;\n\n @consume({ context: socketProxyContext, subscribe: true })\n @state()\n _socketProxy?: ProxyOptions;\n\n @consume({ context: pushToTalkKeybindingContext, subscribe: true })\n @state()\n _pushToTalkKeybinding?: string | null;\n\n @consume({ context: toggleToTalkKeybindingContext, subscribe: true })\n @state()\n _toggleToTalkKeybinding?: string | null;\n\n @property({ type: Boolean })\n allowButtonFocus: boolean = false;\n\n protected abstract _socketController: SocketController<\n SocketControllerOutboundItem,\n TMessage,\n TConfig,\n SocketControllerWebSocket\n >;\n\n protected abstract _getConnectConfig(): TConfig;\n\n #mediaController = new MediaController(this);\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: Controller self-registers in constructor (addController).\n #keybindingController = new KeybindingController(this);\n #closeConnectionOnInit = false;\n #processing = false;\n #connection: RecordingStateChangedEventDetail[\"connection\"] = \"CLOSED\";\n\n static styles: CSSResultGroup = [RecordingButtonStyles, ButtonStyles];\n\n protected update(changedProperties: PropertyValues) {\n if (\n changedProperties.has(\"_recordingState\") &&\n this._recordingState === \"recording\" &&\n this.#closeConnectionOnInit\n ) {\n this.#closeConnectionOnInit = false;\n this.#handleStop();\n }\n\n super.update(changedProperties);\n }\n\n #handleClick(event: MouseEvent): void {\n if (!this.allowButtonFocus) {\n event.preventDefault();\n }\n\n this.toggleRecording();\n }\n\n #handleWebSocketMessage = (message: TMessage): void => {\n switch (message.type) {\n case \"CONFIG_DENIED\":\n this.dispatchEvent(\n errorEvent(`Config denied: ${message.reason ?? \"Unknown reason\"}`),\n );\n this.#handleStop();\n break;\n case \"CONFIG_TIMEOUT\":\n this.dispatchEvent(errorEvent(\"Config timeout\"));\n this.#handleStop();\n break;\n case \"transcript\":\n this.dispatchEvent(transcriptEvent(message));\n break;\n case \"command\":\n this.dispatchEvent(commandEvent(message));\n break;\n case \"facts\":\n this.dispatchEvent(factsEvent(message));\n break;\n case \"usage\":\n this.dispatchEvent(usageEvent(message));\n break;\n case \"delta_usage\":\n this.dispatchEvent(deltaUsageEvent(message));\n break;\n case \"audioEvent\":\n this.dispatchEvent(audioEventEvent(message));\n break;\n case \"error\":\n this.dispatchEvent(errorEvent(message.error));\n this.#handleStop();\n break;\n case \"ended\":\n case \"ENDED\":\n this.#processing = false;\n this.#dispatchRecordingStateChanged(this._recordingState);\n break;\n case \"flushed\":\n if (\n this._recordingState === \"stopped\" ||\n this._recordingState === \"stopping\"\n ) {\n this.#processing = false;\n this.#dispatchRecordingStateChanged(this._recordingState);\n }\n break;\n }\n };\n\n #handleWebSocketError = (error: Error): void => {\n this.dispatchEvent(errorEvent(`Socket error: ${error.message}`));\n this.#processing = false;\n this.#connection = \"CLOSED\";\n this.#handleStop();\n };\n\n #handleWebSocketClose = (event: unknown): void => {\n if (\n this._socketController.isConnectionOpen() ||\n this._socketController.isConnecting()\n ) {\n return;\n }\n\n this.#processing = false;\n this.#connection = \"CLOSED\";\n this.dispatchEvent(streamClosedEvent(event));\n this.#dispatchRecordingStateChanged(this._recordingState);\n };\n\n #dispatchRecordingStateChanged(state: RecordingState): void {\n this.dispatchEvent(\n recordingStateChangedEvent(state, {\n connection: this.#connection,\n processing: this.#processing,\n }),\n );\n }\n\n async #handleStart(): Promise<void> {\n this.#dispatchRecordingStateChanged(\"initializing\");\n\n try {\n await this.#mediaController.initialize(() => {\n if (this._recordingState === \"recording\") {\n this.dispatchEvent(errorEvent(\"Recording device access was lost.\"));\n this.#handleStop();\n }\n }, this._socketController.mediaRecorderHandler);\n this.#mediaController.mediaRecorder?.start(AUDIO_CHUNK_INTERVAL_MS);\n this.#mediaController.startAudioLevelMonitoring((level) => {\n this.dispatchEvent(audioLevelChangedEvent(level));\n });\n\n this.#processing = true;\n\n if (this.#connection !== \"OPEN\") {\n this.#connection = \"CONNECTING\";\n }\n\n this.#dispatchRecordingStateChanged(\"recording\");\n\n const isNewConnection = await this._socketController.connect(\n this._getConnectConfig(),\n {\n onClose: this.#handleWebSocketClose,\n onError: this.#handleWebSocketError,\n onMessage: this.#handleWebSocketMessage,\n onNetworkActivity: (direction, data) => {\n this.dispatchEvent(networkActivityEvent(direction, data));\n },\n },\n );\n\n if (isNewConnection === \"superseded\") {\n return;\n }\n\n this.#connection = \"OPEN\";\n\n this.#dispatchRecordingStateChanged(this._recordingState);\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n await this.#handleStop();\n }\n }\n\n async #handleStop(): Promise<void> {\n this.#dispatchRecordingStateChanged(\"stopping\");\n\n try {\n this.#mediaController.stopAudioLevelMonitoring();\n await this.#mediaController.stopRecording();\n await this._socketController.stopRecording();\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n\n try {\n await this.#mediaController.cleanup();\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n\n this.#dispatchRecordingStateChanged(\"stopped\");\n }\n\n public startRecording(): void {\n if (this._recordingState !== \"stopped\") {\n return;\n }\n\n this.#handleStart();\n }\n\n public stopRecording(): void {\n if (\n this._recordingState === \"stopped\" ||\n this._recordingState === \"stopping\"\n ) {\n return;\n }\n\n if (this._recordingState === \"initializing\") {\n this.#closeConnectionOnInit = true;\n return;\n }\n\n this.#handleStop();\n }\n\n public toggleRecording(): void {\n if (this._recordingState === \"stopped\") {\n this.startRecording();\n } else if (this._recordingState === \"recording\") {\n this.stopRecording();\n }\n }\n\n public async openConnection(): Promise<void> {\n if (this._recordingState !== \"stopped\" || this.#processing) {\n return;\n }\n\n if (this._socketController.isConnectionOpen()) {\n return;\n }\n\n try {\n this.#connection = \"CONNECTING\";\n this.#dispatchRecordingStateChanged(this._recordingState);\n\n await this._socketController.connect(this._getConnectConfig(), {\n onClose: this.#handleWebSocketClose,\n onError: this.#handleWebSocketError,\n onMessage: this.#handleWebSocketMessage,\n onNetworkActivity: (direction, data) => {\n this.dispatchEvent(networkActivityEvent(direction, data));\n },\n });\n\n this.#connection = \"OPEN\";\n this.#dispatchRecordingStateChanged(this._recordingState);\n } catch (error) {\n this.#connection = \"CLOSED\";\n this.dispatchEvent(errorEvent(error));\n }\n }\n\n public async closeConnection(): Promise<void> {\n if (this._recordingState !== \"stopped\" || this.#processing) {\n return;\n }\n\n if (this._socketController.isConnecting()) {\n await this._socketController.waitForConnection();\n }\n\n if (!this._socketController.isConnectionOpen()) {\n this.#connection = \"CLOSED\";\n this.#dispatchRecordingStateChanged(\"stopped\");\n return;\n }\n\n try {\n this.#connection = \"CLOSING\";\n this.#dispatchRecordingStateChanged(\"stopped\");\n await this._socketController.closeConnection(this.#handleWebSocketClose);\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n }\n\n render() {\n const isLoading =\n this._recordingState === \"initializing\" ||\n this._recordingState === \"stopping\";\n const isRecording = this._recordingState === \"recording\";\n\n return html`\n <button\n @click=${this.#handleClick}\n ?disabled=${isLoading}\n class=${isRecording ? \"red\" : \"accent\"}\n aria-label=${isRecording ? \"Stop recording\" : \"Start recording\"}\n aria-pressed=${isRecording}\n >\n ${\n isLoading\n ? html`<icon-loading-spinner />`\n : isRecording\n ? html`<icon-recording />`\n : html`<icon-mic-on />`\n }\n ${this._renderAudioVisualiser(isRecording)}\n </button>\n `;\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { type CSSResultGroup, LitElement, nothing, type TemplateResult } from "lit";
2
+ import type { ConfigurableSettings, RecordingState } from "../types.js";
3
+ import "../icons/icons.js";
4
+ export declare abstract class SettingsMenuBase extends LitElement {
5
+ protected abstract _renderDeviceSelector(isRecording: boolean): TemplateResult | typeof nothing;
6
+ protected abstract _renderLanguageSelector(isRecording: boolean): TemplateResult | typeof nothing;
7
+ protected abstract _renderKeybindingSelector(isRecording: boolean): TemplateResult | typeof nothing;
8
+ protected _renderVirtualModeSelector(_isRecording: boolean): TemplateResult | typeof nothing;
9
+ _recordingState: RecordingState;
10
+ settingsEnabled: ConfigurableSettings[];
11
+ static styles: CSSResultGroup;
12
+ render(): TemplateResult<1> | typeof nothing;
13
+ }
@@ -5,25 +5,23 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { consume } from "@lit/context";
8
- import { html, LitElement, nothing } from "lit";
8
+ import { html, LitElement, nothing, } from "lit";
9
9
  import { property, state } from "lit/decorators.js";
10
10
  import { recordingStateContext } from "../contexts/mixins/recording-state-context.js";
11
11
  import ButtonStyles from "../styles/buttons.js";
12
12
  import CalloutStyles from "../styles/callout.js";
13
13
  import SettingsMenuStyles from "../styles/settings-menu.js";
14
14
  import { commaSeparatedConverter } from "../utils/converters.js";
15
- import { dualCustomElement } from "../utils/custom-elements.js";
16
- import "./ambient-virtual-mode-selector.js";
17
- import "./device-selector.js";
18
- import "./keybinding-selector.js";
19
- import "./language-selector.js";
20
15
  import "../icons/icons.js";
21
- let DictationSettingsMenu = class DictationSettingsMenu extends LitElement {
16
+ export class SettingsMenuBase extends LitElement {
22
17
  constructor() {
23
18
  super(...arguments);
24
19
  this._recordingState = "stopped";
25
20
  this.settingsEnabled = ["device", "language"];
26
21
  }
22
+ _renderVirtualModeSelector(_isRecording) {
23
+ return nothing;
24
+ }
27
25
  render() {
28
26
  if (this.settingsEnabled?.length === 0) {
29
27
  return nothing;
@@ -47,33 +45,17 @@ let DictationSettingsMenu = class DictationSettingsMenu extends LitElement {
47
45
  </div>
48
46
  `
49
47
  : nothing}
50
- ${showDeviceSelector
51
- ? html `<dictation-device-selector
52
- ?disabled=${isRecording}
53
- />`
54
- : nothing}
55
- ${showLanguageSelector
56
- ? html `<dictation-language-selector
57
- ?disabled=${isRecording}
58
- />`
59
- : nothing}
60
- ${showKeybinding
61
- ? html `<dictation-keybinding-selector
62
- ?disabled=${isRecording}
63
- />`
64
- : nothing}
65
- ${showVirtualMode
66
- ? html `<ambient-virtual-mode-selector
67
- ?disabled=${isRecording}
68
- ></ambient-virtual-mode-selector>`
69
- : nothing}
48
+ ${showDeviceSelector ? this._renderDeviceSelector(isRecording) : nothing}
49
+ ${showLanguageSelector ? this._renderLanguageSelector(isRecording) : nothing}
50
+ ${showKeybinding ? this._renderKeybindingSelector(isRecording) : nothing}
51
+ ${showVirtualMode ? this._renderVirtualModeSelector(isRecording) : nothing}
70
52
  </div>
71
53
  </div>
72
54
  </div>
73
55
  `;
74
56
  }
75
- };
76
- DictationSettingsMenu.styles = [
57
+ }
58
+ SettingsMenuBase.styles = [
77
59
  SettingsMenuStyles,
78
60
  ButtonStyles,
79
61
  CalloutStyles,
@@ -81,15 +63,11 @@ DictationSettingsMenu.styles = [
81
63
  __decorate([
82
64
  consume({ context: recordingStateContext, subscribe: true }),
83
65
  state()
84
- ], DictationSettingsMenu.prototype, "_recordingState", void 0);
66
+ ], SettingsMenuBase.prototype, "_recordingState", void 0);
85
67
  __decorate([
86
68
  property({
87
69
  converter: commaSeparatedConverter,
88
70
  type: Array,
89
71
  })
90
- ], DictationSettingsMenu.prototype, "settingsEnabled", void 0);
91
- DictationSettingsMenu = __decorate([
92
- dualCustomElement("dictation-settings-menu", "ambient-settings-menu")
93
- ], DictationSettingsMenu);
94
- export { DictationSettingsMenu };
95
- //# sourceMappingURL=settings-menu.js.map
72
+ ], SettingsMenuBase.prototype, "settingsEnabled", void 0);
73
+ //# sourceMappingURL=settings-menu-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-menu-base.js","sourceRoot":"","sources":["../../src/components/settings-menu-base.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAEL,IAAI,EACJ,UAAU,EACV,OAAO,GAER,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,YAAY,MAAM,sBAAsB,CAAC;AAChD,OAAO,aAAa,MAAM,sBAAsB,CAAC;AACjD,OAAO,kBAAkB,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,mBAAmB,CAAC;AAE3B,MAAM,OAAgB,gBAAiB,SAAQ,UAAU;IAAzD;;QAqBE,oBAAe,GAAmB,SAAS,CAAC;QAM5C,oBAAe,GAA2B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IA4CnE,CAAC;IA1DW,0BAA0B,CAClC,YAAqB;QAErB,OAAO,OAAO,CAAC;IACjB,CAAC;IAkBD,MAAM;QACJ,IAAI,IAAI,CAAC,eAAe,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,KAAK,WAAW,CAAC;QACzD,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnE,MAAM,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnE,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAErE,OAAO,IAAI,CAAA;;;;;;;cAQD,WAAW;YACT,CAAC,CAAC,IAAI,CAAA;;;;iBAIL;YACD,CAAC,CAAC,OACN;cACE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO;cACtE,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO;cAC1E,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO;cACtE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO;;;;KAIjF,CAAC;IACJ,CAAC;;AAzCM,uBAAM,GAAmB;IAC9B,kBAAkB;IAClB,YAAY;IACZ,aAAa;CACd,AAJY,CAIX;AAZF;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5D,KAAK,EAAE;yDACoC;AAM5C;IAJC,QAAQ,CAAC;QACR,SAAS,EAAE,uBAAuB;QAClC,IAAI,EAAE,KAAK;KACZ,CAAC;yDAC+D","sourcesContent":["import { consume } from \"@lit/context\";\nimport {\n type CSSResultGroup,\n html,\n LitElement,\n nothing,\n type TemplateResult,\n} from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { recordingStateContext } from \"../contexts/mixins/recording-state-context.js\";\nimport ButtonStyles from \"../styles/buttons.js\";\nimport CalloutStyles from \"../styles/callout.js\";\nimport SettingsMenuStyles from \"../styles/settings-menu.js\";\nimport type { ConfigurableSettings, RecordingState } from \"../types.js\";\nimport { commaSeparatedConverter } from \"../utils/converters.js\";\n\nimport \"../icons/icons.js\";\n\nexport abstract class SettingsMenuBase extends LitElement {\n protected abstract _renderDeviceSelector(\n isRecording: boolean,\n ): TemplateResult | typeof nothing;\n\n protected abstract _renderLanguageSelector(\n isRecording: boolean,\n ): TemplateResult | typeof nothing;\n\n protected abstract _renderKeybindingSelector(\n isRecording: boolean,\n ): TemplateResult | typeof nothing;\n\n protected _renderVirtualModeSelector(\n _isRecording: boolean,\n ): TemplateResult | typeof nothing {\n return nothing;\n }\n\n @consume({ context: recordingStateContext, subscribe: true })\n @state()\n _recordingState: RecordingState = \"stopped\";\n\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n settingsEnabled: ConfigurableSettings[] = [\"device\", \"language\"];\n\n static styles: CSSResultGroup = [\n SettingsMenuStyles,\n ButtonStyles,\n CalloutStyles,\n ];\n\n render() {\n if (this.settingsEnabled?.length === 0) {\n return nothing;\n }\n\n const isRecording = this._recordingState === \"recording\";\n const showDeviceSelector = this.settingsEnabled.includes(\"device\");\n const showLanguageSelector = this.settingsEnabled.includes(\"language\");\n const showKeybinding = this.settingsEnabled.includes(\"keybinding\");\n const showVirtualMode = this.settingsEnabled.includes(\"virtualMode\");\n\n return html`\n <div class=\"mic-selector\">\n <button id=\"settings-popover-button\" popovertarget=\"settings-popover\">\n <icon-settings />\n </button>\n <div id=\"settings-popover\" popover>\n <div class=\"settings-wrapper\">\n ${\n isRecording\n ? html`\n <div class=\"callout warn\">\n Recording is in progress. Stop recording to change settings.\n </div>\n `\n : nothing\n }\n ${showDeviceSelector ? this._renderDeviceSelector(isRecording) : nothing}\n ${showLanguageSelector ? this._renderLanguageSelector(isRecording) : nothing}\n ${showKeybinding ? this._renderKeybindingSelector(isRecording) : nothing}\n ${showVirtualMode ? this._renderVirtualModeSelector(isRecording) : nothing}\n </div>\n </div>\n </div>\n `;\n }\n}\n"]}
@@ -1,15 +1,14 @@
1
1
  import { LitElement, type PropertyValues } from "lit";
2
- export declare class DictationAudioVisualiser extends LitElement {
2
+ export declare class SpeechAudioVisualiser extends LitElement {
3
3
  level: number;
4
4
  active: boolean;
5
5
  segmentCount: number;
6
6
  static styles: import("lit").CSSResult;
7
7
  willUpdate(changedProperties: PropertyValues<this>): void;
8
- render(): import("lit-html").TemplateResult<1>;
8
+ render(): import("lit").TemplateResult<1>;
9
9
  }
10
10
  declare global {
11
11
  interface HTMLElementTagNameMap {
12
- "ambient-audio-visualiser": DictationAudioVisualiser;
13
- "dictation-audio-visualiser": DictationAudioVisualiser;
12
+ "speech-audio-visualiser": SpeechAudioVisualiser;
14
13
  }
15
14
  }