@corti/dictation-web 0.7.0-ambient.8 → 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.
- package/LICENSE +21 -0
- package/README.md +110 -0
- package/dist/.tsbuildinfo +1 -0
- package/{bundle.js → dist/bundle.js} +4459 -4823
- package/{components → dist/components}/corti-dictation.d.ts +3 -3
- package/{components → dist/components}/corti-dictation.js +5 -4
- package/dist/components/corti-dictation.js.map +1 -0
- package/dist/components/dictation-device-selector.d.ts +8 -0
- package/dist/components/dictation-device-selector.js +15 -0
- package/dist/components/dictation-device-selector.js.map +1 -0
- package/dist/components/dictation-keybinding-selector.d.ts +8 -0
- package/dist/components/dictation-keybinding-selector.js +15 -0
- package/dist/components/dictation-keybinding-selector.js.map +1 -0
- package/dist/components/dictation-language-selector.d.ts +8 -0
- package/dist/components/dictation-language-selector.js +15 -0
- package/dist/components/dictation-language-selector.js.map +1 -0
- package/{components → dist/components}/dictation-recording-button.d.ts +2 -1
- package/{components → dist/components}/dictation-recording-button.js +9 -4
- package/dist/components/dictation-recording-button.js.map +1 -0
- package/dist/components/dictation-settings-menu.d.ts +15 -0
- package/dist/components/dictation-settings-menu.js +34 -0
- package/dist/components/dictation-settings-menu.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/{contexts → dist/contexts}/dictation-context.d.ts +1 -1
- package/{contexts → dist/contexts}/dictation-context.js +4 -3
- package/dist/contexts/dictation-context.js.map +1 -0
- package/{controllers → dist/controllers}/dictation-controller.d.ts +4 -4
- package/{controllers → dist/controllers}/dictation-controller.js +1 -1
- package/dist/controllers/dictation-controller.js.map +1 -0
- package/dist/core/.tsbuildinfo +1 -0
- package/{components → dist/core/components}/corti-root.d.ts +1 -1
- package/dist/core/components/corti-root.js.map +1 -0
- package/dist/core/components/device-selector-base.d.ts +9 -0
- package/{components/device-selector.js → dist/core/components/device-selector-base.js} +11 -17
- package/dist/core/components/device-selector-base.js.map +1 -0
- package/dist/core/components/keybinding-selector-base.d.ts +10 -0
- package/{components/keybinding-selector.js → dist/core/components/keybinding-selector-base.js} +21 -21
- package/dist/core/components/keybinding-selector-base.js.map +1 -0
- package/dist/core/components/language-selector-base.d.ts +10 -0
- package/{components/language-selector.js → dist/core/components/language-selector-base.js} +11 -18
- package/dist/core/components/language-selector-base.js.map +1 -0
- package/{components → dist/core/components}/recording-button-base.d.ts +10 -7
- package/{components → dist/core/components}/recording-button-base.js +17 -15
- package/dist/core/components/recording-button-base.js.map +1 -0
- package/dist/core/components/settings-menu-base.d.ts +13 -0
- package/{components/settings-menu.js → dist/core/components/settings-menu-base.js} +14 -36
- package/dist/core/components/settings-menu-base.js.map +1 -0
- package/{components/audio-visualiser.d.ts → dist/core/components/speech-audio-visualiser.d.ts} +3 -4
- package/{components/audio-visualiser.js → dist/core/components/speech-audio-visualiser.js} +11 -12
- package/dist/core/components/speech-audio-visualiser.js.map +1 -0
- package/{components/keybinding-input.d.ts → dist/core/components/speech-keybinding-input.d.ts} +3 -4
- package/{components/keybinding-input.js → dist/core/components/speech-keybinding-input.js} +22 -22
- package/dist/core/components/speech-keybinding-input.js.map +1 -0
- package/{constants.d.ts → dist/core/constants.d.ts} +0 -2
- package/{constants.js → dist/core/constants.js} +0 -14
- package/dist/core/constants.js.map +1 -0
- package/dist/core/contexts/mixins/auth-context.js.map +1 -0
- package/dist/core/contexts/mixins/devices-context.js.map +1 -0
- package/{contexts → dist/core/contexts}/mixins/keybindings-context.js +3 -2
- package/dist/core/contexts/mixins/keybindings-context.js.map +1 -0
- package/dist/core/contexts/mixins/languages-context.js.map +1 -0
- package/dist/core/contexts/mixins/proxy-context.js.map +1 -0
- package/dist/core/contexts/mixins/recording-state-context.js.map +1 -0
- package/dist/core/contexts/mixins/types.js.map +1 -0
- package/{contexts → dist/core/contexts}/root-context.d.ts +1 -1
- package/dist/core/contexts/root-context.js.map +1 -0
- package/dist/core/controllers/devices-controller.js.map +1 -0
- package/dist/core/controllers/keybinding-controller.js.map +1 -0
- package/dist/core/controllers/languages-controller.js.map +1 -0
- package/dist/core/controllers/media-controller.js.map +1 -0
- package/dist/core/controllers/socket-controller.js.map +1 -0
- package/{icons → dist/core/icons}/icons.d.ts +6 -6
- package/{icons → dist/core/icons}/icons.js +7 -7
- package/dist/core/icons/icons.js.map +1 -0
- package/dist/core/icons/index.js.map +1 -0
- package/dist/core/socket-messages.d.ts +4 -0
- package/dist/core/socket-messages.js +2 -0
- package/dist/core/socket-messages.js.map +1 -0
- package/dist/core/styles/audio-visualiser.js.map +1 -0
- package/dist/core/styles/buttons.js.map +1 -0
- package/dist/core/styles/callout.js.map +1 -0
- package/dist/core/styles/component-styles.js.map +1 -0
- package/dist/core/styles/keybinding-selector.js.map +1 -0
- package/dist/core/styles/recording-button.js.map +1 -0
- package/dist/core/styles/select.js.map +1 -0
- package/dist/core/styles/settings-menu.js.map +1 -0
- package/{types.d.ts → dist/core/types.d.ts} +0 -3
- package/dist/core/types.js.map +1 -0
- package/dist/core/utils/auth.js.map +1 -0
- package/dist/core/utils/converters.js.map +1 -0
- package/dist/core/utils/custom-elements.d.ts +6 -0
- package/dist/core/utils/custom-elements.js +23 -0
- package/dist/core/utils/custom-elements.js.map +1 -0
- package/dist/core/utils/devices.js.map +1 -0
- package/dist/core/utils/events.js.map +1 -0
- package/dist/core/utils/keybinding.js.map +1 -0
- package/dist/core/utils/languages.js.map +1 -0
- package/dist/core/utils/media.js.map +1 -0
- package/dist/core/utils/token.js.map +1 -0
- package/dist/core/utils/validation.js.map +1 -0
- package/{index.d.ts → dist/index.d.ts} +6 -6
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/package.json +19 -13
- package/.tsbuildinfo +0 -1
- package/components/ambient-recording-button.d.ts +0 -16
- package/components/ambient-recording-button.js +0 -68
- package/components/ambient-recording-button.js.map +0 -1
- package/components/ambient-virtual-mode-selector.d.ts +0 -14
- package/components/ambient-virtual-mode-selector.js +0 -69
- package/components/ambient-virtual-mode-selector.js.map +0 -1
- package/components/audio-visualiser.js.map +0 -1
- package/components/corti-ambient.d.ts +0 -35
- package/components/corti-ambient.js +0 -126
- package/components/corti-ambient.js.map +0 -1
- package/components/corti-dictation.js.map +0 -1
- package/components/corti-root.js.map +0 -1
- package/components/device-selector.d.ts +0 -15
- package/components/device-selector.js.map +0 -1
- package/components/dictation-recording-button.js.map +0 -1
- package/components/keybinding-input.js.map +0 -1
- package/components/keybinding-selector.d.ts +0 -15
- package/components/keybinding-selector.js.map +0 -1
- package/components/language-selector.d.ts +0 -16
- package/components/language-selector.js.map +0 -1
- package/components/recording-button-base.js.map +0 -1
- package/components/settings-menu.d.ts +0 -19
- package/components/settings-menu.js.map +0 -1
- package/constants.js.map +0 -1
- package/contexts/ambient-context.d.ts +0 -24
- package/contexts/ambient-context.js +0 -93
- package/contexts/ambient-context.js.map +0 -1
- package/contexts/dictation-context.js.map +0 -1
- package/contexts/mixins/auth-context.js.map +0 -1
- package/contexts/mixins/devices-context.js.map +0 -1
- package/contexts/mixins/keybindings-context.js.map +0 -1
- package/contexts/mixins/languages-context.js.map +0 -1
- package/contexts/mixins/proxy-context.js.map +0 -1
- package/contexts/mixins/recording-state-context.js.map +0 -1
- package/contexts/mixins/types.js.map +0 -1
- package/contexts/root-context.js.map +0 -1
- package/controllers/ambient-controller.d.ts +0 -16
- package/controllers/ambient-controller.js +0 -24
- package/controllers/ambient-controller.js.map +0 -1
- package/controllers/devices-controller.js.map +0 -1
- package/controllers/dictation-controller.js.map +0 -1
- package/controllers/keybinding-controller.js.map +0 -1
- package/controllers/languages-controller.js.map +0 -1
- package/controllers/media-controller.js.map +0 -1
- package/controllers/socket-controller.js.map +0 -1
- package/icons/icons.js.map +0 -1
- package/icons/index.js.map +0 -1
- package/index.js +0 -8
- package/index.js.map +0 -1
- package/styles/ambient-virtual-mode-selector.d.ts +0 -2
- package/styles/ambient-virtual-mode-selector.js +0 -101
- package/styles/ambient-virtual-mode-selector.js.map +0 -1
- package/styles/audio-visualiser.js.map +0 -1
- package/styles/buttons.js.map +0 -1
- package/styles/callout.js.map +0 -1
- package/styles/component-styles.js.map +0 -1
- package/styles/keybinding-selector.js.map +0 -1
- package/styles/recording-button.js.map +0 -1
- package/styles/select.js.map +0 -1
- package/styles/settings-menu.js.map +0 -1
- package/types.js.map +0 -1
- package/utils/auth.js.map +0 -1
- package/utils/converters.js.map +0 -1
- package/utils/custom-elements.d.ts +0 -6
- package/utils/custom-elements.js +0 -11
- package/utils/custom-elements.js.map +0 -1
- package/utils/devices.js.map +0 -1
- package/utils/events.js.map +0 -1
- package/utils/keybinding.js.map +0 -1
- package/utils/languages.js.map +0 -1
- package/utils/media.js.map +0 -1
- package/utils/token.js.map +0 -1
- package/utils/validation.js.map +0 -1
- /package/{components → dist/core/components}/corti-root.js +0 -0
- /package/{contexts → dist/core/contexts}/mixins/auth-context.d.ts +0 -0
- /package/{contexts → dist/core/contexts}/mixins/auth-context.js +0 -0
- /package/{contexts → dist/core/contexts}/mixins/devices-context.d.ts +0 -0
- /package/{contexts → dist/core/contexts}/mixins/devices-context.js +0 -0
- /package/{contexts → dist/core/contexts}/mixins/keybindings-context.d.ts +0 -0
- /package/{contexts → dist/core/contexts}/mixins/languages-context.d.ts +0 -0
- /package/{contexts → dist/core/contexts}/mixins/languages-context.js +0 -0
- /package/{contexts → dist/core/contexts}/mixins/proxy-context.d.ts +0 -0
- /package/{contexts → dist/core/contexts}/mixins/proxy-context.js +0 -0
- /package/{contexts → dist/core/contexts}/mixins/recording-state-context.d.ts +0 -0
- /package/{contexts → dist/core/contexts}/mixins/recording-state-context.js +0 -0
- /package/{contexts → dist/core/contexts}/mixins/types.d.ts +0 -0
- /package/{contexts → dist/core/contexts}/mixins/types.js +0 -0
- /package/{contexts → dist/core/contexts}/root-context.js +0 -0
- /package/{controllers → dist/core/controllers}/devices-controller.d.ts +0 -0
- /package/{controllers → dist/core/controllers}/devices-controller.js +0 -0
- /package/{controllers → dist/core/controllers}/keybinding-controller.d.ts +0 -0
- /package/{controllers → dist/core/controllers}/keybinding-controller.js +0 -0
- /package/{controllers → dist/core/controllers}/languages-controller.d.ts +0 -0
- /package/{controllers → dist/core/controllers}/languages-controller.js +0 -0
- /package/{controllers → dist/core/controllers}/media-controller.d.ts +0 -0
- /package/{controllers → dist/core/controllers}/media-controller.js +0 -0
- /package/{controllers → dist/core/controllers}/socket-controller.d.ts +0 -0
- /package/{controllers → dist/core/controllers}/socket-controller.js +0 -0
- /package/{icons → dist/core/icons}/index.d.ts +0 -0
- /package/{icons → dist/core/icons}/index.js +0 -0
- /package/{styles → dist/core/styles}/audio-visualiser.d.ts +0 -0
- /package/{styles → dist/core/styles}/audio-visualiser.js +0 -0
- /package/{styles → dist/core/styles}/buttons.d.ts +0 -0
- /package/{styles → dist/core/styles}/buttons.js +0 -0
- /package/{styles → dist/core/styles}/callout.d.ts +0 -0
- /package/{styles → dist/core/styles}/callout.js +0 -0
- /package/{styles → dist/core/styles}/component-styles.d.ts +0 -0
- /package/{styles → dist/core/styles}/component-styles.js +0 -0
- /package/{styles → dist/core/styles}/keybinding-selector.d.ts +0 -0
- /package/{styles → dist/core/styles}/keybinding-selector.js +0 -0
- /package/{styles → dist/core/styles}/recording-button.d.ts +0 -0
- /package/{styles → dist/core/styles}/recording-button.js +0 -0
- /package/{styles → dist/core/styles}/select.d.ts +0 -0
- /package/{styles → dist/core/styles}/select.js +0 -0
- /package/{styles → dist/core/styles}/settings-menu.d.ts +0 -0
- /package/{styles → dist/core/styles}/settings-menu.js +0 -0
- /package/{types.js → dist/core/types.js} +0 -0
- /package/{utils → dist/core/utils}/auth.d.ts +0 -0
- /package/{utils → dist/core/utils}/auth.js +0 -0
- /package/{utils → dist/core/utils}/converters.d.ts +0 -0
- /package/{utils → dist/core/utils}/converters.js +0 -0
- /package/{utils → dist/core/utils}/devices.d.ts +0 -0
- /package/{utils → dist/core/utils}/devices.js +0 -0
- /package/{utils → dist/core/utils}/events.d.ts +0 -0
- /package/{utils → dist/core/utils}/events.js +0 -0
- /package/{utils → dist/core/utils}/keybinding.d.ts +0 -0
- /package/{utils → dist/core/utils}/keybinding.js +0 -0
- /package/{utils → dist/core/utils}/languages.d.ts +0 -0
- /package/{utils → dist/core/utils}/languages.js +0 -0
- /package/{utils → dist/core/utils}/media.d.ts +0 -0
- /package/{utils → dist/core/utils}/media.js +0 -0
- /package/{utils → dist/core/utils}/token.d.ts +0 -0
- /package/{utils → dist/core/utils}/token.js +0 -0
- /package/{utils → dist/core/utils}/validation.d.ts +0 -0
- /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
|
|
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
|
|
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
|
-
|
|
19
|
+
export class DeviceSelectorBase extends LitElement {
|
|
21
20
|
constructor() {
|
|
22
21
|
super(...arguments);
|
|
23
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
58
|
+
DeviceSelectorBase.styles = SelectStyles;
|
|
61
59
|
__decorate([
|
|
62
60
|
consume({ context: devicesContext, subscribe: true }),
|
|
63
61
|
state()
|
|
64
|
-
],
|
|
62
|
+
], DeviceSelectorBase.prototype, "_devices", void 0);
|
|
65
63
|
__decorate([
|
|
66
64
|
consume({ context: selectedDeviceContext, subscribe: true }),
|
|
67
65
|
state()
|
|
68
|
-
],
|
|
66
|
+
], DeviceSelectorBase.prototype, "_selectedDevice", void 0);
|
|
69
67
|
__decorate([
|
|
70
68
|
property({ type: Boolean })
|
|
71
|
-
],
|
|
72
|
-
|
|
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
|
+
}
|
package/{components/keybinding-selector.js → dist/core/components/keybinding-selector-base.js}
RENAMED
|
@@ -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
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
41
|
+
}
|
|
42
|
+
KeybindingSelectorBase.styles = KeybindingSelectorStyles;
|
|
39
43
|
__decorate([
|
|
40
44
|
consume({ context: pushToTalkKeybindingContext, subscribe: true }),
|
|
41
45
|
state()
|
|
42
|
-
],
|
|
46
|
+
], KeybindingSelectorBase.prototype, "_pushToTalkKeybinding", void 0);
|
|
43
47
|
__decorate([
|
|
44
48
|
consume({ context: toggleToTalkKeybindingContext, subscribe: true }),
|
|
45
49
|
state()
|
|
46
|
-
],
|
|
50
|
+
], KeybindingSelectorBase.prototype, "_toggleToTalkKeybinding", void 0);
|
|
47
51
|
__decorate([
|
|
48
52
|
property({ type: Boolean })
|
|
49
|
-
],
|
|
50
|
-
|
|
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
|
|
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
|
-
|
|
20
|
+
export class LanguageSelectorBase extends LitElement {
|
|
22
21
|
constructor() {
|
|
23
22
|
super(...arguments);
|
|
24
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
57
|
+
LanguageSelectorBase.styles = SelectStyles;
|
|
61
58
|
__decorate([
|
|
62
59
|
consume({ context: languagesContext, subscribe: true }),
|
|
63
60
|
state()
|
|
64
|
-
],
|
|
61
|
+
], LanguageSelectorBase.prototype, "_languages", void 0);
|
|
65
62
|
__decorate([
|
|
66
63
|
consume({ context: selectedLanguageContext, subscribe: true }),
|
|
67
64
|
state()
|
|
68
|
-
],
|
|
65
|
+
], LanguageSelectorBase.prototype, "_selectedLanguage", void 0);
|
|
69
66
|
__decorate([
|
|
70
67
|
property({ type: Boolean })
|
|
71
|
-
],
|
|
72
|
-
|
|
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 {
|
|
6
|
-
import "
|
|
5
|
+
import type { RecordingSocketInboundMessage } from "../socket-messages.js";
|
|
6
|
+
import type { ProxyOptions, RecordingState } from "../types.js";
|
|
7
7
|
import "../icons/icons.js";
|
|
8
|
-
|
|
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():
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
?
|
|
52
|
-
|
|
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
|
-
|
|
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
|
-
],
|
|
66
|
+
], SettingsMenuBase.prototype, "_recordingState", void 0);
|
|
85
67
|
__decorate([
|
|
86
68
|
property({
|
|
87
69
|
converter: commaSeparatedConverter,
|
|
88
70
|
type: Array,
|
|
89
71
|
})
|
|
90
|
-
],
|
|
91
|
-
|
|
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"]}
|
package/{components/audio-visualiser.d.ts → dist/core/components/speech-audio-visualiser.d.ts}
RENAMED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { LitElement, type PropertyValues } from "lit";
|
|
2
|
-
export declare class
|
|
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
|
|
8
|
+
render(): import("lit").TemplateResult<1>;
|
|
9
9
|
}
|
|
10
10
|
declare global {
|
|
11
11
|
interface HTMLElementTagNameMap {
|
|
12
|
-
"
|
|
13
|
-
"dictation-audio-visualiser": DictationAudioVisualiser;
|
|
12
|
+
"speech-audio-visualiser": SpeechAudioVisualiser;
|
|
14
13
|
}
|
|
15
14
|
}
|