@corti/dictation-web 0.7.0-ambient.2 → 0.7.0-ambient.4

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/dist/bundle.js CHANGED
@@ -1491,7 +1491,7 @@ _LanguagesController_autoLoadedLanguages = /* @__PURE__ */ new WeakMap(), _Langu
1491
1491
  const { languages, defaultLanguage } = getLanguagesByRegion(this.host.region);
1492
1492
  __classPrivateFieldSet2(this, _LanguagesController_autoLoadedLanguages, true, "f");
1493
1493
  this.host._languages = languages;
1494
- const previousLanguage = this.host.selectedLanguage;
1494
+ const previousLanguage = this.host._selectedLanguage;
1495
1495
  const selectedLanguage = previousLanguage && languages.includes(previousLanguage) ? previousLanguage : defaultLanguage;
1496
1496
  this.host._selectedLanguage = selectedLanguage;
1497
1497
  this.host.requestUpdate();
@@ -1531,23 +1531,20 @@ function LanguagesContextMixin(superclass) {
1531
1531
  if (value !== void 0) {
1532
1532
  __classPrivateFieldGet5(this, _LanguagesContextMixinClass_languagesController, "f").clearAutoLoadedFlag();
1533
1533
  }
1534
- if (value === void 0 || value.length === 0) {
1535
- this.selectedLanguage = void 0;
1534
+ if (value === void 0) {
1536
1535
  return;
1537
1536
  }
1538
- if (this.selectedLanguage === void 0 || !value.includes(this.selectedLanguage)) {
1539
- this.selectedLanguage = getPreferredDefaultLanguage(value);
1537
+ if (value.length === 0) {
1538
+ this._selectedLanguage = void 0;
1539
+ return;
1540
+ }
1541
+ if (this._selectedLanguage === void 0 || !value.includes(this._selectedLanguage)) {
1542
+ this._selectedLanguage = getPreferredDefaultLanguage(value);
1540
1543
  }
1541
1544
  }
1542
1545
  get languages() {
1543
1546
  return this._languages;
1544
1547
  }
1545
- set selectedLanguage(value) {
1546
- this._selectedLanguage = value;
1547
- }
1548
- get selectedLanguage() {
1549
- return this._selectedLanguage;
1550
- }
1551
1548
  constructor(...args) {
1552
1549
  super(...args);
1553
1550
  _LanguagesContextMixinClass_languagesController.set(this, new LanguagesController(this));
@@ -1560,7 +1557,7 @@ function LanguagesContextMixin(superclass) {
1560
1557
  this.addEventListener("languages-changed", (e10) => {
1561
1558
  const event = e10;
1562
1559
  const selectedLanguage = event.detail.selectedLanguage;
1563
- this.selectedLanguage = selectedLanguage ?? getPreferredDefaultLanguage(event.detail.languages);
1560
+ this._selectedLanguage = selectedLanguage ?? getPreferredDefaultLanguage(event.detail.languages);
1564
1561
  });
1565
1562
  }
1566
1563
  }
@@ -1579,9 +1576,6 @@ function LanguagesContextMixin(superclass) {
1579
1576
  type: Array
1580
1577
  })
1581
1578
  ], LanguagesContextMixinClass.prototype, "languages", null);
1582
- __decorate4([
1583
- n4({ type: String })
1584
- ], LanguagesContextMixinClass.prototype, "selectedLanguage", null);
1585
1579
  return LanguagesContextMixinClass;
1586
1580
  }
1587
1581
 
@@ -1695,10 +1689,7 @@ var AmbientRoot = class AmbientRoot2 extends RootContext {
1695
1689
  if (!changedProperties.has("ambientConfig")) {
1696
1690
  return;
1697
1691
  }
1698
- const configuredLanguage = this.ambientConfig?.transcription?.primaryLanguage ?? "en";
1699
- if (configuredLanguage !== void 0 && configuredLanguage !== this.selectedLanguage) {
1700
- this.selectedLanguage = configuredLanguage;
1701
- }
1692
+ this._selectedLanguage = this.ambientConfig?.transcription?.primaryLanguage ?? "en";
1702
1693
  }
1703
1694
  };
