@signalwire/web-components 1.0.0-dev-20260504184154 → 1.0.0-dev-20260508182243

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/components/UI/controls/sw-ui-dialpad.d.ts +1 -1
  2. package/dist/components/UI/controls/sw-ui-dialpad.d.ts.map +1 -1
  3. package/dist/components/UI/controls/sw-ui-dialpad.js +9 -8
  4. package/dist/components/UI/controls/sw-ui-dialpad.js.map +1 -1
  5. package/dist/components/UI/controls/sw-ui-dropup.d.ts +1 -1
  6. package/dist/components/UI/controls/sw-ui-dropup.d.ts.map +1 -1
  7. package/dist/components/UI/controls/sw-ui-dropup.js +9 -8
  8. package/dist/components/UI/controls/sw-ui-dropup.js.map +1 -1
  9. package/dist/components/UI/controls/sw-ui-split-button.d.ts +1 -1
  10. package/dist/components/UI/controls/sw-ui-split-button.d.ts.map +1 -1
  11. package/dist/components/UI/controls/sw-ui-split-button.js +13 -12
  12. package/dist/components/UI/controls/sw-ui-split-button.js.map +1 -1
  13. package/dist/components/UI/host-reset.d.ts +16 -0
  14. package/dist/components/UI/host-reset.d.ts.map +1 -0
  15. package/dist/components/UI/host-reset.js +20 -0
  16. package/dist/components/UI/host-reset.js.map +1 -0
  17. package/dist/components/UI/sw-ui-alert.d.ts +1 -1
  18. package/dist/components/UI/sw-ui-alert.d.ts.map +1 -1
  19. package/dist/components/UI/sw-ui-alert.js +14 -13
  20. package/dist/components/UI/sw-ui-alert.js.map +1 -1
  21. package/dist/components/UI/sw-ui-transcript-view.d.ts +1 -1
  22. package/dist/components/UI/sw-ui-transcript-view.d.ts.map +1 -1
  23. package/dist/components/UI/sw-ui-transcript-view.js +6 -5
  24. package/dist/components/UI/sw-ui-transcript-view.js.map +1 -1
  25. package/dist/components/sw-call-status.d.ts +1 -1
  26. package/dist/components/sw-call-status.d.ts.map +1 -1
  27. package/dist/components/sw-call-status.js +6 -5
  28. package/dist/components/sw-call-status.js.map +1 -1
  29. package/dist/components/sw-call-widget/sw-call-widget.d.ts +1 -1
  30. package/dist/components/sw-call-widget/sw-call-widget.d.ts.map +1 -1
  31. package/dist/components/sw-call-widget/sw-call-widget.js +14 -13
  32. package/dist/components/sw-call-widget/sw-call-widget.js.map +1 -1
  33. package/dist/components/sw-click-to-call.d.ts +1 -1
  34. package/dist/components/sw-click-to-call.d.ts.map +1 -1
  35. package/dist/components/sw-click-to-call.js +9 -8
  36. package/dist/components/sw-click-to-call.js.map +1 -1
  37. package/dist/components/sw-device-selector/sw-device-selector.d.ts +1 -1
  38. package/dist/components/sw-device-selector/sw-device-selector.d.ts.map +1 -1
  39. package/dist/components/sw-device-selector/sw-device-selector.js +5 -4
  40. package/dist/components/sw-device-selector/sw-device-selector.js.map +1 -1
  41. package/dist/components/sw-directory.d.ts +1 -1
  42. package/dist/components/sw-directory.d.ts.map +1 -1
  43. package/dist/components/sw-directory.js +6 -5
  44. package/dist/components/sw-directory.js.map +1 -1
  45. package/dist/components/sw-participant-controls.d.ts +1 -1
  46. package/dist/components/sw-participant-controls.d.ts.map +1 -1
  47. package/dist/components/sw-participant-controls.js +6 -5
  48. package/dist/components/sw-participant-controls.js.map +1 -1
  49. package/dist/components/sw-participants.d.ts +1 -1
  50. package/dist/components/sw-participants.d.ts.map +1 -1
  51. package/dist/components/sw-participants.js +20 -19
  52. package/dist/components/sw-participants.js.map +1 -1
  53. package/dist/embed/signalwire-web-components-embed.iife.js +109 -95
  54. package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -1
  55. package/dist/embed/signalwire-web-components-embed.umd.cjs +109 -95
  56. package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -1
  57. package/package.json +2 -2
@@ -3,10 +3,11 @@ import { property as d, state as h, customElement as u } from "lit/decorators.js
3
3
  import { unsafeHTML as b } from "lit/directives/unsafe-html.js";
4
4
  import { highlight as g } from "../../utils/prism.js";
5
5
  import { transcriptToMarkdown as x } from "../../utils/transcriptToMarkdown.js";
