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

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 (189) hide show
  1. package/README.md +14 -5
  2. package/dist/CortiDictation.d.ts +6 -2
  3. package/dist/CortiDictation.js +36 -14
  4. package/dist/CortiDictation.js.map +1 -1
  5. package/dist/bundle.js +2802 -1571
  6. package/dist/components/audio-visualiser.d.ts +3 -2
  7. package/dist/components/audio-visualiser.js +29 -40
  8. package/dist/components/audio-visualiser.js.map +1 -1
  9. package/dist/components/corti-dictation.d.ts +123 -0
  10. package/dist/components/corti-dictation.js +224 -0
  11. package/dist/components/corti-dictation.js.map +1 -0
  12. package/dist/components/device-selector.d.ts +24 -0
  13. package/dist/components/device-selector.js +106 -0
  14. package/dist/components/device-selector.js.map +1 -0
  15. package/dist/components/language-selector.d.ts +24 -0
  16. package/dist/components/language-selector.js +100 -0
  17. package/dist/components/language-selector.js.map +1 -0
  18. package/dist/components/recording-button.d.ts +37 -0
  19. package/dist/components/recording-button.js +203 -0
  20. package/dist/components/recording-button.js.map +1 -0
  21. package/dist/components/settings-menu.d.ts +9 -13
  22. package/dist/components/settings-menu.js +42 -147
  23. package/dist/components/settings-menu.js.map +1 -1
  24. package/dist/constants.d.ts +3 -2
  25. package/dist/constants.js +33 -12
  26. package/dist/constants.js.map +1 -1
  27. package/dist/contexts/dictation-context.d.ts +97 -0
  28. package/dist/contexts/dictation-context.js +208 -0
  29. package/dist/contexts/dictation-context.js.map +1 -0
  30. package/dist/controllers/DictationController.d.ts +35 -0
  31. package/dist/controllers/DictationController.js +130 -0
  32. package/dist/controllers/DictationController.js.map +1 -0
  33. package/dist/controllers/MediaController.d.ts +31 -0
  34. package/dist/controllers/MediaController.js +99 -0
  35. package/dist/controllers/MediaController.js.map +1 -0
  36. package/dist/index.d.ts +9 -1
  37. package/dist/index.js +29 -3
  38. package/dist/index.js.map +1 -1
  39. package/dist/package.json +14 -0
  40. package/dist/src/components/audio-visualiser.d.ts +13 -0
  41. package/dist/src/components/audio-visualiser.js +54 -0
  42. package/dist/src/components/audio-visualiser.js.map +1 -0
  43. package/dist/src/components/corti-dictation.d.ts +108 -0
  44. package/dist/src/components/corti-dictation.js +201 -0
  45. package/dist/src/components/corti-dictation.js.map +1 -0
  46. package/dist/src/components/device-selector.d.ts +24 -0
  47. package/dist/src/components/device-selector.js +106 -0
  48. package/dist/src/components/device-selector.js.map +1 -0
  49. package/dist/src/components/language-selector.d.ts +24 -0
  50. package/dist/src/components/language-selector.js +100 -0
  51. package/dist/src/components/language-selector.js.map +1 -0
  52. package/dist/src/components/recording-button.d.ts +33 -0
  53. package/dist/src/components/recording-button.js +179 -0
  54. package/dist/src/components/recording-button.js.map +1 -0
  55. package/dist/src/components/settings-menu.d.ts +16 -0
  56. package/dist/src/components/settings-menu.js +80 -0
  57. package/dist/src/components/settings-menu.js.map +1 -0
  58. package/dist/src/constants.d.ts +4 -0
  59. package/dist/src/constants.js +19 -0
  60. package/dist/src/constants.js.map +1 -0
  61. package/dist/src/contexts/dictation-context.d.ts +83 -0
  62. package/dist/src/contexts/dictation-context.js +188 -0
  63. package/dist/src/contexts/dictation-context.js.map +1 -0
  64. package/dist/src/controllers/DictationController.d.ts +30 -0
  65. package/dist/src/controllers/DictationController.js +111 -0
  66. package/dist/src/controllers/DictationController.js.map +1 -0
  67. package/dist/src/controllers/MediaController.d.ts +25 -0
  68. package/dist/src/controllers/MediaController.js +83 -0
  69. package/dist/src/controllers/MediaController.js.map +1 -0
  70. package/dist/src/icons/icons.d.ts +17 -0
  71. package/dist/src/icons/icons.js +158 -0
  72. package/dist/src/icons/icons.js.map +1 -0
  73. package/dist/src/styles/ComponentStyles.d.ts +2 -0
  74. package/dist/src/styles/ComponentStyles.js +18 -0
  75. package/dist/src/styles/ComponentStyles.js.map +1 -0
  76. package/dist/src/styles/audio-visualiser.d.ts +2 -0
  77. package/dist/src/styles/audio-visualiser.js +33 -0
  78. package/dist/src/styles/audio-visualiser.js.map +1 -0
  79. package/dist/src/styles/buttons.d.ts +2 -0
  80. package/dist/src/styles/buttons.js +52 -0
  81. package/dist/src/styles/buttons.js.map +1 -0
  82. package/dist/src/styles/callout.d.ts +2 -0
  83. package/dist/src/styles/callout.js +23 -0
  84. package/dist/src/styles/callout.js.map +1 -0
  85. package/dist/src/styles/default-theme.d.ts +2 -0
  86. package/dist/src/styles/default-theme.js +50 -0
  87. package/dist/src/styles/default-theme.js.map +1 -0
  88. package/dist/src/styles/recording-button.d.ts +2 -0
  89. package/dist/src/styles/recording-button.js +8 -0
  90. package/dist/src/styles/recording-button.js.map +1 -0
  91. package/dist/src/styles/select.d.ts +2 -0
  92. package/dist/src/styles/select.js +36 -0
  93. package/dist/src/styles/select.js.map +1 -0
  94. package/dist/src/styles/settings-menu.d.ts +2 -0
  95. package/dist/src/styles/settings-menu.js +34 -0
  96. package/dist/src/styles/settings-menu.js.map +1 -0
  97. package/dist/src/types.d.ts +2 -0
  98. package/dist/src/types.js +2 -0
  99. package/dist/src/types.js.map +1 -0
  100. package/dist/src/utils/auth.d.ts +9 -0
  101. package/dist/src/utils/auth.js +21 -0
  102. package/dist/src/utils/auth.js.map +1 -0
  103. package/dist/src/utils/converters.d.ts +4 -0
  104. package/dist/src/utils/converters.js +5 -0
  105. package/dist/src/utils/converters.js.map +1 -0
  106. package/dist/src/utils/devices.d.ts +26 -0
  107. package/dist/src/utils/devices.js +53 -0
  108. package/dist/src/utils/devices.js.map +1 -0
  109. package/dist/src/utils/events.d.ts +37 -0
  110. package/dist/src/utils/events.js +88 -0
  111. package/dist/src/utils/events.js.map +1 -0
  112. package/dist/src/utils/languages.d.ts +7 -0
  113. package/dist/src/utils/languages.js +28 -0
  114. package/dist/src/utils/languages.js.map +1 -0
  115. package/dist/src/utils/media.d.ts +6 -0
  116. package/dist/src/utils/media.js +27 -0
  117. package/dist/src/utils/media.js.map +1 -0
  118. package/dist/src/utils/token.d.ts +13 -0
  119. package/dist/src/utils/token.js +59 -0
  120. package/dist/src/utils/token.js.map +1 -0
  121. package/dist/src/utils/validation.d.ts +1 -0
  122. package/dist/src/utils/validation.js +7 -0
  123. package/dist/src/utils/validation.js.map +1 -0
  124. package/dist/stories/audio-visualiser.stories.d.ts +39 -0
  125. package/dist/stories/audio-visualiser.stories.js +71 -0
  126. package/dist/stories/audio-visualiser.stories.js.map +1 -0
  127. package/dist/stories/corti-dictation.stories.d.ts +27 -0
  128. package/dist/stories/corti-dictation.stories.js +129 -0
  129. package/dist/stories/corti-dictation.stories.js.map +1 -0
  130. package/dist/stories/device-selector.stories.d.ts +18 -0
  131. package/dist/stories/device-selector.stories.js +84 -0
  132. package/dist/stories/device-selector.stories.js.map +1 -0
  133. package/dist/stories/language-selector.stories.d.ts +18 -0
  134. package/dist/stories/language-selector.stories.js +53 -0
  135. package/dist/stories/language-selector.stories.js.map +1 -0
  136. package/dist/stories/recording-button.stories.d.ts +27 -0
  137. package/dist/stories/recording-button.stories.js +90 -0
  138. package/dist/stories/recording-button.stories.js.map +1 -0
  139. package/dist/stories/settings-menu.stories.d.ts +23 -0
  140. package/dist/stories/settings-menu.stories.js +156 -0
  141. package/dist/stories/settings-menu.stories.js.map +1 -0
  142. package/dist/styles/ComponentStyles.js +6 -41
  143. package/dist/styles/ComponentStyles.js.map +1 -1
  144. package/dist/styles/audio-visualiser.d.ts +2 -0
  145. package/dist/styles/audio-visualiser.js +33 -0
  146. package/dist/styles/audio-visualiser.js.map +1 -0
  147. package/dist/styles/buttons.js +19 -25
  148. package/dist/styles/buttons.js.map +1 -1
  149. package/dist/styles/callout.js +7 -17
  150. package/dist/styles/callout.js.map +1 -1
  151. package/dist/styles/default-theme.d.ts +2 -0
  152. package/dist/styles/default-theme.js +14 -0
  153. package/dist/styles/default-theme.js.map +1 -0
  154. package/dist/styles/recording-button.d.ts +2 -0
  155. package/dist/styles/recording-button.js +8 -0
  156. package/dist/styles/recording-button.js.map +1 -0
  157. package/dist/styles/select.js +9 -9
  158. package/dist/styles/select.js.map +1 -1
  159. package/dist/styles/settings-menu.d.ts +2 -0
  160. package/dist/styles/settings-menu.js +34 -0
  161. package/dist/styles/settings-menu.js.map +1 -0
  162. package/dist/tsconfig.stories.tsbuildinfo +1 -0
  163. package/dist/types.d.ts +7 -8
  164. package/dist/types.js.map +1 -1
  165. package/dist/utils/auth.d.ts +9 -0
  166. package/dist/utils/auth.js +21 -0
  167. package/dist/utils/auth.js.map +1 -0
  168. package/dist/utils/converters.d.ts +4 -0
  169. package/dist/utils/converters.js +8 -0
  170. package/dist/utils/converters.js.map +1 -0
  171. package/dist/utils/devices.d.ts +26 -0
  172. package/dist/utils/devices.js +53 -0
  173. package/dist/utils/devices.js.map +1 -0
  174. package/dist/utils/events.d.ts +44 -0
  175. package/dist/utils/events.js +88 -0
  176. package/dist/utils/events.js.map +1 -0
  177. package/dist/utils/languages.d.ts +7 -0
  178. package/dist/utils/languages.js +29 -0
  179. package/dist/utils/languages.js.map +1 -0
  180. package/dist/utils/media.d.ts +6 -0
  181. package/dist/utils/media.js +39 -0
  182. package/dist/utils/media.js.map +1 -0
  183. package/dist/utils/token.d.ts +13 -0
  184. package/dist/utils/token.js +59 -0
  185. package/dist/utils/token.js.map +1 -0
  186. package/dist/utils/validation.d.ts +1 -0
  187. package/dist/utils/validation.js +7 -0
  188. package/dist/utils/validation.js.map +1 -0
  189. package/package.json +23 -50
