@corti/dictation-web 0.0.0-test.562 → 0.0.0-test.571
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -112
- package/dist/bundle.js +1416 -546
- package/dist/components/audio-visualiser.d.ts +3 -2
- package/dist/components/audio-visualiser.js +15 -12
- package/dist/components/audio-visualiser.js.map +1 -1
- package/dist/components/corti-dictation.d.ts +26 -13
- package/dist/components/corti-dictation.js +70 -21
- package/dist/components/corti-dictation.js.map +1 -1
- package/dist/components/device-selector.d.ts +6 -16
- package/dist/components/device-selector.js +27 -58
- package/dist/components/device-selector.js.map +1 -1
- package/dist/components/keybinding-selector.d.ts +14 -0
- package/dist/components/keybinding-selector.js +81 -0
- package/dist/components/keybinding-selector.js.map +1 -0
- package/dist/components/language-selector.d.ts +8 -17
- package/dist/components/language-selector.js +26 -52
- package/dist/components/language-selector.js.map +1 -1
- package/dist/components/mode-selector.d.ts +14 -0
- package/dist/components/mode-selector.js +73 -0
- package/dist/components/mode-selector.js.map +1 -0
- package/dist/components/recording-button.d.ts +8 -14
- package/dist/components/recording-button.js +155 -96
- package/dist/components/recording-button.js.map +1 -1
- package/dist/components/settings-menu.d.ts +4 -2
- package/dist/components/settings-menu.js +34 -14
- package/dist/components/settings-menu.js.map +1 -1
- package/dist/constants.d.ts +5 -0
- package/dist/constants.js +5 -0
- package/dist/constants.js.map +1 -1
- package/dist/contexts/dictation-context.d.ts +24 -14
- package/dist/contexts/dictation-context.js +128 -46
- package/dist/contexts/dictation-context.js.map +1 -1
- package/dist/controllers/devices-controller.d.ts +26 -0
- package/dist/controllers/devices-controller.js +99 -0
- package/dist/controllers/devices-controller.js.map +1 -0
- package/dist/controllers/dictation-controller.d.ts +29 -0
- package/dist/controllers/dictation-controller.js +179 -0
- package/dist/controllers/dictation-controller.js.map +1 -0
- package/dist/controllers/keybinding-controller.d.ts +17 -0
- package/dist/controllers/keybinding-controller.js +80 -0
- package/dist/controllers/keybinding-controller.js.map +1 -0
- package/dist/controllers/languages-controller.d.ts +26 -0
- package/dist/controllers/languages-controller.js +83 -0
- package/dist/controllers/languages-controller.js.map +1 -0
- package/dist/controllers/media-controller.d.ts +24 -0
- package/dist/controllers/media-controller.js +115 -0
- package/dist/controllers/media-controller.js.map +1 -0
- package/dist/index.d.ts +9 -7
- package/dist/index.js +30 -20
- package/dist/index.js.map +1 -1
- package/dist/src/components/audio-visualiser.d.ts +1 -0
- package/dist/src/components/audio-visualiser.js +6 -3
- package/dist/src/components/audio-visualiser.js.map +1 -1
- package/dist/src/components/corti-dictation.d.ts +21 -6
- package/dist/src/components/corti-dictation.js +25 -2
- package/dist/src/components/corti-dictation.js.map +1 -1
- package/dist/src/components/recording-button.d.ts +4 -0
- package/dist/src/components/recording-button.js +34 -10
- package/dist/src/components/recording-button.js.map +1 -1
- package/dist/src/components/settings-menu.js +1 -1
- package/dist/src/components/settings-menu.js.map +1 -1
- package/dist/src/constants.js +24 -6
- package/dist/src/constants.js.map +1 -1
- package/dist/src/contexts/dictation-context.d.ts +19 -5
- package/dist/src/contexts/dictation-context.js +32 -12
- package/dist/src/contexts/dictation-context.js.map +1 -1
- package/dist/src/controllers/DictationController.d.ts +5 -0
- package/dist/src/controllers/DictationController.js +27 -8
- package/dist/src/controllers/DictationController.js.map +1 -1
- package/dist/src/controllers/MediaController.d.ts +6 -0
- package/dist/src/controllers/MediaController.js +17 -1
- package/dist/src/controllers/MediaController.js.map +1 -1
- package/dist/src/styles/ComponentStyles.js +5 -5
- package/dist/src/styles/ComponentStyles.js.map +1 -1
- package/dist/src/styles/audio-visualiser.js +1 -1
- package/dist/src/styles/audio-visualiser.js.map +1 -1
- package/dist/src/styles/buttons.js +12 -12
- package/dist/src/styles/buttons.js.map +1 -1
- package/dist/src/styles/callout.js +7 -7
- package/dist/src/styles/callout.js.map +1 -1
- package/dist/src/styles/select.js +8 -8
- package/dist/src/styles/select.js.map +1 -1
- package/dist/src/styles/settings-menu.js +4 -4
- package/dist/src/styles/settings-menu.js.map +1 -1
- package/dist/src/types.d.ts +5 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/converters.js +4 -1
- package/dist/src/utils/converters.js.map +1 -1
- package/dist/src/utils/events.d.ts +11 -4
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/languages.js +2 -1
- package/dist/src/utils/languages.js.map +1 -1
- package/dist/src/utils/media.d.ts +1 -1
- package/dist/src/utils/media.js +13 -1
- package/dist/src/utils/media.js.map +1 -1
- package/dist/src/utils/token.d.ts +1 -1
- package/dist/src/utils/token.js +12 -11
- package/dist/src/utils/token.js.map +1 -1
- package/dist/styles/buttons.js +1 -2
- package/dist/styles/buttons.js.map +1 -1
- package/dist/styles/component-styles.d.ts +3 -0
- package/dist/styles/component-styles.js +32 -0
- package/dist/styles/component-styles.js.map +1 -0
- package/dist/styles/keybinding-selector.d.ts +2 -0
- package/dist/styles/keybinding-selector.js +72 -0
- package/dist/styles/keybinding-selector.js.map +1 -0
- package/dist/styles/mode-selector.d.ts +2 -0
- package/dist/styles/mode-selector.js +54 -0
- package/dist/styles/mode-selector.js.map +1 -0
- package/dist/styles/select.d.ts +1 -1
- package/dist/styles/select.js +6 -10
- package/dist/styles/select.js.map +1 -1
- package/dist/styles/settings-menu.js +9 -1
- package/dist/styles/settings-menu.js.map +1 -1
- package/dist/tsconfig.stories.tsbuildinfo +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/events.d.ts +12 -3
- package/dist/utils/events.js +14 -0
- package/dist/utils/events.js.map +1 -1
- package/dist/utils/keybinding.d.ts +49 -0
- package/dist/utils/keybinding.js +140 -0
- package/dist/utils/keybinding.js.map +1 -0
- package/dist/utils/languages.d.ts +4 -3
- package/dist/utils/languages.js.map +1 -1
- package/dist/utils/token.d.ts +1 -1
- package/dist/utils/token.js +12 -11
- package/dist/utils/token.js.map +1 -1
- package/package.json +9 -8
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Corti } from "@corti/sdk";
|
|
2
2
|
import { type CSSResultGroup, LitElement } from "lit";
|
|
3
|
-
import type { RecordingState } from "../types.js";
|
|
3
|
+
import type { ProxyOptions, RecordingState } from "../types.js";
|
|
4
4
|
export declare const regionContext: {
|
|
5
5
|
__context__: string | undefined;
|
|
6
6
|
};
|
|
@@ -28,6 +28,15 @@ export declare const dictationConfigContext: {
|
|
|
28
28
|
export declare const authConfigContext: {
|
|
29
29
|
__context__: Corti.BearerOptions | undefined;
|
|
30
30
|
};
|
|
31
|
+
export declare const socketUrlContext: {
|
|
32
|
+
__context__: string | undefined;
|
|
33
|
+
};
|
|
34
|
+
export declare const socketProxyContext: {
|
|
35
|
+
__context__: ProxyOptions | undefined;
|
|
36
|
+
};
|
|
37
|
+
export declare const debugDisplayAudioContext: {
|
|
38
|
+
__context__: boolean | undefined;
|
|
39
|
+
};
|
|
31
40
|
export declare class DictationContext extends LitElement {
|
|
32
41
|
region?: string;
|
|
33
42
|
tenantName?: string;
|
|
@@ -38,16 +47,20 @@ export declare class DictationContext extends LitElement {
|
|
|
38
47
|
private _authConfig?;
|
|
39
48
|
set authConfig(config: Corti.BearerOptions | undefined);
|
|
40
49
|
get authConfig(): Corti.BearerOptions | undefined;
|
|
50
|
+
socketUrl?: string;
|
|
51
|
+
socketProxy?: ProxyOptions;
|
|
41
52
|
dictationConfig?: Corti.TranscribeConfig;
|
|
42
53
|
languages?: string[];
|
|
43
54
|
devices?: MediaDeviceInfo[];
|
|
44
55
|
selectedDevice?: MediaDeviceInfo;
|
|
56
|
+
debug_displayAudio?: boolean;
|
|
45
57
|
noWrapper: boolean;
|
|
46
58
|
static styles: CSSResultGroup;
|
|
47
59
|
constructor();
|
|
48
60
|
/**
|
|
49
61
|
* Sets the access token and parses region/tenant from it.
|
|
50
62
|
* @returns ServerConfig with environment, tenant, and accessToken
|
|
63
|
+
* @deprecated Use 'accessToken' property instead.
|
|
51
64
|
*/
|
|
52
65
|
setAccessToken(token: string | undefined): {
|
|
53
66
|
accessToken: string | undefined;
|
|
@@ -55,12 +68,13 @@ export declare class DictationContext extends LitElement {
|
|
|
55
68
|
tenant: undefined;
|
|
56
69
|
} | {
|
|
57
70
|
accessToken: string;
|
|
58
|
-
environment: string
|
|
59
|
-
tenant: string
|
|
71
|
+
environment: string;
|
|
72
|
+
tenant: string;
|
|
60
73
|
};
|
|
61
74
|
/**
|
|
62
75
|
* Sets the auth config and parses region/tenant from the initial token.
|
|
63
76
|
* @returns Promise with ServerConfig containing environment, tenant, and accessToken
|
|
77
|
+
* @deprecated Use 'authConfig' property instead.
|
|
64
78
|
*/
|
|
65
79
|
setAuthConfig(config?: Corti.BearerOptions): Promise<{
|
|
66
80
|
accessToken: string | undefined;
|
|
@@ -68,8 +82,8 @@ export declare class DictationContext extends LitElement {
|
|
|
68
82
|
tenant: undefined;
|
|
69
83
|
} | {
|
|
70
84
|
accessToken: string;
|
|
71
|
-
environment: string
|
|
72
|
-
tenant: string
|
|
85
|
+
environment: string;
|
|
86
|
+
tenant: string;
|
|
73
87
|
}>;
|
|
74
88
|
private _handleLanguageChanged;
|
|
75
89
|
private _handleDeviceChanged;
|
|
@@ -8,20 +8,22 @@ import { createContext, provide } from "@lit/context";
|
|
|
8
8
|
import { html, LitElement } from "lit";
|
|
9
9
|
import { customElement, property, state } from "lit/decorators.js";
|
|
10
10
|
import ComponentStyles from "../styles/ComponentStyles.js";
|
|
11
|
-
import DefaultThemeStyles from "../styles/default-theme.js";
|
|
12
11
|
import { getInitialToken } from "../utils/auth.js";
|
|
13
12
|
import { commaSeparatedConverter } from "../utils/converters.js";
|
|
14
13
|
import { errorEvent } from "../utils/events.js";
|
|
15
14
|
import { decodeToken } from "../utils/token.js";
|
|
16
|
-
export const regionContext = createContext("region");
|
|
17
|
-
export const tenantNameContext = createContext("tenantName");
|
|
18
|
-
export const languagesContext = createContext("languages");
|
|
19
|
-
export const devicesContext = createContext("devices");
|
|
20
|
-
export const selectedDeviceContext = createContext("selectedDevice");
|
|
21
|
-
export const recordingStateContext = createContext("recordingState");
|
|
22
|
-
export const accessTokenContext = createContext("accessToken");
|
|
23
|
-
export const dictationConfigContext = createContext("dictationConfig");
|
|
24
|
-
export const authConfigContext = createContext("authConfig");
|
|
15
|
+
export const regionContext = createContext(Symbol("region"));
|
|
16
|
+
export const tenantNameContext = createContext(Symbol("tenantName"));
|
|
17
|
+
export const languagesContext = createContext(Symbol("languages"));
|
|
18
|
+
export const devicesContext = createContext(Symbol("devices"));
|
|
19
|
+
export const selectedDeviceContext = createContext(Symbol("selectedDevice"));
|
|
20
|
+
export const recordingStateContext = createContext(Symbol("recordingState"));
|
|
21
|
+
export const accessTokenContext = createContext(Symbol("accessToken"));
|
|
22
|
+
export const dictationConfigContext = createContext(Symbol("dictationConfig"));
|
|
23
|
+
export const authConfigContext = createContext(Symbol("authConfig"));
|
|
24
|
+
export const socketUrlContext = createContext(Symbol("socketUrl"));
|
|
25
|
+
export const socketProxyContext = createContext(Symbol("socketProxy"));
|
|
26
|
+
export const debugDisplayAudioContext = createContext(Symbol("debugDisplayAudio"));
|
|
25
27
|
let DictationContext = class DictationContext extends LitElement {
|
|
26
28
|
set accessToken(token) {
|
|
27
29
|
this.setAccessToken(token);
|
|
@@ -72,6 +74,7 @@ let DictationContext = class DictationContext extends LitElement {
|
|
|
72
74
|
/**
|
|
73
75
|
* Sets the access token and parses region/tenant from it.
|
|
74
76
|
* @returns ServerConfig with environment, tenant, and accessToken
|
|
77
|
+
* @deprecated Use 'accessToken' property instead.
|
|
75
78
|
*/
|
|
76
79
|
setAccessToken(token) {
|
|
77
80
|
this._accessToken = token;
|
|
@@ -98,11 +101,16 @@ let DictationContext = class DictationContext extends LitElement {
|
|
|
98
101
|
/**
|
|
99
102
|
* Sets the auth config and parses region/tenant from the initial token.
|
|
100
103
|
* @returns Promise with ServerConfig containing environment, tenant, and accessToken
|
|
104
|
+
* @deprecated Use 'authConfig' property instead.
|
|
101
105
|
*/
|
|
102
106
|
async setAuthConfig(config) {
|
|
103
107
|
this._authConfig = config;
|
|
104
108
|
if (!config) {
|
|
105
|
-
return {
|
|
109
|
+
return {
|
|
110
|
+
accessToken: undefined,
|
|
111
|
+
environment: undefined,
|
|
112
|
+
tenant: undefined,
|
|
113
|
+
};
|
|
106
114
|
}
|
|
107
115
|
try {
|
|
108
116
|
const { accessToken } = await getInitialToken(config);
|
|
@@ -132,7 +140,7 @@ let DictationContext = class DictationContext extends LitElement {
|
|
|
132
140
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
133
141
|
// Static
|
|
134
142
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
135
|
-
DictationContext.styles = [
|
|
143
|
+
DictationContext.styles = [ComponentStyles];
|
|
136
144
|
__decorate([
|
|
137
145
|
provide({ context: regionContext }),
|
|
138
146
|
state()
|
|
@@ -159,6 +167,14 @@ __decorate([
|
|
|
159
167
|
__decorate([
|
|
160
168
|
property({ attribute: false, type: Object })
|
|
161
169
|
], DictationContext.prototype, "authConfig", null);
|
|
170
|
+
__decorate([
|
|
171
|
+
provide({ context: socketUrlContext }),
|
|
172
|
+
property({ type: String })
|
|
173
|
+
], DictationContext.prototype, "socketUrl", void 0);
|
|
174
|
+
__decorate([
|
|
175
|
+
provide({ context: socketProxyContext }),
|
|
176
|
+
property({ attribute: false, type: Object })
|
|
177
|
+
], DictationContext.prototype, "socketProxy", void 0);
|
|
162
178
|
__decorate([
|
|
163
179
|
provide({ context: dictationConfigContext }),
|
|
164
180
|
property({ attribute: false, type: Object })
|
|
@@ -178,6 +194,10 @@ __decorate([
|
|
|
178
194
|
provide({ context: selectedDeviceContext }),
|
|
179
195
|
property({ attribute: false, type: Object })
|
|
180
196
|
], DictationContext.prototype, "selectedDevice", void 0);
|
|
197
|
+
__decorate([
|
|
198
|
+
provide({ context: debugDisplayAudioContext }),
|
|
199
|
+
property({ attribute: "debug-display-audio", type: Boolean })
|
|
200
|
+
], DictationContext.prototype, "debug_displayAudio", void 0);
|
|
181
201
|
__decorate([
|
|
182
202
|
property({ type: Boolean })
|
|
183
203
|
], DictationContext.prototype, "noWrapper", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dictation-context.js","sourceRoot":"","sources":["../../../src/contexts/dictation-context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { createContext, provide } from \"@lit/context\";\nimport { type CSSResultGroup, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport ComponentStyles from \"../styles/ComponentStyles.js\";\nimport DefaultThemeStyles from \"../styles/default-theme.js\";\nimport type { RecordingState } from \"../types.js\";\nimport { getInitialToken } from \"../utils/auth.js\";\nimport { commaSeparatedConverter } from \"../utils/converters.js\";\nimport { errorEvent } from \"../utils/events.js\";\nimport { decodeToken } from \"../utils/token.js\";\n\nexport const regionContext = createContext<string | undefined>(\"region\");\nexport const tenantNameContext = createContext<string | undefined>(\n \"tenantName\",\n);\nexport const languagesContext = createContext<string[] | undefined>(\n \"languages\",\n);\nexport const devicesContext = createContext<MediaDeviceInfo[] | undefined>(\n \"devices\",\n);\nexport const selectedDeviceContext = createContext<MediaDeviceInfo | undefined>(\n \"selectedDevice\",\n);\nexport const recordingStateContext =\n createContext<RecordingState>(\"recordingState\");\nexport const accessTokenContext = createContext<string | undefined>(\n \"accessToken\",\n);\nexport const dictationConfigContext = createContext<\n Corti.TranscribeConfig | undefined\n>(\"dictationConfig\");\nexport const authConfigContext = createContext<Corti.BearerOptions | undefined>(\n \"authConfig\",\n);\n\n@customElement(\"dictation-context-provider\")\nexport class DictationContext extends LitElement {\n // ─────────────────────────────────────────────────────────────────────────────\n // Context state\n // ─────────────────────────────────────────────────────────────────────────────\n\n @provide({ context: regionContext })\n @state()\n region?: string;\n\n @provide({ context: tenantNameContext })\n @state()\n tenantName?: string;\n\n @provide({ context: recordingStateContext })\n @state()\n recordingState: RecordingState = \"stopped\";\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Properties\n // ─────────────────────────────────────────────────────────────────────────────\n\n @provide({ context: accessTokenContext })\n @state()\n private _accessToken?: string;\n\n @property({ type: String })\n set accessToken(token: string | undefined) {\n this.setAccessToken(token);\n }\n\n get accessToken(): string | undefined {\n return this._accessToken;\n }\n\n @provide({ context: authConfigContext })\n @state()\n private _authConfig?: Corti.BearerOptions;\n\n @property({ attribute: false, type: Object })\n set authConfig(config: Corti.BearerOptions | undefined) {\n this.setAuthConfig(config);\n }\n\n get authConfig(): Corti.BearerOptions | undefined {\n return this._authConfig;\n }\n\n @provide({ context: dictationConfigContext })\n @property({ attribute: false, type: Object })\n dictationConfig?: Corti.TranscribeConfig;\n\n @provide({ context: languagesContext })\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n languages?: string[];\n\n @provide({ context: devicesContext })\n @property({ attribute: false, type: Array })\n devices?: MediaDeviceInfo[];\n\n @provide({ context: selectedDeviceContext })\n @property({ attribute: false, type: Object })\n selectedDevice?: MediaDeviceInfo;\n\n @property({ type: Boolean })\n noWrapper: boolean = false;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Static\n // ─────────────────────────────────────────────────────────────────────────────\n\n static styles: CSSResultGroup = [DefaultThemeStyles, ComponentStyles];\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n constructor() {\n super();\n this.addEventListener(\"languages-changed\", this._handleLanguageChanged);\n this.addEventListener(\n \"recording-devices-changed\",\n this._handleDeviceChanged,\n );\n this.addEventListener(\n \"recording-state-changed\",\n this._handleRecordingStateChanged,\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Sets the access token and parses region/tenant from it.\n * @returns ServerConfig with environment, tenant, and accessToken\n */\n public setAccessToken(token: string | undefined) {\n this._accessToken = token;\n this.region = undefined;\n this.tenantName = undefined;\n\n if (!token) {\n return { accessToken: token, environment: undefined, tenant: undefined };\n }\n\n try {\n const decoded = decodeToken(token);\n\n this.region = decoded?.environment;\n this.tenantName = decoded?.tenant;\n\n return {\n accessToken: token,\n environment: decoded?.environment,\n tenant: decoded?.tenant,\n };\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n\n return { accessToken: token, environment: undefined, tenant: undefined };\n }\n\n /**\n * Sets the auth config and parses region/tenant from the initial token.\n * @returns Promise with ServerConfig containing environment, tenant, and accessToken\n */\n public async setAuthConfig(config?: Corti.BearerOptions) {\n this._authConfig = config;\n\n if (!config) {\n return { accessToken: undefined, environment: undefined, tenant: undefined };\n }\n\n try {\n const { accessToken } = await getInitialToken(config);\n\n return this.setAccessToken(accessToken);\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n\n return {\n accessToken: undefined,\n environment: undefined,\n tenant: undefined,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private event handlers\n // ─────────────────────────────────────────────────────────────────────────────\n\n private _handleLanguageChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.languages = event.detail.languages;\n this.dictationConfig = {\n ...this.dictationConfig,\n primaryLanguage: event.detail.selectedLanguage,\n };\n };\n\n private _handleDeviceChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.devices = event.detail.devices;\n this.selectedDevice = event.detail.selectedDevice;\n };\n\n private _handleRecordingStateChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.recordingState = event.detail.state;\n };\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Render\n // ─────────────────────────────────────────────────────────────────────────────\n\n render() {\n if (this.noWrapper) {\n return html`<slot></slot>`;\n }\n\n return html`<div class=\"wrapper\">\n <slot></slot>\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"dictation-context-provider\": DictationContext;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dictation-context.js","sourceRoot":"","sources":["../../../src/contexts/dictation-context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { createContext, provide } from \"@lit/context\";\nimport { type CSSResultGroup, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport ComponentStyles from \"../styles/ComponentStyles.js\";\nimport type { ProxyOptions, RecordingState } from \"../types.js\";\nimport { getInitialToken } from \"../utils/auth.js\";\nimport { commaSeparatedConverter } from \"../utils/converters.js\";\nimport { errorEvent } from \"../utils/events.js\";\nimport { decodeToken } from \"../utils/token.js\";\n\nexport const regionContext = createContext<string | undefined>(Symbol(\"region\"));\nexport const tenantNameContext = createContext<string | undefined>(\n Symbol(\"tenantName\"),\n);\nexport const languagesContext = createContext<string[] | undefined>(\n Symbol(\"languages\"),\n);\nexport const devicesContext = createContext<MediaDeviceInfo[] | undefined>(\n Symbol(\"devices\"),\n);\nexport const selectedDeviceContext = createContext<MediaDeviceInfo | undefined>(\n Symbol(\"selectedDevice\"),\n);\nexport const recordingStateContext =\n createContext<RecordingState>(Symbol(\"recordingState\"));\nexport const accessTokenContext = createContext<string | undefined>(\n Symbol(\"accessToken\"),\n);\nexport const dictationConfigContext = createContext<\n Corti.TranscribeConfig | undefined\n>(Symbol(\"dictationConfig\"));\nexport const authConfigContext = createContext<Corti.BearerOptions | undefined>(\n Symbol(\"authConfig\"),\n);\nexport const socketUrlContext = createContext<string | undefined>(Symbol(\"socketUrl\"));\nexport const socketProxyContext = createContext<ProxyOptions | undefined>(\n Symbol(\"socketProxy\"),\n);\nexport const debugDisplayAudioContext = createContext<boolean | undefined>(\n Symbol(\"debugDisplayAudio\"),\n);\n\n@customElement(\"dictation-context-provider\")\nexport class DictationContext extends LitElement {\n // ─────────────────────────────────────────────────────────────────────────────\n // Context state\n // ─────────────────────────────────────────────────────────────────────────────\n\n @provide({ context: regionContext })\n @state()\n region?: string;\n\n @provide({ context: tenantNameContext })\n @state()\n tenantName?: string;\n\n @provide({ context: recordingStateContext })\n @state()\n recordingState: RecordingState = \"stopped\";\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Properties\n // ─────────────────────────────────────────────────────────────────────────────\n\n @provide({ context: accessTokenContext })\n @state()\n private _accessToken?: string;\n\n @property({ type: String })\n set accessToken(token: string | undefined) {\n this.setAccessToken(token);\n }\n\n get accessToken(): string | undefined {\n return this._accessToken;\n }\n\n @provide({ context: authConfigContext })\n @state()\n private _authConfig?: Corti.BearerOptions;\n\n @property({ attribute: false, type: Object })\n set authConfig(config: Corti.BearerOptions | undefined) {\n this.setAuthConfig(config);\n }\n\n get authConfig(): Corti.BearerOptions | undefined {\n return this._authConfig;\n }\n\n @provide({ context: socketUrlContext })\n @property({ type: String })\n socketUrl?: string;\n\n @provide({ context: socketProxyContext })\n @property({ attribute: false, type: Object })\n socketProxy?: ProxyOptions;\n\n @provide({ context: dictationConfigContext })\n @property({ attribute: false, type: Object })\n dictationConfig?: Corti.TranscribeConfig;\n\n @provide({ context: languagesContext })\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n languages?: string[];\n\n @provide({ context: devicesContext })\n @property({ attribute: false, type: Array })\n devices?: MediaDeviceInfo[];\n\n @provide({ context: selectedDeviceContext })\n @property({ attribute: false, type: Object })\n selectedDevice?: MediaDeviceInfo;\n\n @provide({ context: debugDisplayAudioContext })\n @property({ attribute: \"debug-display-audio\", type: Boolean })\n debug_displayAudio?: boolean;\n\n @property({ type: Boolean })\n noWrapper: boolean = false;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Static\n // ─────────────────────────────────────────────────────────────────────────────\n\n static styles: CSSResultGroup = [ComponentStyles];\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n constructor() {\n super();\n this.addEventListener(\"languages-changed\", this._handleLanguageChanged);\n this.addEventListener(\n \"recording-devices-changed\",\n this._handleDeviceChanged,\n );\n this.addEventListener(\n \"recording-state-changed\",\n this._handleRecordingStateChanged,\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Sets the access token and parses region/tenant from it.\n * @returns ServerConfig with environment, tenant, and accessToken\n * @deprecated Use 'accessToken' property instead.\n */\n public setAccessToken(token: string | undefined) {\n this._accessToken = token;\n this.region = undefined;\n this.tenantName = undefined;\n\n if (!token) {\n return { accessToken: token, environment: undefined, tenant: undefined };\n }\n\n try {\n const decoded = decodeToken(token);\n\n this.region = decoded?.environment;\n this.tenantName = decoded?.tenant;\n\n return {\n accessToken: token,\n environment: decoded?.environment,\n tenant: decoded?.tenant,\n };\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n\n return { accessToken: token, environment: undefined, tenant: undefined };\n }\n\n /**\n * Sets the auth config and parses region/tenant from the initial token.\n * @returns Promise with ServerConfig containing environment, tenant, and accessToken\n * @deprecated Use 'authConfig' property instead.\n */\n public async setAuthConfig(config?: Corti.BearerOptions) {\n this._authConfig = config;\n\n if (!config) {\n return {\n accessToken: undefined,\n environment: undefined,\n tenant: undefined,\n };\n }\n\n try {\n const { accessToken } = await getInitialToken(config);\n\n return this.setAccessToken(accessToken);\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n\n return {\n accessToken: undefined,\n environment: undefined,\n tenant: undefined,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private event handlers\n // ─────────────────────────────────────────────────────────────────────────────\n\n private _handleLanguageChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.languages = event.detail.languages;\n this.dictationConfig = {\n ...this.dictationConfig,\n primaryLanguage: event.detail.selectedLanguage,\n };\n };\n\n private _handleDeviceChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.devices = event.detail.devices;\n this.selectedDevice = event.detail.selectedDevice;\n };\n\n private _handleRecordingStateChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.recordingState = event.detail.state;\n };\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Render\n // ─────────────────────────────────────────────────────────────────────────────\n\n render() {\n if (this.noWrapper) {\n return html`<slot></slot>`;\n }\n\n return html`<div class=\"wrapper\">\n <slot></slot>\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"dictation-context-provider\": DictationContext;\n }\n}\n"]}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { type Corti } from "@corti/sdk";
|
|
2
2
|
import type { ReactiveController, ReactiveControllerHost } from "lit";
|
|
3
|
+
import type { ProxyOptions } from "../types.js";
|
|
3
4
|
interface DictationControllerHost extends ReactiveControllerHost {
|
|
4
5
|
_accessToken?: string;
|
|
5
6
|
_authConfig?: Corti.BearerOptions;
|
|
6
7
|
_region?: string;
|
|
7
8
|
_tenantName?: string;
|
|
9
|
+
_socketUrl?: string;
|
|
10
|
+
_socketProxy?: ProxyOptions;
|
|
8
11
|
}
|
|
9
12
|
export type TranscribeMessage = Corti.TranscribeConfigStatusMessage | Corti.TranscribeUsageMessage | Corti.TranscribeEndedMessage | Corti.TranscribeErrorMessage | Corti.TranscribeTranscriptMessage | Corti.TranscribeCommandMessage | Corti.TranscribeFlushedMessage;
|
|
10
13
|
interface WebSocketCallbacks {
|
|
@@ -22,6 +25,8 @@ export declare class DictationController implements ReactiveController {
|
|
|
22
25
|
constructor(host: DictationControllerHost);
|
|
23
26
|
hostDisconnected(): void;
|
|
24
27
|
connect(mediaRecorder: MediaRecorder | null, dictationConfig?: Corti.TranscribeConfig, callbacks?: WebSocketCallbacks): Promise<void>;
|
|
28
|
+
private connectProxy;
|
|
29
|
+
private connectAuth;
|
|
25
30
|
private setupWebSocketHandlers;
|
|
26
31
|
private setupMediaRecorder;
|
|
27
32
|
disconnect(onClose?: (event: unknown) => void): Promise<void>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CortiClient } from "@corti/sdk";
|
|
1
|
+
import { CortiClient, CortiWebSocketProxyClient } from "@corti/sdk";
|
|
2
2
|
import { DEFAULT_DICTATION_CONFIG } from "../constants.js";
|
|
3
3
|
export class DictationController {
|
|
4
4
|
constructor(host) {
|
|
@@ -11,15 +11,36 @@ export class DictationController {
|
|
|
11
11
|
this.cleanup();
|
|
12
12
|
}
|
|
13
13
|
async connect(mediaRecorder, dictationConfig = DEFAULT_DICTATION_CONFIG, callbacks = {}) {
|
|
14
|
-
if (!this.host._authConfig && !this.host._accessToken) {
|
|
15
|
-
throw new Error("Auth configuration or access token is required to connect");
|
|
16
|
-
}
|
|
17
14
|
if (!mediaRecorder) {
|
|
18
15
|
throw new Error("MediaRecorder is required to connect");
|
|
19
16
|
}
|
|
20
17
|
if (this._webSocket?.readyState === WebSocket.OPEN) {
|
|
21
18
|
throw new Error("Already connected. Disconnect before reconnecting.");
|
|
22
19
|
}
|
|
20
|
+
this._webSocket =
|
|
21
|
+
this.host._socketUrl || this.host._socketProxy
|
|
22
|
+
? await this.connectProxy(dictationConfig)
|
|
23
|
+
: await this.connectAuth(dictationConfig);
|
|
24
|
+
this._onNetworkActivity = callbacks.onNetworkActivity;
|
|
25
|
+
this.setupMediaRecorder(mediaRecorder);
|
|
26
|
+
this.setupWebSocketHandlers(callbacks);
|
|
27
|
+
}
|
|
28
|
+
async connectProxy(dictationConfig) {
|
|
29
|
+
const proxyOptions = this.host._socketProxy || {
|
|
30
|
+
url: this.host._socketUrl || "",
|
|
31
|
+
};
|
|
32
|
+
if (!proxyOptions.url) {
|
|
33
|
+
throw new Error("Proxy URL is required when using proxy client");
|
|
34
|
+
}
|
|
35
|
+
return await CortiWebSocketProxyClient.transcribe.connect({
|
|
36
|
+
configuration: dictationConfig,
|
|
37
|
+
proxy: proxyOptions,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async connectAuth(dictationConfig) {
|
|
41
|
+
if (!this.host._authConfig && !this.host._accessToken) {
|
|
42
|
+
throw new Error("Auth configuration or access token is required to connect");
|
|
43
|
+
}
|
|
23
44
|
// Use authConfig if available, otherwise create one from accessToken
|
|
24
45
|
const auth = this.host._authConfig || {
|
|
25
46
|
accessToken: this.host._accessToken || "",
|
|
@@ -32,12 +53,9 @@ export class DictationController {
|
|
|
32
53
|
environment: this.host._region,
|
|
33
54
|
tenantName: this.host._tenantName,
|
|
34
55
|
});
|
|
35
|
-
|
|
56
|
+
return await this._cortiClient.transcribe.connect({
|
|
36
57
|
configuration: dictationConfig,
|
|
37
58
|
});
|
|
38
|
-
this._onNetworkActivity = callbacks.onNetworkActivity;
|
|
39
|
-
this.setupMediaRecorder(mediaRecorder);
|
|
40
|
-
this.setupWebSocketHandlers(callbacks);
|
|
41
59
|
}
|
|
42
60
|
setupWebSocketHandlers(callbacks) {
|
|
43
61
|
if (!this._webSocket) {
|
|
@@ -106,6 +124,7 @@ export class DictationController {
|
|
|
106
124
|
this._webSocket.close();
|
|
107
125
|
}
|
|
108
126
|
this._webSocket = null;
|
|
127
|
+
this._cortiClient = null;
|
|
109
128
|
}
|
|
110
129
|
}
|
|
111
130
|
//# sourceMappingURL=DictationController.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DictationController.js","sourceRoot":"","sources":["../../../src/controllers/DictationController.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Corti, CortiClient } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { DEFAULT_DICTATION_CONFIG } from \"../constants.js\";\n\ntype TranscribeSocket = Awaited<\n ReturnType<CortiClient[\"transcribe\"][\"connect\"]>\n>;\n\ninterface DictationControllerHost extends ReactiveControllerHost {\n _accessToken?: string;\n _authConfig?: Corti.BearerOptions;\n _region?: string;\n _tenantName?: string;\n}\n\nexport type TranscribeMessage =\n | Corti.TranscribeConfigStatusMessage\n | Corti.TranscribeUsageMessage\n | Corti.TranscribeEndedMessage\n | Corti.TranscribeErrorMessage\n | Corti.TranscribeTranscriptMessage\n | Corti.TranscribeCommandMessage\n | Corti.TranscribeFlushedMessage;\n\ninterface WebSocketCallbacks {\n onMessage?: (message: TranscribeMessage) => void;\n onError?: (error: Error) => void;\n onClose?: (event: unknown) => void;\n onNetworkActivity?: (direction: \"sent\" | \"received\", data: unknown) => void;\n}\n\nexport class DictationController implements ReactiveController {\n host: DictationControllerHost;\n\n private _cortiClient: CortiClient | null = null;\n private _webSocket: TranscribeSocket | null = null;\n private _closeTimeout?: number;\n private _onNetworkActivity?: WebSocketCallbacks[\"onNetworkActivity\"];\n\n constructor(host: DictationControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n async connect(\n mediaRecorder: MediaRecorder | null,\n dictationConfig: Corti.TranscribeConfig = DEFAULT_DICTATION_CONFIG,\n callbacks: WebSocketCallbacks = {},\n ): Promise<void> {\n if (!this.host._authConfig && !this.host._accessToken) {\n throw new Error(\n \"Auth configuration or access token is required to connect\",\n );\n }\n\n if (!mediaRecorder) {\n throw new Error(\"MediaRecorder is required to connect\");\n }\n\n if (this._webSocket?.readyState === WebSocket.OPEN) {\n throw new Error(\"Already connected. Disconnect before reconnecting.\");\n }\n\n // Use authConfig if available, otherwise create one from accessToken\n const auth: Corti.BearerOptions = this.host._authConfig || {\n accessToken: this.host._accessToken || \"\",\n refreshAccessToken: () => ({\n accessToken: this.host._accessToken || \"\",\n }),\n };\n\n this._cortiClient = new CortiClient({\n auth,\n environment: this.host._region,\n tenantName: this.host._tenantName,\n });\n\n this._webSocket = await this._cortiClient.transcribe.connect({\n configuration: dictationConfig,\n });\n this._onNetworkActivity = callbacks.onNetworkActivity;\n this.setupMediaRecorder(mediaRecorder);\n this.setupWebSocketHandlers(callbacks);\n }\n\n private setupWebSocketHandlers(callbacks: WebSocketCallbacks): void {\n if (!this._webSocket) {\n throw new Error(\"WebSocket not initialized\");\n }\n\n this._webSocket.on(\"message\", (message) => {\n this._onNetworkActivity?.(\"received\", message);\n\n if (callbacks.onMessage) {\n callbacks.onMessage(message);\n }\n });\n\n this._webSocket.on(\"error\", (event) => {\n if (callbacks.onError) {\n callbacks.onError(event);\n }\n });\n\n this._webSocket.on(\"close\", (event) => {\n if (callbacks.onClose) {\n callbacks.onClose(event);\n }\n });\n }\n\n private setupMediaRecorder(mediaRecorder: MediaRecorder): void {\n mediaRecorder.ondataavailable = (event) => {\n this._webSocket?.sendAudio(event.data);\n this._onNetworkActivity?.(\"sent\", {\n size: event.data.size,\n type: \"audio\",\n });\n };\n }\n\n async disconnect(onClose?: (event: unknown) => void): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n if (!this._webSocket || this._webSocket.readyState !== WebSocket.OPEN) {\n resolve();\n return;\n }\n\n this._webSocket.on(\"close\", (event) => {\n if (this._closeTimeout) {\n clearTimeout(this._closeTimeout);\n this._closeTimeout = undefined;\n }\n\n if (onClose) {\n onClose(event);\n }\n\n resolve();\n });\n\n this._webSocket.sendEnd({ type: \"end\" });\n this._onNetworkActivity?.(\"sent\", { type: \"end\" });\n\n this._closeTimeout = window.setTimeout(() => {\n // Reject the promise before closing the web socket, so the promise rejects before close event fires\n reject(new Error(\"WebSocket close timeout\"));\n\n if (this._webSocket?.readyState === WebSocket.OPEN) {\n this._webSocket.close();\n }\n }, 10000);\n });\n\n this.cleanup();\n }\n\n cleanup(): void {\n if (this._closeTimeout) {\n clearTimeout(this._closeTimeout);\n this._closeTimeout = undefined;\n }\n\n if (this._webSocket?.readyState === WebSocket.OPEN) {\n this._webSocket.close();\n }\n\n this._webSocket = null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DictationController.js","sourceRoot":"","sources":["../../../src/controllers/DictationController.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Corti, CortiClient, CortiWebSocketProxyClient } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { DEFAULT_DICTATION_CONFIG } from \"../constants.js\";\nimport type { ProxyOptions } from \"../types.js\";\n\ntype TranscribeSocket = Awaited<\n ReturnType<CortiClient[\"transcribe\"][\"connect\"]>\n>;\n\ninterface DictationControllerHost extends ReactiveControllerHost {\n _accessToken?: string;\n _authConfig?: Corti.BearerOptions;\n _region?: string;\n _tenantName?: string;\n _socketUrl?: string;\n _socketProxy?: ProxyOptions;\n}\n\nexport type TranscribeMessage =\n | Corti.TranscribeConfigStatusMessage\n | Corti.TranscribeUsageMessage\n | Corti.TranscribeEndedMessage\n | Corti.TranscribeErrorMessage\n | Corti.TranscribeTranscriptMessage\n | Corti.TranscribeCommandMessage\n | Corti.TranscribeFlushedMessage;\n\ninterface WebSocketCallbacks {\n onMessage?: (message: TranscribeMessage) => void;\n onError?: (error: Error) => void;\n onClose?: (event: unknown) => void;\n onNetworkActivity?: (direction: \"sent\" | \"received\", data: unknown) => void;\n}\n\nexport class DictationController implements ReactiveController {\n host: DictationControllerHost;\n\n private _cortiClient: CortiClient | null = null;\n private _webSocket: TranscribeSocket | null = null;\n private _closeTimeout?: number;\n private _onNetworkActivity?: WebSocketCallbacks[\"onNetworkActivity\"];\n\n constructor(host: DictationControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n async connect(\n mediaRecorder: MediaRecorder | null,\n dictationConfig: Corti.TranscribeConfig = DEFAULT_DICTATION_CONFIG,\n callbacks: WebSocketCallbacks = {},\n ): Promise<void> {\n if (!mediaRecorder) {\n throw new Error(\"MediaRecorder is required to connect\");\n }\n\n if (this._webSocket?.readyState === WebSocket.OPEN) {\n throw new Error(\"Already connected. Disconnect before reconnecting.\");\n }\n\n this._webSocket =\n this.host._socketUrl || this.host._socketProxy\n ? await this.connectProxy(dictationConfig)\n : await this.connectAuth(dictationConfig);\n\n this._onNetworkActivity = callbacks.onNetworkActivity;\n this.setupMediaRecorder(mediaRecorder);\n this.setupWebSocketHandlers(callbacks);\n }\n\n private async connectProxy(\n dictationConfig: Corti.TranscribeConfig,\n ): Promise<TranscribeSocket> {\n const proxyOptions = this.host._socketProxy || {\n url: this.host._socketUrl || \"\",\n };\n\n if (!proxyOptions.url) {\n throw new Error(\"Proxy URL is required when using proxy client\");\n }\n\n return await CortiWebSocketProxyClient.transcribe.connect({\n configuration: dictationConfig,\n proxy: proxyOptions,\n });\n }\n\n private async connectAuth(\n dictationConfig: Corti.TranscribeConfig,\n ): Promise<TranscribeSocket> {\n if (!this.host._authConfig && !this.host._accessToken) {\n throw new Error(\n \"Auth configuration or access token is required to connect\",\n );\n }\n\n // Use authConfig if available, otherwise create one from accessToken\n const auth: Corti.BearerOptions = this.host._authConfig || {\n accessToken: this.host._accessToken || \"\",\n refreshAccessToken: () => ({\n accessToken: this.host._accessToken || \"\",\n }),\n };\n\n this._cortiClient = new CortiClient({\n auth,\n environment: this.host._region,\n tenantName: this.host._tenantName,\n });\n\n return await this._cortiClient.transcribe.connect({\n configuration: dictationConfig,\n });\n }\n\n private setupWebSocketHandlers(callbacks: WebSocketCallbacks): void {\n if (!this._webSocket) {\n throw new Error(\"WebSocket not initialized\");\n }\n\n this._webSocket.on(\"message\", (message: TranscribeMessage) => {\n this._onNetworkActivity?.(\"received\", message);\n\n if (callbacks.onMessage) {\n callbacks.onMessage(message);\n }\n });\n\n this._webSocket.on(\"error\", (event: Error) => {\n if (callbacks.onError) {\n callbacks.onError(event);\n }\n });\n\n this._webSocket.on(\"close\", (event: unknown) => {\n if (callbacks.onClose) {\n callbacks.onClose(event);\n }\n });\n }\n\n private setupMediaRecorder(mediaRecorder: MediaRecorder): void {\n mediaRecorder.ondataavailable = (event) => {\n this._webSocket?.sendAudio(event.data);\n this._onNetworkActivity?.(\"sent\", {\n size: event.data.size,\n type: \"audio\",\n });\n };\n }\n\n async disconnect(onClose?: (event: unknown) => void): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n if (!this._webSocket || this._webSocket.readyState !== WebSocket.OPEN) {\n resolve();\n return;\n }\n\n this._webSocket.on(\"close\", (event) => {\n if (this._closeTimeout) {\n clearTimeout(this._closeTimeout);\n this._closeTimeout = undefined;\n }\n\n if (onClose) {\n onClose(event);\n }\n\n resolve();\n });\n\n this._webSocket.sendEnd({ type: \"end\" });\n this._onNetworkActivity?.(\"sent\", { type: \"end\" });\n\n this._closeTimeout = window.setTimeout(() => {\n // Reject the promise before closing the web socket, so the promise rejects before close event fires\n reject(new Error(\"WebSocket close timeout\"));\n\n if (this._webSocket?.readyState === WebSocket.OPEN) {\n this._webSocket.close();\n }\n }, 10000);\n });\n\n this.cleanup();\n }\n\n cleanup(): void {\n if (this._closeTimeout) {\n clearTimeout(this._closeTimeout);\n this._closeTimeout = undefined;\n }\n\n if (this._webSocket?.readyState === WebSocket.OPEN) {\n this._webSocket.close();\n }\n\n this._webSocket = null;\n this._cortiClient = null;\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReactiveController, ReactiveControllerHost } from "lit";
|
|
2
2
|
interface MediaControllerHost extends ReactiveControllerHost {
|
|
3
3
|
_selectedDevice?: MediaDeviceInfo;
|
|
4
|
+
_debug_displayAudio?: boolean;
|
|
4
5
|
}
|
|
5
6
|
export declare class MediaController implements ReactiveController {
|
|
6
7
|
host: MediaControllerHost;
|
|
@@ -19,6 +20,11 @@ export declare class MediaController implements ReactiveController {
|
|
|
19
20
|
startAudioLevelMonitoring(onAudioLevelChange?: (level: number) => void): void;
|
|
20
21
|
stopAudioLevelMonitoring(): void;
|
|
21
22
|
cleanup(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Stops the media recorder and waits for all buffered data to be flushed.
|
|
25
|
+
* This ensures the final ondataavailable event fires before resolving.
|
|
26
|
+
*/
|
|
27
|
+
stopRecording(): Promise<void>;
|
|
22
28
|
get mediaRecorder(): MediaRecorder | null;
|
|
23
29
|
get audioLevel(): number;
|
|
24
30
|
}
|
|
@@ -15,7 +15,7 @@ export class MediaController {
|
|
|
15
15
|
async initialize(onTrackEnded) {
|
|
16
16
|
await this.cleanup();
|
|
17
17
|
this._onTrackEnded = onTrackEnded;
|
|
18
|
-
this._mediaStream = await getMediaStream(this.host._selectedDevice?.deviceId);
|
|
18
|
+
this._mediaStream = await getMediaStream(this.host._selectedDevice?.deviceId, this.host._debug_displayAudio);
|
|
19
19
|
this._mediaStream.getTracks().forEach((track) => {
|
|
20
20
|
track.addEventListener("ended", () => {
|
|
21
21
|
if (this._onTrackEnded) {
|
|
@@ -73,6 +73,22 @@ export class MediaController {
|
|
|
73
73
|
this._onTrackEnded = undefined;
|
|
74
74
|
this._onAudioLevelChange = undefined;
|
|
75
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Stops the media recorder and waits for all buffered data to be flushed.
|
|
78
|
+
* This ensures the final ondataavailable event fires before resolving.
|
|
79
|
+
*/
|
|
80
|
+
async stopRecording() {
|
|
81
|
+
return new Promise((resolve) => {
|
|
82
|
+
if (!this._mediaRecorder || this._mediaRecorder.state !== "recording") {
|
|
83
|
+
resolve();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
this._mediaRecorder.onstop = () => {
|
|
87
|
+
resolve();
|
|
88
|
+
};
|
|
89
|
+
this._mediaRecorder.stop();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
76
92
|
get mediaRecorder() {
|
|
77
93
|
return this._mediaRecorder;
|
|
78
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaController.js","sourceRoot":"","sources":["../../../src/controllers/MediaController.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"MediaController.js","sourceRoot":"","sources":["../../../src/controllers/MediaController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport {\n calculateAudioLevel,\n createAudioAnalyzer,\n getMediaStream,\n} from \"../utils/media.js\";\n\ninterface MediaControllerHost extends ReactiveControllerHost {\n _selectedDevice?: MediaDeviceInfo;\n _debug_displayAudio?: boolean;\n}\n\nexport class MediaController implements ReactiveController {\n host: MediaControllerHost;\n\n private _mediaStream: MediaStream | null = null;\n private _audioContext: AudioContext | null = null;\n private _analyser: AnalyserNode | null = null;\n private _mediaRecorder: MediaRecorder | null = null;\n private _visualiserInterval?: number;\n private _audioLevel: number = 0;\n private _onTrackEnded?: () => void;\n private _onAudioLevelChange?: (level: number) => void;\n\n constructor(host: MediaControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n async initialize(onTrackEnded?: () => void): Promise<void> {\n await this.cleanup();\n\n this._onTrackEnded = onTrackEnded;\n this._mediaStream = await getMediaStream(\n this.host._selectedDevice?.deviceId,\n this.host._debug_displayAudio,\n );\n\n this._mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.addEventListener(\"ended\", () => {\n if (this._onTrackEnded) {\n this._onTrackEnded();\n }\n });\n });\n\n const { audioContext, analyser } = createAudioAnalyzer(this._mediaStream);\n\n this._audioContext = audioContext;\n this._analyser = analyser;\n\n this._mediaRecorder = new MediaRecorder(this._mediaStream);\n }\n\n getAudioLevel(): number {\n return this._analyser ? calculateAudioLevel(this._analyser) : 0;\n }\n\n startAudioLevelMonitoring(\n onAudioLevelChange?: (level: number) => void,\n ): void {\n this.stopAudioLevelMonitoring();\n\n this._onAudioLevelChange = onAudioLevelChange;\n\n this._visualiserInterval = window.setInterval(() => {\n this._audioLevel = this.getAudioLevel() * 3;\n this.host.requestUpdate();\n\n if (this._onAudioLevelChange) {\n this._onAudioLevelChange(this._audioLevel);\n }\n }, 150);\n }\n\n stopAudioLevelMonitoring(): void {\n if (this._visualiserInterval) {\n clearInterval(this._visualiserInterval);\n this._visualiserInterval = undefined;\n }\n\n this._audioLevel = 0;\n this.host.requestUpdate();\n\n if (this._onAudioLevelChange) {\n this._onAudioLevelChange(this._audioLevel);\n }\n }\n\n async cleanup(): Promise<void> {\n this.stopAudioLevelMonitoring();\n\n if (this._mediaRecorder?.state === \"recording\") {\n this._mediaRecorder.stop();\n }\n\n if (this._mediaStream) {\n this._mediaStream.getTracks().forEach((track) => {\n track.stop();\n });\n this._mediaStream = null;\n }\n\n if (this._audioContext && this._audioContext.state !== \"closed\") {\n await this._audioContext.close();\n }\n\n this._audioContext = null;\n\n this._analyser = null;\n this._mediaRecorder = null;\n this._onTrackEnded = undefined;\n this._onAudioLevelChange = undefined;\n }\n\n /**\n * Stops the media recorder and waits for all buffered data to be flushed.\n * This ensures the final ondataavailable event fires before resolving.\n */\n async stopRecording(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this._mediaRecorder || this._mediaRecorder.state !== \"recording\") {\n resolve();\n return;\n }\n\n this._mediaRecorder.onstop = () => {\n resolve();\n };\n\n this._mediaRecorder.stop();\n });\n }\n\n get mediaRecorder(): MediaRecorder | null {\n return this._mediaRecorder;\n }\n\n get audioLevel(): number {\n return this._audioLevel;\n }\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { css } from 'lit';
|
|
2
2
|
const ComponentStyles = css `
|
|
3
3
|
.wrapper {
|
|
4
|
-
background-color: var(--card-background);
|
|
5
|
-
border: 1px solid var(--card-border-color);
|
|
6
|
-
border-radius: var(--card-border-radius);
|
|
7
|
-
box-shadow: var(--card-box-shadow);
|
|
8
|
-
padding: var(--card-padding);
|
|
4
|
+
background-color: var(--card-background, light-dark(#fff, #333));
|
|
5
|
+
border: 1px solid var(--card-border-color, light-dark(#ddd, #555));
|
|
6
|
+
border-radius: var(--card-border-radius, 8px);
|
|
7
|
+
box-shadow: var(--card-box-shadow, 0 2px 5px rgba(0, 0, 0, 0.1));
|
|
8
|
+
padding: var(--card-padding, 4px);
|
|
9
9
|
display: flex;
|
|
10
10
|
gap: 4px;
|
|
11
11
|
height: 46px;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentStyles.js","sourceRoot":"","sources":["../../../src/styles/ComponentStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,eAAe,GAAG,GAAG,CAAA;;;;;;;;;;;;;;CAc1B,CAAC;AAEF,eAAe,eAAe,CAAC","sourcesContent":["import { css } from 'lit';\n\nconst ComponentStyles = css`\n .wrapper {\n background-color: var(--card-background);\n border: 1px solid var(--card-border-color);\n border-radius: var(--card-border-radius);\n box-shadow: var(--card-box-shadow);\n padding: var(--card-padding);\n display: flex;\n gap: 4px;\n height: 46px;\n width: fit-content;\n box-sizing: border-box;\n overflow: hidden;\n }\n`;\n\nexport default ComponentStyles;\n\n"]}
|
|
1
|
+
{"version":3,"file":"ComponentStyles.js","sourceRoot":"","sources":["../../../src/styles/ComponentStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,eAAe,GAAG,GAAG,CAAA;;;;;;;;;;;;;;CAc1B,CAAC;AAEF,eAAe,eAAe,CAAC","sourcesContent":["import { css } from 'lit';\n\nconst ComponentStyles = css`\n .wrapper {\n background-color: var(--card-background, light-dark(#fff, #333));\n border: 1px solid var(--card-border-color, light-dark(#ddd, #555));\n border-radius: var(--card-border-radius, 8px);\n box-shadow: var(--card-box-shadow, 0 2px 5px rgba(0, 0, 0, 0.1));\n padding: var(--card-padding, 4px);\n display: flex;\n gap: 4px;\n height: 46px;\n width: fit-content;\n box-sizing: border-box;\n overflow: hidden;\n }\n`;\n\nexport default ComponentStyles;\n\n"]}
|
|
@@ -19,7 +19,7 @@ const AudioVisualiserStyles = css `
|
|
|
19
19
|
|
|
20
20
|
.segment {
|
|
21
21
|
flex: 1;
|
|
22
|
-
background-color: var(--action-accent-text-color);
|
|
22
|
+
background-color: var(--action-accent-text-color, light-dark(#fff, #fff));
|
|
23
23
|
transition: background-color 0.25s;
|
|
24
24
|
border-radius: 1px;
|
|
25
25
|
opacity: 0.5;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-visualiser.js","sourceRoot":"","sources":["../../../src/styles/audio-visualiser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,qBAAqB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BhC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst AudioVisualiserStyles = css`\n :host {\n height: 100%;\n }\n\n .container {\n display: flex;\n width: 8px;\n flex-direction: column-reverse; /* Bottom-up stacking */\n height: 100%;\n gap: 1px;\n opacity: 0.5;\n\n &.active {\n opacity: 1;\n }\n }\n\n .segment {\n flex: 1;\n background-color: var(--action-accent-text-color);\n transition: background-color 0.25s;\n border-radius: 1px;\n opacity: 0.5;\n }\n\n .segment.active {\n opacity: 1;\n }\n`;\n\nexport default AudioVisualiserStyles;\n\n"]}
|
|
1
|
+
{"version":3,"file":"audio-visualiser.js","sourceRoot":"","sources":["../../../src/styles/audio-visualiser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,qBAAqB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BhC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst AudioVisualiserStyles = css`\n :host {\n height: 100%;\n }\n\n .container {\n display: flex;\n width: 8px;\n flex-direction: column-reverse; /* Bottom-up stacking */\n height: 100%;\n gap: 1px;\n opacity: 0.5;\n\n &.active {\n opacity: 1;\n }\n }\n\n .segment {\n flex: 1;\n background-color: var(--action-accent-text-color, light-dark(#fff, #fff));\n transition: background-color 0.25s;\n border-radius: 1px;\n opacity: 0.5;\n }\n\n .segment.active {\n opacity: 1;\n }\n`;\n\nexport default AudioVisualiserStyles;\n\n"]}
|
|
@@ -2,50 +2,50 @@ import { css } from 'lit';
|
|
|
2
2
|
const ButtonStyles = css `
|
|
3
3
|
/* Default (plain) button styling */
|
|
4
4
|
button {
|
|
5
|
-
background: var(--action-plain-background);
|
|
5
|
+
background: var(--action-plain-background, transparent);
|
|
6
6
|
/* border: 1px solid var(--action-plain-border-color); */
|
|
7
7
|
border: none;
|
|
8
|
-
color: var(--component-text-color);
|
|
8
|
+
color: var(--component-text-color, light-dark(#333, #eee));
|
|
9
9
|
cursor: pointer;
|
|
10
10
|
padding: 8px;
|
|
11
|
-
border-radius: var(--card-inner-border-radius);
|
|
11
|
+
border-radius: var(--card-inner-border-radius, 6px);
|
|
12
12
|
display: inline-flex;
|
|
13
13
|
gap: 4px;
|
|
14
14
|
align-items: center;
|
|
15
15
|
justify-content: center;
|
|
16
16
|
transition: background 0.3s ease;
|
|
17
|
-
font-family: var(--component-font-family);
|
|
17
|
+
font-family: var(--component-font-family, -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, Cantarell, Ubuntu, roboto, noto, helvetica, arial, sans-serif);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
button:hover {
|
|
21
|
-
background: var(--action-plain-background-hover);
|
|
21
|
+
background: var(--action-plain-background-hover, light-dark(#ddd, #444));
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
button:focus-visible {
|
|
25
|
-
outline: 2px solid var(--action-accent-background);
|
|
25
|
+
outline: 2px solid var(--action-accent-background, light-dark(#007bff, #0056b3));
|
|
26
26
|
outline-offset: 2px;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
/* Accent variant */
|
|
30
30
|
button.accent {
|
|
31
|
-
background: var(--action-accent-background);
|
|
32
|
-
color: var(--action-accent-text-color);
|
|
31
|
+
background: var(--action-accent-background, light-dark(#007bff, #0056b3));
|
|
32
|
+
color: var(--action-accent-text-color, #fff);
|
|
33
33
|
border: none;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
button.accent:hover {
|
|
37
|
-
background: var(--action-accent-background-hover);
|
|
37
|
+
background: var(--action-accent-background-hover, light-dark(#0056b3, #003d80));
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/* Red variant */
|
|
41
41
|
button.red {
|
|
42
|
-
background: var(--action-red-background);
|
|
43
|
-
color: var(--action-red-text-color);
|
|
42
|
+
background: var(--action-red-background, light-dark(#dc3545, #bd2130));
|
|
43
|
+
color: var(--action-red-text-color, #fff);
|
|
44
44
|
border: none;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
button.red:hover {
|
|
48
|
-
background: var(--action-red-background-hover);
|
|
48
|
+
background: var(--action-red-background-hover, light-dark(#bd2130, #a71c24));
|
|
49
49
|
}
|
|
50
50
|
`;
|
|
51
51
|
export default ButtonStyles;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buttons.js","sourceRoot":"","sources":["../../../src/styles/buttons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,YAAY,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDvB,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import { css } from 'lit';\n\nconst ButtonStyles = css`\n /* Default (plain) button styling */\n button {\n background: var(--action-plain-background);\n /* border: 1px solid var(--action-plain-border-color); */\n border: none;\n color: var(--component-text-color);\n cursor: pointer;\n padding: 8px;\n border-radius: var(--card-inner-border-radius);\n display: inline-flex;\n gap: 4px;\n align-items: center;\n justify-content: center;\n transition: background 0.3s ease;\n font-family: var(--component-font-family);\n }\n\n button:hover {\n background: var(--action-plain-background-hover);\n }\n\n button:focus-visible {\n outline: 2px solid var(--action-accent-background);\n outline-offset: 2px;\n }\n\n /* Accent variant */\n button.accent {\n background: var(--action-accent-background);\n color: var(--action-accent-text-color);\n border: none;\n }\n\n button.accent:hover {\n background: var(--action-accent-background-hover);\n }\n\n /* Red variant */\n button.red {\n background: var(--action-red-background);\n color: var(--action-red-text-color);\n border: none;\n }\n\n button.red:hover {\n background: var(--action-red-background-hover);\n }\n`;\n\nexport default ButtonStyles;\n"]}
|
|
1
|
+
{"version":3,"file":"buttons.js","sourceRoot":"","sources":["../../../src/styles/buttons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,YAAY,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDvB,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import { css } from 'lit';\n\nconst ButtonStyles = css`\n /* Default (plain) button styling */\n button {\n background: var(--action-plain-background, transparent);\n /* border: 1px solid var(--action-plain-border-color); */\n border: none;\n color: var(--component-text-color, light-dark(#333, #eee));\n cursor: pointer;\n padding: 8px;\n border-radius: var(--card-inner-border-radius, 6px);\n display: inline-flex;\n gap: 4px;\n align-items: center;\n justify-content: center;\n transition: background 0.3s ease;\n font-family: var(--component-font-family, -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, Cantarell, Ubuntu, roboto, noto, helvetica, arial, sans-serif);\n }\n\n button:hover {\n background: var(--action-plain-background-hover, light-dark(#ddd, #444));\n }\n\n button:focus-visible {\n outline: 2px solid var(--action-accent-background, light-dark(#007bff, #0056b3));\n outline-offset: 2px;\n }\n\n /* Accent variant */\n button.accent {\n background: var(--action-accent-background, light-dark(#007bff, #0056b3));\n color: var(--action-accent-text-color, #fff);\n border: none;\n }\n\n button.accent:hover {\n background: var(--action-accent-background-hover, light-dark(#0056b3, #003d80));\n }\n\n /* Red variant */\n button.red {\n background: var(--action-red-background, light-dark(#dc3545, #bd2130));\n color: var(--action-red-text-color, #fff);\n border: none;\n }\n\n button.red:hover {\n background: var(--action-red-background-hover, light-dark(#bd2130, #a71c24));\n }\n`;\n\nexport default ButtonStyles;\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { css } from 'lit';
|
|
2
2
|
const CalloutStyles = css `
|
|
3
3
|
.callout {
|
|
4
|
-
background: var(--callout-info-background);
|
|
5
|
-
border: 1px solid var(--callout-info-border);
|
|
6
|
-
color: var(--callout-info-text);
|
|
4
|
+
background: var(--callout-info-background, light-dark(#007bff33, #0056b333));
|
|
5
|
+
border: 1px solid var(--callout-info-border, light-dark(#007bff99, #0056b399));
|
|
6
|
+
color: var(--callout-info-text, light-dark(#007bff, #0056b3));
|
|
7
7
|
padding: 8px;
|
|
8
|
-
border-radius: var(--card-inner-border-radius);
|
|
8
|
+
border-radius: var(--card-inner-border-radius, 6px);
|
|
9
9
|
display: flex;
|
|
10
10
|
font-size: 0.9rem;
|
|
11
11
|
gap: 8px;
|
|
@@ -13,9 +13,9 @@ const CalloutStyles = css `
|
|
|
13
13
|
max-width: 100%;
|
|
14
14
|
height: fit-content;
|
|
15
15
|
&.warn {
|
|
16
|
-
background: var(--callout-warn-background);
|
|
17
|
-
border: 1px solid var(--callout-warn-border);
|
|
18
|
-
color: var(--callout-warn-text);
|
|
16
|
+
background: var(--callout-warn-background, light-dark(#fd7e1433, #e06c1233));
|
|
17
|
+
border: 1px solid var(--callout-warn-border, light-dark(#fd7e1499, #e06c1299));
|
|
18
|
+
color: var(--callout-warn-text, light-dark(#fd7e14, #e06c12));
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callout.js","sourceRoot":"","sources":["../../../src/styles/callout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,aAAa,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;CAmBxB,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { css } from 'lit';\n\nconst CalloutStyles = css`\n .callout {\n background: var(--callout-info-background);\n border: 1px solid var(--callout-info-border);\n color: var(--callout-info-text);\n padding: 8px;\n border-radius: var(--card-inner-border-radius);\n display: flex;\n font-size: 0.9rem;\n gap: 8px;\n align-items: center;\n max-width: 100%;\n height: fit-content;\n &.warn {\n background: var(--callout-warn-background);\n border: 1px solid var(--callout-warn-border);\n color: var(--callout-warn-text);\n }\n }\n`;\n\nexport default CalloutStyles;\n"]}
|
|
1
|
+
{"version":3,"file":"callout.js","sourceRoot":"","sources":["../../../src/styles/callout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,aAAa,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;CAmBxB,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { css } from 'lit';\n\nconst CalloutStyles = css`\n .callout {\n background: var(--callout-info-background, light-dark(#007bff33, #0056b333));\n border: 1px solid var(--callout-info-border, light-dark(#007bff99, #0056b399));\n color: var(--callout-info-text, light-dark(#007bff, #0056b3));\n padding: 8px;\n border-radius: var(--card-inner-border-radius, 6px);\n display: flex;\n font-size: 0.9rem;\n gap: 8px;\n align-items: center;\n max-width: 100%;\n height: fit-content;\n &.warn {\n background: var(--callout-warn-background, light-dark(#fd7e1433, #e06c1233));\n border: 1px solid var(--callout-warn-border, light-dark(#fd7e1499, #e06c1299));\n color: var(--callout-warn-text, light-dark(#fd7e14, #e06c12));\n }\n }\n`;\n\nexport default CalloutStyles;\n"]}
|