6
- var k = Object.defineProperty, v = Object.getOwnPropertyDescriptor, s = (e, t, o, r) => {
7
- for (var a = r > 1 ? void 0 : r ? v(t, o) : t, l = e.length - 1, c; l >= 0; l--)
6
+ import { hostReset as k } from "./host-reset.js";
7
+ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, s = (e, t, o, r) => {
8
+ for (var a = r > 1 ? void 0 : r ? y(t, o) : t, l = e.length - 1, c; l >= 0; l--)
8
9
  (c = e[l]) && (a = (r ? c(t, o, a) : c(a)) || a);
9
- return r && a && k(t, o, a), a;
10
+ return r && a && v(t, o, a), a;
10
11
  };
11
12
  let i = class extends f {
12
13
  constructor() {
@@ -90,7 +91,7 @@ let i = class extends f {
90
91
  `;
91
92
  }
92
93
  };
93
- i.styles = m`
94
+ i.styles = [k, m`
94
95
  :host {
95
96
  display: flex;
96
97
  flex-direction: column;
@@ -319,7 +320,7 @@ i.styles = m`
319
320
  .token.italic {
320
321
  font-style: italic;
321
322
  }
322
- `;
323
+ `];
323
324
  s([
324
325
  d({ attribute: !1 })
325
326
  ], i.prototype, "entries", 2);
@@ -1 +1 @@
1
- {"version":3,"file":"sw-ui-transcript-view.js","sources":["../../../src/components/UI/sw-ui-transcript-view.ts"],"sourcesContent":["import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { highlight } from '../../utils/prism.js';\nimport { transcriptToMarkdown } from '../../utils/transcriptToMarkdown.js';\n\n/**\n * A single transcript entry rendered as a chat bubble.\n *\n * The optional `meta` field carries rich content from the AI.\n */\nexport interface TranscriptEntry {\n id: string;\n type: 'user' | 'agent' | 'system';\n state: 'partial' | 'complete';\n text: string;\n meta?: TranscriptEntryMeta;\n}\n\n/** Rich content attached to a transcript entry. */\nexport interface TranscriptEntryMeta {\n /** Clickable links. */\n links?: { label: string; url: string }[];\n /** Code snippet. */\n code?: { language?: string; content: string };\n /**\n * Content that the agent pushed via a `display_content` user_event.\n * Stored here so the download serializer can include the full payload.\n */\n displayContent?: {\n title?: string;\n content: string;\n format: 'text' | 'markdown' | 'code' | 'html';\n language?: string;\n };\n}\n\n@customElement('sw-ui-transcript-view')\nexport class SwUiTranscriptView extends LitElement {\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--bg-page);\n color: var(--fg-default);\n font-family: var(--type-family-body);\n font-size: var(--type-size-small);\n overflow: hidden;\n }\n\n .header {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 10px 8px 14px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: color-mix(in srgb, var(--fg-default) 40%, transparent);\n border-bottom: 1px solid var(--border-default);\n user-select: none;\n }\n\n .download-btn {\n all: unset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border-radius: 5px;\n cursor: pointer;\n color: color-mix(in srgb, var(--fg-default) 50%, transparent);\n transition:\n background var(--transition-fast),\n color var(--transition-fast);\n }\n\n .download-btn:hover {\n background: var(--bg-surface-raised);\n color: var(--fg-default);\n }\n\n\n .messages {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 10px 12px 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n scroll-behavior: smooth;\n }\n\n .messages::-webkit-scrollbar {\n width: 4px;\n }\n .messages::-webkit-scrollbar-track {\n background: transparent;\n }\n .messages::-webkit-scrollbar-thumb {\n background: var(--bg-surface-raised);\n border-radius: 2px;\n }\n\n .empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n color: rgba(255, 255, 255, 0.25);\n padding: 20px;\n text-align: center;\n }\n\n .bubble {\n max-width: 85%;\n padding: 8px 12px;\n border-radius: 14px;\n font-size: 0.8125rem;\n line-height: 1.45;\n word-break: break-word;\n animation: pop-in 0.15s ease-out;\n }\n\n @keyframes pop-in {\n from {\n opacity: 0;\n transform: scale(0.94) translateY(4px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n .user {\n align-self: flex-end;\n background: var(--interactive-button-primary-bg);\n color: #fff;\n border-bottom-right-radius: 4px;\n }\n .agent {\n align-self: flex-start;\n background: var(--bg-surface);\n color: var(--fg-default);\n border-bottom-left-radius: 4px;\n }\n .system {\n align-self: center;\n background: transparent;\n border: 1px solid var(--border-default);\n color: var(--fg-default);\n font-size: 0.75rem;\n max-width: 95%;\n }\n\n .partial {\n opacity: 0.55;\n }\n\n /* ── Links ── */\n .meta-links {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n }\n\n .meta-links a {\n color: var(--interactive-button-primary-bg);\n text-decoration: none;\n font-size: 0.75rem;\n padding: 2px 8px;\n border: 1px solid var(--interactive-button-primary-bg);\n border-radius: 4px;\n transition: background var(--transition-fast);\n }\n\n .meta-links a:hover {\n background: var(--interactive-button-primary-bg);\n color: #fff;\n }\n\n /* ── Code block ── */\n .meta-code {\n margin-top: 8px;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .meta-code pre {\n margin: 0;\n padding: 10px 12px;\n background: #1a1b26;\n overflow-x: auto;\n font-size: 0.72rem;\n line-height: 1.5;\n }\n\n .meta-code code {\n font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;\n color: #f8f8f2;\n }\n\n /* ── Prism Okaidia theme ── */\n .token.comment,\n .token.prolog,\n .token.doctype,\n .token.cdata {\n color: #8292a2;\n }\n .token.punctuation {\n color: #f8f8f2;\n }\n .token.namespace {\n opacity: 0.7;\n }\n .token.property,\n .token.tag,\n .token.constant,\n .token.symbol,\n .token.deleted {\n color: #f92672;\n }\n .token.boolean,\n .token.number {\n color: #ae81ff;\n }\n .token.selector,\n .token.attr-name,\n .token.string,\n .token.char,\n .token.builtin,\n .token.inserted {\n color: #a6e22e;\n }\n .token.operator,\n .token.entity,\n .token.url,\n .token.variable {\n color: #f8f8f2;\n }\n .token.atrule,\n .token.attr-value,\n .token.function,\n .token.class-name {\n color: #e6db74;\n }\n .token.keyword {\n color: #66d9ef;\n }\n .token.regex,\n .token.important {\n color: #fd971f;\n }\n .token.important,\n .token.bold {\n font-weight: bold;\n }\n .token.italic {\n font-style: italic;\n }\n `;\n\n @property({ attribute: false }) entries: TranscriptEntry[] = [];\n @property({ type: String }) header = 'Transcript';\n @property({ type: String, attribute: 'empty-text' }) emptyText = '';\n\n // entry.id → highlighted HTML (populated asynchronously)\n @state() private _codeCache = new Map<string, string>();\n\n private _lastEntryCount = 0;\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (this.entries.length !== this._lastEntryCount) {\n this._lastEntryCount = this.entries.length;\n this._autoScroll();\n }\n if (changed.has('entries')) {\n void this._highlightNewEntries();\n }\n }\n\n private async _highlightNewEntries(): Promise<void> {\n const toHighlight = this.entries.filter((e) => e.meta?.code && !this._codeCache.has(e.id));\n if (toHighlight.length === 0) return;\n\n await Promise.all(\n toHighlight.map(async (e) => {\n const { content, language = '' } = e.meta!.code!;\n const html = await highlight(content, language);\n this._codeCache = new Map(this._codeCache).set(e.id, html);\n })\n );\n\n // The highlighted re-render extends the scroll height — scroll again\n // now that the final DOM height is known.\n await this.updateComplete;\n this._autoScroll();\n }\n\n private _downloadTranscript(): void {\n const md = transcriptToMarkdown(this.entries);\n const blob = new Blob([md], { type: 'text/markdown;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `transcript-${new Date().toISOString().slice(0, 10)}.md`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private _autoScroll(): void {\n const el = this.shadowRoot?.querySelector('.messages');\n if (!el) return;\n const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 120;\n if (nearBottom) el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });\n }\n\n private _renderCode(entry: TranscriptEntry) {\n const code = entry.meta?.code;\n if (!code) return nothing;\n const cached = this._codeCache.get(entry.id);\n return html`\n <div class=\"meta-code\" part=\"code\">\n <pre><code>${cached ? unsafeHTML(cached) : code.content}</code></pre>\n </div>\n `;\n }\n\n render() {\n const hasEntries = this.entries.some((e) => e.state === 'complete');\n\n return html`\n <div class=\"header\" part=\"header\">\n <span>${this.header}</span>\n <button\n class=\"download-btn\"\n part=\"download-btn\"\n title=\"Download transcript as Markdown\"\n ?disabled=${!hasEntries}\n @click=${this._downloadTranscript}\n >\n <sw-ui-icon name=\"download\" size=\"15\"></sw-ui-icon>\n </button>\n </div>\n\n ${this.entries.length === 0\n ? html`<div class=\"empty\" part=\"empty\">${this.emptyText}</div>`\n : html`\n <div class=\"messages\" part=\"messages\">\n ${this.entries.map(\n (e) => html`\n <div\n class=\"bubble ${e.type} ${e.state === 'partial' ? 'partial' : ''}\"\n part=\"bubble bubble-${e.type}\"\n >\n ${e.text}\n ${e.meta?.links?.length\n ? html`<div class=\"meta-links\">\n ${e.meta.links.map(\n (l) =>\n html`<a href=${l.url} target=\"_blank\" rel=\"noopener\">${l.label}</a>`\n )}\n </div>`\n : nothing}\n ${this._renderCode(e)}\n </div>\n `\n )}\n </div>\n `}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-ui-transcript-view': SwUiTranscriptView;\n }\n}\n"],"names":["SwUiTranscriptView","LitElement","changed","toHighlight","e","_a","content","language","html","highlight","md","transcriptToMarkdown","blob","url","a","el","entry","code","nothing","cached","unsafeHTML","hasEntries","_b","l","css","__decorateClass","property","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"sw-ui-transcript-view.js","sources":["../../../src/components/UI/sw-ui-transcript-view.ts"],"sourcesContent":["import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { highlight } from '../../utils/prism.js';\nimport { transcriptToMarkdown } from '../../utils/transcriptToMarkdown.js';\nimport { hostReset } from './host-reset.js';\n\n/**\n * A single transcript entry rendered as a chat bubble.\n *\n * The optional `meta` field carries rich content from the AI.\n */\nexport interface TranscriptEntry {\n id: string;\n type: 'user' | 'agent' | 'system';\n state: 'partial' | 'complete';\n text: string;\n meta?: TranscriptEntryMeta;\n}\n\n/** Rich content attached to a transcript entry. */\nexport interface TranscriptEntryMeta {\n /** Clickable links. */\n links?: { label: string; url: string }[];\n /** Code snippet. */\n code?: { language?: string; content: string };\n /**\n * Content that the agent pushed via a `display_content` user_event.\n * Stored here so the download serializer can include the full payload.\n */\n displayContent?: {\n title?: string;\n content: string;\n format: 'text' | 'markdown' | 'code' | 'html';\n language?: string;\n };\n}\n\n@customElement('sw-ui-transcript-view')\nexport class SwUiTranscriptView extends LitElement {\n static styles = [hostReset, css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--bg-page);\n color: var(--fg-default);\n font-family: var(--type-family-body);\n font-size: var(--type-size-small);\n overflow: hidden;\n }\n\n .header {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 10px 8px 14px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: color-mix(in srgb, var(--fg-default) 40%, transparent);\n border-bottom: 1px solid var(--border-default);\n user-select: none;\n }\n\n .download-btn {\n all: unset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border-radius: 5px;\n cursor: pointer;\n color: color-mix(in srgb, var(--fg-default) 50%, transparent);\n transition:\n background var(--transition-fast),\n color var(--transition-fast);\n }\n\n .download-btn:hover {\n background: var(--bg-surface-raised);\n color: var(--fg-default);\n }\n\n\n .messages {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 10px 12px 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n scroll-behavior: smooth;\n }\n\n .messages::-webkit-scrollbar {\n width: 4px;\n }\n .messages::-webkit-scrollbar-track {\n background: transparent;\n }\n .messages::-webkit-scrollbar-thumb {\n background: var(--bg-surface-raised);\n border-radius: 2px;\n }\n\n .empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n color: rgba(255, 255, 255, 0.25);\n padding: 20px;\n text-align: center;\n }\n\n .bubble {\n max-width: 85%;\n padding: 8px 12px;\n border-radius: 14px;\n font-size: 0.8125rem;\n line-height: 1.45;\n word-break: break-word;\n animation: pop-in 0.15s ease-out;\n }\n\n @keyframes pop-in {\n from {\n opacity: 0;\n transform: scale(0.94) translateY(4px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n .user {\n align-self: flex-end;\n background: var(--interactive-button-primary-bg);\n color: #fff;\n border-bottom-right-radius: 4px;\n }\n .agent {\n align-self: flex-start;\n background: var(--bg-surface);\n color: var(--fg-default);\n border-bottom-left-radius: 4px;\n }\n .system {\n align-self: center;\n background: transparent;\n border: 1px solid var(--border-default);\n color: var(--fg-default);\n font-size: 0.75rem;\n max-width: 95%;\n }\n\n .partial {\n opacity: 0.55;\n }\n\n /* ── Links ── */\n .meta-links {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n }\n\n .meta-links a {\n color: var(--interactive-button-primary-bg);\n text-decoration: none;\n font-size: 0.75rem;\n padding: 2px 8px;\n border: 1px solid var(--interactive-button-primary-bg);\n border-radius: 4px;\n transition: background var(--transition-fast);\n }\n\n .meta-links a:hover {\n background: var(--interactive-button-primary-bg);\n color: #fff;\n }\n\n /* ── Code block ── */\n .meta-code {\n margin-top: 8px;\n border-radius: 6px;\n overflow: hidden;\n }\n\n .meta-code pre {\n margin: 0;\n padding: 10px 12px;\n background: #1a1b26;\n overflow-x: auto;\n font-size: 0.72rem;\n line-height: 1.5;\n }\n\n .meta-code code {\n font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;\n color: #f8f8f2;\n }\n\n /* ── Prism Okaidia theme ── */\n .token.comment,\n .token.prolog,\n .token.doctype,\n .token.cdata {\n color: #8292a2;\n }\n .token.punctuation {\n color: #f8f8f2;\n }\n .token.namespace {\n opacity: 0.7;\n }\n .token.property,\n .token.tag,\n .token.constant,\n .token.symbol,\n .token.deleted {\n color: #f92672;\n }\n .token.boolean,\n .token.number {\n color: #ae81ff;\n }\n .token.selector,\n .token.attr-name,\n .token.string,\n .token.char,\n .token.builtin,\n .token.inserted {\n color: #a6e22e;\n }\n .token.operator,\n .token.entity,\n .token.url,\n .token.variable {\n color: #f8f8f2;\n }\n .token.atrule,\n .token.attr-value,\n .token.function,\n .token.class-name {\n color: #e6db74;\n }\n .token.keyword {\n color: #66d9ef;\n }\n .token.regex,\n .token.important {\n color: #fd971f;\n }\n .token.important,\n .token.bold {\n font-weight: bold;\n }\n .token.italic {\n font-style: italic;\n }\n `];\n\n @property({ attribute: false }) entries: TranscriptEntry[] = [];\n @property({ type: String }) header = 'Transcript';\n @property({ type: String, attribute: 'empty-text' }) emptyText = '';\n\n // entry.id → highlighted HTML (populated asynchronously)\n @state() private _codeCache = new Map<string, string>();\n\n private _lastEntryCount = 0;\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (this.entries.length !== this._lastEntryCount) {\n this._lastEntryCount = this.entries.length;\n this._autoScroll();\n }\n if (changed.has('entries')) {\n void this._highlightNewEntries();\n }\n }\n\n private async _highlightNewEntries(): Promise<void> {\n const toHighlight = this.entries.filter((e) => e.meta?.code && !this._codeCache.has(e.id));\n if (toHighlight.length === 0) return;\n\n await Promise.all(\n toHighlight.map(async (e) => {\n const { content, language = '' } = e.meta!.code!;\n const html = await highlight(content, language);\n this._codeCache = new Map(this._codeCache).set(e.id, html);\n })\n );\n\n // The highlighted re-render extends the scroll height — scroll again\n // now that the final DOM height is known.\n await this.updateComplete;\n this._autoScroll();\n }\n\n private _downloadTranscript(): void {\n const md = transcriptToMarkdown(this.entries);\n const blob = new Blob([md], { type: 'text/markdown;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `transcript-${new Date().toISOString().slice(0, 10)}.md`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private _autoScroll(): void {\n const el = this.shadowRoot?.querySelector('.messages');\n if (!el) return;\n const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 120;\n if (nearBottom) el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });\n }\n\n private _renderCode(entry: TranscriptEntry) {\n const code = entry.meta?.code;\n if (!code) return nothing;\n const cached = this._codeCache.get(entry.id);\n return html`\n <div class=\"meta-code\" part=\"code\">\n <pre><code>${cached ? unsafeHTML(cached) : code.content}</code></pre>\n </div>\n `;\n }\n\n render() {\n const hasEntries = this.entries.some((e) => e.state === 'complete');\n\n return html`\n <div class=\"header\" part=\"header\">\n <span>${this.header}</span>\n <button\n class=\"download-btn\"\n part=\"download-btn\"\n title=\"Download transcript as Markdown\"\n ?disabled=${!hasEntries}\n @click=${this._downloadTranscript}\n >\n <sw-ui-icon name=\"download\" size=\"15\"></sw-ui-icon>\n </button>\n </div>\n\n ${this.entries.length === 0\n ? html`<div class=\"empty\" part=\"empty\">${this.emptyText}</div>`\n : html`\n <div class=\"messages\" part=\"messages\">\n ${this.entries.map(\n (e) => html`\n <div\n class=\"bubble ${e.type} ${e.state === 'partial' ? 'partial' : ''}\"\n part=\"bubble bubble-${e.type}\"\n >\n ${e.text}\n ${e.meta?.links?.length\n ? html`<div class=\"meta-links\">\n ${e.meta.links.map(\n (l) =>\n html`<a href=${l.url} target=\"_blank\" rel=\"noopener\">${l.label}</a>`\n )}\n </div>`\n : nothing}\n ${this._renderCode(e)}\n </div>\n `\n )}\n </div>\n `}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-ui-transcript-view': SwUiTranscriptView;\n }\n}\n"],"names":["SwUiTranscriptView","LitElement","changed","toHighlight","e","_a","content","language","html","highlight","md","transcriptToMarkdown","blob","url","a","el","entry","code","nothing","cached","unsafeHTML","hasEntries","_b","l","hostReset","css","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -21,7 +21,7 @@
21
21
  import { LitElement } from 'lit';
22
22
  import type { Call } from '../types/index.js';
23
23
  export declare class SwCallStatus extends LitElement {
24
- static styles: import("lit").CSSResult;
24
+ static styles: import("lit").CSSResult[];
25
25
  /** Explicit Call — when set, subscribes directly to its observables and bypasses context. */
26
26
  call?: Call;
27
27
  private _callState?;
@@ -1 +1 @@
1
- {"version":3,"file":"sw-call-status.d.ts","sourceRoot":"","sources":["../../src/components/sw-call-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAK5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,qBACa,YAAa,SAAQ,UAAU;IAC1C,MAAM,CAAC,MAAM,0BA4FT;IAEJ,6FAA6F;IACjE,IAAI,CAAC,EAAE,IAAI,CAAC;IAIxC,OAAO,CAAC,UAAU,CAAC,CAAY;IAE/B,qFAAqF;IAC5E,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,SAAS,CAAU;IAEpC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,oBAAoB,CAAsB;IAElD,OAAO,KAAK,gBAAgB,GAE3B;IAED,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqBtD,oBAAoB;IAMpB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,aAAa;IA8BrB,MAAM;CAgBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,YAAY,CAAC;KAChC;CACF"}
1
+ {"version":3,"file":"sw-call-status.d.ts","sourceRoot":"","sources":["../../src/components/sw-call-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAK5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAI9C,qBACa,YAAa,SAAQ,UAAU;IAC1C,MAAM,CAAC,MAAM,4BA4FR;IAEL,6FAA6F;IACjE,IAAI,CAAC,EAAE,IAAI,CAAC;IAIxC,OAAO,CAAC,UAAU,CAAC,CAAY;IAE/B,qFAAqF;IAC5E,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,SAAS,CAAU;IAEpC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,oBAAoB,CAAsB;IAElD,OAAO,KAAK,gBAAgB,GAE3B;IAED,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqBtD,oBAAoB;IAMpB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,aAAa;IA8BrB,MAAM;CAgBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,YAAY,CAAC;KAChC;CACF"}
@@ -2,10 +2,11 @@ import { LitElement as d, html as l, css as p } from "lit";
2
2
  import { property as h, state as c, customElement as v } from "lit/decorators.js";
3
3
  import { consume as _ } from "@lit/context";
4
4
  import { callStateContext as f } from "../context/call-state-context.js";
5
- var g = Object.defineProperty, m = Object.getOwnPropertyDescriptor, n = (t, e, r, i) => {
6
- for (var a = i > 1 ? void 0 : i ? m(e, r) : e, o = t.length - 1, u; o >= 0; o--)
5
+ import { hostReset as g } from "./UI/host-reset.js";
6
+ var m = Object.defineProperty, S = Object.getOwnPropertyDescriptor, n = (t, e, r, i) => {
7
+ for (var a = i > 1 ? void 0 : i ? S(e, r) : e, o = t.length - 1, u; o >= 0; o--)
7
8
  (u = t[o]) && (a = (i ? u(e, r, a) : u(a)) || a);
8
- return i && a && g(e, r, a), a;
9
+ return i && a && m(e, r, a), a;
9
10
  };
10
11
  let s = class extends d {
11
12
  constructor() {
@@ -85,7 +86,7 @@ let s = class extends d {
85
86
  `;
86
87
  }
87
88
  };
88
- s.styles = p`
89
+ s.styles = [g, p`
89
90
  :host {
90
91
  display: inline-flex;
91
92
  align-items: center;
@@ -177,7 +178,7 @@ s.styles = p`
177
178
  opacity: 0.6;
178
179
  font-size: 0.85em;
179
180
  }
180
- `;
181
+ `];
181
182
  n([
182
183
  h({ type: Object })
183
184
  ], s.prototype, "call", 2);
@@ -1 +1 @@
1
- {"version":3,"file":"sw-call-status.js","sources":["../../src/components/sw-call-status.ts"],"sourcesContent":["/**\n * Call Status Component\n *\n * Displays current call state with status text and duration timer.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @example\n * ```html\n * <!-- Inside a context provider: -->\n * <sw-call-status></sw-call-status>\n *\n * <!-- Standalone with an explicit Call: -->\n * <sw-call-status .call=${call}></sw-call-status>\n * ```\n *\n * @csspart container - Outer status container.\n * @csspart status-text - Text label of the current status.\n * @csspart duration - Elapsed-time label (only rendered when connected).\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { CallStatus } from '@signalwire/js';\nimport type { Call } from '../types/index.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\n\n@customElement('sw-call-status')\nexport class SwCallStatus extends LitElement {\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-family: var(--type-family-body);\n font-size: var(--type-size-small);\n }\n\n .container {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: var(--radius-md);\n color: var(--fg-default);\n }\n\n .status-indicator {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-indicator.new {\n background-color: var(--bg-surface-raised);\n }\n .status-indicator.connecting,\n .status-indicator.ringing,\n .status-indicator.trying,\n .status-indicator.recovering {\n background-color: var(--interactive-status-warning);\n animation: pulse 1.5s ease-in-out infinite;\n }\n .status-indicator.connected {\n background-color: var(--interactive-status-success);\n }\n .status-indicator.disconnecting {\n background-color: var(--interactive-button-destructive-bg);\n animation: pulse 1s ease-in-out infinite;\n }\n .status-indicator.disconnected,\n .status-indicator.failed {\n background-color: var(--interactive-button-destructive-bg);\n }\n .status-indicator.destroyed {\n background-color: var(--bg-surface-raised);\n }\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.5;\n transform: scale(1.1);\n }\n }\n\n .status-text {\n font-weight: 500;\n white-space: nowrap;\n }\n .status-text.trying,\n .status-text.connecting,\n .status-text.ringing,\n .status-text.recovering {\n color: var(--interactive-status-warning);\n }\n .status-text.disconnecting {\n color: var(--interactive-button-destructive-bg);\n }\n .status-text.connected {\n color: var(--interactive-status-success);\n }\n .status-text.disconnected,\n .status-text.failed {\n color: var(--interactive-button-destructive-bg);\n }\n .status-text.new,\n .status-text.destroyed {\n color: var(--bg-surface-raised);\n }\n\n .duration {\n font-variant-numeric: tabular-nums;\n opacity: 0.6;\n font-size: 0.85em;\n }\n `;\n\n /** Explicit Call — when set, subscribes directly to its observables and bypasses context. */\n @property({ type: Object }) call?: Call;\n\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n /** Status from a directly-subscribed `.call` — `null` when context is the source. */\n @state() private _directStatus: CallStatus | null = null;\n\n @state() private _callStartTime: number | null = null;\n @state() private _duration = '0:00';\n\n private _durationInterval: number | null = null;\n private _prevStatus: CallStatus = 'new';\n private _directSubscriptions: Subscription[] = [];\n\n private get _effectiveStatus(): CallStatus {\n return this.call ? this._directStatus ?? 'new' : this._callState?.status ?? 'new';\n }\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n\n if (changed.has('call')) {\n this._teardownDirect();\n if (this.call) this._setupDirect(this.call);\n }\n\n if (changed.has('call') || changed.has('_callState') || changed.has('_directStatus')) {\n const status = this._effectiveStatus;\n if (status !== this._prevStatus) {\n if (status === 'connected' && this._prevStatus !== 'connected') {\n this._startDurationTimer();\n } else if (status !== 'connected') {\n this._stopDurationTimer();\n }\n this._prevStatus = status;\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._stopDurationTimer();\n this._teardownDirect();\n }\n\n private _setupDirect(call: Call): void {\n this._directSubscriptions.push(\n call.status$.subscribe((s) => {\n this._directStatus = s;\n })\n );\n }\n\n private _teardownDirect(): void {\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n this._directStatus = null;\n }\n\n private _startDurationTimer(): void {\n this._callStartTime = Date.now();\n this._duration = '0:00';\n this._durationInterval = window.setInterval(() => {\n if (this._callStartTime) {\n const elapsed = Math.floor((Date.now() - this._callStartTime) / 1000);\n const hours = Math.floor(elapsed / 3600);\n const minutes = Math.floor((elapsed % 3600) / 60);\n const secs = elapsed % 60;\n this._duration =\n hours > 0\n ? `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`\n : `${minutes}:${secs.toString().padStart(2, '0')}`;\n }\n }, 1000);\n }\n\n private _stopDurationTimer(): void {\n if (this._durationInterval) {\n clearInterval(this._durationInterval);\n this._durationInterval = null;\n }\n this._callStartTime = null;\n this._duration = '0:00';\n }\n\n private getStatusText(): string {\n const status = this._effectiveStatus;\n switch (status) {\n case 'new':\n return 'Ready';\n case 'trying':\n return 'Trying...';\n case 'connecting':\n return 'Connecting...';\n case 'ringing':\n return 'Ringing...';\n case 'connected':\n return 'Connected';\n case 'recovering':\n return 'Reconnecting...';\n case 'disconnecting':\n return 'Disconnecting...';\n case 'disconnected':\n return 'Disconnected';\n case 'failed':\n return 'Failed';\n case 'destroyed':\n return 'Ended';\n default: {\n const _exhaustive: never = status;\n return String(_exhaustive);\n }\n }\n }\n\n render() {\n const status = this._effectiveStatus;\n const statusText = this.getStatusText();\n\n return html`\n <div class=\"container\" part=\"container\">\n <span class=\"status-indicator ${status}\" aria-hidden=\"true\"></span>\n <span class=\"status-text ${status}\" part=\"status-text\" role=\"status\" aria-live=\"polite\">\n ${statusText}\n </span>\n ${status === 'connected'\n ? html`<span class=\"duration\" part=\"duration\">${this._duration}</span>`\n : null}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-status': SwCallStatus;\n }\n}\n"],"names":["SwCallStatus","LitElement","_a","changed","status","call","s","elapsed","hours","minutes","secs","statusText","html","css","__decorateClass","property","consume","callStateContext","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"sw-call-status.js","sources":["../../src/components/sw-call-status.ts"],"sourcesContent":["/**\n * Call Status Component\n *\n * Displays current call state with status text and duration timer.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @example\n * ```html\n * <!-- Inside a context provider: -->\n * <sw-call-status></sw-call-status>\n *\n * <!-- Standalone with an explicit Call: -->\n * <sw-call-status .call=${call}></sw-call-status>\n * ```\n *\n * @csspart container - Outer status container.\n * @csspart status-text - Text label of the current status.\n * @csspart duration - Elapsed-time label (only rendered when connected).\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { CallStatus } from '@signalwire/js';\nimport type { Call } from '../types/index.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport { hostReset } from './UI/host-reset.js';\n\n@customElement('sw-call-status')\nexport class SwCallStatus extends LitElement {\n static styles = [hostReset, css`\n :host {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-family: var(--type-family-body);\n font-size: var(--type-size-small);\n }\n\n .container {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: var(--radius-md);\n color: var(--fg-default);\n }\n\n .status-indicator {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-indicator.new {\n background-color: var(--bg-surface-raised);\n }\n .status-indicator.connecting,\n .status-indicator.ringing,\n .status-indicator.trying,\n .status-indicator.recovering {\n background-color: var(--interactive-status-warning);\n animation: pulse 1.5s ease-in-out infinite;\n }\n .status-indicator.connected {\n background-color: var(--interactive-status-success);\n }\n .status-indicator.disconnecting {\n background-color: var(--interactive-button-destructive-bg);\n animation: pulse 1s ease-in-out infinite;\n }\n .status-indicator.disconnected,\n .status-indicator.failed {\n background-color: var(--interactive-button-destructive-bg);\n }\n .status-indicator.destroyed {\n background-color: var(--bg-surface-raised);\n }\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.5;\n transform: scale(1.1);\n }\n }\n\n .status-text {\n font-weight: 500;\n white-space: nowrap;\n }\n .status-text.trying,\n .status-text.connecting,\n .status-text.ringing,\n .status-text.recovering {\n color: var(--interactive-status-warning);\n }\n .status-text.disconnecting {\n color: var(--interactive-button-destructive-bg);\n }\n .status-text.connected {\n color: var(--interactive-status-success);\n }\n .status-text.disconnected,\n .status-text.failed {\n color: var(--interactive-button-destructive-bg);\n }\n .status-text.new,\n .status-text.destroyed {\n color: var(--bg-surface-raised);\n }\n\n .duration {\n font-variant-numeric: tabular-nums;\n opacity: 0.6;\n font-size: 0.85em;\n }\n `];\n\n /** Explicit Call — when set, subscribes directly to its observables and bypasses context. */\n @property({ type: Object }) call?: Call;\n\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n /** Status from a directly-subscribed `.call` — `null` when context is the source. */\n @state() private _directStatus: CallStatus | null = null;\n\n @state() private _callStartTime: number | null = null;\n @state() private _duration = '0:00';\n\n private _durationInterval: number | null = null;\n private _prevStatus: CallStatus = 'new';\n private _directSubscriptions: Subscription[] = [];\n\n private get _effectiveStatus(): CallStatus {\n return this.call ? this._directStatus ?? 'new' : this._callState?.status ?? 'new';\n }\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n\n if (changed.has('call')) {\n this._teardownDirect();\n if (this.call) this._setupDirect(this.call);\n }\n\n if (changed.has('call') || changed.has('_callState') || changed.has('_directStatus')) {\n const status = this._effectiveStatus;\n if (status !== this._prevStatus) {\n if (status === 'connected' && this._prevStatus !== 'connected') {\n this._startDurationTimer();\n } else if (status !== 'connected') {\n this._stopDurationTimer();\n }\n this._prevStatus = status;\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._stopDurationTimer();\n this._teardownDirect();\n }\n\n private _setupDirect(call: Call): void {\n this._directSubscriptions.push(\n call.status$.subscribe((s) => {\n this._directStatus = s;\n })\n );\n }\n\n private _teardownDirect(): void {\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n this._directStatus = null;\n }\n\n private _startDurationTimer(): void {\n this._callStartTime = Date.now();\n this._duration = '0:00';\n this._durationInterval = window.setInterval(() => {\n if (this._callStartTime) {\n const elapsed = Math.floor((Date.now() - this._callStartTime) / 1000);\n const hours = Math.floor(elapsed / 3600);\n const minutes = Math.floor((elapsed % 3600) / 60);\n const secs = elapsed % 60;\n this._duration =\n hours > 0\n ? `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`\n : `${minutes}:${secs.toString().padStart(2, '0')}`;\n }\n }, 1000);\n }\n\n private _stopDurationTimer(): void {\n if (this._durationInterval) {\n clearInterval(this._durationInterval);\n this._durationInterval = null;\n }\n this._callStartTime = null;\n this._duration = '0:00';\n }\n\n private getStatusText(): string {\n const status = this._effectiveStatus;\n switch (status) {\n case 'new':\n return 'Ready';\n case 'trying':\n return 'Trying...';\n case 'connecting':\n return 'Connecting...';\n case 'ringing':\n return 'Ringing...';\n case 'connected':\n return 'Connected';\n case 'recovering':\n return 'Reconnecting...';\n case 'disconnecting':\n return 'Disconnecting...';\n case 'disconnected':\n return 'Disconnected';\n case 'failed':\n return 'Failed';\n case 'destroyed':\n return 'Ended';\n default: {\n const _exhaustive: never = status;\n return String(_exhaustive);\n }\n }\n }\n\n render() {\n const status = this._effectiveStatus;\n const statusText = this.getStatusText();\n\n return html`\n <div class=\"container\" part=\"container\">\n <span class=\"status-indicator ${status}\" aria-hidden=\"true\"></span>\n <span class=\"status-text ${status}\" part=\"status-text\" role=\"status\" aria-live=\"polite\">\n ${statusText}\n </span>\n ${status === 'connected'\n ? html`<span class=\"duration\" part=\"duration\">${this._duration}</span>`\n : null}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-status': SwCallStatus;\n }\n}\n"],"names":["SwCallStatus","LitElement","_a","changed","status","call","s","elapsed","hours","minutes","secs","statusText","html","hostReset","css","__decorateClass","property","consume","callStateContext","state","customElement"],"mappings":"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"}
@@ -36,7 +36,7 @@ import '../UI/sw-ui-transcript-view.js';
36
36
  * @method hangup() - End active call
37
37
  */
38
38
  export declare class SwCallWidget extends LitElement {
39
- static styles: import("lit").CSSResult;
39
+ static styles: import("lit").CSSResult[];
40
40
  token: string;
41
41
  host: string;
42
42
  destination: string;
@@ -1 +1 @@
1
- {"version":3,"file":"sw-call-widget.d.ts","sourceRoot":"","sources":["../../../src/components/sw-call-widget/sw-call-widget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,KAAK,CAAC;AAchD,OAAO,qBAAqB,CAAC;AAC7B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,wBAAwB,CAAC;AAChC,OAAO,mCAAmC,CAAC;AAC3C,OAAO,4CAA4C,CAAC;AACpD,OAAO,6BAA6B,CAAC;AACrC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,gCAAgC,CAAC;AAiBxC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBACa,YAAa,SAAQ,UAAU;IAC1C,MAAM,CAAC,MAAM,0BAAgB;IAID,KAAK,SAAM;IACX,IAAI,SAAM;IACV,WAAW,SAAM;IACD,KAAK,UAAS;IACd,aAAa,UAAS;IACa,kBAAkB,UAAS;IACrC,SAAS,UAAS;IAEvF;;;;;;;;;;;;OAYG;IACsD,aAAa,SAAM;IAE5E;;;;OAIG;IAC0E,gBAAgB,UAAS;IAEtG;;;;OAIG;IAC0E,gBAAgB,UAAS;IAI7F,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAsC;IAI9D,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,WAAW,CAAwD;IAC3E,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,cAAc,CAAoC;IAI1D,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,gBAAgB,CAAS;IAIjC,iBAAiB,IAAI,IAAI;IAMzB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAsBtD,oBAAoB,IAAI,IAAI;IAO5B,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,cAAc;IAoBhB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoDrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,mBAAmB,CAyBzB;IAIF,OAAO,CAAC,SAAS;IAoCjB,OAAO,CAAC,iBAAiB,CASvB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa,CAYnB;IAEF,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,mBAAmB;IAM3B,MAAM;CAgCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,YAAY,CAAC;KAChC;CACF"}
1
+ {"version":3,"file":"sw-call-widget.d.ts","sourceRoot":"","sources":["../../../src/components/sw-call-widget/sw-call-widget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,KAAK,CAAC;AAchD,OAAO,qBAAqB,CAAC;AAC7B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,wBAAwB,CAAC;AAChC,OAAO,mCAAmC,CAAC;AAC3C,OAAO,4CAA4C,CAAC;AACpD,OAAO,6BAA6B,CAAC;AACrC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,gCAAgC,CAAC;AAkBxC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBACa,YAAa,SAAQ,UAAU;IAC1C,MAAM,CAAC,MAAM,4BAA6B;IAId,KAAK,SAAM;IACX,IAAI,SAAM;IACV,WAAW,SAAM;IACD,KAAK,UAAS;IACd,aAAa,UAAS;IACa,kBAAkB,UAAS;IACrC,SAAS,UAAS;IAEvF;;;;;;;;;;;;OAYG;IACsD,aAAa,SAAM;IAE5E;;;;OAIG;IAC0E,gBAAgB,UAAS;IAEtG;;;;OAIG;IAC0E,gBAAgB,UAAS;IAI7F,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAsC;IAI9D,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,WAAW,CAAwD;IAC3E,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,cAAc,CAAoC;IAI1D,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,gBAAgB,CAAS;IAIjC,iBAAiB,IAAI,IAAI;IAMzB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAsBtD,oBAAoB,IAAI,IAAI;IAO5B,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,cAAc;IAoBhB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoDrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,mBAAmB,CAyBzB;IAIF,OAAO,CAAC,SAAS;IAoCjB,OAAO,CAAC,iBAAiB,CASvB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa,CAYnB;IAEF,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,mBAAmB;IAM3B,MAAM;CAgCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,YAAY,CAAC;KAChC;CACF"}
@@ -1,6 +1,6 @@
1
1
  import { LitElement as C, nothing as c, html as _ } from "lit";
2
- import { property as l, state as p, customElement as y } from "lit/decorators.js";
3
- import { SignalWire as f, getLogger as w } from "@signalwire/js";
2
+ import { property as l, state as p, customElement as f } from "lit/decorators.js";
3
+ import { SignalWire as y, getLogger as w } from "@signalwire/js";
4
4
  import { filter as g, first as m } from "rxjs/operators";
5
5
  import { CallStateContextController as b } from "../../context/CallStateContextController.js";
6
6
  import { IncomingCallController as v } from "../../context/call-state-context.js";
@@ -10,12 +10,13 @@ import { UserEventController as L } from "../../context/UserEventController.js";
10
10
  import { showPrompt as h } from "../UI/sw-ui-alert.js";
11
11
  import { ensureSignalWireTheme as I, ensureSignalWireFonts as D } from "../../utils/theme-loader.js";
12
12
  import { withWidgetCapabilities as T, parseUserVariablesAttribute as F } from "../../utils/user-variables.js";
13
- import { buildCredentialProvider as $ } from "./client-factory.js";
14
- import { renderCallView as A, renderConnecting as k, widgetStyles as W } from "./sw-call-widget.templates.js";
15
- var U = Object.defineProperty, V = Object.getOwnPropertyDescriptor, s = (t, e, n, r) => {
16
- for (var o = r > 1 ? void 0 : r ? V(e, n) : e, a = t.length - 1, u; a >= 0; a--)
13
+ import { hostReset as $ } from "../UI/host-reset.js";
14
+ import { buildCredentialProvider as A } from "./client-factory.js";
15
+ import { renderCallView as k, renderConnecting as W, widgetStyles as U } from "./sw-call-widget.templates.js";
16
+ var V = Object.defineProperty, B = Object.getOwnPropertyDescriptor, s = (t, e, n, r) => {
17
+ for (var o = r > 1 ? void 0 : r ? B(e, n) : e, a = t.length - 1, u; a >= 0; a--)
17
18
  (u = t[a]) && (o = (r ? u(e, n, o) : u(o)) || o);
18
- return r && o && U(e, n, o), o;
19
+ return r && o && V(e, n, o), o;
19
20
  };
20
21
  const d = w();
21
22
  let i = class extends C {
@@ -79,8 +80,8 @@ let i = class extends C {
79
80
  _refreshClient() {
80
81
  this._destroyClient();
81
82
  try {
82
- this._client = new f(
83
- $(this.token, this.host)
83
+ this._client = new y(
84
+ A(this.token, this.host)
84
85
  ), this._devices.connectDevices(this._client), this.allowIncomingCalls && this._connectIncomingCalls();
85
86
  } catch (t) {
86
87
  const e = t instanceof Error ? t.message : "Failed to initialise client";
@@ -178,7 +179,7 @@ let i = class extends C {
178
179
  }
179
180
  // ── Render ─────────────────────────────────────────────────────────
180
181
  render() {
181
- const t = !!(this._call || this._connecting), e = this._call ? A({
182
+ const t = !!(this._call || this._connecting), e = this._call ? k({
182
183
  transcription: this.transcription,
183
184
  hasLayoutLayers: this._hasLayoutLayers,
184
185
  drawer: this._drawer,
@@ -187,7 +188,7 @@ let i = class extends C {
187
188
  onFullscreenToggle: this._onFullscreenToggle,
188
189
  onTranscriptToggle: this._onTranscriptToggle,
189
190
  onDrawerClose: this._onDrawerClose
190
- }) : this._connecting ? k() : c;
191
+ }) : this._connecting ? W() : c;
191
192
  return this.modal ? _`
192
193
  <slot @slotchange=${this._onSlotChange}></slot>
193
194
  <sw-ui-modal ?open=${t} @sw-modal-close=${this._onModalClose}>
@@ -198,7 +199,7 @@ let i = class extends C {
198
199
  ` : e !== c ? e : _`<slot @slotchange=${this._onSlotChange}></slot>`;
199
200
  }
200
201
  };
201
- i.styles = W;
202
+ i.styles = [$, U];
202
203
  s([
203
204
  l({ type: String })
204
205
  ], i.prototype, "token", 2);
@@ -242,7 +243,7 @@ s([
242
243
  p()
243
244
  ], i.prototype, "_drawer", 2);
244
245
  i = s([
245
- y("sw-call-widget")
246
+ f("sw-call-widget")
246
247
  ], i);
247
248
  export {
248
249
  i as SwCallWidget
@@ -1 +1 @@
1
- {"version":3,"file":"sw-call-widget.js","sources":["../../../src/components/sw-call-widget/sw-call-widget.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { SignalWire, getLogger } from '@signalwire/js';\nimport type { Call } from '../../types/index.js';\nimport { Subscription } from 'rxjs';\nimport { first, filter } from 'rxjs/operators';\n\nimport { CallStateContextController } from '../../context/CallStateContextController.js';\nimport { IncomingCallController } from '../../context/call-state-context.js';\nimport type { IncomingCallInfo } from '../../context/call-state-context.js';\nimport { DevicesContextController } from '../../context/DevicesContextController.js';\nimport { TranscriptController } from '../../context/TranscriptController.js';\nimport { UserEventController } from '../../context/UserEventController.js';\n\nimport '../sw-call-media.js';\nimport '../sw-local-camera.js';\nimport '../sw-call-controls.js';\nimport '../UI/layout/sw-ui-call-layout.js';\nimport '../UI/layout/sw-ui-responsive-container.js';\nimport '../UI/layout/sw-ui-modal.js';\nimport '../UI/layout/sw-ui-background.js';\nimport '../UI/layout/sw-ui-content-drawer.js';\nimport '../UI/sw-ui-transcript-view.js';\nimport { showPrompt } from '../UI/sw-ui-alert.js';\nimport type { DisplayContentPayload } from '../UI/layout/sw-ui-content-drawer.js';\nimport { ensureSignalWireTheme, ensureSignalWireFonts } from '../../utils/theme-loader.js';\nimport {\n parseUserVariablesAttribute,\n withWidgetCapabilities,\n} from '../../utils/user-variables.js';\nimport { buildCredentialProvider } from './client-factory.js';\nimport {\n widgetStyles,\n renderCallView,\n renderConnecting,\n} from './sw-call-widget.templates.js';\n\nconst logger = getLogger();\n\n/**\n * All-in-one call widget. Handles client initialisation, dialling, media,\n * controls and optional AI transcript — in either inline or modal modes.\n *\n * Composes `sw-ui-call-layout`, `sw-call-media`, `sw-local-camera`,\n * `sw-call-controls`, and `sw-ui-transcript-view` under the hood.\n * All child components are wired via Lit context — no manual plumbing needed.\n *\n * @prop {string} token - SignalWire SAT or embed token\n * @prop {string} host - Optional server host\n * @prop {string} destination - Call destination (address or resource)\n * @prop {boolean} modal - Render in a `<sw-ui-modal>` overlay\n * @prop {boolean} transcription - Show AI transcript panel\n *\n * @slot background - Background element (e.g. `<sw-ui-background default>`)\n * @slot (default) - Trigger element (click to dial, shown when idle)\n *\n * @fires sw-dial - When `dial()` is invoked. Detail: `{ destination }`.\n * @fires sw-call-ended - When the call reaches a terminal state (user hangup, remote disconnect, or failure). Detail: `{ status }`.\n * @fires sw-display-content - From `display_content` user event. Detail: `DisplayContentPayload`.\n * @fires signalwire-address:event - Forwarded SignalWire custom user events.\n *\n * All inner events bubble.\n *\n * @method dial() - Initiate call\n * @method hangup() - End active call\n */\n@customElement('sw-call-widget')\nexport class SwCallWidget extends LitElement {\n static styles = widgetStyles;\n\n // ── Public properties ──────────────────────────────────────────────\n\n @property({ type: String }) token = '';\n @property({ type: String }) host = '';\n @property({ type: String }) destination = '';\n @property({ type: Boolean, reflect: true }) modal = false;\n @property({ type: Boolean, reflect: true }) transcription = false;\n @property({ type: Boolean, reflect: true, attribute: 'allow-incoming-calls' }) allowIncomingCalls = false;\n @property({ type: Boolean, reflect: true, attribute: 'audio-only' }) audioOnly = false;\n\n /**\n * Custom variables sent with the Verto invite as a JSON object.\n *\n * The widget always advertises `capabilities.display_content` and\n * `metadata.widget.opened_at` so the agent can detect that the caller\n * supports the content drawer; user-supplied keys are merged in and win\n * on shallow conflict.\n *\n * Invalid JSON is logged and ignored — the call still dials.\n *\n * @example\n * <sw-call-widget user-variables='{\"customer_id\": \"abc-123\"}'></sw-call-widget>\n */\n @property({ type: String, attribute: 'user-variables' }) userVariables = '';\n\n /**\n * Skip auto-injecting the SignalWire `theme.css` design-token stylesheet.\n * Set this when the host page already loads `@signalwire/web-components/theme.css`\n * or a custom theme written against the same DTCG token names.\n */\n @property({ type: Boolean, reflect: true, attribute: 'disable-auto-theme' }) disableAutoTheme = false;\n\n /**\n * Skip auto-loading the SignalWire brand fonts (Lexend, Instrument Sans,\n * JetBrains Mono) from Google Fonts. Set this when fonts are self-hosted\n * or loaded elsewhere.\n */\n @property({ type: Boolean, reflect: true, attribute: 'disable-auto-fonts' }) disableAutoFonts = false;\n\n // ── Internal state ─────────────────────────────────────────────────\n\n @state() private _call: Call | null = null;\n @state() private _connecting = false;\n @state() private _hasLayoutLayers = false;\n @state() private _drawer: DisplayContentPayload | null = null;\n\n // ── Context providers ──────────────────────────────────────────────\n\n private _callState = new CallStateContextController(this);\n private _devices = new DevicesContextController(this);\n private _transcript: TranscriptController = new TranscriptController(this);\n private _userEventCtrl = new UserEventController(this);\n private _incomingCalls = new IncomingCallController(this);\n\n // ── Internals ──────────────────────────────────────────────────────\n\n private _client: SignalWire | null = null;\n private _subs: Subscription[] = [];\n private _pendingIncoming = false;\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!this.disableAutoTheme) ensureSignalWireTheme();\n if (!this.disableAutoFonts) ensureSignalWireFonts();\n }\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('token') || changed.has('host')) {\n if (this.token) {\n this._refreshClient();\n } else if (changed.has('host')) {\n // Host changed but no token configured yet — defer client init until\n // the consumer sets `.token`. Surface this so misconfigurations\n // (e.g. forgetting to bind token) don't fail silently.\n logger.debug(\n '[SwCallWidget] host changed but token is empty; skipping client refresh until token is set',\n );\n }\n } else if (changed.has('allowIncomingCalls') && this._client) {\n if (this.allowIncomingCalls) {\n this._connectIncomingCalls();\n } else {\n this._incomingCalls.disconnect();\n }\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._destroyClient();\n }\n\n // ── Client lifecycle ───────────────────────────────────────────────\n\n private _destroyClient(): void {\n this._subs.forEach((s) => s.unsubscribe());\n this._subs = [];\n\n this._incomingCalls.disconnect();\n this._devices.disconnectCall();\n this._devices.disconnect();\n this._callState.disconnect();\n this._transcript.setCall(undefined);\n\n\n if (this._client) {\n try {\n this._client.destroy();\n } catch (e) {\n logger.error('[SwCallWidget] Error destroying client:', e);\n }\n this._client = null;\n }\n\n this._call = null;\n this._connecting = false;\n }\n\n private _refreshClient(): void {\n this._destroyClient();\n try {\n this._client = new SignalWire(\n buildCredentialProvider(this.token, this.host),\n );\n this._devices.connectDevices(this._client as unknown as import('../../types/index.js').DeviceController);\n\n if (this.allowIncomingCalls) {\n this._connectIncomingCalls();\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Failed to initialise client';\n logger.error('[SwCallWidget] Failed to initialise client:', e);\n void showPrompt({ title: 'Client Error', description: message, type: 'alert' });\n }\n }\n\n // ── Public methods ─────────────────────────────────────────────────\n\n async dial(): Promise<void> {\n if (!this._client || this._connecting || this._call) return;\n if (!this.destination) {\n void showPrompt({ title: 'Call Error', description: 'No destination configured.', type: 'alert' });\n return;\n }\n\n this._connecting = true;\n\n this.dispatchEvent(new CustomEvent('sw-dial', {\n detail: { destination: this.destination },\n bubbles: true,\n composed: true,\n }));\n\n const wantsVideo = !this.audioOnly;\n\n try {\n const call = await new Promise<Call>((resolve, reject) => {\n const sub = this._client!.isConnected$\n .pipe(filter((c) => c), first())\n .subscribe({\n next: () => {\n const userVariables = withWidgetCapabilities(\n parseUserVariablesAttribute(this.userVariables)\n );\n this._client!\n .dial(this.destination, {\n audio: true,\n video: wantsVideo,\n receiveAudio: true,\n receiveVideo: wantsVideo,\n userVariables,\n })\n .then(resolve)\n .catch(reject);\n },\n error: reject,\n });\n this._subs.push(sub);\n });\n\n this._wireCall(call);\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Failed to connect call';\n logger.error('[SwCallWidget] Dial failed:', e);\n void showPrompt({ title: 'Call Failed', description: message, type: 'alert' });\n } finally {\n this._connecting = false;\n }\n }\n\n async hangup(): Promise<void> {\n if (this._call) {\n await this._call.hangup();\n }\n }\n\n // ── Incoming calls ──────────────────────────────────────────────────\n\n private _connectIncomingCalls(): void {\n if (!this._client) return;\n this._incomingCalls.onIncomingCall = this._handleIncomingCall;\n this._subs.push(\n this._client.isConnected$\n .pipe(filter(Boolean), first())\n .subscribe(() => {\n if (this._client) {\n this._incomingCalls.connect(this._client.session.incomingCalls$);\n }\n })\n );\n }\n\n private _handleIncomingCall = async (info: IncomingCallInfo): Promise<void> => {\n if (this._call || this._connecting || this._pendingIncoming) return;\n this._pendingIncoming = true;\n\n try {\n const callerDisplay = info.callerName || info.callerNumber || 'Unknown Caller';\n // TODO(ringing-ux): the confirm dialog is a placeholder, not a real\n // ringing UI. Missing: caller avatar, audible ringtone, distinction\n // between \"ignore\" (let it keep ringing) and \"reject\" (decline now),\n // and a timeout. Replace with a dedicated `<sw-ui-incoming-call>`.\n const accepted = await showPrompt({\n title: 'Incoming Call',\n description: `${callerDisplay} is calling`,\n type: 'confirm',\n });\n\n if (accepted) {\n this._wireCall(info.call);\n info.call.answer();\n } else {\n info.call.reject();\n }\n } finally {\n this._pendingIncoming = false;\n }\n };\n\n // ── Call wiring ────────────────────────────────────────────────────\n\n private _wireCall(call: Call): void {\n this._call = call;\n\n // Wire contexts\n this._callState.connect(call);\n this._devices.connectCall(call);\n this._transcript.setCall(call);\n\n // Always subscribe to user_event for display_content and pass-through\n this._userEventCtrl.setCall(call);\n this.addEventListener('sw-display-content', this._onDisplayContent as EventListener);\n\n // Re-enumerate devices now that getUserMedia has granted permission\n this._devices.refreshDevices();\n\n // Track layout layers to know when MCU composites local camera\n this._subs.push(\n call.layoutLayers$.subscribe((layers) => {\n this._hasLayoutLayers = layers.length > 0;\n })\n );\n\n // Watch for call end\n this._subs.push(\n call.status$.subscribe((status) => {\n if (\n status === 'disconnected' ||\n status === 'destroyed' ||\n status === 'failed'\n ) {\n this._unwireCall();\n }\n })\n );\n }\n\n private _onDisplayContent = (e: CustomEvent<DisplayContentPayload>): void => {\n this._drawer = e.detail;\n this._transcript.injectEntry({\n id: crypto.randomUUID(),\n type: 'system',\n state: 'complete',\n text: e.detail.title ?? 'Agent shared content',\n meta: { displayContent: e.detail },\n });\n };\n\n private _onDrawerClose = (): void => {\n this._drawer = null;\n };\n\n private _unwireCall(): void {\n const endedCall = this._call;\n const endedStatus = endedCall?.status;\n\n this._callState.disconnect();\n this._devices.disconnectCall();\n this._transcript.setCall(undefined);\n this._userEventCtrl.setCall(undefined);\n this.removeEventListener('sw-display-content', this._onDisplayContent as EventListener);\n\n this._call = null;\n this._connecting = false;\n this._hasLayoutLayers = false;\n this._drawer = null;\n\n if (endedCall) {\n // Fires for any terminal transition — user hangup, remote disconnect,\n // or failure. Distinct from `sw-call-hangup` which only fires when the\n // user clicks the hangup button.\n this.dispatchEvent(new CustomEvent('sw-call-ended', {\n detail: { status: endedStatus },\n bubbles: true,\n composed: true,\n }));\n }\n }\n\n // ── Slot trigger ───────────────────────────────────────────────────\n\n private _onSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n slot.assignedElements({ flatten: true }).forEach((el) => {\n if (el instanceof HTMLElement) {\n el.addEventListener('click', () => this.dial());\n }\n });\n }\n\n // ── Event handlers ─────────────────────────────────────────────────\n\n private _onHangUp(): void {\n this.hangup();\n }\n\n private _onModalClose = (e: Event): void => {\n if (this._call || this._connecting) {\n // Active call → hang up. Modal will close automatically once the\n // call reaches a terminal state and `_unwireCall` clears `_call`.\n this.hangup();\n return;\n }\n if (!this.destination) {\n // Pre-call dialpad state — no destination entered yet. Keep the\n // modal open so the user doesn't lose their in-progress dialing.\n e.preventDefault();\n }\n };\n\n private _onFullscreenToggle(): void {\n const layout = this.shadowRoot?.querySelector('sw-ui-call-layout');\n if (layout) {\n (layout as import('../UI/layout/sw-ui-call-layout.js').SwUiCallLayout).toggleFullscreen();\n }\n }\n\n private _onTranscriptToggle(): void {\n this.transcription = !this.transcription;\n }\n\n // ── Render ─────────────────────────────────────────────────────────\n\n render() {\n const isActive = !!(this._call || this._connecting);\n const body = this._call\n ? renderCallView({\n transcription: this.transcription,\n hasLayoutLayers: this._hasLayoutLayers,\n drawer: this._drawer,\n transcriptEntries: this._transcript.state.entries,\n onHangUp: this._onHangUp,\n onFullscreenToggle: this._onFullscreenToggle,\n onTranscriptToggle: this._onTranscriptToggle,\n onDrawerClose: this._onDrawerClose,\n })\n : this._connecting\n ? renderConnecting()\n : nothing;\n\n if (this.modal) {\n return html`\n <slot @slotchange=${this._onSlotChange}></slot>\n <sw-ui-modal ?open=${isActive} @sw-modal-close=${this._onModalClose}>\n <sw-ui-responsive-container>\n ${body !== nothing ? body : nothing}\n </sw-ui-responsive-container>\n </sw-ui-modal>\n `;\n }\n\n if (body !== nothing) return body;\n\n return html`<slot @slotchange=${this._onSlotChange}></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-widget': SwCallWidget;\n }\n}\n"],"names":["logger","getLogger","SwCallWidget","LitElement","CallStateContextController","DevicesContextController","TranscriptController","UserEventController","IncomingCallController","info","callerDisplay","showPrompt","e","ensureSignalWireTheme","ensureSignalWireFonts","changed","s","SignalWire","buildCredentialProvider","message","wantsVideo","call","resolve","reject","sub","filter","c","first","userVariables","withWidgetCapabilities","parseUserVariablesAttribute","layers","status","endedCall","endedStatus","el","layout","_a","isActive","body","renderCallView","renderConnecting","nothing","html","widgetStyles","__decorateClass","property","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"sw-call-widget.js","sources":["../../../src/components/sw-call-widget/sw-call-widget.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { SignalWire, getLogger } from '@signalwire/js';\nimport type { Call } from '../../types/index.js';\nimport { Subscription } from 'rxjs';\nimport { first, filter } from 'rxjs/operators';\n\nimport { CallStateContextController } from '../../context/CallStateContextController.js';\nimport { IncomingCallController } from '../../context/call-state-context.js';\nimport type { IncomingCallInfo } from '../../context/call-state-context.js';\nimport { DevicesContextController } from '../../context/DevicesContextController.js';\nimport { TranscriptController } from '../../context/TranscriptController.js';\nimport { UserEventController } from '../../context/UserEventController.js';\n\nimport '../sw-call-media.js';\nimport '../sw-local-camera.js';\nimport '../sw-call-controls.js';\nimport '../UI/layout/sw-ui-call-layout.js';\nimport '../UI/layout/sw-ui-responsive-container.js';\nimport '../UI/layout/sw-ui-modal.js';\nimport '../UI/layout/sw-ui-background.js';\nimport '../UI/layout/sw-ui-content-drawer.js';\nimport '../UI/sw-ui-transcript-view.js';\nimport { showPrompt } from '../UI/sw-ui-alert.js';\nimport type { DisplayContentPayload } from '../UI/layout/sw-ui-content-drawer.js';\nimport { ensureSignalWireTheme, ensureSignalWireFonts } from '../../utils/theme-loader.js';\nimport {\n parseUserVariablesAttribute,\n withWidgetCapabilities,\n} from '../../utils/user-variables.js';\nimport { hostReset } from '../UI/host-reset.js';\nimport { buildCredentialProvider } from './client-factory.js';\nimport {\n widgetStyles,\n renderCallView,\n renderConnecting,\n} from './sw-call-widget.templates.js';\n\nconst logger = getLogger();\n\n/**\n * All-in-one call widget. Handles client initialisation, dialling, media,\n * controls and optional AI transcript — in either inline or modal modes.\n *\n * Composes `sw-ui-call-layout`, `sw-call-media`, `sw-local-camera`,\n * `sw-call-controls`, and `sw-ui-transcript-view` under the hood.\n * All child components are wired via Lit context — no manual plumbing needed.\n *\n * @prop {string} token - SignalWire SAT or embed token\n * @prop {string} host - Optional server host\n * @prop {string} destination - Call destination (address or resource)\n * @prop {boolean} modal - Render in a `<sw-ui-modal>` overlay\n * @prop {boolean} transcription - Show AI transcript panel\n *\n * @slot background - Background element (e.g. `<sw-ui-background default>`)\n * @slot (default) - Trigger element (click to dial, shown when idle)\n *\n * @fires sw-dial - When `dial()` is invoked. Detail: `{ destination }`.\n * @fires sw-call-ended - When the call reaches a terminal state (user hangup, remote disconnect, or failure). Detail: `{ status }`.\n * @fires sw-display-content - From `display_content` user event. Detail: `DisplayContentPayload`.\n * @fires signalwire-address:event - Forwarded SignalWire custom user events.\n *\n * All inner events bubble.\n *\n * @method dial() - Initiate call\n * @method hangup() - End active call\n */\n@customElement('sw-call-widget')\nexport class SwCallWidget extends LitElement {\n static styles = [hostReset, widgetStyles];\n\n // ── Public properties ──────────────────────────────────────────────\n\n @property({ type: String }) token = '';\n @property({ type: String }) host = '';\n @property({ type: String }) destination = '';\n @property({ type: Boolean, reflect: true }) modal = false;\n @property({ type: Boolean, reflect: true }) transcription = false;\n @property({ type: Boolean, reflect: true, attribute: 'allow-incoming-calls' }) allowIncomingCalls = false;\n @property({ type: Boolean, reflect: true, attribute: 'audio-only' }) audioOnly = false;\n\n /**\n * Custom variables sent with the Verto invite as a JSON object.\n *\n * The widget always advertises `capabilities.display_content` and\n * `metadata.widget.opened_at` so the agent can detect that the caller\n * supports the content drawer; user-supplied keys are merged in and win\n * on shallow conflict.\n *\n * Invalid JSON is logged and ignored — the call still dials.\n *\n * @example\n * <sw-call-widget user-variables='{\"customer_id\": \"abc-123\"}'></sw-call-widget>\n */\n @property({ type: String, attribute: 'user-variables' }) userVariables = '';\n\n /**\n * Skip auto-injecting the SignalWire `theme.css` design-token stylesheet.\n * Set this when the host page already loads `@signalwire/web-components/theme.css`\n * or a custom theme written against the same DTCG token names.\n */\n @property({ type: Boolean, reflect: true, attribute: 'disable-auto-theme' }) disableAutoTheme = false;\n\n /**\n * Skip auto-loading the SignalWire brand fonts (Lexend, Instrument Sans,\n * JetBrains Mono) from Google Fonts. Set this when fonts are self-hosted\n * or loaded elsewhere.\n */\n @property({ type: Boolean, reflect: true, attribute: 'disable-auto-fonts' }) disableAutoFonts = false;\n\n // ── Internal state ─────────────────────────────────────────────────\n\n @state() private _call: Call | null = null;\n @state() private _connecting = false;\n @state() private _hasLayoutLayers = false;\n @state() private _drawer: DisplayContentPayload | null = null;\n\n // ── Context providers ──────────────────────────────────────────────\n\n private _callState = new CallStateContextController(this);\n private _devices = new DevicesContextController(this);\n private _transcript: TranscriptController = new TranscriptController(this);\n private _userEventCtrl = new UserEventController(this);\n private _incomingCalls = new IncomingCallController(this);\n\n // ── Internals ──────────────────────────────────────────────────────\n\n private _client: SignalWire | null = null;\n private _subs: Subscription[] = [];\n private _pendingIncoming = false;\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!this.disableAutoTheme) ensureSignalWireTheme();\n if (!this.disableAutoFonts) ensureSignalWireFonts();\n }\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('token') || changed.has('host')) {\n if (this.token) {\n this._refreshClient();\n } else if (changed.has('host')) {\n // Host changed but no token configured yet — defer client init until\n // the consumer sets `.token`. Surface this so misconfigurations\n // (e.g. forgetting to bind token) don't fail silently.\n logger.debug(\n '[SwCallWidget] host changed but token is empty; skipping client refresh until token is set',\n );\n }\n } else if (changed.has('allowIncomingCalls') && this._client) {\n if (this.allowIncomingCalls) {\n this._connectIncomingCalls();\n } else {\n this._incomingCalls.disconnect();\n }\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._destroyClient();\n }\n\n // ── Client lifecycle ───────────────────────────────────────────────\n\n private _destroyClient(): void {\n this._subs.forEach((s) => s.unsubscribe());\n this._subs = [];\n\n this._incomingCalls.disconnect();\n this._devices.disconnectCall();\n this._devices.disconnect();\n this._callState.disconnect();\n this._transcript.setCall(undefined);\n\n\n if (this._client) {\n try {\n this._client.destroy();\n } catch (e) {\n logger.error('[SwCallWidget] Error destroying client:', e);\n }\n this._client = null;\n }\n\n this._call = null;\n this._connecting = false;\n }\n\n private _refreshClient(): void {\n this._destroyClient();\n try {\n this._client = new SignalWire(\n buildCredentialProvider(this.token, this.host),\n );\n this._devices.connectDevices(this._client as unknown as import('../../types/index.js').DeviceController);\n\n if (this.allowIncomingCalls) {\n this._connectIncomingCalls();\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Failed to initialise client';\n logger.error('[SwCallWidget] Failed to initialise client:', e);\n void showPrompt({ title: 'Client Error', description: message, type: 'alert' });\n }\n }\n\n // ── Public methods ─────────────────────────────────────────────────\n\n async dial(): Promise<void> {\n if (!this._client || this._connecting || this._call) return;\n if (!this.destination) {\n void showPrompt({ title: 'Call Error', description: 'No destination configured.', type: 'alert' });\n return;\n }\n\n this._connecting = true;\n\n this.dispatchEvent(new CustomEvent('sw-dial', {\n detail: { destination: this.destination },\n bubbles: true,\n composed: true,\n }));\n\n const wantsVideo = !this.audioOnly;\n\n try {\n const call = await new Promise<Call>((resolve, reject) => {\n const sub = this._client!.isConnected$\n .pipe(filter((c) => c), first())\n .subscribe({\n next: () => {\n const userVariables = withWidgetCapabilities(\n parseUserVariablesAttribute(this.userVariables)\n );\n this._client!\n .dial(this.destination, {\n audio: true,\n video: wantsVideo,\n receiveAudio: true,\n receiveVideo: wantsVideo,\n userVariables,\n })\n .then(resolve)\n .catch(reject);\n },\n error: reject,\n });\n this._subs.push(sub);\n });\n\n this._wireCall(call);\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Failed to connect call';\n logger.error('[SwCallWidget] Dial failed:', e);\n void showPrompt({ title: 'Call Failed', description: message, type: 'alert' });\n } finally {\n this._connecting = false;\n }\n }\n\n async hangup(): Promise<void> {\n if (this._call) {\n await this._call.hangup();\n }\n }\n\n // ── Incoming calls ──────────────────────────────────────────────────\n\n private _connectIncomingCalls(): void {\n if (!this._client) return;\n this._incomingCalls.onIncomingCall = this._handleIncomingCall;\n this._subs.push(\n this._client.isConnected$\n .pipe(filter(Boolean), first())\n .subscribe(() => {\n if (this._client) {\n this._incomingCalls.connect(this._client.session.incomingCalls$);\n }\n })\n );\n }\n\n private _handleIncomingCall = async (info: IncomingCallInfo): Promise<void> => {\n if (this._call || this._connecting || this._pendingIncoming) return;\n this._pendingIncoming = true;\n\n try {\n const callerDisplay = info.callerName || info.callerNumber || 'Unknown Caller';\n // TODO(ringing-ux): the confirm dialog is a placeholder, not a real\n // ringing UI. Missing: caller avatar, audible ringtone, distinction\n // between \"ignore\" (let it keep ringing) and \"reject\" (decline now),\n // and a timeout. Replace with a dedicated `<sw-ui-incoming-call>`.\n const accepted = await showPrompt({\n title: 'Incoming Call',\n description: `${callerDisplay} is calling`,\n type: 'confirm',\n });\n\n if (accepted) {\n this._wireCall(info.call);\n info.call.answer();\n } else {\n info.call.reject();\n }\n } finally {\n this._pendingIncoming = false;\n }\n };\n\n // ── Call wiring ────────────────────────────────────────────────────\n\n private _wireCall(call: Call): void {\n this._call = call;\n\n // Wire contexts\n this._callState.connect(call);\n this._devices.connectCall(call);\n this._transcript.setCall(call);\n\n // Always subscribe to user_event for display_content and pass-through\n this._userEventCtrl.setCall(call);\n this.addEventListener('sw-display-content', this._onDisplayContent as EventListener);\n\n // Re-enumerate devices now that getUserMedia has granted permission\n this._devices.refreshDevices();\n\n // Track layout layers to know when MCU composites local camera\n this._subs.push(\n call.layoutLayers$.subscribe((layers) => {\n this._hasLayoutLayers = layers.length > 0;\n })\n );\n\n // Watch for call end\n this._subs.push(\n call.status$.subscribe((status) => {\n if (\n status === 'disconnected' ||\n status === 'destroyed' ||\n status === 'failed'\n ) {\n this._unwireCall();\n }\n })\n );\n }\n\n private _onDisplayContent = (e: CustomEvent<DisplayContentPayload>): void => {\n this._drawer = e.detail;\n this._transcript.injectEntry({\n id: crypto.randomUUID(),\n type: 'system',\n state: 'complete',\n text: e.detail.title ?? 'Agent shared content',\n meta: { displayContent: e.detail },\n });\n };\n\n private _onDrawerClose = (): void => {\n this._drawer = null;\n };\n\n private _unwireCall(): void {\n const endedCall = this._call;\n const endedStatus = endedCall?.status;\n\n this._callState.disconnect();\n this._devices.disconnectCall();\n this._transcript.setCall(undefined);\n this._userEventCtrl.setCall(undefined);\n this.removeEventListener('sw-display-content', this._onDisplayContent as EventListener);\n\n this._call = null;\n this._connecting = false;\n this._hasLayoutLayers = false;\n this._drawer = null;\n\n if (endedCall) {\n // Fires for any terminal transition — user hangup, remote disconnect,\n // or failure. Distinct from `sw-call-hangup` which only fires when the\n // user clicks the hangup button.\n this.dispatchEvent(new CustomEvent('sw-call-ended', {\n detail: { status: endedStatus },\n bubbles: true,\n composed: true,\n }));\n }\n }\n\n // ── Slot trigger ───────────────────────────────────────────────────\n\n private _onSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n slot.assignedElements({ flatten: true }).forEach((el) => {\n if (el instanceof HTMLElement) {\n el.addEventListener('click', () => this.dial());\n }\n });\n }\n\n // ── Event handlers ─────────────────────────────────────────────────\n\n private _onHangUp(): void {\n this.hangup();\n }\n\n private _onModalClose = (e: Event): void => {\n if (this._call || this._connecting) {\n // Active call → hang up. Modal will close automatically once the\n // call reaches a terminal state and `_unwireCall` clears `_call`.\n this.hangup();\n return;\n }\n if (!this.destination) {\n // Pre-call dialpad state — no destination entered yet. Keep the\n // modal open so the user doesn't lose their in-progress dialing.\n e.preventDefault();\n }\n };\n\n private _onFullscreenToggle(): void {\n const layout = this.shadowRoot?.querySelector('sw-ui-call-layout');\n if (layout) {\n (layout as import('../UI/layout/sw-ui-call-layout.js').SwUiCallLayout).toggleFullscreen();\n }\n }\n\n private _onTranscriptToggle(): void {\n this.transcription = !this.transcription;\n }\n\n // ── Render ─────────────────────────────────────────────────────────\n\n render() {\n const isActive = !!(this._call || this._connecting);\n const body = this._call\n ? renderCallView({\n transcription: this.transcription,\n hasLayoutLayers: this._hasLayoutLayers,\n drawer: this._drawer,\n transcriptEntries: this._transcript.state.entries,\n onHangUp: this._onHangUp,\n onFullscreenToggle: this._onFullscreenToggle,\n onTranscriptToggle: this._onTranscriptToggle,\n onDrawerClose: this._onDrawerClose,\n })\n : this._connecting\n ? renderConnecting()\n : nothing;\n\n if (this.modal) {\n return html`\n <slot @slotchange=${this._onSlotChange}></slot>\n <sw-ui-modal ?open=${isActive} @sw-modal-close=${this._onModalClose}>\n <sw-ui-responsive-container>\n ${body !== nothing ? body : nothing}\n </sw-ui-responsive-container>\n </sw-ui-modal>\n `;\n }\n\n if (body !== nothing) return body;\n\n return html`<slot @slotchange=${this._onSlotChange}></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-widget': SwCallWidget;\n }\n}\n"],"names":["logger","getLogger","SwCallWidget","LitElement","CallStateContextController","DevicesContextController","TranscriptController","UserEventController","IncomingCallController","info","callerDisplay","showPrompt","e","ensureSignalWireTheme","ensureSignalWireFonts","changed","s","SignalWire","buildCredentialProvider","message","wantsVideo","call","resolve","reject","sub","filter","c","first","userVariables","withWidgetCapabilities","parseUserVariablesAttribute","layers","status","endedCall","endedStatus","el","layout","_a","isActive","body","renderCallView","renderConnecting","nothing","html","hostReset","widgetStyles","__decorateClass","property","state","customElement"],"mappings":";;;;;;;;;;;;;;;;;;;;AAsCA,MAAMA,IAASC,EAAA;AA8BR,IAAMC,IAAN,cAA2BC,EAAW;AAAA,EAAtC,cAAA;AAAA,UAAA,GAAA,SAAA,GAKuB,KAAA,QAAQ,IACR,KAAA,OAAO,IACP,KAAA,cAAc,IACE,KAAA,QAAQ,IACR,KAAA,gBAAgB,IACmB,KAAA,qBAAqB,IAC/B,KAAA,YAAY,IAexB,KAAA,gBAAgB,IAOI,KAAA,mBAAmB,IAOnB,KAAA,mBAAmB,IAIvF,KAAQ,QAAqB,MAC7B,KAAQ,cAAc,IACtB,KAAQ,mBAAmB,IAC3B,KAAQ,UAAwC,MAIzD,KAAQ,aAAa,IAAIC,EAA2B,IAAI,GACxD,KAAQ,WAAW,IAAIC,EAAyB,IAAI,GACpD,KAAQ,cAAoC,IAAIC,EAAqB,IAAI,GACzE,KAAQ,iBAAiB,IAAIC,EAAoB,IAAI,GACrD,KAAQ,iBAAiB,IAAIC,EAAuB,IAAI,GAIxD,KAAQ,UAA6B,MACrC,KAAQ,QAAwB,CAAA,GAChC,KAAQ,mBAAmB,IA6J3B,KAAQ,sBAAsB,OAAOC,MAA0C;AAC7E,UAAI,OAAK,SAAS,KAAK,eAAe,KAAK,mBAC3C;AAAA,aAAK,mBAAmB;AAExB,YAAI;AACF,gBAAMC,IAAgBD,EAAK,cAAcA,EAAK,gBAAgB;AAW9D,UANiB,MAAME,EAAW;AAAA,YAChC,OAAO;AAAA,YACP,aAAa,GAAGD,CAAa;AAAA,YAC7B,MAAM;AAAA,UAAA,CACP,KAGC,KAAK,UAAUD,EAAK,IAAI,GACxBA,EAAK,KAAK,OAAA,KAEVA,EAAK,KAAK,OAAA;AAAA,QAEd,UAAA;AACE,eAAK,mBAAmB;AAAA,QAC1B;AAAA;AAAA,IACF,GAwCA,KAAQ,oBAAoB,CAACG,MAAgD;AAC3E,WAAK,UAAUA,EAAE,QACjB,KAAK,YAAY,YAAY;AAAA,QAC3B,IAAI,OAAO,WAAA;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,QACP,MAAMA,EAAE,OAAO,SAAS;AAAA,QACxB,MAAM,EAAE,gBAAgBA,EAAE,OAAA;AAAA,MAAO,CAClC;AAAA,IACH,GAEA,KAAQ,iBAAiB,MAAY;AACnC,WAAK,UAAU;AAAA,IACjB,GA8CA,KAAQ,gBAAgB,CAACA,MAAmB;AAC1C,UAAI,KAAK,SAAS,KAAK,aAAa;AAGlC,aAAK,OAAA;AACL;AAAA,MACF;AACA,MAAK,KAAK,eAGRA,EAAE,eAAA;AAAA,IAEN;AAAA,EAAA;AAAA;AAAA,EAjSA,oBAA0B;AACxB,UAAM,kBAAA,GACD,KAAK,oBAAkBC,EAAA,GACvB,KAAK,oBAAkBC,EAAA;AAAA,EAC9B;AAAA,EAEU,QAAQC,GAAqC;AACrD,UAAM,QAAQA,CAAO,GACjBA,EAAQ,IAAI,OAAO,KAAKA,EAAQ,IAAI,MAAM,IACxC,KAAK,QACP,KAAK,eAAA,IACIA,EAAQ,IAAI,MAAM,KAI3Bf,EAAO;AAAA,MACL;AAAA,IAAA,IAGKe,EAAQ,IAAI,oBAAoB,KAAK,KAAK,YAC/C,KAAK,qBACP,KAAK,sBAAA,IAEL,KAAK,eAAe,WAAA;AAAA,EAG1B;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAA,GACN,KAAK,eAAA;AAAA,EACP;AAAA;AAAA,EAIQ,iBAAuB;AAW7B,QAVA,KAAK,MAAM,QAAQ,CAACC,MAAMA,EAAE,aAAa,GACzC,KAAK,QAAQ,CAAA,GAEb,KAAK,eAAe,WAAA,GACpB,KAAK,SAAS,eAAA,GACd,KAAK,SAAS,WAAA,GACd,KAAK,WAAW,WAAA,GAChB,KAAK,YAAY,QAAQ,MAAS,GAG9B,KAAK,SAAS;AAChB,UAAI;AACF,aAAK,QAAQ,QAAA;AAAA,MACf,SAASJ,GAAG;AACV,QAAAZ,EAAO,MAAM,2CAA2CY,CAAC;AAAA,MAC3D;AACA,WAAK,UAAU;AAAA,IACjB;AAEA,SAAK,QAAQ,MACb,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,eAAA;AACL,QAAI;AACF,WAAK,UAAU,IAAIK;AAAA,QACjBC,EAAwB,KAAK,OAAO,KAAK,IAAI;AAAA,MAAA,GAE/C,KAAK,SAAS,eAAe,KAAK,OAAqE,GAEnG,KAAK,sBACP,KAAK,sBAAA;AAAA,IAET,SAASN,GAAG;AACV,YAAMO,IAAUP,aAAa,QAAQA,EAAE,UAAU;AACjD,MAAAZ,EAAO,MAAM,+CAA+CY,CAAC,GACxDD,EAAW,EAAE,OAAO,gBAAgB,aAAaQ,GAAS,MAAM,SAAS;AAAA,IAChF;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,WAAW,KAAK,eAAe,KAAK,MAAO;AACrD,QAAI,CAAC,KAAK,aAAa;AACrB,MAAKR,EAAW,EAAE,OAAO,cAAc,aAAa,8BAA8B,MAAM,SAAS;AACjG;AAAA,IACF;AAEA,SAAK,cAAc,IAEnB,KAAK,cAAc,IAAI,YAAY,WAAW;AAAA,MAC5C,QAAQ,EAAE,aAAa,KAAK,YAAA;AAAA,MAC5B,SAAS;AAAA,MACT,UAAU;AAAA,IAAA,CACX,CAAC;AAEF,UAAMS,IAAa,CAAC,KAAK;AAEzB,QAAI;AACF,YAAMC,IAAO,MAAM,IAAI,QAAc,CAACC,GAASC,MAAW;AACxD,cAAMC,IAAM,KAAK,QAAS,aACvB,KAAKC,EAAO,CAACC,MAAMA,CAAC,GAAGC,EAAA,CAAO,EAC9B,UAAU;AAAA,UACT,MAAM,MAAM;AACV,kBAAMC,IAAgBC;AAAA,cACpBC,EAA4B,KAAK,aAAa;AAAA,YAAA;AAEhD,iBAAK,QACF,KAAK,KAAK,aAAa;AAAA,cACtB,OAAO;AAAA,cACP,OAAOV;AAAA,cACP,cAAc;AAAA,cACd,cAAcA;AAAA,cACd,eAAAQ;AAAA,YAAA,CACD,EACA,KAAKN,CAAO,EACZ,MAAMC,CAAM;AAAA,UACjB;AAAA,UACA,OAAOA;AAAA,QAAA,CACR;AACH,aAAK,MAAM,KAAKC,CAAG;AAAA,MACrB,CAAC;AAED,WAAK,UAAUH,CAAI;AAAA,IACrB,SAAS,GAAG;AACV,YAAMF,IAAU,aAAa,QAAQ,EAAE,UAAU;AACjD,MAAAnB,EAAO,MAAM,+BAA+B,CAAC,GACxCW,EAAW,EAAE,OAAO,eAAe,aAAaQ,GAAS,MAAM,SAAS;AAAA,IAC/E,UAAA;AACE,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,SAAwB;AAC5B,IAAI,KAAK,SACP,MAAM,KAAK,MAAM,OAAA;AAAA,EAErB;AAAA;AAAA,EAIQ,wBAA8B;AACpC,IAAK,KAAK,YACV,KAAK,eAAe,iBAAiB,KAAK,qBAC1C,KAAK,MAAM;AAAA,MACT,KAAK,QAAQ,aACV,KAAKM,EAAO,OAAO,GAAGE,EAAA,CAAO,EAC7B,UAAU,MAAM;AACf,QAAI,KAAK,WACP,KAAK,eAAe,QAAQ,KAAK,QAAQ,QAAQ,cAAc;AAAA,MAEnE,CAAC;AAAA,IAAA;AAAA,EAEP;AAAA;AAAA,EA+BQ,UAAUN,GAAkB;AAClC,SAAK,QAAQA,GAGb,KAAK,WAAW,QAAQA,CAAI,GAC5B,KAAK,SAAS,YAAYA,CAAI,GAC9B,KAAK,YAAY,QAAQA,CAAI,GAG7B,KAAK,eAAe,QAAQA,CAAI,GAChC,KAAK,iBAAiB,sBAAsB,KAAK,iBAAkC,GAGnF,KAAK,SAAS,eAAA,GAGd,KAAK,MAAM;AAAA,MACTA,EAAK,cAAc,UAAU,CAACU,MAAW;AACvC,aAAK,mBAAmBA,EAAO,SAAS;AAAA,MAC1C,CAAC;AAAA,IAAA,GAIH,KAAK,MAAM;AAAA,MACTV,EAAK,QAAQ,UAAU,CAACW,MAAW;AACjC,SACEA,MAAW,kBACXA,MAAW,eACXA,MAAW,aAEX,KAAK,YAAA;AAAA,MAET,CAAC;AAAA,IAAA;AAAA,EAEL;AAAA,EAiBQ,cAAoB;AAC1B,UAAMC,IAAY,KAAK,OACjBC,IAAcD,KAAA,gBAAAA,EAAW;AAE/B,SAAK,WAAW,WAAA,GAChB,KAAK,SAAS,eAAA,GACd,KAAK,YAAY,QAAQ,MAAS,GAClC,KAAK,eAAe,QAAQ,MAAS,GACrC,KAAK,oBAAoB,sBAAsB,KAAK,iBAAkC,GAEtF,KAAK,QAAQ,MACb,KAAK,cAAc,IACnB,KAAK,mBAAmB,IACxB,KAAK,UAAU,MAEXA,KAIF,KAAK,cAAc,IAAI,YAAY,iBAAiB;AAAA,MAClD,QAAQ,EAAE,QAAQC,EAAA;AAAA,MAClB,SAAS;AAAA,MACT,UAAU;AAAA,IAAA,CACX,CAAC;AAAA,EAEN;AAAA;AAAA,EAIQ,cAActB,GAAgB;AAEpC,IADaA,EAAE,OACV,iBAAiB,EAAE,SAAS,GAAA,CAAM,EAAE,QAAQ,CAACuB,MAAO;AACvD,MAAIA,aAAc,eAChBA,EAAG,iBAAiB,SAAS,MAAM,KAAK,MAAM;AAAA,IAElD,CAAC;AAAA,EACH;AAAA;AAAA,EAIQ,YAAkB;AACxB,SAAK,OAAA;AAAA,EACP;AAAA,EAgBQ,sBAA4B;;AAClC,UAAMC,KAASC,IAAA,KAAK,eAAL,gBAAAA,EAAiB,cAAc;AAC9C,IAAID,KACDA,EAAsE,iBAAA;AAAA,EAE3E;AAAA,EAEQ,sBAA4B;AAClC,SAAK,gBAAgB,CAAC,KAAK;AAAA,EAC7B;AAAA;AAAA,EAIA,SAAS;AACP,UAAME,IAAW,CAAC,EAAE,KAAK,SAAS,KAAK,cACjCC,IAAO,KAAK,QACdC,EAAe;AAAA,MACb,eAAe,KAAK;AAAA,MACpB,iBAAiB,KAAK;AAAA,MACtB,QAAQ,KAAK;AAAA,MACb,mBAAmB,KAAK,YAAY,MAAM;AAAA,MAC1C,UAAU,KAAK;AAAA,MACf,oBAAoB,KAAK;AAAA,MACzB,oBAAoB,KAAK;AAAA,MACzB,eAAe,KAAK;AAAA,IAAA,CACrB,IACD,KAAK,cACHC,MACAC;AAEN,WAAI,KAAK,QACAC;AAAA,4BACe,KAAK,aAAa;AAAA,6BACjBL,CAAQ,oBAAoB,KAAK,aAAa;AAAA;AAAA,cAE7DC,MAASG,IAAUH,IAAOG,CAAO;AAAA;AAAA;AAAA,UAMvCH,MAASG,IAAgBH,IAEtBI,sBAAyB,KAAK,aAAa;AAAA,EACpD;AACF;AAjZazC,EACJ,SAAS,CAAC0C,GAAWC,CAAY;AAIZC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GALf7C,EAKiB,WAAA,SAAA,CAAA;AACA4C,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GANf7C,EAMiB,WAAA,QAAA,CAAA;AACA4C,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAPf7C,EAOiB,WAAA,eAAA,CAAA;AACgB4C,EAAA;AAAA,EAA3CC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAR/B7C,EAQiC,WAAA,SAAA,CAAA;AACA4C,EAAA;AAAA,EAA3CC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAT/B7C,EASiC,WAAA,iBAAA,CAAA;AACmC4C,EAAA;AAAA,EAA9EC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,wBAAwB;AAAA,GAVlE7C,EAUoE,WAAA,sBAAA,CAAA;AACV4C,EAAA;AAAA,EAApEC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,cAAc;AAAA,GAXxD7C,EAW0D,WAAA,aAAA,CAAA;AAeZ4C,EAAA;AAAA,EAAxDC,EAAS,EAAE,MAAM,QAAQ,WAAW,kBAAkB;AAAA,GA1B5C7C,EA0B8C,WAAA,iBAAA,CAAA;AAOoB4C,EAAA;AAAA,EAA5EC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,sBAAsB;AAAA,GAjChE7C,EAiCkE,WAAA,oBAAA,CAAA;AAOA4C,EAAA;AAAA,EAA5EC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,sBAAsB;AAAA,GAxChE7C,EAwCkE,WAAA,oBAAA,CAAA;AAI5D4C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA5CI9C,EA4CM,WAAA,SAAA,CAAA;AACA4C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA7CI9C,EA6CM,WAAA,eAAA,CAAA;AACA4C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA9CI9C,EA8CM,WAAA,oBAAA,CAAA;AACA4C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA/CI9C,EA+CM,WAAA,WAAA,CAAA;AA/CNA,IAAN4C,EAAA;AAAA,EADNG,EAAc,gBAAgB;AAAA,GAClB/C,CAAA;"}
@@ -23,7 +23,7 @@ import './UI/icons/sw-ui-icon.js';
23
23
  * `--type-family-body`, `--type-size-body`, `--radius-md`, `--transition-fast`).
24
24
  */
25
25
  export declare class SwClickToCall extends LitElement {
26
- static styles: import("lit").CSSResult;
26
+ static styles: import("lit").CSSResult[];
27
27
  token: string;
28
28
  host: string;
29
29
  destination: string;
@@ -1 +1 @@
1
- {"version":3,"file":"sw-click-to-call.d.ts","sourceRoot":"","sources":["../../src/components/sw-click-to-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,oCAAoC,CAAC;AAC5C,OAAO,iCAAiC,CAAC;AACzC,OAAO,0BAA0B,CAAC;AAElC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBACa,aAAc,SAAQ,UAAU;IAC3C,MAAM,CAAC,MAAM,0BAkCX;IAE0B,KAAK,SAAM;IACX,IAAI,SAAM;IACV,WAAW,SAAM;IACjB,KAAK,SAAU;IAC0B,SAAS,UAAS;IAEvF,MAAM;CAkBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,aAAa,CAAC;KACnC;CACF"}
1
+ {"version":3,"file":"sw-click-to-call.d.ts","sourceRoot":"","sources":["../../src/components/sw-click-to-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,oCAAoC,CAAC;AAC5C,OAAO,iCAAiC,CAAC;AACzC,OAAO,0BAA0B,CAAC;AAGlC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBACa,aAAc,SAAQ,UAAU;IAC3C,MAAM,CAAC,MAAM,4BAkCV;IAEyB,KAAK,SAAM;IACX,IAAI,SAAM;IACV,WAAW,SAAM;IACjB,KAAK,SAAU;IAC0B,SAAS,UAAS;IAEvF,MAAM;CAkBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,aAAa,CAAC;KACnC;CACF"}
@@ -1,11 +1,12 @@
1
- import { LitElement as p, html as u, css as d } from "lit";
1
+ import { LitElement as c, html as u, css as d } from "lit";
2
2
  import { property as n, customElement as f } from "lit/decorators.js";
3
- var y = Object.defineProperty, b = Object.getOwnPropertyDescriptor, o = (c, i, s, r) => {
4
- for (var e = r > 1 ? void 0 : r ? b(i, s) : i, l = c.length - 1, a; l >= 0; l--)
5
- (a = c[l]) && (e = (r ? a(i, s, e) : a(e)) || e);
6
- return r && e && y(i, s, e), e;
3
+ import { hostReset as y } from "./UI/host-reset.js";
4
+ var b = Object.defineProperty, h = Object.getOwnPropertyDescriptor, o = (p, i, s, r) => {
5
+ for (var e = r > 1 ? void 0 : r ? h(i, s) : i, l = p.length - 1, a; l >= 0; l--)
6
+ (a = p[l]) && (e = (r ? a(i, s, e) : a(e)) || e);
7
+ return r && e && b(i, s, e), e;
7
8
  };
8
- let t = class extends p {
9
+ let t = class extends c {
9
10
  constructor() {
10
11
  super(...arguments), this.token = "", this.host = "", this.destination = "", this.label = "Call", this.audioOnly = !1;
11
12
  }
@@ -28,7 +29,7 @@ let t = class extends p {
28
29
  `;
29
30
  }
30
31
  };
31
- t.styles = d`
32
+ t.styles = [y, d`
32
33
  :host {
33
34
  display: inline-block;
34
35
  font-family: var(--type-family-body);
@@ -62,7 +63,7 @@ t.styles = d`
62
63
  .call-button sw-ui-icon {
63
64
  pointer-events: none;
64
65
  }
65
- `;
66
+ `];
66
67
  o([
67
68
  n({ type: String })
68
69
  ], t.prototype, "token", 2);
@@ -1 +1 @@
1
- {"version":3,"file":"sw-click-to-call.js","sources":["../../src/components/sw-click-to-call.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport './sw-call-widget/sw-call-widget.js';\nimport './UI/layout/sw-ui-background.js';\nimport './UI/icons/sw-ui-icon.js';\n\n/**\n * Click-to-call button that opens a full call widget.\n *\n * Thin wrapper around `sw-call-widget` in modal mode. Renders a styled\n * call button; clicking it dials the preconfigured destination and opens\n * the call UI in a modal overlay.\n *\n * @prop {string} token - SignalWire SAT or embed token\n * @prop {string} host - Optional server host\n * @prop {string} destination - Call destination (address or resource)\n * @prop {string} label - Button text (default \"Call\")\n * @prop {boolean} audioOnly - Audio-only mode (no video send/receive)\n *\n * @fires sw-dial - Fired when the call is initiated. Detail: `{ destination }`.\n * @fires sw-call-ended - Fired when the call reaches a terminal state (any reason). Detail: `{ status }`.\n * @fires sw-call-hangup - Fired when the user clicks the hangup button (does not fire on remote disconnect).\n *\n * Themed via the SignalWire DTCG tokens (`--interactive-status-success`,\n * `--type-family-body`, `--type-size-body`, `--radius-md`, `--transition-fast`).\n */\n@customElement('sw-click-to-call')\nexport class SwClickToCall extends LitElement {\n static styles = css`\n :host {\n display: inline-block;\n font-family: var(--type-family-body);\n }\n\n .call-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n background: var(--interactive-status-success);\n color: #fff;\n border: none;\n border-radius: var(--radius-md);\n font-family: inherit;\n font-size: var(--type-size-body);\n font-weight: 600;\n cursor: pointer;\n transition: filter var(--transition-fast), transform 0.1s ease;\n }\n\n .call-button:hover {\n filter: brightness(0.9);\n }\n\n .call-button:active {\n transform: scale(0.98);\n }\n\n .call-button sw-ui-icon {\n pointer-events: none;\n }\n `;\n\n @property({ type: String }) token = '';\n @property({ type: String }) host = '';\n @property({ type: String }) destination = '';\n @property({ type: String }) label = 'Call';\n @property({ type: Boolean, reflect: true, attribute: 'audio-only' }) audioOnly = false;\n\n render() {\n return html`\n <sw-call-widget\n modal\n transcription\n ?audio-only=${this.audioOnly}\n .token=${this.token}\n .host=${this.host}\n .destination=${this.destination}\n >\n <sw-ui-background slot=\"background\" default></sw-ui-background>\n <button class=\"call-button\" part=\"button\">\n <sw-ui-icon name=\"phone-call\" size=\"20\"></sw-ui-icon>\n ${this.label}\n </button>\n </sw-call-widget>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-click-to-call': SwClickToCall;\n }\n}\n"],"names":["SwClickToCall","LitElement","html","css","__decorateClass","property","customElement"],"mappings":";;;;;;;AA2BO,IAAMA,IAAN,cAA4BC,EAAW;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA,GAqCuB,KAAA,QAAQ,IACR,KAAA,OAAO,IACP,KAAA,cAAc,IACd,KAAA,QAAQ,QACiC,KAAA,YAAY;AAAA,EAAA;AAAA,EAEjF,SAAS;AACP,WAAOC;AAAA;AAAA;AAAA;AAAA,sBAIW,KAAK,SAAS;AAAA,iBACnB,KAAK,KAAK;AAAA,gBACX,KAAK,IAAI;AAAA,uBACF,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,YAK3B,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA,EAIpB;AACF;AA7DaF,EACJ,SAASG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCYC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GArCfL,EAqCiB,WAAA,SAAA,CAAA;AACAI,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAtCfL,EAsCiB,WAAA,QAAA,CAAA;AACAI,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAvCfL,EAuCiB,WAAA,eAAA,CAAA;AACAI,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAxCfL,EAwCiB,WAAA,SAAA,CAAA;AACyCI,EAAA;AAAA,EAApEC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,cAAc;AAAA,GAzCxDL,EAyC0D,WAAA,aAAA,CAAA;AAzC1DA,IAANI,EAAA;AAAA,EADNE,EAAc,kBAAkB;AAAA,GACpBN,CAAA;"}
1
+ {"version":3,"file":"sw-click-to-call.js","sources":["../../src/components/sw-click-to-call.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport './sw-call-widget/sw-call-widget.js';\nimport './UI/layout/sw-ui-background.js';\nimport './UI/icons/sw-ui-icon.js';\nimport { hostReset } from './UI/host-reset.js';\n\n/**\n * Click-to-call button that opens a full call widget.\n *\n * Thin wrapper around `sw-call-widget` in modal mode. Renders a styled\n * call button; clicking it dials the preconfigured destination and opens\n * the call UI in a modal overlay.\n *\n * @prop {string} token - SignalWire SAT or embed token\n * @prop {string} host - Optional server host\n * @prop {string} destination - Call destination (address or resource)\n * @prop {string} label - Button text (default \"Call\")\n * @prop {boolean} audioOnly - Audio-only mode (no video send/receive)\n *\n * @fires sw-dial - Fired when the call is initiated. Detail: `{ destination }`.\n * @fires sw-call-ended - Fired when the call reaches a terminal state (any reason). Detail: `{ status }`.\n * @fires sw-call-hangup - Fired when the user clicks the hangup button (does not fire on remote disconnect).\n *\n * Themed via the SignalWire DTCG tokens (`--interactive-status-success`,\n * `--type-family-body`, `--type-size-body`, `--radius-md`, `--transition-fast`).\n */\n@customElement('sw-click-to-call')\nexport class SwClickToCall extends LitElement {\n static styles = [hostReset, css`\n :host {\n display: inline-block;\n font-family: var(--type-family-body);\n }\n\n .call-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n background: var(--interactive-status-success);\n color: #fff;\n border: none;\n border-radius: var(--radius-md);\n font-family: inherit;\n font-size: var(--type-size-body);\n font-weight: 600;\n cursor: pointer;\n transition: filter var(--transition-fast), transform 0.1s ease;\n }\n\n .call-button:hover {\n filter: brightness(0.9);\n }\n\n .call-button:active {\n transform: scale(0.98);\n }\n\n .call-button sw-ui-icon {\n pointer-events: none;\n }\n `];\n\n @property({ type: String }) token = '';\n @property({ type: String }) host = '';\n @property({ type: String }) destination = '';\n @property({ type: String }) label = 'Call';\n @property({ type: Boolean, reflect: true, attribute: 'audio-only' }) audioOnly = false;\n\n render() {\n return html`\n <sw-call-widget\n modal\n transcription\n ?audio-only=${this.audioOnly}\n .token=${this.token}\n .host=${this.host}\n .destination=${this.destination}\n >\n <sw-ui-background slot=\"background\" default></sw-ui-background>\n <button class=\"call-button\" part=\"button\">\n <sw-ui-icon name=\"phone-call\" size=\"20\"></sw-ui-icon>\n ${this.label}\n </button>\n </sw-call-widget>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-click-to-call': SwClickToCall;\n }\n}\n"],"names":["SwClickToCall","LitElement","html","hostReset","css","__decorateClass","property","customElement"],"mappings":";;;;;;;;AA4BO,IAAMA,IAAN,cAA4BC,EAAW;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA,GAqCuB,KAAA,QAAQ,IACR,KAAA,OAAO,IACP,KAAA,cAAc,IACd,KAAA,QAAQ,QACiC,KAAA,YAAY;AAAA,EAAA;AAAA,EAEjF,SAAS;AACP,WAAOC;AAAA;AAAA;AAAA;AAAA,sBAIW,KAAK,SAAS;AAAA,iBACnB,KAAK,KAAK;AAAA,gBACX,KAAK,IAAI;AAAA,uBACF,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,YAK3B,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA,EAIpB;AACF;AA7DaF,EACJ,SAAS,CAACG,GAAWC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkC3B;AAE2BC,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GArCfN,EAqCiB,WAAA,SAAA,CAAA;AACAK,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAtCfN,EAsCiB,WAAA,QAAA,CAAA;AACAK,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAvCfN,EAuCiB,WAAA,eAAA,CAAA;AACAK,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAxCfN,EAwCiB,WAAA,SAAA,CAAA;AACyCK,EAAA;AAAA,EAApEC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,cAAc;AAAA,GAzCxDN,EAyC0D,WAAA,aAAA,CAAA;AAzC1DA,IAANK,EAAA;AAAA,EADNE,EAAc,kBAAkB;AAAA,GACpBP,CAAA;"}
@@ -16,7 +16,7 @@ import '../sw-audio-level.js';
16
16
  * @cssprop --ctrl-* - all primitive ctrl tokens
17
17
  */
18
18
  export declare class SwDeviceSelector extends LitElement {
19
- static styles: import("lit").CSSResult;
19
+ static styles: import("lit").CSSResult[];
20
20
  deviceController?: DeviceController;
21
21
  /**
22
22
  * Render inline previews (camera video, mic level, speaker test) inside
@@ -1 +1 @@
1
- {"version":3,"file":"sw-device-selector.d.ts","sourceRoot":"","sources":["../../../src/components/sw-device-selector/sw-device-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,KAAK,CAAC;AAGhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD,OAAO,2BAA2B,CAAC;AACnC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AAQ9B;;;;;;;;;;;GAWG;AACH,qBACa,gBAAiB,SAAQ,UAAU;IAC9C,MAAM,CAAC,MAAM,0BAAwB;IAET,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEhE;;;;OAIG;IAEH,WAAW,UAAS;IAEX,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,KAAK,CAAsB;IAEnC,OAAO,CAAC,gBAAgB,CAEtB;IAEF,iBAAiB;IAMjB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQtD,oBAAoB;IASpB,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA+BzD,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;YASR,kBAAkB;IAYhC,OAAO,CAAC,iBAAiB;YAKX,kBAAkB;IAYhC,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CACwqC;IAEntC,OAAO,CAAC,UAAU,CAAC,CAAyB;YAE9B,YAAY;IA2B1B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,qBAAqB;IAmB7B,MAAM;CA8BP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,oBAAoB,EAAE,gBAAgB,CAAC;KACxC;CACF"}
1
+ {"version":3,"file":"sw-device-selector.d.ts","sourceRoot":"","sources":["../../../src/components/sw-device-selector/sw-device-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,KAAK,CAAC;AAGhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKvD,OAAO,2BAA2B,CAAC;AACnC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AAQ9B;;;;;;;;;;;GAWG;AACH,qBACa,gBAAiB,SAAQ,UAAU;IAC9C,MAAM,CAAC,MAAM,4BAAqC;IAEtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEhE;;;;OAIG;IAEH,WAAW,UAAS;IAEX,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,KAAK,CAAsB;IAEnC,OAAO,CAAC,gBAAgB,CAEtB;IAEF,iBAAiB;IAMjB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQtD,oBAAoB;IASpB,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA+BzD,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;YASR,kBAAkB;IAYhC,OAAO,CAAC,iBAAiB;YAKX,kBAAkB;IAYhC,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CACwqC;IAEntC,OAAO,CAAC,UAAU,CAAC,CAAyB;YAE9B,YAAY;IA2B1B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,qBAAqB;IAmB7B,MAAM;CA8BP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,oBAAoB,EAAE,gBAAgB,CAAC;KACxC;CACF"}
@@ -2,10 +2,11 @@ import { LitElement as v, nothing as l, html as n } from "lit";
2
2
  import { property as p, state as c, customElement as m } from "lit/decorators.js";
3
3
  import { getLogger as b } from "@signalwire/js";
4
4
  import { deviceSelectorStyles as w } from "./sw-device-selector.styles.js";
5
- var k = Object.defineProperty, I = Object.getOwnPropertyDescriptor, a = (e, i, t, s) => {
6
- for (var o = s > 1 ? void 0 : s ? I(i, t) : i, h = e.length - 1, d; h >= 0; h--)
5
+ import { hostReset as k } from "../UI/host-reset.js";
6
+ var I = Object.defineProperty, f = Object.getOwnPropertyDescriptor, a = (e, i, t, s) => {
7
+ for (var o = s > 1 ? void 0 : s ? f(i, t) : i, h = e.length - 1, d; h >= 0; h--)
7
8
  (d = e[h]) && (o = (s ? d(i, t, o) : d(o)) || o);
8
- return s && o && k(i, t, o), o;
9
+ return s && o && I(i, t, o), o;
9
10
  };
10
11
  const u = b();
11
12
  let r = class extends v {
@@ -230,7 +231,7 @@ let r = class extends v {
230
231
  `;
231
232
  }
232
233
  };
233
- r.styles = w;
234
+ r.styles = [k, w];
234
235
  r._TEST_TONE_DATA_URI = "data:audio/wav;base64,UklGRrQEAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YZAEAACAh46Sl5qcm5mWko2HgXp1cGxqaWlsb3R5gIaNk5icnp2bl5OOiIJ8dnFtamhoam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamlo";
235
236
  a([
236
237
  p({ type: Object })