@@ -0,0 +1,24 @@
1
+ import { LitElement } from "lit";
2
+ export declare class DeviceSelector extends LitElement {
3
+ private _devices?;
4
+ private _selectedDevice?;
5
+ disabled: boolean;
6
+ /**
7
+ * Internal cache of loaded devices to check if devices were auto-loaded or provided via property
8
+ * @private
9
+ */
10
+ private _loadedDevices;
11
+ private _devicesAutoLoaded;
12
+ static styles: import("lit").CSSResult;
13
+ connectedCallback(): Promise<void>;
14
+ disconnectedCallback(): void;
15
+ private _loadDevices;
16
+ private _handleDeviceChange;
17
+ private _handleSelectDevice;
18
+ render(): import("lit-html").TemplateResult<1>;
19
+ }
20
+ declare global {
21
+ interface HTMLElementTagNameMap {
22
+ "device-selector": DeviceSelector;
23
+ }
24
+ }
@@ -0,0 +1,106 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { consume } from "@lit/context";
8
+ import { html, LitElement } from "lit";
9
+ import { customElement, property, state } from "lit/decorators.js";
10
+ import { devicesContext, selectedDeviceContext, } from "../contexts/dictation-context.js";
11
+ import SelectStyles from "../styles/select.js";
12
+ import { getAudioDevices } from "../utils/devices.js";
13
+ import { errorEvent, readyEvent, recordingDevicesChangedEvent, } from "../utils/events.js";
14
+ let DeviceSelector = class DeviceSelector extends LitElement {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.disabled = false;
18
+ /**
19
+ * Internal cache of loaded devices to check if devices were auto-loaded or provided via property
20
+ * @private
21
+ */
22
+ this._loadedDevices = [];
23
+ this._handleDeviceChange = async () => {
24
+ if (this._devicesAutoLoaded()) {
25
+ await this._loadDevices();
26
+ }
27
+ };
28
+ }
29
+ _devicesAutoLoaded() {
30
+ return this._loadedDevices === this._devices;
31
+ }
32
+ async connectedCallback() {
33
+ super.connectedCallback();
34
+ if (!this._devices) {
35
+ await this._loadDevices();
36
+ navigator.mediaDevices.addEventListener("devicechange", this._handleDeviceChange);
37
+ }
38
+ this.dispatchEvent(readyEvent());
39
+ }
40
+ disconnectedCallback() {
41
+ super.disconnectedCallback();
42
+ navigator.mediaDevices.removeEventListener("devicechange", this._handleDeviceChange);
43
+ }
44
+ async _loadDevices() {
45
+ try {
46
+ const { devices, defaultDevice } = await getAudioDevices();
47
+ this._loadedDevices = devices;
48
+ // Use selected device if it still exists, otherwise fall back to default
49
+ const selectedDevice = devices.find((d) => d.deviceId === this._selectedDevice?.deviceId) ??
50
+ defaultDevice;
51
+ this.dispatchEvent(recordingDevicesChangedEvent(devices, selectedDevice));
52
+ }
53
+ catch (error) {
54
+ this.dispatchEvent(errorEvent(error));
55
+ }
56
+ }
57
+ _handleSelectDevice(e) {
58
+ const deviceId = e.target.value;
59
+ const device = this._devices?.find((d) => d.deviceId === deviceId);
60
+ if (!device) {
61
+ return;
62
+ }
63
+ this.dispatchEvent(recordingDevicesChangedEvent(this._devices || [], device));
64
+ }
65
+ render() {
66
+ return html `
67
+ <div>
68
+ <label id="device-select-label" for="device-select">
69
+ Recording Device
70
+ </label>
71
+ <select
72
+ id="device-select"
73
+ aria-labelledby="device-select-label"
74
+ @change=${this._handleSelectDevice}
75
+ ?disabled=${this.disabled || !this._devices || this._devices.length === 0}
76
+ >
77
+ ${this._devices?.map((device) => html `
78
+ <option
79
+ value=${device.deviceId}
80
+ ?selected=${this._selectedDevice?.deviceId === device.deviceId}
81
+ >
82
+ ${device.label || "Unknown Device"}
83
+ </option>
84
+ `)}
85
+ </select>
86
+ </div>
87
+ `;
88
+ }
89
+ };
90
+ DeviceSelector.styles = SelectStyles;
91
+ __decorate([
92
+ consume({ context: devicesContext, subscribe: true }),
93
+ state()
94
+ ], DeviceSelector.prototype, "_devices", void 0);
95
+ __decorate([
96
+ consume({ context: selectedDeviceContext, subscribe: true }),
97
+ state()
98
+ ], DeviceSelector.prototype, "_selectedDevice", void 0);
99
+ __decorate([
100
+ property({ type: Boolean })
101
+ ], DeviceSelector.prototype, "disabled", void 0);
102
+ DeviceSelector = __decorate([
103
+ customElement("device-selector")
104
+ ], DeviceSelector);
105
+ export { DeviceSelector };
106
+ //# sourceMappingURL=device-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-selector.js","sourceRoot":"","sources":["../../../src/components/device-selector.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EACL,cAAc,EACd,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EACL,UAAU,EACV,UAAU,EACV,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC;AAGrB,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,UAAU;IAAvC;;QAUL,aAAQ,GAAY,KAAK,CAAC;QAE1B;;;WAGG;QACK,mBAAc,GAAsB,EAAE,CAAC;QAkDvC,wBAAmB,GAAG,KAAK,IAAI,EAAE;YACvC,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBAC9B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;IAyCJ,CAAC;IA7FS,kBAAkB;QACxB,OAAO,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAID,KAAK,CAAC,iBAAiB;QACrB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAE1B,SAAS,CAAC,YAAY,CAAC,gBAAgB,CACrC,cAAc,EACd,IAAI,CAAC,mBAAmB,CACzB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAE7B,SAAS,CAAC,YAAY,CAAC,mBAAmB,CACxC,cAAc,EACd,IAAI,CAAC,mBAAmB,CACzB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;YAC3D,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAE9B,yEAAyE;YACzE,MAAM,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC;gBAClE,aAAa,CAAC;YAEhB,IAAI,CAAC,aAAa,CAChB,4BAA4B,CAAC,OAAO,EAAE,cAAc,CAAC,CACtD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAQO,mBAAmB,CAAC,CAAQ;QAClC,MAAM,QAAQ,GAAI,CAAC,CAAC,MAA4B,CAAC,KAAK,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAChB,4BAA4B,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,CAC1D,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;oBAQK,IAAI,CAAC,mBAAmB;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;;AAxFM,qBAAM,GAAG,YAAY,AAAf,CAAgB;AAnBrB;IAFP,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrD,KAAK,EAAE;gDAC6B;AAI7B;IAFP,OAAO,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5D,KAAK,EAAE;uDACkC;AAG1C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gDACF;AAVf,cAAc;IAD1B,aAAa,CAAC,iBAAiB,CAAC;GACpB,cAAc,CA+G1B","sourcesContent":["import { consume } from \"@lit/context\";\nimport { html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport {\n devicesContext,\n selectedDeviceContext,\n} from \"../contexts/dictation-context.js\";\nimport SelectStyles from \"../styles/select.js\";\nimport { getAudioDevices } from \"../utils/devices.js\";\nimport {\n errorEvent,\n readyEvent,\n recordingDevicesChangedEvent,\n} from \"../utils/events.js\";\n\n@customElement(\"device-selector\")\nexport class DeviceSelector extends LitElement {\n @consume({ context: devicesContext, subscribe: true })\n @state()\n private _devices?: MediaDeviceInfo[];\n\n @consume({ context: selectedDeviceContext, subscribe: true })\n @state()\n private _selectedDevice?: MediaDeviceInfo;\n\n @property({ type: Boolean })\n disabled: boolean = false;\n\n /**\n * Internal cache of loaded devices to check if devices were auto-loaded or provided via property\n * @private\n */\n private _loadedDevices: MediaDeviceInfo[] = [];\n\n private _devicesAutoLoaded(): boolean {\n return this._loadedDevices === this._devices;\n }\n\n static styles = SelectStyles;\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n\n if (!this._devices) {\n await this._loadDevices();\n\n navigator.mediaDevices.addEventListener(\n \"devicechange\",\n this._handleDeviceChange,\n );\n }\n\n this.dispatchEvent(readyEvent());\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n\n navigator.mediaDevices.removeEventListener(\n \"devicechange\",\n this._handleDeviceChange,\n );\n }\n\n private async _loadDevices(): Promise<void> {\n try {\n const { devices, defaultDevice } = await getAudioDevices();\n this._loadedDevices = devices;\n\n // Use selected device if it still exists, otherwise fall back to default\n const selectedDevice =\n devices.find((d) => d.deviceId === this._selectedDevice?.deviceId) ??\n defaultDevice;\n\n this.dispatchEvent(\n recordingDevicesChangedEvent(devices, selectedDevice),\n );\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n }\n\n private _handleDeviceChange = async () => {\n if (this._devicesAutoLoaded()) {\n await this._loadDevices();\n }\n };\n\n private _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 Recording Device\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\ndeclare global {\n interface HTMLElementTagNameMap {\n \"device-selector\": DeviceSelector;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { LitElement, type PropertyValues } from "lit";
2
+ export declare class LanguageSelector extends LitElement {
3
+ private _languages?;
4
+ private _dictationConfig?;
5
+ disabled: boolean;
6
+ _region?: string;
7
+ /**
8
+ * Internal cache of loaded languages to check if languages were auto-loaded or provided via property
9
+ * @private
10
+ */
11
+ private _loadedLanguages;
12
+ private _languagesAutoLoaded;
13
+ static styles: import("lit").CSSResult;
14
+ connectedCallback(): Promise<void>;
15
+ updated(changedProperties: PropertyValues<this>): void;
16
+ private _loadLanguages;
17
+ private _handleSelectLanguage;
18
+ render(): import("lit-html").TemplateResult<1>;
19
+ }
20
+ declare global {
21
+ interface HTMLElementTagNameMap {
22
+ "language-selector": LanguageSelector;
23
+ }
24
+ }
@@ -0,0 +1,100 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { consume } from "@lit/context";
8
+ import { html, LitElement } from "lit";
9
+ import { customElement, property, state } from "lit/decorators.js";
10
+ import { dictationConfigContext, languagesContext, regionContext, } from "../contexts/dictation-context.js";
11
+ import SelectStyles from "../styles/select.js";
12
+ import { languageChangedEvent, languagesChangedEvent, } from "../utils/events.js";
13
+ import { getLanguageName, getLanguagesByRegion } from "../utils/languages.js";
14
+ let LanguageSelector = class LanguageSelector extends LitElement {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.disabled = false;
18
+ /**
19
+ * Internal cache of loaded languages to check if languages were auto-loaded or provided via property
20
+ * @private
21
+ */
22
+ this._loadedLanguages = [];
23
+ }
24
+ _languagesAutoLoaded() {
25
+ return this._loadedLanguages === this._languages;
26
+ }
27
+ async connectedCallback() {
28
+ super.connectedCallback();
29
+ if (this._languages) {
30
+ return;
31
+ }
32
+ await this._loadLanguages();
33
+ }
34
+ updated(changedProperties) {
35
+ if (changedProperties.has("_region") && this._languagesAutoLoaded()) {
36
+ this._loadLanguages();
37
+ }
38
+ }
39
+ async _loadLanguages() {
40
+ const { languages, defaultLanguage } = getLanguagesByRegion(this._region);
41
+ this._loadedLanguages = languages;
42
+ const selectedLanguage = this._dictationConfig?.primaryLanguage ?? defaultLanguage;
43
+ this.dispatchEvent(languagesChangedEvent(languages, selectedLanguage));
44
+ // Dispatch backward compatible event
45
+ if (selectedLanguage) {
46
+ this.dispatchEvent(languageChangedEvent(selectedLanguage));
47
+ }
48
+ }
49
+ _handleSelectLanguage(e) {
50
+ const language = e.target.value;
51
+ this.dispatchEvent(languagesChangedEvent(this._languages || [], language));
52
+ // Dispatch backward compatible event
53
+ this.dispatchEvent(languageChangedEvent(language));
54
+ }
55
+ render() {
56
+ return html `
57
+ <div>
58
+ <label id="language-select-label" for="language-select">
59
+ Dictation Language
60
+ </label>
61
+ <select
62
+ id="language-select"
63
+ aria-labelledby="language-select-label"
64
+ @change=${this._handleSelectLanguage}
65
+ ?disabled=${this.disabled || !this._languages || this._languages.length === 0}
66
+ >
67
+ ${this._languages?.map((language) => html `
68
+ <option
69
+ value=${language}
70
+ ?selected=${this._dictationConfig?.primaryLanguage === language}
71
+ >
72
+ ${getLanguageName(language)}
73
+ </option>
74
+ `)}
75
+ </select>
76
+ </div>
77
+ `;
78
+ }
79
+ };
80
+ LanguageSelector.styles = SelectStyles;
81
+ __decorate([
82
+ consume({ context: languagesContext, subscribe: true }),
83
+ state()
84
+ ], LanguageSelector.prototype, "_languages", void 0);
85
+ __decorate([
86
+ consume({ context: dictationConfigContext, subscribe: true }),
87
+ state()
88
+ ], LanguageSelector.prototype, "_dictationConfig", void 0);
89
+ __decorate([
90
+ property({ type: Boolean })
91
+ ], LanguageSelector.prototype, "disabled", void 0);
92
+ __decorate([
93
+ consume({ context: regionContext, subscribe: true }),
94
+ state()
95
+ ], LanguageSelector.prototype, "_region", void 0);
96
+ LanguageSelector = __decorate([
97
+ customElement("language-selector")
98
+ ], LanguageSelector);
99
+ export { LanguageSelector };
100
+ //# sourceMappingURL=language-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-selector.js","sourceRoot":"","sources":["../../../src/components/language-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport { html, LitElement, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport {\n dictationConfigContext,\n languagesContext,\n regionContext,\n} from \"../contexts/dictation-context.js\";\nimport SelectStyles from \"../styles/select.js\";\nimport {\n languageChangedEvent,\n languagesChangedEvent,\n} from \"../utils/events.js\";\nimport { getLanguageName, getLanguagesByRegion } from \"../utils/languages.js\";\n\n@customElement(\"language-selector\")\nexport class LanguageSelector extends LitElement {\n @consume({ context: languagesContext, subscribe: true })\n @state()\n private _languages?: string[];\n\n @consume({ context: dictationConfigContext, subscribe: true })\n @state()\n private _dictationConfig?: Corti.TranscribeConfig;\n\n @property({ type: Boolean })\n disabled: boolean = false;\n\n @consume({ context: regionContext, subscribe: true })\n @state()\n _region?: string;\n\n /**\n * Internal cache of loaded languages to check if languages were auto-loaded or provided via property\n * @private\n */\n private _loadedLanguages: string[] = [];\n\n private _languagesAutoLoaded(): boolean {\n return this._loadedLanguages === this._languages;\n }\n\n static styles = SelectStyles;\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n\n if (this._languages) {\n return;\n }\n\n await this._loadLanguages();\n }\n\n updated(changedProperties: PropertyValues<this>): void {\n if (changedProperties.has(\"_region\") && this._languagesAutoLoaded()) {\n this._loadLanguages();\n }\n }\n\n private async _loadLanguages(): Promise<void> {\n const { languages, defaultLanguage } = getLanguagesByRegion(this._region);\n this._loadedLanguages = languages;\n\n const selectedLanguage =\n this._dictationConfig?.primaryLanguage ?? defaultLanguage;\n\n this.dispatchEvent(languagesChangedEvent(languages, selectedLanguage));\n\n // Dispatch backward compatible event\n if (selectedLanguage) {\n this.dispatchEvent(languageChangedEvent(selectedLanguage));\n }\n }\n\n private _handleSelectLanguage(e: Event): void {\n const language = (e.target as HTMLSelectElement).value;\n\n this.dispatchEvent(languagesChangedEvent(this._languages || [], language));\n\n // Dispatch backward compatible event\n this.dispatchEvent(languageChangedEvent(language));\n }\n\n render() {\n return html`\n <div>\n <label id=\"language-select-label\" for=\"language-select\">\n Dictation Language\n </label>\n <select\n id=\"language-select\"\n aria-labelledby=\"language-select-label\"\n @change=${this._handleSelectLanguage}\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._dictationConfig?.primaryLanguage === language}\n >\n ${getLanguageName(language)}\n </option>\n `,\n )}\n </select>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"language-selector\": LanguageSelector;\n }\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import type { Corti } from "@corti/sdk";
2
+ import { type CSSResultGroup, LitElement } from "lit";
3
+ import "./audio-visualiser.js";
4
+ import "../icons/icons.js";
5
+ export declare class RecordingButton extends LitElement {
6
+ private _recordingState;
7
+ _selectedDevice?: MediaDeviceInfo;
8
+ _accessToken?: string;
9
+ _authConfig?: Corti.BearerOptions;
10
+ _region?: string;
11
+ _tenantName?: string;
12
+ _dictationConfig?: Corti.TranscribeConfig;
13
+ preventFocus: boolean;
14
+ private _mediaController;
15
+ private _dictationController;
16
+ static styles: CSSResultGroup;
17
+ private _handleMouseDown;
18
+ private _handleWebSocketMessage;
19
+ private _handleWebSocketError;
20
+ private _handleWebSocketClose;
21
+ private _handleStart;
22
+ private _handleStop;
23
+ private _handleClick;
24
+ startRecording(): void;
25
+ stopRecording(): void;
26
+ toggleRecording(): void;
27
+ render(): import("lit-html").TemplateResult<1>;
28
+ }
29
+ declare global {
30
+ interface HTMLElementTagNameMap {
31
+ "recording-button": RecordingButton;
32
+ }
33
+ }
@@ -0,0 +1,179 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { consume } from "@lit/context";
8
+ import { html, LitElement } from "lit";
9
+ import { customElement, property, state } from "lit/decorators.js";
10
+ import { accessTokenContext, authConfigContext, dictationConfigContext, recordingStateContext, regionContext, selectedDeviceContext, tenantNameContext, } from "../contexts/dictation-context.js";
11
+ import { DictationController, } from "../controllers/DictationController.js";
12
+ import { MediaController } from "../controllers/MediaController.js";
13
+ import ButtonStyles from "../styles/buttons.js";
14
+ import RecordingButtonStyles from "../styles/recording-button.js";
15
+ import { audioLevelChangedEvent, commandEvent, errorEvent, networkActivityEvent, recordingStateChangedEvent, streamClosedEvent, transcriptEvent, usageEvent, } from "../utils/events.js";
16
+ import "./audio-visualiser.js";
17
+ import "../icons/icons.js";
18
+ let RecordingButton = class RecordingButton extends LitElement {
19
+ constructor() {
20
+ super(...arguments);
21
+ this._recordingState = "stopped";
22
+ this.preventFocus = false;
23
+ this._mediaController = new MediaController(this);
24
+ this._dictationController = new DictationController(this);
25
+ this._handleWebSocketMessage = (message) => {
26
+ if (message.type === "CONFIG_ACCEPTED") {
27
+ this._mediaController.mediaRecorder?.start(250);
28
+ this._mediaController.startAudioLevelMonitoring((level) => {
29
+ this.dispatchEvent(audioLevelChangedEvent(level));
30
+ });
31
+ this.dispatchEvent(recordingStateChangedEvent("recording"));
32
+ }
33
+ switch (message.type) {
34
+ case "transcript":
35
+ this.dispatchEvent(transcriptEvent(message));
36
+ break;
37
+ case "command":
38
+ this.dispatchEvent(commandEvent(message));
39
+ break;
40
+ case "usage":
41
+ this.dispatchEvent(usageEvent(message));
42
+ break;
43
+ }
44
+ };
45
+ this._handleWebSocketError = (error) => {
46
+ this.dispatchEvent(errorEvent("Socket error: " + error.message));
47
+ this._handleStop();
48
+ };
49
+ this._handleWebSocketClose = (event) => {
50
+ this.dispatchEvent(streamClosedEvent(event));
51
+ };
52
+ }
53
+ _handleMouseDown(event) {
54
+ if (this.preventFocus) {
55
+ event.preventDefault();
56
+ }
57
+ }
58
+ async _handleStart() {
59
+ this.dispatchEvent(recordingStateChangedEvent("initializing"));
60
+ try {
61
+ await this._mediaController.initialize(() => {
62
+ if (this._recordingState === "recording") {
63
+ this.dispatchEvent(errorEvent("Microphone access was lost."));
64
+ this._handleStop();
65
+ }
66
+ });
67
+ await this._dictationController.connect(this._mediaController.mediaRecorder, this._dictationConfig, {
68
+ onClose: this._handleWebSocketClose,
69
+ onError: this._handleWebSocketError,
70
+ onMessage: this._handleWebSocketMessage,
71
+ onNetworkActivity: (direction, data) => {
72
+ this.dispatchEvent(networkActivityEvent(direction, data));
73
+ },
74
+ });
75
+ }
76
+ catch (error) {
77
+ this.dispatchEvent(errorEvent(error));
78
+ await this._handleStop();
79
+ }
80
+ }
81
+ async _handleStop() {
82
+ this.dispatchEvent(recordingStateChangedEvent("stopping"));
83
+ try {
84
+ this._mediaController.stopAudioLevelMonitoring();
85
+ this._mediaController.mediaRecorder?.stop();
86
+ await this._mediaController.cleanup();
87
+ await this._dictationController.disconnect(this._handleWebSocketClose);
88
+ }
89
+ catch (error) {
90
+ this.dispatchEvent(errorEvent(error));
91
+ }
92
+ this.dispatchEvent(recordingStateChangedEvent("stopped"));
93
+ }
94
+ _handleClick() {
95
+ if (this._recordingState === "stopped") {
96
+ this._handleStart();
97
+ }
98
+ else if (this._recordingState === "recording") {
99
+ this._handleStop();
100
+ }
101
+ }
102
+ startRecording() {
103
+ if (this._recordingState !== "stopped") {
104
+ return;
105
+ }
106
+ this._handleStart();
107
+ }
108
+ stopRecording() {
109
+ if (this._recordingState !== "recording") {
110
+ return;
111
+ }
112
+ this._handleStop();
113
+ }
114
+ toggleRecording() {
115
+ this._handleClick();
116
+ }
117
+ render() {
118
+ const isLoading = this._recordingState === "initializing" ||
119
+ this._recordingState === "stopping";
120
+ const isRecording = this._recordingState === "recording";
121
+ return html `
122
+ <button
123
+ @mousedown=${this._handleMouseDown}
124
+ @click=${this._handleClick}
125
+ ?disabled=${isLoading}
126
+ class=${isRecording ? "red" : "accent"}
127
+ aria-label=${isRecording ? "Stop recording" : "Start recording"}
128
+ aria-pressed=${isRecording}
129
+ >
130
+ ${isLoading
131
+ ? html `<icon-loading-spinner></icon-loading-spinner>`
132
+ : isRecording
133
+ ? html `<icon-recording></icon-recording>`
134
+ : html `<icon-mic-on></icon-mic-on>`}
135
+ <audio-visualiser
136
+ .level=${this._mediaController.audioLevel}
137
+ ?active=${isRecording}
138
+ ></audio-visualiser>
139
+ </button>
140
+ `;
141
+ }
142
+ };
143
+ RecordingButton.styles = [RecordingButtonStyles, ButtonStyles];
144
+ __decorate([
145
+ consume({ context: recordingStateContext, subscribe: true }),
146
+ state()
147
+ ], RecordingButton.prototype, "_recordingState", void 0);
148
+ __decorate([
149
+ consume({ context: selectedDeviceContext, subscribe: true }),
150
+ state()
151
+ ], RecordingButton.prototype, "_selectedDevice", void 0);
152
+ __decorate([
153
+ consume({ context: accessTokenContext, subscribe: true }),
154
+ state()
155
+ ], RecordingButton.prototype, "_accessToken", void 0);
156
+ __decorate([
157
+ consume({ context: authConfigContext, subscribe: true }),
158
+ state()
159
+ ], RecordingButton.prototype, "_authConfig", void 0);
160
+ __decorate([
161
+ consume({ context: regionContext, subscribe: true }),
162
+ state()
163
+ ], RecordingButton.prototype, "_region", void 0);
164
+ __decorate([
165
+ consume({ context: tenantNameContext, subscribe: true }),
166
+ state()
167
+ ], RecordingButton.prototype, "_tenantName", void 0);
168
+ __decorate([
169
+ consume({ context: dictationConfigContext, subscribe: true }),
170
+ state()
171
+ ], RecordingButton.prototype, "_dictationConfig", void 0);
172
+ __decorate([
173
+ property({ type: Boolean })
174
+ ], RecordingButton.prototype, "preventFocus", void 0);
175
+ RecordingButton = __decorate([
176
+ customElement("recording-button")
177
+ ], RecordingButton);
178
+ export { RecordingButton };
179
+ //# sourceMappingURL=recording-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-button.js","sourceRoot":"","sources":["../../../src/components/recording-button.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport { type CSSResultGroup, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport {\n accessTokenContext,\n authConfigContext,\n dictationConfigContext,\n recordingStateContext,\n regionContext,\n selectedDeviceContext,\n tenantNameContext,\n} from \"../contexts/dictation-context.js\";\nimport {\n DictationController,\n type TranscribeMessage,\n} from \"../controllers/DictationController.js\";\nimport { MediaController } from \"../controllers/MediaController.js\";\nimport ButtonStyles from \"../styles/buttons.js\";\nimport RecordingButtonStyles from \"../styles/recording-button.js\";\nimport type { RecordingState } from \"../types.js\";\nimport {\n audioLevelChangedEvent,\n commandEvent,\n errorEvent,\n networkActivityEvent,\n recordingStateChangedEvent,\n streamClosedEvent,\n transcriptEvent,\n usageEvent,\n} from \"../utils/events.js\";\n\nimport \"./audio-visualiser.js\";\nimport \"../icons/icons.js\";\n\n@customElement(\"recording-button\")\nexport class RecordingButton extends LitElement {\n @consume({ context: recordingStateContext, subscribe: true })\n @state()\n private _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?: Corti.BearerOptions;\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: dictationConfigContext, subscribe: true })\n @state()\n _dictationConfig?: Corti.TranscribeConfig;\n\n @property({ type: Boolean })\n preventFocus: boolean = false;\n\n private _mediaController = new MediaController(this);\n private _dictationController = new DictationController(this);\n\n static styles: CSSResultGroup = [RecordingButtonStyles, ButtonStyles];\n\n private _handleMouseDown(event: MouseEvent): void {\n if (this.preventFocus) {\n event.preventDefault();\n }\n }\n\n private _handleWebSocketMessage = (message: TranscribeMessage): void => {\n if (message.type === \"CONFIG_ACCEPTED\") {\n this._mediaController.mediaRecorder?.start(250);\n this._mediaController.startAudioLevelMonitoring((level) => {\n this.dispatchEvent(audioLevelChangedEvent(level));\n });\n\n this.dispatchEvent(recordingStateChangedEvent(\"recording\"));\n }\n\n switch (message.type) {\n case \"transcript\":\n this.dispatchEvent(transcriptEvent(message));\n break;\n case \"command\":\n this.dispatchEvent(commandEvent(message));\n break;\n case \"usage\":\n this.dispatchEvent(usageEvent(message));\n break;\n }\n };\n\n private _handleWebSocketError = (error: Error): void => {\n this.dispatchEvent(errorEvent(\"Socket error: \" + error.message));\n this._handleStop();\n };\n\n private _handleWebSocketClose = (event: unknown): void => {\n this.dispatchEvent(streamClosedEvent(event));\n };\n\n private async _handleStart(): Promise<void> {\n this.dispatchEvent(recordingStateChangedEvent(\"initializing\"));\n\n try {\n await this._mediaController.initialize(() => {\n if (this._recordingState === \"recording\") {\n this.dispatchEvent(errorEvent(\"Microphone access was lost.\"));\n this._handleStop();\n }\n });\n\n await this._dictationController.connect(\n this._mediaController.mediaRecorder,\n this._dictationConfig,\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 } catch (error) {\n this.dispatchEvent(errorEvent(error));\n await this._handleStop();\n }\n }\n\n private async _handleStop(): Promise<void> {\n this.dispatchEvent(recordingStateChangedEvent(\"stopping\"));\n\n try {\n this._mediaController.stopAudioLevelMonitoring();\n this._mediaController.mediaRecorder?.stop();\n await this._mediaController.cleanup();\n\n await this._dictationController.disconnect(this._handleWebSocketClose);\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n\n this.dispatchEvent(recordingStateChangedEvent(\"stopped\"));\n }\n\n private _handleClick(): void {\n if (this._recordingState === \"stopped\") {\n this._handleStart();\n } else if (this._recordingState === \"recording\") {\n this._handleStop();\n }\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 (this._recordingState !== \"recording\") {\n return;\n }\n\n this._handleStop();\n }\n\n public toggleRecording(): void {\n this._handleClick();\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 @mousedown=${this._handleMouseDown}\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></icon-loading-spinner>`\n : isRecording\n ? html`<icon-recording></icon-recording>`\n : html`<icon-mic-on></icon-mic-on>`\n }\n <audio-visualiser\n .level=${this._mediaController.audioLevel}\n ?active=${isRecording}\n ></audio-visualiser>\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"recording-button\": RecordingButton;\n }\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import { type CSSResultGroup, LitElement, nothing } from "lit";
2
+ import type { ConfigurableSettings, RecordingState } from "../types.js";
3
+ import "./device-selector.js";
4
+ import "./language-selector.js";
5
+ import "../icons/icons.js";
6
+ export declare class SettingsMenu extends LitElement {
7
+ _recordingState: RecordingState;
8
+ settingsEnabled: ConfigurableSettings[];
9
+ static styles: CSSResultGroup;
10
+ render(): import("lit-html").TemplateResult<1> | typeof nothing;
11
+ }
12
+ declare global {
13
+ interface HTMLElementTagNameMap {
14
+ "settings-menu": SettingsMenu;
15
+ }
16
+ }
@@ -0,0 +1,80 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { consume } from "@lit/context";
8
+ import { html, LitElement, nothing } from "lit";
9
+ import { customElement, property, state } from "lit/decorators.js";
10
+ import { recordingStateContext } from "../contexts/dictation-context.js";
11
+ import ButtonStyles from "../styles/buttons.js";
12
+ import CalloutStyles from "../styles/callout.js";
13
+ import SettingsMenuStyles from "../styles/settings-menu.js";
14
+ import { commaSeparatedConverter } from "../utils/converters.js";
15
+ import "./device-selector.js";
16
+ import "./language-selector.js";
17
+ import "../icons/icons.js";
18
+ let SettingsMenu = class SettingsMenu extends LitElement {
19
+ constructor() {
20
+ super(...arguments);
21
+ this._recordingState = "stopped";
22
+ this.settingsEnabled = ["device", "language"];
23
+ }
24
+ render() {
25
+ if (this.settingsEnabled?.length === 0) {
26
+ return nothing;
27
+ }
28
+ const isRecording = this._recordingState === "recording";
29
+ const showDeviceSelector = this.settingsEnabled.includes("device");
30
+ const showLanguageSelector = this.settingsEnabled.includes("language");
31
+ return html `
32
+ <div class="mic-selector">
33
+ <button id="settings-popover-button" popovertarget="settings-popover">
34
+ <icon-settings></icon-settings>
35
+ </button>
36
+ <div id="settings-popover" popover>
37
+ <div class="settings-wrapper">
38
+ ${isRecording
39
+ ? html `
40
+ <div class="callout warn">
41
+ Recording is in progress. Stop recording to change settings.
42
+ </div>
43
+ `
44
+ : nothing}
45
+ ${showDeviceSelector
46
+ ? html `<device-selector
47
+ ?disabled=${isRecording}
48
+ ></device-selector>`
49
+ : nothing}
50
+ ${showLanguageSelector
51
+ ? html `<language-selector
52
+ ?disabled=${isRecording}
53
+ ></language-selector>`
54
+ : nothing}
55
+ </div>
56
+ </div>
57
+ </div>
58
+ `;
59
+ }
60
+ };
61
+ SettingsMenu.styles = [
62
+ SettingsMenuStyles,
63
+ ButtonStyles,
64
+ CalloutStyles,
65
+ ];
66
+ __decorate([
67
+ consume({ context: recordingStateContext, subscribe: true }),
68
+ state()
69
+ ], SettingsMenu.prototype, "_recordingState", void 0);
70
+ __decorate([
71
+ property({
72
+ converter: commaSeparatedConverter,
73
+ type: Array,
74
+ })
75
+ ], SettingsMenu.prototype, "settingsEnabled", void 0);
76
+ SettingsMenu = __decorate([
77
+ customElement("settings-menu")
78
+ ], SettingsMenu);
79
+ export { SettingsMenu };
80
+ //# sourceMappingURL=settings-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-menu.js","sourceRoot":"","sources":["../../../src/components/settings-menu.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAuB,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,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,sBAAsB,CAAC;AAC9B,OAAO,wBAAwB,CAAC;AAChC,OAAO,mBAAmB,CAAC;AAGpB,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAArC;;QAGL,oBAAe,GAAmB,SAAS,CAAC;QAM5C,oBAAe,GAA2B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAoDnE,CAAC;IA5CC,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;QAEvE,OAAO,IAAI,CAAA;;;;;;;cAQD,WAAW;YACT,CAAC,CAAC,IAAI,CAAA;;;;iBAIL;YACD,CAAC,CAAC,OACN;cAEE,kBAAkB;YAChB,CAAC,CAAC,IAAI,CAAA;8BACQ,WAAW;oCACL;YACpB,CAAC,CAAC,OACN;cAEE,oBAAoB;YAClB,CAAC,CAAC,IAAI,CAAA;8BACQ,WAAW;sCACH;YACtB,CAAC,CAAC,OACN;;;;KAIP,CAAC;IACJ,CAAC;;AAjDM,mBAAM,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;qDACoC;AAM5C;IAJC,QAAQ,CAAC;QACR,SAAS,EAAE,uBAAuB;QAClC,IAAI,EAAE,KAAK;KACZ,CAAC;qDAC+D;AATtD,YAAY;IADxB,aAAa,CAAC,eAAe,CAAC;GAClB,YAAY,CA6DxB","sourcesContent":["import { consume } from \"@lit/context\";\nimport { type CSSResultGroup, html, LitElement, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { recordingStateContext } from \"../contexts/dictation-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 \"./device-selector.js\";\nimport \"./language-selector.js\";\nimport \"../icons/icons.js\";\n\n@customElement(\"settings-menu\")\nexport class SettingsMenu extends LitElement {\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\n return html`\n <div class=\"mic-selector\">\n <button id=\"settings-popover-button\" popovertarget=\"settings-popover\">\n <icon-settings></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 ${\n showDeviceSelector\n ? html`<device-selector\n ?disabled=${isRecording}\n ></device-selector>`\n : nothing\n }\n ${\n showLanguageSelector\n ? html`<language-selector\n ?disabled=${isRecording}\n ></language-selector>`\n : nothing\n }\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"settings-menu\": SettingsMenu;\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { Corti } from "@corti/sdk";
2
+ export declare const LANGUAGES_SUPPORTED_EU: Corti.TranscribeSupportedLanguage[];
3
+ export declare const LANGUAGES_SUPPORTED_US: Corti.TranscribeSupportedLanguage[];
4
+ export declare const DEFAULT_DICTATION_CONFIG: Corti.TranscribeConfig;