1704
1695
  __decorate8([
@@ -12804,7 +12795,7 @@ _SocketController_webSocket = /* @__PURE__ */ new WeakMap(), _SocketController_c
12804
12795
  return "superseded";
12805
12796
  }
12806
12797
  __classPrivateFieldSet3(this, _SocketController_webSocket, socket, "f");
12807
- __classPrivateFieldGet6(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
12798
+ callbacks?.onNetworkActivity?.("sent", {
12808
12799
  configuration: config,
12809
12800
  type: "config"
12810
12801
  });
@@ -12922,10 +12913,7 @@ var DictationRoot = class DictationRoot2 extends RootContext {
12922
12913
  if (!changedProperties.has("dictationConfig")) {
12923
12914
  return;
12924
12915
  }
12925
- const configuredLanguage = this.dictationConfig?.primaryLanguage;
12926
- if (configuredLanguage !== void 0 && configuredLanguage !== this.selectedLanguage) {
12927
- this.selectedLanguage = configuredLanguage;
12928
- }
12916
+ this._selectedLanguage = this.dictationConfig?.primaryLanguage;
12929
12917
  }
12930
12918
  };
12931
12919
  __decorate9([
@@ -13940,7 +13928,7 @@ var __classPrivateFieldGet10 = function(receiver, state, kind, f5) {
13940
13928
  };
13941
13929
  var _AmbientRecordingButton_instances;
13942
13930
  var _AmbientRecordingButton_trimmedInteractionId;
13943
- var interactionIdRequiredError = () => new Error("interactionId is required. Set interactionId on ambient-root.");
13931
+ var interactionIdRequiredError = () => new Error("interactionId is required. Set interactionId on corti-ambient or ambient-root.");
13944
13932
  var AmbientRecordingButton = class AmbientRecordingButton2 extends RecordingButtonBase {
13945
13933
  constructor() {
13946
13934
  super(...arguments);
@@ -14139,7 +14127,7 @@ var CortiRoot = class extends i5 {
14139
14127
  * Toggle-to-talk keybinding for keyboard shortcut. Single key only (e.g., "`", "k", "meta", "ctrl").
14140
14128
  * Combinations with "+" are not supported.
14141
14129
  * Pressing the key toggles recording on/off.
14142
- * Defaults to "`" if keybinding is in settingsEnabled, otherwise undefined
14130
+ * Defaults to "Enter" if keybinding is in settingsEnabled, otherwise undefined
14143
14131
  */
14144
14132
  set toggleToTalkKeybinding(value) {
14145
14133
  this._toggleToTalkKeybinding = value;
@@ -14652,6 +14640,7 @@ var DictationLanguageSelector = class DictationLanguageSelector2 extends i5 {
14652
14640
  id="language-select"
14653
14641
  aria-labelledby="language-select-label"
14654
14642
  @change=${__classPrivateFieldGet13(this, _DictationLanguageSelector_instances, "m", _DictationLanguageSelector_handleSelectLanguage)}
14643
+ .value=${this._selectedLanguage ?? ""}
14655
14644
  ?disabled=${this.disabled || !this._languages || this._languages.length === 0}
14656
14645
  >
14657
14646
  ${this._languages?.map((language) => x`
@@ -15001,12 +14990,16 @@ if (!customElements.get("dictation-keybinding-selector")) {
15001
14990
  if (!customElements.get("dictation-settings-menu")) {
15002
14991
  customElements.define("dictation-settings-menu", DictationSettingsMenu);
15003
14992
  }
14993
+ if (!customElements.get("ambient-root")) {
14994
+ customElements.define("ambient-root", AmbientRoot);
14995
+ }
15004
14996
  if (!customElements.get("dictation-root")) {
15005
14997
  customElements.define("dictation-root", DictationRoot);
15006
14998
  }
15007
14999
  var index_default = CortiDictation;
15008
15000
  export {
15009
15001
  AmbientRecordingButton,
15002
+ AmbientRoot,
15010
15003
  CortiAmbient,
15011
15004
  CortiDictation,
15012
15005
  DictationDeviceSelector,
@@ -17,7 +17,7 @@ import { ambientConfigContext, interactionIdContext, } from "../contexts/ambient
17
17
  import { AmbientController, } from "../controllers/ambient-controller.js";
18
18
  import { errorEvent } from "../utils/events.js";
19
19
  import { RecordingButtonBase } from "./recording-button-base.js";
20
- const interactionIdRequiredError = () => new Error("interactionId is required. Set interactionId on ambient-root.");
20
+ const interactionIdRequiredError = () => new Error("interactionId is required. Set interactionId on corti-ambient or ambient-root.");
21
21
  let AmbientRecordingButton = class AmbientRecordingButton extends RecordingButtonBase {
22
22
  constructor() {
23
23
  super(...arguments);
@@ -1 +1 @@
1
- {"version":3,"file":"ambient-recording-button.js","sourceRoot":"","sources":["../../src/components/ambient-recording-button.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,iBAAiB,GAGlB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,0BAA0B,GAAG,GAAG,EAAE,CACtC,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;AAGtE,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,mBAG3C;IAHM;;;QAYK,sBAAiB,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAoC5D,CAAC;IAlCiB,cAAc;QAC5B,IAAI,CAAC,uBAAA,IAAI,uFAAsB,MAA1B,IAAI,CAAwB,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC;IAEe,KAAK,CAAC,cAAc;QAClC,IAAI,CAAC,uBAAA,IAAI,uFAAsB,MAA1B,IAAI,CAAwB,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAES,iBAAiB;QACzB,MAAM,aAAa,GAAG,uBAAA,IAAI,uFAAsB,MAA1B,IAAI,CAAwB,CAAC;QAEnD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,0BAA0B,EAAE,CAAC;QACrC,CAAC;QAED,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,cAAc,IAAI,qBAAqB;YAC3D,aAAa;SACd,CAAC;IACJ,CAAC;CAKF,CAAA;;;IAFG,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC;AAzCO;IAFP,OAAO,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3D,KAAK,EAAE;8DACoC;AAIpC;IAFP,OAAO,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3D,KAAK,EAAE;8DACwB;AAVrB,sBAAsB;IADlC,aAAa,CAAC,0BAA0B,CAAC;GAC7B,sBAAsB,CAgDlC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { DEFAULT_STREAM_CONFIG } from \"../constants.js\";\nimport {\n ambientConfigContext,\n interactionIdContext,\n} from \"../contexts/ambient-context.js\";\nimport {\n AmbientController,\n type AmbientStreamSessionConfig,\n type StreamAmbientMessage,\n} from \"../controllers/ambient-controller.js\";\nimport { errorEvent } from \"../utils/events.js\";\nimport { RecordingButtonBase } from \"./recording-button-base.js\";\n\nconst interactionIdRequiredError = () =>\n new Error(\"interactionId is required. Set interactionId on ambient-root.\");\n\n@customElement(\"ambient-recording-button\")\nexport class AmbientRecordingButton extends RecordingButtonBase<\n AmbientStreamSessionConfig,\n StreamAmbientMessage\n> {\n @consume({ context: ambientConfigContext, subscribe: true })\n @state()\n private _ambientConfig?: Corti.StreamConfig;\n\n @consume({ context: interactionIdContext, subscribe: true })\n @state()\n private _interactionId?: string;\n\n protected _socketController = new AmbientController(this);\n\n public override startRecording(): void {\n if (!this.#trimmedInteractionId()) {\n this.dispatchEvent(errorEvent(interactionIdRequiredError()));\n return;\n }\n\n super.startRecording();\n }\n\n public override async openConnection(): Promise<void> {\n if (!this.#trimmedInteractionId()) {\n this.dispatchEvent(errorEvent(interactionIdRequiredError()));\n return;\n }\n\n await super.openConnection();\n }\n\n protected _getConnectConfig(): AmbientStreamSessionConfig {\n const interactionId = this.#trimmedInteractionId();\n\n if (!interactionId) {\n throw interactionIdRequiredError();\n }\n\n return {\n configuration: this._ambientConfig ?? DEFAULT_STREAM_CONFIG,\n interactionId,\n };\n }\n\n #trimmedInteractionId(): string | undefined {\n return this._interactionId?.trim();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ambient-recording-button\": AmbientRecordingButton;\n }\n}\n"]}
1
+ {"version":3,"file":"ambient-recording-button.js","sourceRoot":"","sources":["../../src/components/ambient-recording-button.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,iBAAiB,GAGlB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,0BAA0B,GAAG,GAAG,EAAE,CACtC,IAAI,KAAK,CACP,gFAAgF,CACjF,CAAC;AAGG,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,mBAG3C;IAHM;;;QAYK,sBAAiB,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAoC5D,CAAC;IAlCiB,cAAc;QAC5B,IAAI,CAAC,uBAAA,IAAI,uFAAsB,MAA1B,IAAI,CAAwB,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC;IAEe,KAAK,CAAC,cAAc;QAClC,IAAI,CAAC,uBAAA,IAAI,uFAAsB,MAA1B,IAAI,CAAwB,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAES,iBAAiB;QACzB,MAAM,aAAa,GAAG,uBAAA,IAAI,uFAAsB,MAA1B,IAAI,CAAwB,CAAC;QAEnD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,0BAA0B,EAAE,CAAC;QACrC,CAAC;QAED,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,cAAc,IAAI,qBAAqB;YAC3D,aAAa;SACd,CAAC;IACJ,CAAC;CAKF,CAAA;;;IAFG,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC;AAzCO;IAFP,OAAO,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3D,KAAK,EAAE;8DACoC;AAIpC;IAFP,OAAO,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3D,KAAK,EAAE;8DACwB;AAVrB,sBAAsB;IADlC,aAAa,CAAC,0BAA0B,CAAC;GAC7B,sBAAsB,CAgDlC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { DEFAULT_STREAM_CONFIG } from \"../constants.js\";\nimport {\n ambientConfigContext,\n interactionIdContext,\n} from \"../contexts/ambient-context.js\";\nimport {\n AmbientController,\n type AmbientStreamSessionConfig,\n type StreamAmbientMessage,\n} from \"../controllers/ambient-controller.js\";\nimport { errorEvent } from \"../utils/events.js\";\nimport { RecordingButtonBase } from \"./recording-button-base.js\";\n\nconst interactionIdRequiredError = () =>\n new Error(\n \"interactionId is required. Set interactionId on corti-ambient or ambient-root.\",\n );\n\n@customElement(\"ambient-recording-button\")\nexport class AmbientRecordingButton extends RecordingButtonBase<\n AmbientStreamSessionConfig,\n StreamAmbientMessage\n> {\n @consume({ context: ambientConfigContext, subscribe: true })\n @state()\n private _ambientConfig?: Corti.StreamConfig;\n\n @consume({ context: interactionIdContext, subscribe: true })\n @state()\n private _interactionId?: string;\n\n protected _socketController = new AmbientController(this);\n\n public override startRecording(): void {\n if (!this.#trimmedInteractionId()) {\n this.dispatchEvent(errorEvent(interactionIdRequiredError()));\n return;\n }\n\n super.startRecording();\n }\n\n public override async openConnection(): Promise<void> {\n if (!this.#trimmedInteractionId()) {\n this.dispatchEvent(errorEvent(interactionIdRequiredError()));\n return;\n }\n\n await super.openConnection();\n }\n\n protected _getConnectConfig(): AmbientStreamSessionConfig {\n const interactionId = this.#trimmedInteractionId();\n\n if (!interactionId) {\n throw interactionIdRequiredError();\n }\n\n return {\n configuration: this._ambientConfig ?? DEFAULT_STREAM_CONFIG,\n interactionId,\n };\n }\n\n #trimmedInteractionId(): string | undefined {\n return this._interactionId?.trim();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ambient-recording-button\": AmbientRecordingButton;\n }\n}\n"]}
@@ -42,13 +42,12 @@ export declare class CortiRoot<TRoot extends CortiProviderRoot = CortiProviderRo
42
42
  /**
43
43
  * Which settings should be available in the UI.
44
44
  * If an empty array is passed, the settings will be disabled entirely.
45
- * Options are language and devices
46
45
  */
47
46
  settingsEnabled: ConfigurableSettings[];
48
47
  /**
49
- * When false (default), allows the start/stop button from taking focus when clicked,
50
- * disabling textareas or other input elements to maintain focus.
51
- * Set to "true" to allow the button to receive focus on click.
48
+ * When false (default), clicking the start/stop button does not move focus
49
+ * to the button, allowing textareas or other input elements to keep focus.
50
+ * Set to true to allow the button to receive focus on click.
52
51
  */
53
52
  allowButtonFocus: boolean;
54
53
  /**
@@ -83,7 +82,7 @@ export declare class CortiRoot<TRoot extends CortiProviderRoot = CortiProviderRo
83
82
  * Toggle-to-talk keybinding for keyboard shortcut. Single key only (e.g., "`", "k", "meta", "ctrl").
84
83
  * Combinations with "+" are not supported.
85
84
  * Pressing the key toggles recording on/off.
86
- * Defaults to "`" if keybinding is in settingsEnabled, otherwise undefined
85
+ * Defaults to "Enter" if keybinding is in settingsEnabled, otherwise undefined
87
86
  */
88
87
  set toggleToTalkKeybinding(value: string | null | undefined);
89
88
  get toggleToTalkKeybinding(): string | null | undefined;
@@ -18,13 +18,12 @@ export class CortiRoot extends LitElement {
18
18
  /**
19
19
  * Which settings should be available in the UI.
20
20
  * If an empty array is passed, the settings will be disabled entirely.
21
- * Options are language and devices
22
21
  */
23
22
  this.settingsEnabled = ["device", "language"];
24
23
  /**
25
- * When false (default), allows the start/stop button from taking focus when clicked,
26
- * disabling textareas or other input elements to maintain focus.
27
- * Set to "true" to allow the button to receive focus on click.
24
+ * When false (default), clicking the start/stop button does not move focus
25
+ * to the button, allowing textareas or other input elements to keep focus.
26
+ * Set to true to allow the button to receive focus on click.
28
27
  */
29
28
  this.allowButtonFocus = false;
30
29
  this._contextProviderRef = createRef();
@@ -77,7 +76,7 @@ export class CortiRoot extends LitElement {
77
76
  * Toggle-to-talk keybinding for keyboard shortcut. Single key only (e.g., "`", "k", "meta", "ctrl").
78
77
  * Combinations with "+" are not supported.
79
78
  * Pressing the key toggles recording on/off.
80
- * Defaults to "`" if keybinding is in settingsEnabled, otherwise undefined
79
+ * Defaults to "Enter" if keybinding is in settingsEnabled, otherwise undefined
81
80
  */
82
81
  set toggleToTalkKeybinding(value) {
83
82
  this._toggleToTalkKeybinding = value;
@@ -1 +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 * Options are language and devices\n */\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n settingsEnabled: ConfigurableSettings[] = [\"device\", \"language\"];\n\n /**\n * When false (default), allows the start/stop button from taking focus when clicked,\n * disabling textareas or other input elements to maintain 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 \"`\" 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"]}
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"]}
@@ -33,6 +33,7 @@ let DictationLanguageSelector = class DictationLanguageSelector extends LitEleme
33
33
  id="language-select"
34
34
  aria-labelledby="language-select-label"
35
35
  @change=${__classPrivateFieldGet(this, _DictationLanguageSelector_instances, "m", _DictationLanguageSelector_handleSelectLanguage)}
36
+ .value=${this._selectedLanguage ?? ""}
36
37
  ?disabled=${this.disabled || !this._languages || this._languages.length === 0}
37
38
  >
38
39
  ${this._languages?.map((language) => html `
@@ -1 +1 @@
1
- {"version":3,"file":"language-selector.js","sourceRoot":"","sources":["../../src/components/language-selector.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,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,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;AAGjD,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,UAAU;IAAlD;;;QAUL,aAAQ,GAAY,KAAK,CAAC;IAuC5B,CAAC;IA1BC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;oBAQK,uBAAA,IAAI,6FAAsB;sBACxB,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;;;2GAlCqB,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,qCAAqC;IACrC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrD,CAAC;AATM,gCAAM,GAAG,YAAY,AAAf,CAAgB;AAT7B;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACvD,KAAK,EAAE;6DACyC;AAIjD;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9D,KAAK,EAAE;oEAC8C;AAGtD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;2DACF;AAVf,yBAAyB;IADrC,aAAa,CAAC,6BAA6B,CAAC;GAChC,yBAAyB,CAiDrC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport { html, LitElement } from \"lit\";\nimport { customElement, 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\n@customElement(\"dictation-language-selector\")\nexport class DictationLanguageSelector 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 // 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 Spoken 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._selectedLanguage === language}\n >\n ${getLanguageName(language)}\n </option>\n `,\n )}\n </select>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"dictation-language-selector\": DictationLanguageSelector;\n }\n}\n"]}
1
+ {"version":3,"file":"language-selector.js","sourceRoot":"","sources":["../../src/components/language-selector.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,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,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;AAGjD,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,UAAU;IAAlD;;;QAUL,aAAQ,GAAY,KAAK,CAAC;IAwC5B,CAAC;IA3BC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;oBAQK,uBAAA,IAAI,6FAAsB;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;;;2GAnCqB,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,qCAAqC;IACrC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrD,CAAC;AATM,gCAAM,GAAG,YAAY,AAAf,CAAgB;AAT7B;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACvD,KAAK,EAAE;6DACyC;AAIjD;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC9D,KAAK,EAAE;oEAC8C;AAGtD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;2DACF;AAVf,yBAAyB;IADrC,aAAa,CAAC,6BAA6B,CAAC;GAChC,yBAAyB,CAkDrC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport { html, LitElement } from \"lit\";\nimport { customElement, 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\n@customElement(\"dictation-language-selector\")\nexport class DictationLanguageSelector 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 // 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 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\ndeclare global {\n interface HTMLElementTagNameMap {\n \"dictation-language-selector\": DictationLanguageSelector;\n }\n}\n"]}
@@ -37,12 +37,8 @@ let AmbientRoot = class AmbientRoot extends RootContext {
37
37
  if (!changedProperties.has("ambientConfig")) {
38
38
  return;
39
39
  }
40
- const configuredLanguage = this.ambientConfig?.transcription?.primaryLanguage ?? "en";
41
- if (configuredLanguage !== undefined &&
42
- configuredLanguage !== this.selectedLanguage) {
43
- this.selectedLanguage =
44
- configuredLanguage;
45
- }
40
+ this._selectedLanguage =
41
+ this.ambientConfig?.transcription?.primaryLanguage ?? "en";
46
42
  }
47
43
  };
48
44
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"ambient-context.js","sourceRoot":"","sources":["../../src/contexts/ambient-context.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAE/C,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;AAE3B,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAC/C,MAAM,CAAC,eAAe,CAAC,CACxB,CAAC;AAGK,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,WAAW;IAS1C;QACE,KAAK,EAAE,CAAC;QAPV,kBAAa,GAAuB,qBAAqB,CAAC;QASxD,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAQ,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,CAAgB,CAAC;YAE/B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB;gBACzC,IAAI,CAAsC,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,IAAI,qBAAqB,CAAC;YAEzD,IAAI,CAAC,aAAa,GAAG;gBACnB,GAAG,IAAI;gBACP,IAAI,EAAE;oBACJ,GAAG,IAAI,CAAC,IAAI;oBACZ,YAAY,EAAE,IAAI;iBACnB;gBACD,aAAa,EAAE;oBACb,GAAG,IAAI,CAAC,aAAa;oBACrB,eAAe,EAAE,IAAI;iBACtB;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEkB,UAAU,CAAC,iBAAiC;QAC7D,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAEpC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,GACtB,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,eAAe,IAAI,IAAI,CAAC;QAE7D,IACE,kBAAkB,KAAK,SAAS;YAChC,kBAAkB,KAAK,IAAI,CAAC,gBAAgB,EAC5C,CAAC;YACD,IAAI,CAAC,gBAAgB;gBACnB,kBAAuD,CAAC;QAC5D,CAAC;IACH,CAAC;CACF,CAAA;AAhDC;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACa;AAI1D;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACJ;AAPZ,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CAmDvB","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { createContext, provide } from \"@lit/context\";\nimport type { PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { DEFAULT_STREAM_CONFIG } from \"../constants.js\";\nimport { RootContext } from \"./root-context.js\";\n\nexport const ambientConfigContext = createContext<\n Corti.StreamConfig | undefined\n>(Symbol(\"ambientConfig\"));\n\nexport const interactionIdContext = createContext<string | undefined>(\n Symbol(\"interactionId\"),\n);\n\n@customElement(\"ambient-root\")\nexport class AmbientRoot extends RootContext {\n @provide({ context: ambientConfigContext })\n @property({ attribute: false, type: Object })\n ambientConfig: Corti.StreamConfig = DEFAULT_STREAM_CONFIG;\n\n @provide({ context: interactionIdContext })\n @property({ type: String })\n interactionId?: string;\n\n constructor() {\n super();\n\n this.addEventListener(\"languages-changed\", (e: Event) => {\n const event = e as CustomEvent;\n\n const lang = (event.detail.selectedLanguage ??\n \"en\") as Corti.TranscribeSupportedLanguage;\n const base = this.ambientConfig ?? DEFAULT_STREAM_CONFIG;\n\n this.ambientConfig = {\n ...base,\n mode: {\n ...base.mode,\n outputLocale: lang,\n },\n transcription: {\n ...base.transcription,\n primaryLanguage: lang,\n },\n };\n });\n }\n\n protected override willUpdate(changedProperties: PropertyValues): void {\n super.willUpdate(changedProperties);\n\n if (!changedProperties.has(\"ambientConfig\")) {\n return;\n }\n\n const configuredLanguage =\n this.ambientConfig?.transcription?.primaryLanguage ?? \"en\";\n\n if (\n configuredLanguage !== undefined &&\n configuredLanguage !== this.selectedLanguage\n ) {\n this.selectedLanguage =\n configuredLanguage as Corti.TranscribeSupportedLanguage;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ambient-root\": AmbientRoot;\n }\n}\n"]}
1
+ {"version":3,"file":"ambient-context.js","sourceRoot":"","sources":["../../src/contexts/ambient-context.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAE/C,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;AAE3B,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAC/C,MAAM,CAAC,eAAe,CAAC,CACxB,CAAC;AAGK,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,WAAW;IAS1C;QACE,KAAK,EAAE,CAAC;QAPV,kBAAa,GAAuB,qBAAqB,CAAC;QASxD,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAQ,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,CAAgB,CAAC;YAE/B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB;gBACzC,IAAI,CAAsC,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,IAAI,qBAAqB,CAAC;YAEzD,IAAI,CAAC,aAAa,GAAG;gBACnB,GAAG,IAAI;gBACP,IAAI,EAAE;oBACJ,GAAG,IAAI,CAAC,IAAI;oBACZ,YAAY,EAAE,IAAI;iBACnB;gBACD,aAAa,EAAE;oBACb,GAAG,IAAI,CAAC,aAAa;oBACrB,eAAe,EAAE,IAAI;iBACtB;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEkB,UAAU,CAAC,iBAAiC;QAC7D,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAEpC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB;YACpB,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,eAAe,IAAI,IAAI,CAAC;IAC/D,CAAC;CACF,CAAA;AAxCC;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACa;AAI1D;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACJ;AAPZ,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CA2CvB","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { createContext, provide } from \"@lit/context\";\nimport type { PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { DEFAULT_STREAM_CONFIG } from \"../constants.js\";\nimport { RootContext } from \"./root-context.js\";\n\nexport const ambientConfigContext = createContext<\n Corti.StreamConfig | undefined\n>(Symbol(\"ambientConfig\"));\n\nexport const interactionIdContext = createContext<string | undefined>(\n Symbol(\"interactionId\"),\n);\n\n@customElement(\"ambient-root\")\nexport class AmbientRoot extends RootContext {\n @provide({ context: ambientConfigContext })\n @property({ attribute: false, type: Object })\n ambientConfig: Corti.StreamConfig = DEFAULT_STREAM_CONFIG;\n\n @provide({ context: interactionIdContext })\n @property({ type: String })\n interactionId?: string;\n\n constructor() {\n super();\n\n this.addEventListener(\"languages-changed\", (e: Event) => {\n const event = e as CustomEvent;\n\n const lang = (event.detail.selectedLanguage ??\n \"en\") as Corti.TranscribeSupportedLanguage;\n const base = this.ambientConfig ?? DEFAULT_STREAM_CONFIG;\n\n this.ambientConfig = {\n ...base,\n mode: {\n ...base.mode,\n outputLocale: lang,\n },\n transcription: {\n ...base.transcription,\n primaryLanguage: lang,\n },\n };\n });\n }\n\n protected override willUpdate(changedProperties: PropertyValues): void {\n super.willUpdate(changedProperties);\n\n if (!changedProperties.has(\"ambientConfig\")) {\n return;\n }\n\n this._selectedLanguage =\n this.ambientConfig?.transcription?.primaryLanguage ?? \"en\";\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ambient-root\": AmbientRoot;\n }\n}\n"]}
@@ -29,11 +29,7 @@ let DictationRoot = class DictationRoot extends RootContext {
29
29
  if (!changedProperties.has("dictationConfig")) {
30
30
  return;
31
31
  }
32
- const configuredLanguage = this.dictationConfig?.primaryLanguage;
33
- if (configuredLanguage !== undefined &&
34
- configuredLanguage !== this.selectedLanguage) {
35
- this.selectedLanguage = configuredLanguage;
36
- }
32
+ this._selectedLanguage = this.dictationConfig?.primaryLanguage;
37
33
  }
38
34
  };
39
35
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"dictation-context.js","sourceRoot":"","sources":["../../src/contexts/dictation-context.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAEjD,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CACnD,MAAM,CAAC,mBAAmB,CAAC,CAC5B,CAAC;AAEK,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,WAAW;IAa5C,gFAAgF;IAChF,YAAY;IACZ,gFAAgF;IAEhF;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAQ,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,CAAgB,CAAC;YAC/B,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,gBAEzB,CAAC;YAEd,IAAI,CAAC,eAAe,GAAG;gBACrB,GAAG,IAAI,CAAC,eAAe;gBACvB,eAAe,EAAE,gBAAgB,IAAI,IAAI;aAC1C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEkB,UAAU,CAAC,iBAAiC;QAC7D,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAEpC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC;QAEjE,IACE,kBAAkB,KAAK,SAAS;YAChC,kBAAkB,KAAK,IAAI,CAAC,gBAAgB,EAC5C,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,kBAAkB,CAAC;QAC7C,CAAC;IACH,CAAC;CACF,CAAA;AA1CC;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDACJ;AAIzC;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;IAC9C,QAAQ,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;yDACjC;AAXlB,aAAa;IADzB,aAAa,CAAC,gBAAgB,CAAC;GACnB,aAAa,CAiDzB","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { createContext, provide } from \"@lit/context\";\nimport type { PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { RootContext } from \"./root-context.js\";\n\nexport const dictationConfigContext = createContext<\n Corti.TranscribeConfig | undefined\n>(Symbol(\"dictationConfig\"));\nexport const debugDisplayAudioContext = createContext<boolean | undefined>(\n Symbol(\"debugDisplayAudio\"),\n);\n@customElement(\"dictation-root\")\nexport class DictationRoot extends RootContext {\n // ─────────────────────────────────────────────────────────────────────────────\n // Properties\n // ─────────────────────────────────────────────────────────────────────────────\n\n @provide({ context: dictationConfigContext })\n @property({ attribute: false, type: Object })\n dictationConfig?: Corti.TranscribeConfig;\n\n @provide({ context: debugDisplayAudioContext })\n @property({ attribute: \"debug-display-audio\", type: Boolean })\n debug_displayAudio?: boolean;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n constructor() {\n super();\n\n this.addEventListener(\"languages-changed\", (e: Event) => {\n const event = e as CustomEvent;\n const selectedLanguage = event.detail.selectedLanguage as\n | Corti.TranscribeSupportedLanguage\n | undefined;\n\n this.dictationConfig = {\n ...this.dictationConfig,\n primaryLanguage: selectedLanguage ?? \"en\",\n };\n });\n }\n\n protected override willUpdate(changedProperties: PropertyValues): void {\n super.willUpdate(changedProperties);\n\n if (!changedProperties.has(\"dictationConfig\")) {\n return;\n }\n\n const configuredLanguage = this.dictationConfig?.primaryLanguage;\n\n if (\n configuredLanguage !== undefined &&\n configuredLanguage !== this.selectedLanguage\n ) {\n this.selectedLanguage = configuredLanguage;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"dictation-root\": DictationRoot;\n }\n}\n"]}
1
+ {"version":3,"file":"dictation-context.js","sourceRoot":"","sources":["../../src/contexts/dictation-context.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAEjD,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CACnD,MAAM,CAAC,mBAAmB,CAAC,CAC5B,CAAC;AAEK,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,WAAW;IAa5C,gFAAgF;IAChF,YAAY;IACZ,gFAAgF;IAEhF;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAQ,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,CAAgB,CAAC;YAC/B,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,gBAEzB,CAAC;YAEd,IAAI,CAAC,eAAe,GAAG;gBACrB,GAAG,IAAI,CAAC,eAAe;gBACvB,eAAe,EAAE,gBAAgB,IAAI,IAAI;aAC1C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEkB,UAAU,CAAC,iBAAiC;QAC7D,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAEpC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC;IACjE,CAAC;CACF,CAAA;AAnCC;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDACJ;AAIzC;IAFC,OAAO,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;IAC9C,QAAQ,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;yDACjC;AAXlB,aAAa;IADzB,aAAa,CAAC,gBAAgB,CAAC;GACnB,aAAa,CA0CzB","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { createContext, provide } from \"@lit/context\";\nimport type { PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { RootContext } from \"./root-context.js\";\n\nexport const dictationConfigContext = createContext<\n Corti.TranscribeConfig | undefined\n>(Symbol(\"dictationConfig\"));\nexport const debugDisplayAudioContext = createContext<boolean | undefined>(\n Symbol(\"debugDisplayAudio\"),\n);\n@customElement(\"dictation-root\")\nexport class DictationRoot extends RootContext {\n // ─────────────────────────────────────────────────────────────────────────────\n // Properties\n // ─────────────────────────────────────────────────────────────────────────────\n\n @provide({ context: dictationConfigContext })\n @property({ attribute: false, type: Object })\n dictationConfig?: Corti.TranscribeConfig;\n\n @provide({ context: debugDisplayAudioContext })\n @property({ attribute: \"debug-display-audio\", type: Boolean })\n debug_displayAudio?: boolean;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n constructor() {\n super();\n\n this.addEventListener(\"languages-changed\", (e: Event) => {\n const event = e as CustomEvent;\n const selectedLanguage = event.detail.selectedLanguage as\n | Corti.TranscribeSupportedLanguage\n | undefined;\n\n this.dictationConfig = {\n ...this.dictationConfig,\n primaryLanguage: selectedLanguage ?? \"en\",\n };\n });\n }\n\n protected override willUpdate(changedProperties: PropertyValues): void {\n super.willUpdate(changedProperties);\n\n if (!changedProperties.has(\"dictationConfig\")) {\n return;\n }\n\n this._selectedLanguage = this.dictationConfig?.primaryLanguage;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"dictation-root\": DictationRoot;\n }\n}\n"]}
@@ -11,6 +11,5 @@ export declare class LanguagesContextInterface {
11
11
  _languages?: Corti.TranscribeSupportedLanguage[];
12
12
  _selectedLanguage?: Corti.TranscribeSupportedLanguage;
13
13
  languages?: Corti.TranscribeSupportedLanguage[];
14
- selectedLanguage?: Corti.TranscribeSupportedLanguage;
15
14
  }
16
15
  export declare function LanguagesContextMixin<T extends Constructor<LitElement>>(superclass: T): Constructor<LanguagesContextInterface> & T;
@@ -25,24 +25,21 @@ export function LanguagesContextMixin(superclass) {
25
25
  if (value !== undefined) {
26
26
  __classPrivateFieldGet(this, _LanguagesContextMixinClass_languagesController, "f").clearAutoLoadedFlag();
27
27
  }
28
- if (value === undefined || value.length === 0) {
29
- this.selectedLanguage = undefined;
28
+ if (value === undefined) {
30
29
  return;
31
30
  }
32
- if (this.selectedLanguage === undefined ||
33
- !value.includes(this.selectedLanguage)) {
34
- this.selectedLanguage = getPreferredDefaultLanguage(value);
31
+ if (value.length === 0) {
32
+ this._selectedLanguage = undefined;
33
+ return;
34
+ }
35
+ if (this._selectedLanguage === undefined ||
36
+ !value.includes(this._selectedLanguage)) {
37
+ this._selectedLanguage = getPreferredDefaultLanguage(value);
35
38
  }
36
39
  }
37
40
  get languages() {
38
41
  return this._languages;
39
42
  }
40
- set selectedLanguage(value) {
41
- this._selectedLanguage = value;
42
- }
43
- get selectedLanguage() {
44
- return this._selectedLanguage;
45
- }
46
43
  constructor(...args) {
47
44
  super(...args);
48
45
  _LanguagesContextMixinClass_languagesController.set(this, new LanguagesController(this));
@@ -55,7 +52,7 @@ export function LanguagesContextMixin(superclass) {
55
52
  this.addEventListener("languages-changed", (e) => {
56
53
  const event = e;
57
54
  const selectedLanguage = event.detail.selectedLanguage;
58
- this.selectedLanguage =
55
+ this._selectedLanguage =
59
56
  selectedLanguage ??
60
57
  getPreferredDefaultLanguage(event.detail.languages);
61
58
  });
@@ -76,9 +73,6 @@ export function LanguagesContextMixin(superclass) {
76
73
  type: Array,
77
74
  })
78
75
  ], LanguagesContextMixinClass.prototype, "languages", null);
79
- __decorate([
80
- property({ type: String })
81
- ], LanguagesContextMixinClass.prototype, "selectedLanguage", null);
82
76
  return LanguagesContextMixinClass;
83
77
  }
84
78
  //# sourceMappingURL=languages-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"languages-context.js","sourceRoot":"","sources":["../../../src/contexts/mixins/languages-context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { type ContextEvent, createContext, provide } from \"@lit/context\";\nimport type { LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { LanguagesController } from \"../../controllers/languages-controller.js\";\nimport { commaSeparatedConverter } from \"../../utils/converters.js\";\nimport type { LanguagesChangedEventDetail } from \"../../utils/events.js\";\nimport { getPreferredDefaultLanguage } from \"../../utils/languages.js\";\nimport type { Constructor } from \"./types.js\";\n\nexport const languagesContext = createContext<\n Corti.TranscribeSupportedLanguage[] | undefined\n>(Symbol(\"languages\"));\nexport const selectedLanguageContext = createContext<\n Corti.TranscribeSupportedLanguage | undefined\n>(Symbol(\"selectedLanguage\"));\n\nexport declare class LanguagesContextInterface {\n _languages?: Corti.TranscribeSupportedLanguage[];\n _selectedLanguage?: Corti.TranscribeSupportedLanguage;\n languages?: Corti.TranscribeSupportedLanguage[];\n selectedLanguage?: Corti.TranscribeSupportedLanguage;\n}\n\nexport function LanguagesContextMixin<T extends Constructor<LitElement>>(\n superclass: T,\n): Constructor<LanguagesContextInterface> & T {\n class LanguagesContextMixinClass extends superclass {\n #languagesController = new LanguagesController(this);\n\n @provide({ context: languagesContext })\n @state()\n _languages?: Corti.TranscribeSupportedLanguage[];\n\n @provide({ context: selectedLanguageContext })\n @state()\n _selectedLanguage?: Corti.TranscribeSupportedLanguage;\n\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n set languages(value: Corti.TranscribeSupportedLanguage[] | undefined) {\n this._languages = value;\n\n // Clear auto-loaded flag when languages are set via property\n if (value !== undefined) {\n this.#languagesController.clearAutoLoadedFlag();\n }\n\n if (value === undefined || value.length === 0) {\n this.selectedLanguage = undefined;\n return;\n }\n\n if (\n this.selectedLanguage === undefined ||\n !value.includes(this.selectedLanguage)\n ) {\n this.selectedLanguage = getPreferredDefaultLanguage(value);\n }\n }\n\n get languages(): Corti.TranscribeSupportedLanguage[] | undefined {\n return this._languages;\n }\n\n @property({ type: String })\n set selectedLanguage(value: Corti.TranscribeSupportedLanguage | undefined) {\n this._selectedLanguage = value;\n }\n\n get selectedLanguage(): Corti.TranscribeSupportedLanguage | undefined {\n return this._selectedLanguage;\n }\n\n constructor(...args: any[]) {\n super(...args);\n\n this.addEventListener(\"context-request\", (e: Event) => {\n const ev = e as ContextEvent<typeof languagesContext>;\n\n if (ev.context === languagesContext) {\n this.#languagesController.initialize();\n }\n });\n\n this.addEventListener(\"languages-changed\", (e: Event) => {\n const event = e as CustomEvent<LanguagesChangedEventDetail>;\n const selectedLanguage = event.detail.selectedLanguage as\n | Corti.TranscribeSupportedLanguage\n | undefined;\n\n this.selectedLanguage =\n selectedLanguage ??\n getPreferredDefaultLanguage(event.detail.languages);\n });\n }\n }\n\n return LanguagesContextMixinClass as Constructor<LanguagesContextInterface> &\n T;\n}\n"]}
1
+ {"version":3,"file":"languages-context.js","sourceRoot":"","sources":["../../../src/contexts/mixins/languages-context.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,EAAqB,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAGvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAE3C,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AACvB,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAElD,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAQ9B,MAAM,UAAU,qBAAqB,CACnC,UAAa;;IAEb,MAAM,0BAA2B,SAAQ,UAAU;QAejD,IAAI,SAAS,CAAC,KAAsD;YAClE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YAExB,6DAA6D;YAC7D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,uBAAA,IAAI,uDAAqB,CAAC,mBAAmB,EAAE,CAAC;YAClD,CAAC;YAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,IACE,IAAI,CAAC,iBAAiB,KAAK,SAAS;gBACpC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,EACvC,CAAC;gBACD,IAAI,CAAC,iBAAiB,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,IAAI,SAAS;YACX,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAED,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YA5CjB,0DAAuB,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAC;YA8CnD,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,CAAQ,EAAE,EAAE;gBACpD,MAAM,EAAE,GAAG,CAA0C,CAAC;gBAEtD,IAAI,EAAE,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;oBACpC,uBAAA,IAAI,uDAAqB,CAAC,UAAU,EAAE,CAAC;gBACzC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAQ,EAAE,EAAE;gBACtD,MAAM,KAAK,GAAG,CAA6C,CAAC;gBAC5D,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,gBAEzB,CAAC;gBAEd,IAAI,CAAC,iBAAiB;oBACpB,gBAAgB;wBAChB,2BAA2B,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;QACL,CAAC;KACF;;IA7DC;QAFC,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QACtC,KAAK,EAAE;kEACyC;IAIjD;QAFC,OAAO,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;QAC7C,KAAK,EAAE;yEAC8C;IAMtD;QAJC,QAAQ,CAAC;YACR,SAAS,EAAE,uBAAuB;YAClC,IAAI,EAAE,KAAK;SACZ,CAAC;+DAwBD;IA8BH,OAAO,0BACJ,CAAC;AACN,CAAC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { type ContextEvent, createContext, provide } from \"@lit/context\";\nimport type { LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { LanguagesController } from \"../../controllers/languages-controller.js\";\nimport { commaSeparatedConverter } from \"../../utils/converters.js\";\nimport type { LanguagesChangedEventDetail } from \"../../utils/events.js\";\nimport { getPreferredDefaultLanguage } from \"../../utils/languages.js\";\nimport type { Constructor } from \"./types.js\";\n\nexport const languagesContext = createContext<\n Corti.TranscribeSupportedLanguage[] | undefined\n>(Symbol(\"languages\"));\nexport const selectedLanguageContext = createContext<\n Corti.TranscribeSupportedLanguage | undefined\n>(Symbol(\"selectedLanguage\"));\n\nexport declare class LanguagesContextInterface {\n _languages?: Corti.TranscribeSupportedLanguage[];\n _selectedLanguage?: Corti.TranscribeSupportedLanguage;\n languages?: Corti.TranscribeSupportedLanguage[];\n}\n\nexport function LanguagesContextMixin<T extends Constructor<LitElement>>(\n superclass: T,\n): Constructor<LanguagesContextInterface> & T {\n class LanguagesContextMixinClass extends superclass {\n #languagesController = new LanguagesController(this);\n\n @provide({ context: languagesContext })\n @state()\n _languages?: Corti.TranscribeSupportedLanguage[];\n\n @provide({ context: selectedLanguageContext })\n @state()\n _selectedLanguage?: Corti.TranscribeSupportedLanguage;\n\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n set languages(value: Corti.TranscribeSupportedLanguage[] | undefined) {\n this._languages = value;\n\n // Clear auto-loaded flag when languages are set via property\n if (value !== undefined) {\n this.#languagesController.clearAutoLoadedFlag();\n }\n\n if (value === undefined) {\n return;\n }\n\n if (value.length === 0) {\n this._selectedLanguage = undefined;\n return;\n }\n\n if (\n this._selectedLanguage === undefined ||\n !value.includes(this._selectedLanguage)\n ) {\n this._selectedLanguage = getPreferredDefaultLanguage(value);\n }\n }\n\n get languages(): Corti.TranscribeSupportedLanguage[] | undefined {\n return this._languages;\n }\n\n constructor(...args: any[]) {\n super(...args);\n\n this.addEventListener(\"context-request\", (e: Event) => {\n const ev = e as ContextEvent<typeof languagesContext>;\n\n if (ev.context === languagesContext) {\n this.#languagesController.initialize();\n }\n });\n\n this.addEventListener(\"languages-changed\", (e: Event) => {\n const event = e as CustomEvent<LanguagesChangedEventDetail>;\n const selectedLanguage = event.detail.selectedLanguage as\n | Corti.TranscribeSupportedLanguage\n | undefined;\n\n this._selectedLanguage =\n selectedLanguage ??\n getPreferredDefaultLanguage(event.detail.languages);\n });\n }\n }\n\n return LanguagesContextMixinClass as Constructor<LanguagesContextInterface> &\n T;\n}\n"]}
@@ -6,7 +6,6 @@ interface LanguagesControllerHost extends ReactiveControllerHost {
6
6
  requestUpdate(): void;
7
7
  _languages?: Corti.TranscribeSupportedLanguage[];
8
8
  _selectedLanguage?: Corti.TranscribeSupportedLanguage;
9
- selectedLanguage?: Corti.TranscribeSupportedLanguage;
10
9
  }
11
10
  /**
12
11
  * Controller that manages automatic language loading based on region.
@@ -62,7 +62,7 @@ _LanguagesController_autoLoadedLanguages = new WeakMap(), _LanguagesController_l
62
62
  const { languages, defaultLanguage } = getLanguagesByRegion(this.host.region);
63
63
  __classPrivateFieldSet(this, _LanguagesController_autoLoadedLanguages, true, "f");
64
64
  this.host._languages = languages;
65
- const previousLanguage = this.host.selectedLanguage;
65
+ const previousLanguage = this.host._selectedLanguage;
66
66
  const selectedLanguage = previousLanguage && languages.includes(previousLanguage)
67
67
  ? previousLanguage
68
68
  : defaultLanguage;
@@ -1 +1 @@
1
- {"version":3,"file":"languages-controller.js","sourceRoot":"","sources":["../../src/controllers/languages-controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAW7D;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IAO9B,YAAY,IAA6B;;QALzC,mDAAgC,KAAK,EAAC;QACtC,gDAA6B,KAAK,EAAC;QACnC,sDAAyB;QACzB,2CAAwB,KAAK,EAAC;QAG5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,uBAAA,IAAI,oCAAgB,IAAI,MAAA,CAAC;QAEzB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACvC,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB,CAAC;QACxB,CAAC;IACH,CAAC;IAED,UAAU;QACR,6CAA6C;QAC7C,IAAI,CAAC,uBAAA,IAAI,wCAAa,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,IACE,CAAC,uBAAA,IAAI,2CAAgB,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;YACxC,uBAAA,IAAI,gDAAqB,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAClC,CAAC;YACD,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB,CAAC;QACxB,CAAC;QAED,uBAAA,IAAI,uCAAmB,IAAI,CAAC,IAAI,CAAC,MAAM,MAAA,CAAC;IAC1C,CAAC;IAmCD;;OAEG;IACH,mBAAmB;QACjB,uBAAA,IAAI,4CAAwB,KAAK,MAAA,CAAC;IACpC,CAAC;CACF;6SAvCC,KAAK;IACH,IAAI,uBAAA,IAAI,6CAAkB,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,yCAAqB,IAAI,MAAA,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,oBAAoB,CACzD,IAAI,CAAC,IAAI,CAAC,MAAM,CACjB,CAAC;QAEF,uBAAA,IAAI,4CAAwB,IAAI,MAAA,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAEjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACpD,MAAM,gBAAgB,GACpB,gBAAgB,IAAI,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACtD,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,eAAe,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CACnD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,uBAAA,IAAI,yCAAqB,KAAK,MAAA,CAAC;IACjC,CAAC;AACH,CAAC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { errorEvent, languagesChangedEvent } from \"../utils/events.js\";\nimport { getLanguagesByRegion } from \"../utils/languages.js\";\n\ninterface LanguagesControllerHost extends ReactiveControllerHost {\n region?: string;\n dispatchEvent(event: CustomEvent): boolean;\n requestUpdate(): void;\n _languages?: Corti.TranscribeSupportedLanguage[];\n _selectedLanguage?: Corti.TranscribeSupportedLanguage;\n selectedLanguage?: Corti.TranscribeSupportedLanguage;\n}\n\n/**\n * Controller that manages automatic language loading based on region.\n * Loads languages when they're not present and handles region changes.\n * Reacts to updates and automatically loads languages when needed.\n */\nexport class LanguagesController implements ReactiveController {\n host: LanguagesControllerHost;\n #autoLoadedLanguages: boolean = false;\n #loadingLanguages: boolean = false;\n #previousRegion?: string;\n #initialized: boolean = false;\n\n constructor(host: LanguagesControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n initialize(): void {\n this.#initialized = true;\n\n if (this.host._languages === undefined) {\n this.#loadLanguages();\n }\n }\n\n hostUpdate(): void {\n // Only react to updates after initialization\n if (!this.#initialized) {\n return;\n }\n\n // When region changes, reload languages if they were auto-loaded\n if (\n (this.#previousRegion !== this.host.region &&\n this.#autoLoadedLanguages) ||\n this.host._languages === undefined\n ) {\n this.#loadLanguages();\n }\n\n this.#previousRegion = this.host.region;\n }\n\n async #loadLanguages(): Promise<void> {\n if (this.#loadingLanguages) {\n return;\n }\n\n this.#loadingLanguages = true;\n\n try {\n const { languages, defaultLanguage } = getLanguagesByRegion(\n this.host.region,\n );\n\n this.#autoLoadedLanguages = true;\n this.host._languages = languages;\n\n const previousLanguage = this.host.selectedLanguage;\n const selectedLanguage =\n previousLanguage && languages.includes(previousLanguage)\n ? previousLanguage\n : defaultLanguage;\n\n this.host._selectedLanguage = selectedLanguage;\n this.host.requestUpdate();\n this.host.dispatchEvent(\n languagesChangedEvent(languages, selectedLanguage),\n );\n } catch (error) {\n this.host.dispatchEvent(errorEvent(error));\n } finally {\n this.#loadingLanguages = false;\n }\n }\n\n /**\n * Clear the auto-loaded flag (when languages are set externally)\n */\n clearAutoLoadedFlag(): void {\n this.#autoLoadedLanguages = false;\n }\n}\n"]}
1
+ {"version":3,"file":"languages-controller.js","sourceRoot":"","sources":["../../src/controllers/languages-controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAU7D;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IAO9B,YAAY,IAA6B;;QALzC,mDAAgC,KAAK,EAAC;QACtC,gDAA6B,KAAK,EAAC;QACnC,sDAAyB;QACzB,2CAAwB,KAAK,EAAC;QAG5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,uBAAA,IAAI,oCAAgB,IAAI,MAAA,CAAC;QAEzB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACvC,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB,CAAC;QACxB,CAAC;IACH,CAAC;IAED,UAAU;QACR,6CAA6C;QAC7C,IAAI,CAAC,uBAAA,IAAI,wCAAa,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,IACE,CAAC,uBAAA,IAAI,2CAAgB,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;YACxC,uBAAA,IAAI,gDAAqB,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAClC,CAAC;YACD,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB,CAAC;QACxB,CAAC;QAED,uBAAA,IAAI,uCAAmB,IAAI,CAAC,IAAI,CAAC,MAAM,MAAA,CAAC;IAC1C,CAAC;IAmCD;;OAEG;IACH,mBAAmB;QACjB,uBAAA,IAAI,4CAAwB,KAAK,MAAA,CAAC;IACpC,CAAC;CACF;6SAvCC,KAAK;IACH,IAAI,uBAAA,IAAI,6CAAkB,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,yCAAqB,IAAI,MAAA,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,oBAAoB,CACzD,IAAI,CAAC,IAAI,CAAC,MAAM,CACjB,CAAC;QAEF,uBAAA,IAAI,4CAAwB,IAAI,MAAA,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAEjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACrD,MAAM,gBAAgB,GACpB,gBAAgB,IAAI,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACtD,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,eAAe,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CACnD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,uBAAA,IAAI,yCAAqB,KAAK,MAAA,CAAC;IACjC,CAAC;AACH,CAAC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { errorEvent, languagesChangedEvent } from \"../utils/events.js\";\nimport { getLanguagesByRegion } from \"../utils/languages.js\";\n\ninterface LanguagesControllerHost extends ReactiveControllerHost {\n region?: string;\n dispatchEvent(event: CustomEvent): boolean;\n requestUpdate(): void;\n _languages?: Corti.TranscribeSupportedLanguage[];\n _selectedLanguage?: Corti.TranscribeSupportedLanguage;\n}\n\n/**\n * Controller that manages automatic language loading based on region.\n * Loads languages when they're not present and handles region changes.\n * Reacts to updates and automatically loads languages when needed.\n */\nexport class LanguagesController implements ReactiveController {\n host: LanguagesControllerHost;\n #autoLoadedLanguages: boolean = false;\n #loadingLanguages: boolean = false;\n #previousRegion?: string;\n #initialized: boolean = false;\n\n constructor(host: LanguagesControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n initialize(): void {\n this.#initialized = true;\n\n if (this.host._languages === undefined) {\n this.#loadLanguages();\n }\n }\n\n hostUpdate(): void {\n // Only react to updates after initialization\n if (!this.#initialized) {\n return;\n }\n\n // When region changes, reload languages if they were auto-loaded\n if (\n (this.#previousRegion !== this.host.region &&\n this.#autoLoadedLanguages) ||\n this.host._languages === undefined\n ) {\n this.#loadLanguages();\n }\n\n this.#previousRegion = this.host.region;\n }\n\n async #loadLanguages(): Promise<void> {\n if (this.#loadingLanguages) {\n return;\n }\n\n this.#loadingLanguages = true;\n\n try {\n const { languages, defaultLanguage } = getLanguagesByRegion(\n this.host.region,\n );\n\n this.#autoLoadedLanguages = true;\n this.host._languages = languages;\n\n const previousLanguage = this.host._selectedLanguage;\n const selectedLanguage =\n previousLanguage && languages.includes(previousLanguage)\n ? previousLanguage\n : defaultLanguage;\n\n this.host._selectedLanguage = selectedLanguage;\n this.host.requestUpdate();\n this.host.dispatchEvent(\n languagesChangedEvent(languages, selectedLanguage),\n );\n } catch (error) {\n this.host.dispatchEvent(errorEvent(error));\n } finally {\n this.#loadingLanguages = false;\n }\n }\n\n /**\n * Clear the auto-loaded flag (when languages are set externally)\n */\n clearAutoLoadedFlag(): void {\n this.#autoLoadedLanguages = false;\n }\n}\n"]}
@@ -208,7 +208,7 @@ _SocketController_webSocket = new WeakMap(), _SocketController_cortiClient = new
208
208
  return "superseded";
209
209
  }
210
210
  __classPrivateFieldSet(this, _SocketController_webSocket, socket, "f");
211
- __classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
211
+ callbacks?.onNetworkActivity?.("sent", {
212
212
  configuration: config,
213
213
  type: "config",
214
214
  });