@corti/dictation-web 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -24
- package/dist/{src/index.d.ts → CortiDictation.d.ts} +2 -2
- package/dist/{src/index.js → CortiDictation.js} +10 -10
- package/dist/CortiDictation.js.map +1 -0
- package/dist/{src/dictationService.d.ts → DictationService.d.ts} +4 -4
- package/dist/{src/DictationService.js → DictationService.js} +6 -4
- package/dist/DictationService.js.map +1 -0
- package/dist/{src/RecorderManager.d.ts → RecorderManager.d.ts} +2 -2
- package/dist/RecorderManager.js.map +1 -0
- package/dist/audioService.js.map +1 -0
- package/dist/components/audio-visualiser.js.map +1 -0
- package/dist/components/settings-menu.js.map +1 -0
- package/dist/constants.js.map +1 -0
- package/dist/icons/icons.js.map +1 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/ComponentStyles.js.map +1 -0
- package/dist/styles/buttons.js.map +1 -0
- package/dist/styles/callout.js.map +1 -0
- package/dist/styles/select.js.map +1 -0
- package/dist/styles/theme.js.map +1 -0
- package/dist/types.js.map +1 -0
- package/dist/{src/utils.d.ts → utils.d.ts} +29 -0
- package/dist/{src/utils.js → utils.js} +71 -0
- package/dist/utils.js.map +1 -0
- package/package.json +6 -6
- package/.editorconfig +0 -29
- package/.eslintrc.json +0 -16
- package/.husky/pre-commit +0 -1
- package/.storybook/main.js +0 -8
- package/demo/index.html +0 -98
- package/dist/src/CortiDictation.d.ts +0 -19
- package/dist/src/CortiDictation.js +0 -137
- package/dist/src/CortiDictation.js.map +0 -1
- package/dist/src/DictationService.d.ts +0 -13
- package/dist/src/DictationService.js.map +0 -1
- package/dist/src/RecorderManager.js.map +0 -1
- package/dist/src/audioRecorderManager.d.ts +0 -17
- package/dist/src/audioRecorderManager.js +0 -78
- package/dist/src/audioRecorderManager.js.map +0 -1
- package/dist/src/audioService.js.map +0 -1
- package/dist/src/componentStyles.d.ts +0 -1
- package/dist/src/componentStyles.js +0 -51
- package/dist/src/componentStyles.js.map +0 -1
- package/dist/src/components/audio-visualiser.js.map +0 -1
- package/dist/src/components/settings-menu.js.map +0 -1
- package/dist/src/components/visualiser.d.ts +0 -7
- package/dist/src/components/visualiser.js +0 -62
- package/dist/src/components/visualiser.js.map +0 -1
- package/dist/src/constants.js.map +0 -1
- package/dist/src/corti-dictation.d.ts +0 -1
- package/dist/src/corti-dictation.js +0 -3
- package/dist/src/corti-dictation.js.map +0 -1
- package/dist/src/dictationService.js +0 -70
- package/dist/src/dictationService.js.map +0 -1
- package/dist/src/icons/icons.js.map +0 -1
- package/dist/src/icons/index.js.map +0 -1
- package/dist/src/icons/micOn.d.ts +0 -7
- package/dist/src/icons/micOn.js +0 -25
- package/dist/src/icons/micOn.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/mediaRecorderService.d.ts +0 -6
- package/dist/src/mediaRecorderService.js +0 -31
- package/dist/src/mediaRecorderService.js.map +0 -1
- package/dist/src/mic-selector.d.ts +0 -18
- package/dist/src/mic-selector.js +0 -131
- package/dist/src/mic-selector.js.map +0 -1
- package/dist/src/settings-menu.d.ts +0 -18
- package/dist/src/settings-menu.js +0 -131
- package/dist/src/settings-menu.js.map +0 -1
- package/dist/src/settings-popover.d.ts +0 -18
- package/dist/src/settings-popover.js +0 -131
- package/dist/src/settings-popover.js.map +0 -1
- package/dist/src/settings.d.ts +0 -18
- package/dist/src/settings.js +0 -131
- package/dist/src/settings.js.map +0 -1
- package/dist/src/styles/ComponentStyles.js.map +0 -1
- package/dist/src/styles/buttons.js.map +0 -1
- package/dist/src/styles/callout.js.map +0 -1
- package/dist/src/styles/select.js.map +0 -1
- package/dist/src/styles/theme.js.map +0 -1
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils.js.map +0 -1
- package/dist/stories/index.stories.d.ts +0 -33
- package/dist/stories/index.stories.js +0 -37
- package/dist/stories/index.stories.js.map +0 -1
- package/dist/test/corti-dictation.test.d.ts +0 -1
- package/dist/test/corti-dictation.test.js +0 -100
- package/dist/test/corti-dictation.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/docs/DEV_README.md +0 -80
- package/src/DictationService.ts +0 -99
- package/src/RecorderManager.ts +0 -114
- package/src/audioService.ts +0 -25
- package/src/components/audio-visualiser.ts +0 -56
- package/src/components/settings-menu.ts +0 -152
- package/src/constants.ts +0 -10
- package/src/corti-dictation.ts +0 -3
- package/src/icons/icons.ts +0 -141
- package/src/icons/index.ts +0 -0
- package/src/index.ts +0 -154
- package/src/styles/ComponentStyles.ts +0 -53
- package/src/styles/buttons.ts +0 -59
- package/src/styles/callout.ts +0 -27
- package/src/styles/select.ts +0 -37
- package/src/styles/theme.ts +0 -75
- package/src/types.ts +0 -28
- package/src/utils.ts +0 -83
- package/stories/index.stories.ts +0 -60
- package/test/corti-dictation.test.ts +0 -124
- package/tsconfig.json +0 -22
- package/web-dev-server.config.js +0 -27
- package/web-test-runner.config.js +0 -41
- /package/dist/{src/RecorderManager.js → RecorderManager.js} +0 -0
- /package/dist/{src/audioService.d.ts → audioService.d.ts} +0 -0
- /package/dist/{src/audioService.js → audioService.js} +0 -0
- /package/dist/{src/components → components}/audio-visualiser.d.ts +0 -0
- /package/dist/{src/components → components}/audio-visualiser.js +0 -0
- /package/dist/{src/components → components}/settings-menu.d.ts +0 -0
- /package/dist/{src/components → components}/settings-menu.js +0 -0
- /package/dist/{src/constants.d.ts → constants.d.ts} +0 -0
- /package/dist/{src/constants.js → constants.js} +0 -0
- /package/dist/{src/icons → icons}/icons.d.ts +0 -0
- /package/dist/{src/icons → icons}/icons.js +0 -0
- /package/dist/{src/icons → icons}/index.d.ts +0 -0
- /package/dist/{src/icons → icons}/index.js +0 -0
- /package/dist/{src/styles → styles}/ComponentStyles.d.ts +0 -0
- /package/dist/{src/styles → styles}/ComponentStyles.js +0 -0
- /package/dist/{src/styles → styles}/buttons.d.ts +0 -0
- /package/dist/{src/styles → styles}/buttons.js +0 -0
- /package/dist/{src/styles → styles}/callout.d.ts +0 -0
- /package/dist/{src/styles → styles}/callout.js +0 -0
- /package/dist/{src/styles → styles}/select.d.ts +0 -0
- /package/dist/{src/styles → styles}/select.js +0 -0
- /package/dist/{src/styles → styles}/theme.d.ts +0 -0
- /package/dist/{src/styles → styles}/theme.js +0 -0
- /package/dist/{src/types.d.ts → types.d.ts} +0 -0
- /package/dist/{src/types.js → types.js} +0 -0
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
export class DictationService extends EventTarget {
|
|
2
|
-
constructor(mediaStream, { dictationConfig, serverConfig }) {
|
|
3
|
-
super();
|
|
4
|
-
this.mediaRecorder = new MediaRecorder(mediaStream);
|
|
5
|
-
this.serverConfig = serverConfig;
|
|
6
|
-
this.dictationConfig = dictationConfig;
|
|
7
|
-
this.mediaRecorder.ondataavailable = event => {
|
|
8
|
-
// if (event.data && event.data.size > 0) {
|
|
9
|
-
// this.dispatchEvent(
|
|
10
|
-
// new CustomEvent('audio-packet', {
|
|
11
|
-
// detail: event.data,
|
|
12
|
-
// bubbles: true,
|
|
13
|
-
// composed: true,
|
|
14
|
-
// }),
|
|
15
|
-
// );
|
|
16
|
-
// }
|
|
17
|
-
// if webSocket is open, send the data
|
|
18
|
-
if (this.webSocket?.readyState === WebSocket.OPEN) {
|
|
19
|
-
this.webSocket.send(event.data);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
startRecording() {
|
|
24
|
-
const url = `wss://api.${this.serverConfig.environment}.corti.app/audio-bridge/v2/transcribe?tenant-name=${this.serverConfig.tenant}&token=Bearer%20${this.serverConfig.token}`;
|
|
25
|
-
this.webSocket = new WebSocket(url);
|
|
26
|
-
this.webSocket.onopen = () => {
|
|
27
|
-
this.webSocket.send(JSON.stringify({
|
|
28
|
-
type: 'config',
|
|
29
|
-
configuration: this.dictationConfig,
|
|
30
|
-
}));
|
|
31
|
-
};
|
|
32
|
-
this.webSocket.onmessage = event => {
|
|
33
|
-
const message = JSON.parse(event.data);
|
|
34
|
-
if (message.type === 'config') {
|
|
35
|
-
this.mediaRecorder.start(250);
|
|
36
|
-
}
|
|
37
|
-
else if (message.type === 'transcript') {
|
|
38
|
-
this.dispatchEvent(new CustomEvent('transcript', {
|
|
39
|
-
detail: message,
|
|
40
|
-
bubbles: true,
|
|
41
|
-
composed: true,
|
|
42
|
-
}));
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
async stopRecording() {
|
|
47
|
-
let timeOut;
|
|
48
|
-
this.mediaRecorder.stop();
|
|
49
|
-
if (this.webSocket?.readyState === WebSocket.OPEN) {
|
|
50
|
-
this.webSocket.send(JSON.stringify({
|
|
51
|
-
type: 'end',
|
|
52
|
-
}));
|
|
53
|
-
}
|
|
54
|
-
this.webSocket.onmessage = (e) => {
|
|
55
|
-
};
|
|
56
|
-
// this implementation should be replaced by handling a proper 'ended' message from the server
|
|
57
|
-
this.webSocket.onclose = async () => {
|
|
58
|
-
this.webSocket.close();
|
|
59
|
-
clearTimeout(timeOut);
|
|
60
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
61
|
-
return;
|
|
62
|
-
};
|
|
63
|
-
timeOut = setTimeout(() => {
|
|
64
|
-
if (this.webSocket?.readyState === WebSocket.OPEN) {
|
|
65
|
-
this.webSocket.close();
|
|
66
|
-
}
|
|
67
|
-
}, 10000);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=dictationService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dictationService.js","sourceRoot":"","sources":["../../src/dictationService.ts"],"names":[],"mappings":"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","sourcesContent":["import { DictationConfig, ServerConfig } from \"./types\";\n\n\nexport class DictationService extends EventTarget {\n private mediaRecorder: MediaRecorder;\n private webSocket!: WebSocket;\n private serverConfig!: ServerConfig;\n private dictationConfig!: DictationConfig;\n\n constructor(mediaStream: MediaStream, {dictationConfig, serverConfig}: {dictationConfig: DictationConfig, serverConfig: ServerConfig}) {\n super();\n this.mediaRecorder = new MediaRecorder(mediaStream);\n this.serverConfig = serverConfig;\n this.dictationConfig = dictationConfig;\n this.mediaRecorder.ondataavailable = event => {\n // if (event.data && event.data.size > 0) {\n // this.dispatchEvent(\n // new CustomEvent('audio-packet', {\n // detail: event.data,\n // bubbles: true,\n // composed: true,\n // }),\n // );\n // }\n\n // if webSocket is open, send the data\n if (this.webSocket?.readyState === WebSocket.OPEN) {\n this.webSocket.send(event.data\n );\n }\n };\n }\n\n public startRecording() {\n const url = `wss://api.${this.serverConfig.environment}.corti.app/audio-bridge/v2/transcribe?tenant-name=${this.serverConfig.tenant}&token=Bearer%20${this.serverConfig.token}`\n this.webSocket = new WebSocket(url);\n this.webSocket.onopen = () => {\n this.webSocket.send(\n JSON.stringify({\n type: 'config',\n configuration: this.dictationConfig,\n }),\n );\n };\n this.webSocket.onmessage = event => {\n const message = JSON.parse(event.data);\n if (message.type === 'config') {\n this.mediaRecorder.start(250);\n } else if (message.type === 'transcript') {\n this.dispatchEvent(\n new CustomEvent('transcript', {\n detail: message,\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n }\n\n public async stopRecording() {\n let timeOut: any;\n this.mediaRecorder.stop();\n if (this.webSocket?.readyState === WebSocket.OPEN) {\n this.webSocket.send(\n JSON.stringify({\n type: 'end',\n }),\n );\n }\n this.webSocket.onmessage = (e) => {\n\n };\n // this implementation should be replaced by handling a proper 'ended' message from the server\n this.webSocket.onclose = async() => {\n this.webSocket.close();\n clearTimeout(timeOut);\n await new Promise((resolve) => setTimeout(resolve, 100));\n return\n };\n timeOut = setTimeout(() => {\n if (this.webSocket?.readyState === WebSocket.OPEN) {\n this.webSocket.close();\n }\n }, 10000);\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../src/icons/icons.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG3C,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IACvC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;;KAmBV,CAAC;IACJ,CAAC;CACF,CAAA;AAvBY,SAAS;IADrB,aAAa,CAAC,aAAa,CAAC;GAChB,SAAS,CAuBrB;;AAGM,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,UAAU;IACxC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;WAoBJ,CAAC;IACV,CAAC;CACF,CAAA;AAxBY,UAAU;IADtB,aAAa,CAAC,cAAc,CAAC;GACjB,UAAU,CAwBtB;;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAC3C,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;KAkBV,CAAC;IACJ,CAAC;CACF,CAAA;AAtBY,aAAa;IADzB,aAAa,CAAC,gBAAgB,CAAC;GACnB,aAAa,CAsBzB;;AAEM,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAC1C,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;WAkBJ,CAAC;IACV,CAAC;CACF,CAAA;AAtBY,YAAY;IADxB,aAAa,CAAC,eAAe,CAAC;GAClB,YAAY,CAsBxB;;AAGM,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,UAAU;IAehD,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;WAeJ,CAAC;IACV,CAAC;;AA/BM,yBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;GAYlB,AAZY,CAYX;AAbS,kBAAkB;IAD9B,aAAa,CAAC,sBAAsB,CAAC;GACzB,kBAAkB,CAiC9B","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { LitElement, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('icon-mic-on')\nexport class IconMicOn extends LitElement {\n render() {\n return html`\n <div style=\"display: flex\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-mic\"\n >\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n </div>\n `;\n }\n}\n\n@customElement('icon-mic-off')\nexport class IconMicOff extends LitElement {\n render() {\n return html` <div style=\"display: flex\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-mic-off\"\n >\n <line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\" />\n <path d=\"M18.89 13.23A7.12 7.12 0 0 0 19 12v-2\" />\n <path d=\"M5 10v2a7 7 0 0 0 12 5\" />\n <path d=\"M15 9.34V5a3 3 0 0 0-5.68-1.33\" />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n </div>`;\n }\n}\n\n@customElement('icon-recording')\nexport class IconRecording extends LitElement {\n render() {\n return html`\n <div style=\"display: flex;\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-circle-stop\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" rx=\"1\" fill=\"currentColor\" />\n </svg>\n </div>\n `;\n }\n}\n@customElement('icon-settings')\nexport class IconSettings extends LitElement {\n render() {\n return html`<div style=\"display: flex\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-settings-2\"\n >\n <path d=\"M20 7h-9\" />\n <path d=\"M14 17H5\" />\n <circle cx=\"17\" cy=\"17\" r=\"3\" />\n <circle cx=\"7\" cy=\"7\" r=\"3\" />\n </svg>\n </div>`;\n }\n}\n\n@customElement('icon-loading-spinner')\nexport class IconLoadingSpinner extends LitElement {\n static styles = css`\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n .spin {\n animation: spin 1s linear infinite;\n }\n `;\n\n render() {\n return html`<div style=\"display: flex\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-loader-circle spin\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n </div>`;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/icons/index.ts"],"names":[],"mappings":"","sourcesContent":[""]}
|
package/dist/src/icons/micOn.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { LitElement, svg } from 'lit';
|
|
3
|
-
import { customElement } from 'lit/decorators.js';
|
|
4
|
-
let IconMicOn = class IconMicOn extends LitElement {
|
|
5
|
-
render() {
|
|
6
|
-
return svg `
|
|
7
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mic"><path d="M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><line x1="12" x2="12" y1="19" y2="22"/></svg>
|
|
8
|
-
`;
|
|
9
|
-
}
|
|
10
|
-
};
|
|
11
|
-
IconMicOn = __decorate([
|
|
12
|
-
customElement('icon-mic-on')
|
|
13
|
-
], IconMicOn);
|
|
14
|
-
export { IconMicOn };
|
|
15
|
-
let IconMicOff = class IconMicOff extends LitElement {
|
|
16
|
-
render() {
|
|
17
|
-
return svg `
|
|
18
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mic-off"><line x1="2" x2="22" y1="2" y2="22"/><path d="M18.89 13.23A7.12 7.12 0 0 0 19 12v-2"/><path d="M5 10v2a7 7 0 0 0 12 5"/><path d="M15 9.34V5a3 3 0 0 0-5.68-1.33"/><path d="M9 9v3a3 3 0 0 0 5.12 2.12"/><line x1="12" x2="12" y1="19" y2="22"/></svg> `;
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
IconMicOff = __decorate([
|
|
22
|
-
customElement('icon-mic-off')
|
|
23
|
-
], IconMicOff);
|
|
24
|
-
export { IconMicOff };
|
|
25
|
-
//# sourceMappingURL=micOn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"micOn.js","sourceRoot":"","sources":["../../../src/icons/micOn.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG3C,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IACvC,MAAM;QACJ,OAAO,GAAG,CAAA;;OAEP,CAAC;IACN,CAAC;CACF,CAAA;AANY,SAAS;IADrB,aAAa,CAAC,aAAa,CAAC;GAChB,SAAS,CAMrB;;AAGM,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,UAAU;IACxC,MAAM;QACJ,OAAO,GAAG,CAAA;mdACqc,CAAC;IACld,CAAC;CACF,CAAA;AALY,UAAU;IADtB,aAAa,CAAC,cAAc,CAAC;GACjB,UAAU,CAKtB","sourcesContent":["import { LitElement, svg } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('icon-mic-on')\nexport class IconMicOn extends LitElement {\n render() {\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-mic\"><path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\"/><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/><line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"/></svg>\n `;\n }\n}\n\n@customElement('icon-mic-off')\nexport class IconMicOff extends LitElement {\n render() {\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-mic-off\"><line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\"/><path d=\"M18.89 13.23A7.12 7.12 0 0 0 19 12v-2\"/><path d=\"M5 10v2a7 7 0 0 0 12 5\"/><path d=\"M15 9.34V5a3 3 0 0 0-5.68-1.33\"/><path d=\"M9 9v3a3 3 0 0 0 5.12 2.12\"/><line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"/></svg> `;\n }\n}\n"]}
|
package/dist/src/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,qBAAqB;AACrB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,4BAA4B,CAAC;AACpC,OAAO,+BAA+B,CAAC;AACvC,OAAO,eAAe,CAAC;AACvB,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,eAAe,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAE7C,MAAM,OAAO,cAAe,SAAQ,UAAU;IAA9C;;QAIE,YAAO,GAAsB,EAAE,CAAC;QAGhC,mBAAc,GAAG,SAAS,CAAC;QAG3B,oBAAe,GAAoB,wBAAwB,CAAC;QAG5D,iBAAY,GAAiB,EAAE,CAAC;QAGxB,gBAAW,GAAG,CAAC,CAAC;QAEhB,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAsHlD,CAAC;IApHC,KAAK,CAAC,iBAAiB;QACrB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QAE5C,8CAA8C;QAC9C,MAAM,aAAa,GAA6C;YAC9D,yBAAyB,EAAE,CAAC,CAAC,EAAE;gBAC7B,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YACvC,CAAC;YACD,qBAAqB,EAAE,CAAC,CAAC,EAAE;gBACzB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACvC,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;SACF,CAAC;QAEF,MAAM,aAAa,GAAG;YACpB,yBAAyB;YACzB,qBAAqB;YACrB,OAAO;YACP,YAAY;SACb,CAAC;QAEF,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAChC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAQ,EAAE,EAAE;gBAC5D,MAAM,WAAW,GAAG,CAAgB,CAAC;gBACrC,6CAA6C;gBAC7C,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,aAAa,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;gBACxC,CAAC;gBACD,2CAA2C;gBAC3C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,SAAS,EAAE;oBACzB,MAAM,EAAE,WAAW,CAAC,MAAM;oBAC1B,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;iBACf,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,cAAc,KAAK,WAAW,EAAE,CAAC;YACxC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;QACvC,CAAC;aAAM,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;gBAClC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,yBAAyB,CAAC,KAAY;QAC1C,MAAM,WAAW,GAAG,KAAoB,CAAC;QACzC,IAAI,CAAC,eAAe,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;QAClE,IAAI,IAAI,CAAC,cAAc,KAAK,WAAW,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;gBACxC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM;QACJ,MAAM,YAAY,GAChB,IAAI,CAAC,YAAY;YACjB,IAAI,CAAC,YAAY,CAAC,KAAK;YACvB,IAAI,CAAC,YAAY,CAAC,WAAW;YAC7B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA;;;;;;OAMV,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GACb,IAAI,CAAC,cAAc,KAAK,cAAc;YACtC,IAAI,CAAC,cAAc,KAAK,UAAU,CAAC;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,KAAK,WAAW,CAAC;QACxD,OAAO,IAAI,CAAA;;;mBAGI,IAAI,CAAC,gBAAgB;kBACtB,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;;YAEpC,SAAS;YACT,CAAC,CAAC,IAAI,CAAA,+CAA+C;YACrD,CAAC,CAAC,WAAW;gBACX,CAAC,CAAC,IAAI,CAAA,mCAAmC;gBACzC,CAAC,CAAC,IAAI,CAAA,6BAA6B;;qBAE5B,IAAI,CAAC,WAAW;sBACf,WAAW;;;;;qBAKZ,IAAI,CAAC,OAAO;4BACL,IAAI,CAAC,eAAe,CAAC,cAAc;8BACjC,IAAI,CAAC,cAAc,KAAK,SAAS;sCACzB,IAAI,CAAC,yBAAyB;;;KAG/D,CAAC;IACJ,CAAC;;AAtIM,qBAAM,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,CAAC,AAA9D,CAA+D;AAG5E;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;+CACM;AAGhC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;sDACf;AAG3B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDACiC;AAG5D;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDACK;AAGxB;IADP,KAAK,EAAE;mDACgB;AA0H1B,eAAe,cAAc,CAAC","sourcesContent":["// corti-dictation.ts\nimport { html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { RecorderManager } from './RecorderManager';\nimport './components/settings-menu';\nimport './components/audio-visualiser';\nimport './icons/icons';\nimport ThemeStyles from './styles/theme';\nimport ButtonStyles from './styles/buttons';\nimport ComponentStyles from './styles/ComponentStyles';\n\nimport { DictationConfig, ServerConfig } from './types';\nimport { DEFAULT_DICTATION_CONFIG } from './constants';\nimport CalloutStyles from './styles/callout';\n\nexport class CortiDictation extends LitElement {\n static styles = [ButtonStyles, ThemeStyles, ComponentStyles, CalloutStyles];\n\n @property({ type: Array })\n devices: MediaDeviceInfo[] = [];\n\n @property({ type: String, reflect: true })\n recordingState = 'stopped';\n\n @property({ type: Object })\n dictationConfig: DictationConfig = DEFAULT_DICTATION_CONFIG;\n\n @property({ type: Object })\n serverConfig: ServerConfig = {};\n\n @state()\n private _audioLevel = 0;\n\n private recorderManager = new RecorderManager();\n\n async connectedCallback() {\n super.connectedCallback();\n await this.recorderManager.initialize();\n this.devices = this.recorderManager.devices;\n\n // Map event names to any extra handling logic\n const eventHandlers: Record<string, (e: CustomEvent) => void> = {\n 'recording-state-changed': e => {\n this.recordingState = e.detail.state;\n },\n 'audio-level-changed': e => {\n this._audioLevel = e.detail.audioLevel;\n this.requestUpdate();\n },\n };\n\n const eventsToRelay = [\n 'recording-state-changed',\n 'audio-level-changed',\n 'error',\n 'transcript',\n ];\n\n eventsToRelay.forEach(eventName => {\n this.recorderManager.addEventListener(eventName, (e: Event) => {\n const customEvent = e as CustomEvent;\n // Perform any additional handling if defined\n if (eventHandlers[eventName]) {\n eventHandlers[eventName](customEvent);\n }\n // Re-dispatch the event from the component\n this.dispatchEvent(\n new CustomEvent(eventName, {\n detail: customEvent.detail,\n bubbles: true,\n composed: true,\n }),\n );\n });\n });\n }\n\n public toggleRecording() {\n this._toggleRecording();\n }\n\n _toggleRecording() {\n if (this.recordingState === 'recording') {\n this.recorderManager.stopRecording();\n } else if (this.recordingState === 'stopped') {\n this.recorderManager.startRecording({\n dictationConfig: this.dictationConfig,\n serverConfig: this.serverConfig,\n });\n }\n }\n\n // Handle device change events if needed\n async _onRecordingDeviceChanged(event: Event) {\n const customEvent = event as CustomEvent;\n this.recorderManager.selectedDevice = customEvent.detail.deviceId;\n if (this.recordingState === 'recording') {\n await this.recorderManager.stopRecording();\n await this.recorderManager.startRecording({\n dictationConfig: this.dictationConfig,\n serverConfig: this.serverConfig,\n });\n }\n }\n\n render() {\n const isConfigured =\n this.serverConfig &&\n this.serverConfig.token &&\n this.serverConfig.environment &&\n this.serverConfig.tenant;\n if (!isConfigured) {\n return html`\n <div class=\"wrapper\">\n <div class=\"callout red tiny\">\n Please configure the server settings in the parent component.\n </div>\n </div>\n `;\n }\n\n const isLoading =\n this.recordingState === 'initializing' ||\n this.recordingState === 'stopping';\n const isRecording = this.recordingState === 'recording';\n return html`\n <div class=\"wrapper\">\n <button\n @click=${this._toggleRecording}\n class=${isRecording ? 'red' : 'accent'}\n >\n ${isLoading\n ? html`<icon-loading-spinner></icon-loading-spinner>`\n : isRecording\n ? html`<icon-recording></icon-recording>`\n : html`<icon-mic-on></icon-mic-on>`}\n <audio-visualiser\n .level=${this._audioLevel}\n .active=${isRecording}\n ></audio-visualiser>\n </button>\n\n <settings-menu\n .devices=${this.devices}\n .selectedDevice=${this.recorderManager.selectedDevice}\n ?settingsDisabled=${this.recordingState !== 'stopped'}\n @recording-device-changed=${this._onRecordingDeviceChanged}\n ></settings-menu>\n </div>\n `;\n }\n}\n\nexport default CortiDictation;\n"]}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export class MediaRecorderService extends EventTarget {
|
|
2
|
-
constructor(mediaStream) {
|
|
3
|
-
super();
|
|
4
|
-
this.mediaRecorder = new MediaRecorder(mediaStream);
|
|
5
|
-
this.mediaRecorder.ondataavailable = (event) => {
|
|
6
|
-
if (event.data && event.data.size > 0) {
|
|
7
|
-
this.dispatchEvent(new CustomEvent('audio-packet', {
|
|
8
|
-
detail: event.data,
|
|
9
|
-
bubbles: true,
|
|
10
|
-
composed: true
|
|
11
|
-
}));
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
this.mediaRecorder.onstop = () => {
|
|
15
|
-
// Stub: dispatch a transcript event
|
|
16
|
-
this.dispatchEvent(new CustomEvent('transcript', {
|
|
17
|
-
detail: 'Transcript text here',
|
|
18
|
-
bubbles: true,
|
|
19
|
-
composed: true
|
|
20
|
-
}));
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
startRecording() {
|
|
24
|
-
// Capture audio chunks every 200ms
|
|
25
|
-
this.mediaRecorder.start(200);
|
|
26
|
-
}
|
|
27
|
-
stopRecording() {
|
|
28
|
-
this.mediaRecorder.stop();
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=mediaRecorderService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mediaRecorderService.js","sourceRoot":"","sources":["../../src/mediaRecorderService.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IAGjD,YAAY,WAAwB;QAClC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,eAAe,GAAG,CAAC,KAAK,EAAE,EAAE;YAC7C,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE;oBACjD,MAAM,EAAE,KAAK,CAAC,IAAI;oBAClB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE;YAC/B,oCAAoC;YACpC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,YAAY,EAAE;gBAC/C,MAAM,EAAE,sBAAsB;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC,CAAC;QACN,CAAC,CAAC;IACJ,CAAC;IAEM,cAAc;QACnB,mCAAmC;QACnC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;CACF","sourcesContent":["export class MediaRecorderService extends EventTarget {\n private mediaRecorder: MediaRecorder;\n \n constructor(mediaStream: MediaStream) {\n super();\n this.mediaRecorder = new MediaRecorder(mediaStream);\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data && event.data.size > 0) {\n this.dispatchEvent(new CustomEvent('audio-packet', {\n detail: event.data,\n bubbles: true,\n composed: true\n }));\n }\n };\n this.mediaRecorder.onstop = () => {\n // Stub: dispatch a transcript event\n this.dispatchEvent(new CustomEvent('transcript', {\n detail: 'Transcript text here',\n bubbles: true,\n composed: true\n }));\n };\n }\n \n public startRecording() {\n // Capture audio chunks every 200ms\n this.mediaRecorder.start(200);\n }\n \n public stopRecording() {\n this.mediaRecorder.stop();\n }\n }\n "]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { LitElement, TemplateResult, CSSResultGroup } from 'lit';
|
|
2
|
-
interface Device {
|
|
3
|
-
deviceId: string;
|
|
4
|
-
label?: string;
|
|
5
|
-
}
|
|
6
|
-
export declare class MicSelector extends LitElement {
|
|
7
|
-
devices: Device[];
|
|
8
|
-
selectedDevice: string;
|
|
9
|
-
static styles: CSSResultGroup;
|
|
10
|
-
private _selectDevice;
|
|
11
|
-
render(): TemplateResult;
|
|
12
|
-
}
|
|
13
|
-
declare global {
|
|
14
|
-
interface HTMLElementTagNameMap {
|
|
15
|
-
'mic-selector': MicSelector;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
export {};
|
package/dist/src/mic-selector.js
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
// mic-selector.ts
|
|
3
|
-
import { LitElement, html, css } from 'lit';
|
|
4
|
-
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
-
import ButtonStyles from './styles/buttons';
|
|
6
|
-
import SelectStyles from './styles/select';
|
|
7
|
-
let MicSelector = class MicSelector extends LitElement {
|
|
8
|
-
constructor() {
|
|
9
|
-
super(...arguments);
|
|
10
|
-
this.devices = [];
|
|
11
|
-
this.selectedDevice = '';
|
|
12
|
-
}
|
|
13
|
-
_selectDevice(device) {
|
|
14
|
-
this.selectedDevice = device.deviceId;
|
|
15
|
-
this.dispatchEvent(new CustomEvent('recording-device-changed', {
|
|
16
|
-
detail: device,
|
|
17
|
-
bubbles: true,
|
|
18
|
-
composed: true,
|
|
19
|
-
}));
|
|
20
|
-
}
|
|
21
|
-
render() {
|
|
22
|
-
return html `
|
|
23
|
-
<div class="mic-selector">
|
|
24
|
-
<button id="settings-popover-button" popovertarget="settings-popover">
|
|
25
|
-
<icon-settings></icon-settings>
|
|
26
|
-
</button>
|
|
27
|
-
<div id="settings-popover" popover>
|
|
28
|
-
<label id="device-select-label" for="device-select">
|
|
29
|
-
Recording Device
|
|
30
|
-
</label>
|
|
31
|
-
<select
|
|
32
|
-
id="device-select"
|
|
33
|
-
aria-labelledby="device-select-label"
|
|
34
|
-
@change=${(e) => {
|
|
35
|
-
const target = e.target;
|
|
36
|
-
const selectedDevice = this.devices.find(device => device.deviceId === target.value);
|
|
37
|
-
if (selectedDevice) {
|
|
38
|
-
this._selectDevice(selectedDevice);
|
|
39
|
-
}
|
|
40
|
-
}}
|
|
41
|
-
>
|
|
42
|
-
${this.devices.map(device => html `
|
|
43
|
-
<option
|
|
44
|
-
value=${device.deviceId}
|
|
45
|
-
?selected=${this.selectedDevice === device.deviceId}
|
|
46
|
-
>
|
|
47
|
-
${device.label || 'Unknown Device'}
|
|
48
|
-
</option>
|
|
49
|
-
`)}
|
|
50
|
-
</select>
|
|
51
|
-
<!-- ${this.devices.map(device => html `
|
|
52
|
-
<div
|
|
53
|
-
class="dropdown-item ${this.selectedDevice === device.deviceId
|
|
54
|
-
? 'selected'
|
|
55
|
-
: ''}"
|
|
56
|
-
@click=${() => this._selectDevice(device)}
|
|
57
|
-
>
|
|
58
|
-
${device.label || 'Unknown Device'}
|
|
59
|
-
</div>
|
|
60
|
-
`)} -->
|
|
61
|
-
</div>
|
|
62
|
-
</div>
|
|
63
|
-
`;
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
MicSelector.styles = [
|
|
67
|
-
css `
|
|
68
|
-
:host {
|
|
69
|
-
display: block;
|
|
70
|
-
font-family: var(--component-font-family);
|
|
71
|
-
}
|
|
72
|
-
.label {
|
|
73
|
-
font-size: 0.8rem;
|
|
74
|
-
color: var(--component-text-color);
|
|
75
|
-
margin-bottom: 4px;
|
|
76
|
-
}
|
|
77
|
-
/* Retain the anchor-name styling for this component */
|
|
78
|
-
#settings-popover-button {
|
|
79
|
-
anchor-name: --settings_popover_btn;
|
|
80
|
-
}
|
|
81
|
-
[popover] {
|
|
82
|
-
margin: 0;
|
|
83
|
-
padding: 16px;
|
|
84
|
-
border: 0;
|
|
85
|
-
background: var(--card-background);
|
|
86
|
-
border: 1px solid var(--card-border-color);
|
|
87
|
-
border-radius: var(--card-border-radius);
|
|
88
|
-
box-shadow: var(--card-box-shadow);
|
|
89
|
-
z-index: 1000;
|
|
90
|
-
max-width: 260px;
|
|
91
|
-
position-anchor: --settings_popover_btn;
|
|
92
|
-
position-area: bottom;
|
|
93
|
-
position-visibility: always;
|
|
94
|
-
/* inset: unset; */
|
|
95
|
-
transform: translateX(45%);
|
|
96
|
-
overflow-x: hidden;
|
|
97
|
-
}
|
|
98
|
-
.dropdown-item {
|
|
99
|
-
padding: 8px;
|
|
100
|
-
cursor: pointer;
|
|
101
|
-
font-size: 0.9rem;
|
|
102
|
-
color: var(--component-text-color);
|
|
103
|
-
// allow only a single line of text and truncate the rest
|
|
104
|
-
width: 100%;
|
|
105
|
-
overflow: hidden;
|
|
106
|
-
text-overflow: ellipsis;
|
|
107
|
-
white-space: nowrap;
|
|
108
|
-
opacity: 0.8;
|
|
109
|
-
}
|
|
110
|
-
.dropdown-item:hover {
|
|
111
|
-
background: var(--action-plain-background-hover);
|
|
112
|
-
}
|
|
113
|
-
.dropdown-item.selected {
|
|
114
|
-
font-weight: bold;
|
|
115
|
-
opacity: 1;
|
|
116
|
-
}
|
|
117
|
-
`,
|
|
118
|
-
ButtonStyles,
|
|
119
|
-
SelectStyles,
|
|
120
|
-
];
|
|
121
|
-
__decorate([
|
|
122
|
-
property({ type: Array })
|
|
123
|
-
], MicSelector.prototype, "devices", void 0);
|
|
124
|
-
__decorate([
|
|
125
|
-
property({ type: String })
|
|
126
|
-
], MicSelector.prototype, "selectedDevice", void 0);
|
|
127
|
-
MicSelector = __decorate([
|
|
128
|
-
customElement('mic-selector')
|
|
129
|
-
], MicSelector);
|
|
130
|
-
export { MicSelector };
|
|
131
|
-
//# sourceMappingURL=mic-selector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mic-selector.js","sourceRoot":"","sources":["../../src/mic-selector.ts"],"names":[],"mappings":";AAAA,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAkC,MAAM,KAAK,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAQpC,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,UAAU;IAApC;;QAEL,YAAO,GAAa,EAAE,CAAC;QAGvB,mBAAc,GAAW,EAAE,CAAC;IAuH9B,CAAC;IA7DS,aAAa,CAAC,MAAc;QAClC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;QACtC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,0BAA0B,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;sBAYO,CAAC,CAAQ,EAAE,EAAE;YACrB,MAAM,MAAM,GAAG,CAAC,CAAC,MAA2B,CAAC;YAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CACtC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,KAAK,CAC3C,CAAC;YACF,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;;cAEC,IAAI,CAAC,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA;;0BAEF,MAAM,CAAC,QAAQ;8BACX,IAAI,CAAC,cAAc,KAAK,MAAM,CAAC,QAAQ;;oBAEjD,MAAM,CAAC,KAAK,IAAI,gBAAgB;;eAErC,CACF;;iBAEI,IAAI,CAAC,OAAO,CAAC,GAAG,CACrB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA;;uCAEa,IAAI,CAAC,cAAc,KAAK,MAAM,CAAC,QAAQ;YAC5D,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,EAAE;yBACG,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;;kBAEvC,MAAM,CAAC,KAAK,IAAI,gBAAgB;;aAErC,CACF;;;KAGN,CAAC;IACJ,CAAC;;AApHM,kBAAM,GAAmB;IAC9B,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkDF;IACD,YAAY;IACZ,YAAY;CACb,AAtDY,CAsDX;AA3DF;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;4CACH;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDACC;AALjB,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CA4HvB","sourcesContent":["// mic-selector.ts\nimport { LitElement, html, css, TemplateResult, CSSResultGroup } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport ButtonStyles from './styles/buttons';\nimport SelectStyles from './styles/select';\n\ninterface Device {\n deviceId: string;\n label?: string;\n}\n\n@customElement('mic-selector')\nexport class MicSelector extends LitElement {\n @property({ type: Array })\n devices: Device[] = [];\n\n @property({ type: String })\n selectedDevice: string = '';\n\n static styles: CSSResultGroup = [\n css`\n :host {\n display: block;\n font-family: var(--component-font-family);\n }\n .label {\n font-size: 0.8rem;\n color: var(--component-text-color);\n margin-bottom: 4px;\n }\n /* Retain the anchor-name styling for this component */\n #settings-popover-button {\n anchor-name: --settings_popover_btn;\n }\n [popover] {\n margin: 0;\n padding: 16px;\n border: 0;\n background: 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 z-index: 1000;\n max-width: 260px;\n position-anchor: --settings_popover_btn;\n position-area: bottom;\n position-visibility: always;\n /* inset: unset; */\n transform: translateX(45%);\n overflow-x: hidden;\n }\n .dropdown-item {\n padding: 8px;\n cursor: pointer;\n font-size: 0.9rem;\n color: var(--component-text-color);\n // allow only a single line of text and truncate the rest\n width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n opacity: 0.8;\n }\n .dropdown-item:hover {\n background: var(--action-plain-background-hover);\n }\n .dropdown-item.selected {\n font-weight: bold;\n opacity: 1;\n }\n `,\n ButtonStyles,\n SelectStyles,\n ];\n\n private _selectDevice(device: Device): void {\n this.selectedDevice = device.deviceId;\n this.dispatchEvent(\n new CustomEvent('recording-device-changed', {\n detail: device,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render(): TemplateResult {\n return html`\n <div class=\"mic-selector\">\n <button id=\"settings-popover-button\" popovertarget=\"settings-popover\">\n <icon-settings></icon-settings>\n </button>\n <div id=\"settings-popover\" popover>\n <label id=\"device-select-label\" for=\"device-select\">\n Recording Device\n </label>\n <select\n id=\"device-select\"\n aria-labelledby=\"device-select-label\"\n @change=${(e: Event) => {\n const target = e.target as HTMLSelectElement;\n const selectedDevice = this.devices.find(\n device => device.deviceId === target.value,\n );\n if (selectedDevice) {\n this._selectDevice(selectedDevice);\n }\n }}\n >\n ${this.devices.map(\n device => html`\n <option\n value=${device.deviceId}\n ?selected=${this.selectedDevice === device.deviceId}\n >\n ${device.label || 'Unknown Device'}\n </option>\n `,\n )}\n </select>\n <!-- ${this.devices.map(\n device => html`\n <div\n class=\"dropdown-item ${this.selectedDevice === device.deviceId\n ? 'selected'\n : ''}\"\n @click=${() => this._selectDevice(device)}\n >\n ${device.label || 'Unknown Device'}\n </div>\n `,\n )} -->\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mic-selector': MicSelector;\n }\n}\n"]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { LitElement, TemplateResult, CSSResultGroup } from 'lit';
|
|
2
|
-
interface Device {
|
|
3
|
-
deviceId: string;
|
|
4
|
-
label?: string;
|
|
5
|
-
}
|
|
6
|
-
export declare class MicSelector extends LitElement {
|
|
7
|
-
devices: Device[];
|
|
8
|
-
selectedDevice: string;
|
|
9
|
-
static styles: CSSResultGroup;
|
|
10
|
-
private _selectDevice;
|
|
11
|
-
render(): TemplateResult;
|
|
12
|
-
}
|
|
13
|
-
declare global {
|
|
14
|
-
interface HTMLElementTagNameMap {
|
|
15
|
-
'mic-selector': MicSelector;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
export {};
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
// mic-selector.ts
|
|
3
|
-
import { LitElement, html, css } from 'lit';
|
|
4
|
-
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
-
import ButtonStyles from './styles/buttons';
|
|
6
|
-
import SelectStyles from './styles/select';
|
|
7
|
-
let MicSelector = class MicSelector extends LitElement {
|
|
8
|
-
constructor() {
|
|
9
|
-
super(...arguments);
|
|
10
|
-
this.devices = [];
|
|
11
|
-
this.selectedDevice = '';
|
|
12
|
-
}
|
|
13
|
-
_selectDevice(device) {
|
|
14
|
-
this.selectedDevice = device.deviceId;
|
|
15
|
-
this.dispatchEvent(new CustomEvent('recording-device-changed', {
|
|
16
|
-
detail: device,
|
|
17
|
-
bubbles: true,
|
|
18
|
-
composed: true,
|
|
19
|
-
}));
|
|
20
|
-
}
|
|
21
|
-
render() {
|
|
22
|
-
return html `
|
|
23
|
-
<div class="mic-selector">
|
|
24
|
-
<button id="settings-popover-button" popovertarget="settings-popover">
|
|
25
|
-
<icon-settings></icon-settings>
|
|
26
|
-
</button>
|
|
27
|
-
<div id="settings-popover" popover>
|
|
28
|
-
<label id="device-select-label" for="device-select">
|
|
29
|
-
Recording Device
|
|
30
|
-
</label>
|
|
31
|
-
<select
|
|
32
|
-
id="device-select"
|
|
33
|
-
aria-labelledby="device-select-label"
|
|
34
|
-
@change=${(e) => {
|
|
35
|
-
const target = e.target;
|
|
36
|
-
const selectedDevice = this.devices.find(device => device.deviceId === target.value);
|
|
37
|
-
if (selectedDevice) {
|
|
38
|
-
this._selectDevice(selectedDevice);
|
|
39
|
-
}
|
|
40
|
-
}}
|
|
41
|
-
>
|
|
42
|
-
${this.devices.map(device => html `
|
|
43
|
-
<option
|
|
44
|
-
value=${device.deviceId}
|
|
45
|
-
?selected=${this.selectedDevice === device.deviceId}
|
|
46
|
-
>
|
|
47
|
-
${device.label || 'Unknown Device'}
|
|
48
|
-
</option>
|
|
49
|
-
`)}
|
|
50
|
-
</select>
|
|
51
|
-
<!-- ${this.devices.map(device => html `
|
|
52
|
-
<div
|
|
53
|
-
class="dropdown-item ${this.selectedDevice === device.deviceId
|
|
54
|
-
? 'selected'
|
|
55
|
-
: ''}"
|
|
56
|
-
@click=${() => this._selectDevice(device)}
|
|
57
|
-
>
|
|
58
|
-
${device.label || 'Unknown Device'}
|
|
59
|
-
</div>
|
|
60
|
-
`)} -->
|
|
61
|
-
</div>
|
|
62
|
-
</div>
|
|
63
|
-
`;
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
MicSelector.styles = [
|
|
67
|
-
css `
|
|
68
|
-
:host {
|
|
69
|
-
display: block;
|
|
70
|
-
font-family: var(--component-font-family);
|
|
71
|
-
}
|
|
72
|
-
.label {
|
|
73
|
-
font-size: 0.8rem;
|
|
74
|
-
color: var(--component-text-color);
|
|
75
|
-
margin-bottom: 4px;
|
|
76
|
-
}
|
|
77
|
-
/* Retain the anchor-name styling for this component */
|
|
78
|
-
#settings-popover-button {
|
|
79
|
-
anchor-name: --settings_popover_btn;
|
|
80
|
-
}
|
|
81
|
-
[popover] {
|
|
82
|
-
margin: 0;
|
|
83
|
-
padding: 16px;
|
|
84
|
-
border: 0;
|
|
85
|
-
background: var(--card-background);
|
|
86
|
-
border: 1px solid var(--card-border-color);
|
|
87
|
-
border-radius: var(--card-border-radius);
|
|
88
|
-
box-shadow: var(--card-box-shadow);
|
|
89
|
-
z-index: 1000;
|
|
90
|
-
max-width: 260px;
|
|
91
|
-
position-anchor: --settings_popover_btn;
|
|
92
|
-
position-area: bottom;
|
|
93
|
-
position-visibility: always;
|
|
94
|
-
/* inset: unset; */
|
|
95
|
-
transform: translateX(45%);
|
|
96
|
-
overflow-x: hidden;
|
|
97
|
-
}
|
|
98
|
-
.dropdown-item {
|
|
99
|
-
padding: 8px;
|
|
100
|
-
cursor: pointer;
|
|
101
|
-
font-size: 0.9rem;
|
|
102
|
-
color: var(--component-text-color);
|
|
103
|
-
// allow only a single line of text and truncate the rest
|
|
104
|
-
width: 100%;
|
|
105
|
-
overflow: hidden;
|
|
106
|
-
text-overflow: ellipsis;
|
|
107
|
-
white-space: nowrap;
|
|
108
|
-
opacity: 0.8;
|
|
109
|
-
}
|
|
110
|
-
.dropdown-item:hover {
|
|
111
|
-
background: var(--action-plain-background-hover);
|
|
112
|
-
}
|
|
113
|
-
.dropdown-item.selected {
|
|
114
|
-
font-weight: bold;
|
|
115
|
-
opacity: 1;
|
|
116
|
-
}
|
|
117
|
-
`,
|
|
118
|
-
ButtonStyles,
|
|
119
|
-
SelectStyles,
|
|
120
|
-
];
|
|
121
|
-
__decorate([
|
|
122
|
-
property({ type: Array })
|
|
123
|
-
], MicSelector.prototype, "devices", void 0);
|
|
124
|
-
__decorate([
|
|
125
|
-
property({ type: String })
|
|
126
|
-
], MicSelector.prototype, "selectedDevice", void 0);
|
|
127
|
-
MicSelector = __decorate([
|
|
128
|
-
customElement('mic-selector')
|
|
129
|
-
], MicSelector);
|
|
130
|
-
export { MicSelector };
|
|
131
|
-
//# sourceMappingURL=settings-menu.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-menu.js","sourceRoot":"","sources":["../../src/settings-menu.ts"],"names":[],"mappings":";AAAA,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAkC,MAAM,KAAK,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAQpC,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,UAAU;IAApC;;QAEL,YAAO,GAAa,EAAE,CAAC;QAGvB,mBAAc,GAAW,EAAE,CAAC;IAuH9B,CAAC;IA7DS,aAAa,CAAC,MAAc;QAClC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;QACtC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,0BAA0B,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;sBAYO,CAAC,CAAQ,EAAE,EAAE;YACrB,MAAM,MAAM,GAAG,CAAC,CAAC,MAA2B,CAAC;YAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CACtC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,KAAK,CAC3C,CAAC;YACF,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;;cAEC,IAAI,CAAC,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA;;0BAEF,MAAM,CAAC,QAAQ;8BACX,IAAI,CAAC,cAAc,KAAK,MAAM,CAAC,QAAQ;;oBAEjD,MAAM,CAAC,KAAK,IAAI,gBAAgB;;eAErC,CACF;;iBAEI,IAAI,CAAC,OAAO,CAAC,GAAG,CACrB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAA;;uCAEa,IAAI,CAAC,cAAc,KAAK,MAAM,CAAC,QAAQ;YAC5D,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,EAAE;yBACG,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;;kBAEvC,MAAM,CAAC,KAAK,IAAI,gBAAgB;;aAErC,CACF;;;KAGN,CAAC;IACJ,CAAC;;AApHM,kBAAM,GAAmB;IAC9B,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkDF;IACD,YAAY;IACZ,YAAY;CACb,AAtDY,CAsDX;AA3DF;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;4CACH;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDACC;AALjB,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CA4HvB","sourcesContent":["// mic-selector.ts\nimport { LitElement, html, css, TemplateResult, CSSResultGroup } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport ButtonStyles from './styles/buttons';\nimport SelectStyles from './styles/select';\n\ninterface Device {\n deviceId: string;\n label?: string;\n}\n\n@customElement('mic-selector')\nexport class MicSelector extends LitElement {\n @property({ type: Array })\n devices: Device[] = [];\n\n @property({ type: String })\n selectedDevice: string = '';\n\n static styles: CSSResultGroup = [\n css`\n :host {\n display: block;\n font-family: var(--component-font-family);\n }\n .label {\n font-size: 0.8rem;\n color: var(--component-text-color);\n margin-bottom: 4px;\n }\n /* Retain the anchor-name styling for this component */\n #settings-popover-button {\n anchor-name: --settings_popover_btn;\n }\n [popover] {\n margin: 0;\n padding: 16px;\n border: 0;\n background: 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 z-index: 1000;\n max-width: 260px;\n position-anchor: --settings_popover_btn;\n position-area: bottom;\n position-visibility: always;\n /* inset: unset; */\n transform: translateX(45%);\n overflow-x: hidden;\n }\n .dropdown-item {\n padding: 8px;\n cursor: pointer;\n font-size: 0.9rem;\n color: var(--component-text-color);\n // allow only a single line of text and truncate the rest\n width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n opacity: 0.8;\n }\n .dropdown-item:hover {\n background: var(--action-plain-background-hover);\n }\n .dropdown-item.selected {\n font-weight: bold;\n opacity: 1;\n }\n `,\n ButtonStyles,\n SelectStyles,\n ];\n\n private _selectDevice(device: Device): void {\n this.selectedDevice = device.deviceId;\n this.dispatchEvent(\n new CustomEvent('recording-device-changed', {\n detail: device,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render(): TemplateResult {\n return html`\n <div class=\"mic-selector\">\n <button id=\"settings-popover-button\" popovertarget=\"settings-popover\">\n <icon-settings></icon-settings>\n </button>\n <div id=\"settings-popover\" popover>\n <label id=\"device-select-label\" for=\"device-select\">\n Recording Device\n </label>\n <select\n id=\"device-select\"\n aria-labelledby=\"device-select-label\"\n @change=${(e: Event) => {\n const target = e.target as HTMLSelectElement;\n const selectedDevice = this.devices.find(\n device => device.deviceId === target.value,\n );\n if (selectedDevice) {\n this._selectDevice(selectedDevice);\n }\n }}\n >\n ${this.devices.map(\n device => html`\n <option\n value=${device.deviceId}\n ?selected=${this.selectedDevice === device.deviceId}\n >\n ${device.label || 'Unknown Device'}\n </option>\n `,\n )}\n </select>\n <!-- ${this.devices.map(\n device => html`\n <div\n class=\"dropdown-item ${this.selectedDevice === device.deviceId\n ? 'selected'\n : ''}\"\n @click=${() => this._selectDevice(device)}\n >\n ${device.label || 'Unknown Device'}\n </div>\n `,\n )} -->\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mic-selector': MicSelector;\n }\n}\n"]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { LitElement, TemplateResult, CSSResultGroup } from 'lit';
|
|
2
|
-
interface Device {
|
|
3
|
-
deviceId: string;
|
|
4
|
-
label?: string;
|
|
5
|
-
}
|
|
6
|
-
export declare class MicSelector extends LitElement {
|
|
7
|
-
devices: Device[];
|
|
8
|
-
selectedDevice: string;
|
|
9
|
-
static styles: CSSResultGroup;
|
|
10
|
-
private _selectDevice;
|
|
11
|
-
render(): TemplateResult;
|
|
12
|
-
}
|
|
13
|
-
declare global {
|
|
14
|
-
interface HTMLElementTagNameMap {
|
|
15
|
-
'mic-selector': MicSelector;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
export {};
|