@signalwire/web-components 1.0.0-dev-20260428141127 → 1.0.0-dev-20260428183200

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 (187) hide show
  1. package/README.md +45 -52
  2. package/dist/_virtual/_commonjsHelpers.js +9 -0
  3. package/dist/_virtual/_commonjsHelpers.js.map +1 -0
  4. package/dist/_virtual/prism-python.js +28 -0
  5. package/dist/_virtual/prism-python.js.map +1 -0
  6. package/dist/_virtual/prism-python2.js +5 -0
  7. package/dist/_virtual/prism-python2.js.map +1 -0
  8. package/dist/_virtual/prism-typescript.js +28 -0
  9. package/dist/_virtual/prism-typescript.js.map +1 -0
  10. package/dist/_virtual/prism-typescript2.js +5 -0
  11. package/dist/_virtual/prism-typescript2.js.map +1 -0
  12. package/dist/_virtual/prism.js +28 -0
  13. package/dist/_virtual/prism.js.map +1 -0
  14. package/dist/_virtual/prism2.js +5 -0
  15. package/dist/_virtual/prism2.js.map +1 -0
  16. package/dist/assets/sw_background.webp.js +5 -0
  17. package/dist/assets/sw_background.webp.js.map +1 -0
  18. package/dist/components/UI/DEFAULT_BACKGROUND.d.ts +4 -0
  19. package/dist/components/UI/DEFAULT_BACKGROUND.d.ts.map +1 -0
  20. package/dist/components/UI/DEFAULT_BACKGROUND.js +5 -0
  21. package/dist/components/UI/DEFAULT_BACKGROUND.js.map +1 -0
  22. package/dist/components/UI/controls/sw-ui-control-bar.d.ts +114 -0
  23. package/dist/components/UI/controls/sw-ui-control-bar.d.ts.map +1 -0
  24. package/dist/components/UI/controls/sw-ui-control-bar.js +324 -0
  25. package/dist/components/UI/controls/sw-ui-control-bar.js.map +1 -0
  26. package/dist/components/UI/controls/sw-ui-dialpad.d.ts +57 -0
  27. package/dist/components/UI/controls/sw-ui-dialpad.d.ts.map +1 -0
  28. package/dist/components/UI/controls/sw-ui-dialpad.js +319 -0
  29. package/dist/components/UI/controls/sw-ui-dialpad.js.map +1 -0
  30. package/dist/components/UI/controls/sw-ui-dropup.d.ts +42 -0
  31. package/dist/components/UI/controls/sw-ui-dropup.d.ts.map +1 -0
  32. package/dist/components/UI/controls/sw-ui-dropup.js +137 -0
  33. package/dist/components/UI/controls/sw-ui-dropup.js.map +1 -0
  34. package/dist/components/UI/controls/sw-ui-split-button.d.ts +44 -0
  35. package/dist/components/UI/controls/sw-ui-split-button.d.ts.map +1 -0
  36. package/dist/components/UI/controls/sw-ui-split-button.js +177 -0
  37. package/dist/components/UI/controls/sw-ui-split-button.js.map +1 -0
  38. package/dist/components/UI/icons/backspace.svg.js +10 -0
  39. package/dist/components/UI/icons/backspace.svg.js.map +1 -0
  40. package/dist/components/UI/icons/camera-off.svg.js +8 -0
  41. package/dist/components/UI/icons/camera-off.svg.js.map +1 -0
  42. package/dist/components/UI/icons/camera-on.svg.js +8 -0
  43. package/dist/components/UI/icons/camera-on.svg.js.map +1 -0
  44. package/dist/components/UI/icons/check-circle.svg.js +6 -0
  45. package/dist/components/UI/icons/check-circle.svg.js.map +1 -0
  46. package/dist/components/UI/icons/chevron-up.svg.js +8 -0
  47. package/dist/components/UI/icons/chevron-up.svg.js.map +1 -0
  48. package/dist/components/UI/icons/close.svg.js +6 -0
  49. package/dist/components/UI/icons/close.svg.js.map +1 -0
  50. package/dist/components/UI/icons/copy.svg.js +6 -0
  51. package/dist/components/UI/icons/copy.svg.js.map +1 -0
  52. package/dist/components/UI/icons/download.svg.js +6 -0
  53. package/dist/components/UI/icons/download.svg.js.map +1 -0
  54. package/dist/components/UI/icons/fullscreen-exit.svg.js +8 -0
  55. package/dist/components/UI/icons/fullscreen-exit.svg.js.map +1 -0
  56. package/dist/components/UI/icons/fullscreen.svg.js +8 -0
  57. package/dist/components/UI/icons/fullscreen.svg.js.map +1 -0
  58. package/dist/components/UI/icons/hand-raise.svg.js +6 -0
  59. package/dist/components/UI/icons/hand-raise.svg.js.map +1 -0
  60. package/dist/components/UI/icons/icons.d.ts +31 -0
  61. package/dist/components/UI/icons/icons.d.ts.map +1 -0
  62. package/dist/components/UI/icons/icons.js +60 -0
  63. package/dist/components/UI/icons/icons.js.map +1 -0
  64. package/dist/components/UI/icons/index.d.ts +4 -0
  65. package/dist/components/UI/icons/index.d.ts.map +1 -0
  66. package/dist/components/UI/icons/info-circle.svg.js +6 -0
  67. package/dist/components/UI/icons/info-circle.svg.js.map +1 -0
  68. package/dist/components/UI/icons/mic-off.svg.js +8 -0
  69. package/dist/components/UI/icons/mic-off.svg.js.map +1 -0
  70. package/dist/components/UI/icons/mic-on.svg.js +8 -0
  71. package/dist/components/UI/icons/mic-on.svg.js.map +1 -0
  72. package/dist/components/UI/icons/person.svg.js +8 -0
  73. package/dist/components/UI/icons/person.svg.js.map +1 -0
  74. package/dist/components/UI/icons/phone-call.svg.js +8 -0
  75. package/dist/components/UI/icons/phone-call.svg.js.map +1 -0
  76. package/dist/components/UI/icons/phone-end.svg.js +8 -0
  77. package/dist/components/UI/icons/phone-end.svg.js.map +1 -0
  78. package/dist/components/UI/icons/room.svg.js +8 -0
  79. package/dist/components/UI/icons/room.svg.js.map +1 -0
  80. package/dist/components/UI/icons/screen-share-off.svg.js +9 -0
  81. package/dist/components/UI/icons/screen-share-off.svg.js.map +1 -0
  82. package/dist/components/UI/icons/screen-share.svg.js +9 -0
  83. package/dist/components/UI/icons/screen-share.svg.js.map +1 -0
  84. package/dist/components/UI/icons/sendIcon.svg.js +9 -0
  85. package/dist/components/UI/icons/sendIcon.svg.js.map +1 -0
  86. package/dist/components/UI/icons/settings.svg.js +8 -0
  87. package/dist/components/UI/icons/settings.svg.js.map +1 -0
  88. package/dist/components/UI/icons/speaker-off.svg.js +8 -0
  89. package/dist/components/UI/icons/speaker-off.svg.js.map +1 -0
  90. package/dist/components/UI/icons/speaker-on.svg.js +8 -0
  91. package/dist/components/UI/icons/speaker-on.svg.js.map +1 -0
  92. package/dist/components/UI/icons/spinner.svg.js +9 -0
  93. package/dist/components/UI/icons/spinner.svg.js.map +1 -0
  94. package/dist/components/UI/icons/sw-logo.svg.js +11 -0
  95. package/dist/components/UI/icons/sw-logo.svg.js.map +1 -0
  96. package/dist/components/UI/icons/sw-ui-icon.d.ts +28 -0
  97. package/dist/components/UI/icons/sw-ui-icon.d.ts.map +1 -0
  98. package/dist/components/UI/icons/sw-ui-icon.js +47 -0
  99. package/dist/components/UI/icons/sw-ui-icon.js.map +1 -0
  100. package/dist/components/UI/icons/transcript.svg.js +10 -0
  101. package/dist/components/UI/icons/transcript.svg.js.map +1 -0
  102. package/dist/components/UI/index.d.ts +18 -0
  103. package/dist/components/UI/index.d.ts.map +1 -0
  104. package/dist/components/UI/layout/sw-ui-background.d.ts +33 -0
  105. package/dist/components/UI/layout/sw-ui-background.d.ts.map +1 -0
  106. package/dist/components/UI/layout/sw-ui-background.js +106 -0
  107. package/dist/components/UI/layout/sw-ui-background.js.map +1 -0
  108. package/dist/components/UI/layout/sw-ui-call-layout.d.ts +69 -0
  109. package/dist/components/UI/layout/sw-ui-call-layout.d.ts.map +1 -0
  110. package/dist/components/UI/layout/sw-ui-call-layout.js +278 -0
  111. package/dist/components/UI/layout/sw-ui-call-layout.js.map +1 -0
  112. package/dist/components/UI/layout/sw-ui-content-drawer.d.ts +50 -0
  113. package/dist/components/UI/layout/sw-ui-content-drawer.d.ts.map +1 -0
  114. package/dist/components/UI/layout/sw-ui-content-drawer.js +413 -0
  115. package/dist/components/UI/layout/sw-ui-content-drawer.js.map +1 -0
  116. package/dist/components/UI/layout/sw-ui-modal.d.ts +31 -0
  117. package/dist/components/UI/layout/sw-ui-modal.d.ts.map +1 -0
  118. package/dist/components/UI/layout/sw-ui-modal.js +150 -0
  119. package/dist/components/UI/layout/sw-ui-modal.js.map +1 -0
  120. package/dist/components/UI/layout/sw-ui-responsive-container.d.ts +15 -0
  121. package/dist/components/UI/layout/sw-ui-responsive-container.d.ts.map +1 -0
  122. package/dist/components/UI/layout/sw-ui-responsive-container.js +78 -0
  123. package/dist/components/UI/layout/sw-ui-responsive-container.js.map +1 -0
  124. package/dist/components/UI/sw-ui-alert.d.ts +37 -0
  125. package/dist/components/UI/sw-ui-alert.d.ts.map +1 -0
  126. package/dist/components/UI/sw-ui-alert.js +126 -0
  127. package/dist/components/UI/sw-ui-alert.js.map +1 -0
  128. package/dist/components/UI/sw-ui-transcript-view.d.ts +56 -0
  129. package/dist/components/UI/sw-ui-transcript-view.d.ts.map +1 -0
  130. package/dist/components/UI/sw-ui-transcript-view.js +341 -0
  131. package/dist/components/UI/sw-ui-transcript-view.js.map +1 -0
  132. package/dist/components/directory.d.ts +10 -18
  133. package/dist/components/directory.d.ts.map +1 -1
  134. package/dist/components/directory.js +129 -198
  135. package/dist/components/directory.js.map +1 -1
  136. package/dist/embed/signalwire-web-components-embed.iife.js +2336 -982
  137. package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -1
  138. package/dist/embed/signalwire-web-components-embed.umd.cjs +2336 -982
  139. package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -1
  140. package/dist/embed.d.ts +1 -1
  141. package/dist/embed.d.ts.map +1 -1
  142. package/dist/index.d.ts +2 -3
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +54 -33
  145. package/dist/index.js.map +1 -1
  146. package/dist/node_modules/dompurify/dist/purify.es.js +597 -0
  147. package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
  148. package/dist/node_modules/marked/lib/marked.esm.js +1475 -0
  149. package/dist/node_modules/marked/lib/marked.esm.js.map +1 -0
  150. package/dist/node_modules/prismjs/components/prism-bash.js +220 -0
  151. package/dist/node_modules/prismjs/components/prism-bash.js.map +1 -0
  152. package/dist/node_modules/prismjs/components/prism-css.js +56 -0
  153. package/dist/node_modules/prismjs/components/prism-css.js.map +1 -0
  154. package/dist/node_modules/prismjs/components/prism-javascript.js +138 -0
  155. package/dist/node_modules/prismjs/components/prism-javascript.js.map +1 -0
  156. package/dist/node_modules/prismjs/components/prism-json.js +26 -0
  157. package/dist/node_modules/prismjs/components/prism-json.js.map +1 -0
  158. package/dist/node_modules/prismjs/components/prism-markdown.js +301 -0
  159. package/dist/node_modules/prismjs/components/prism-markdown.js.map +1 -0
  160. package/dist/node_modules/prismjs/components/prism-python.js +69 -0
  161. package/dist/node_modules/prismjs/components/prism-python.js.map +1 -0
  162. package/dist/node_modules/prismjs/components/prism-sql.js +34 -0
  163. package/dist/node_modules/prismjs/components/prism-sql.js.map +1 -0
  164. package/dist/node_modules/prismjs/components/prism-typescript.js +53 -0
  165. package/dist/node_modules/prismjs/components/prism-typescript.js.map +1 -0
  166. package/dist/node_modules/prismjs/components/prism-yaml.js +67 -0
  167. package/dist/node_modules/prismjs/components/prism-yaml.js.map +1 -0
  168. package/dist/node_modules/prismjs/prism.js +1165 -0
  169. package/dist/node_modules/prismjs/prism.js.map +1 -0
  170. package/dist/react.d.ts +3 -3
  171. package/dist/utils/prism.d.ts +4 -0
  172. package/dist/utils/prism.d.ts.map +1 -0
  173. package/dist/utils/prism.js +34 -0
  174. package/dist/utils/prism.js.map +1 -0
  175. package/dist/utils/transcriptToMarkdown.d.ts +14 -0
  176. package/dist/utils/transcriptToMarkdown.d.ts.map +1 -0
  177. package/dist/utils/transcriptToMarkdown.js +59 -0
  178. package/dist/utils/transcriptToMarkdown.js.map +1 -0
  179. package/package.json +53 -9
  180. package/dist/components/dialpad.d.ts +0 -74
  181. package/dist/components/dialpad.d.ts.map +0 -1
  182. package/dist/components/dialpad.js +0 -372
  183. package/dist/components/dialpad.js.map +0 -1
  184. package/dist/components/example-button.d.ts +0 -21
  185. package/dist/components/example-button.d.ts.map +0 -1
  186. package/dist/components/example-button.js +0 -74
  187. package/dist/components/example-button.js.map +0 -1
@@ -0,0 +1,278 @@
1
+ import { LitElement as p, nothing as h, html as d, css as m } from "lit";
2
+ import { property as c, state as u, customElement as v } from "lit/decorators.js";
3
+ var f = Object.defineProperty, g = Object.getOwnPropertyDescriptor, i = (r, a, s, o) => {
4
+ for (var t = o > 1 ? void 0 : o ? g(a, s) : a, n = r.length - 1, l; n >= 0; n--)
5
+ (l = r[n]) && (t = (o ? l(a, s, t) : l(t)) || t);
6
+ return o && t && f(a, s, t), t;
7
+ };
8
+ let e = class extends p {
9
+ constructor() {
10
+ super(...arguments), this.transcript = !1, this.loading = !1, this.shadow = !1, this._fullscreen = !1, this._onFullscreenChange = () => {
11
+ const r = document.fullscreenElement === this;
12
+ this._fullscreen !== r && (this._fullscreen = r, r ? this.setAttribute("fullscreen", "") : this.removeAttribute("fullscreen"));
13
+ };
14
+ }
15
+ /** Reflects as an attribute so CSS can target `:host([fullscreen])`. */
16
+ get fullscreen() {
17
+ return this._fullscreen;
18
+ }
19
+ toggleTranscript() {
20
+ this.transcript = !this.transcript;
21
+ }
22
+ toggleFullscreen() {
23
+ document.fullscreenElement ? document.exitFullscreen().catch(() => {
24
+ }) : this.requestFullscreen().catch(() => {
25
+ });
26
+ }
27
+ connectedCallback() {
28
+ super.connectedCallback(), document.addEventListener("fullscreenchange", this._onFullscreenChange);
29
+ }
30
+ disconnectedCallback() {
31
+ super.disconnectedCallback(), document.removeEventListener("fullscreenchange", this._onFullscreenChange);
32
+ }
33
+ render() {
34
+ return d`
35
+ <div class="root">
36
+ <div class="video">
37
+ <slot name="background"></slot>
38
+ <div class="video-content">
39
+ <slot name="video"></slot>
40
+ </div>
41
+ <div class="floating-video">
42
+ <slot name="floating-video"></slot>
43
+ </div>
44
+ ${this.loading ? d`<div class="loading-overlay">
45
+ <sw-ui-icon
46
+ class="spinner"
47
+ name="spinner"
48
+ .size=${48}
49
+ ></sw-ui-icon>
50
+ </div>` : h}
51
+ </div>
52
+ <div class="controls">
53
+ <slot name="controls"></slot>
54
+ </div>
55
+ <div class="transcript-pane">
56
+ <div class="transcript-inner">
57
+ <slot name="transcript"></slot>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ `;
62
+ }
63
+ };
64
+ e.styles = m`
65
+ /* ================================================================== *
66
+ * HOST *
67
+ * ================================================================== */
68
+ :host {
69
+ display: block;
70
+ width: 100%;
71
+ height: 100%;
72
+ border-radius: var(--sw-call-layout-radius, var(--radius-md));
73
+ overflow: hidden;
74
+ font-family: var(--type-family-body);
75
+ container-type: size;
76
+ }
77
+
78
+ :host([shadow]) {
79
+ box-shadow: var(--sw-call-layout-shadow, var(--shadow-md));
80
+ }
81
+
82
+ /* ================================================================== *
83
+ * FULLSCREEN *
84
+ * ================================================================== */
85
+ :host([fullscreen]) {
86
+ border-radius: 0;
87
+ box-shadow: none;
88
+ width: 100vw;
89
+ height: 100vh;
90
+ background: black;
91
+ }
92
+
93
+ /* ================================================================== *
94
+ * GRID — wide (landscape) default *
95
+ * ================================================================== */
96
+ .root {
97
+ display: grid;
98
+ height: 100%;
99
+ grid-template-rows: 1fr auto;
100
+ grid-template-columns: 1fr 0fr;
101
+ grid-template-areas:
102
+ 'video transcript'
103
+ 'controls controls';
104
+ }
105
+
106
+ :host([transcript]) .root {
107
+ grid-template-columns: 1fr minmax(180px, 0.25fr);
108
+ }
109
+
110
+ /* ================================================================== *
111
+ * VIDEO AREA *
112
+ * ================================================================== */
113
+ .video {
114
+ grid-area: video;
115
+ display: grid;
116
+ grid-template: 1fr / 1fr;
117
+ position: relative;
118
+ overflow: hidden;
119
+ min-height: 0;
120
+ min-width: 0;
121
+ }
122
+
123
+ /* ── Background layer ───────────────────────────────────────────── */
124
+ slot[name='background'] {
125
+ display: contents;
126
+ }
127
+
128
+ ::slotted([slot='background']) {
129
+ grid-area: 1 / 1;
130
+ z-index: 0;
131
+ overflow: hidden;
132
+ }
133
+
134
+ /* ── Video content layer ────────────────────────────────────────── */
135
+ .video-content {
136
+ grid-area: 1 / 1;
137
+ z-index: 1;
138
+ min-height: 0;
139
+ min-width: 0;
140
+ }
141
+
142
+ /* ── Floating PiP ───────────────────────────────────────────────── */
143
+ .floating-video {
144
+ position: absolute;
145
+ bottom: var(--sw-call-layout-pip-bottom, 12px);
146
+ right: var(--sw-call-layout-pip-right, 12px);
147
+ width: var(--sw-call-layout-pip-width, clamp(80px, 20%, 200px));
148
+ max-width: calc(100% - var(--sw-call-layout-pip-right, 12px) * 2);
149
+ max-height: calc(100% - var(--sw-call-layout-pip-bottom, 12px) * 2);
150
+ border-radius: var(--sw-call-layout-pip-radius, var(--radius-md));
151
+ box-shadow: var(--sw-call-layout-pip-shadow, var(--shadow-md));
152
+ overflow: hidden;
153
+ z-index: 3;
154
+ }
155
+
156
+ /* ── Loading overlay ────────────────────────────────────────────── */
157
+ .loading-overlay {
158
+ grid-area: 1 / 1;
159
+ z-index: 4;
160
+ display: flex;
161
+ align-items: center;
162
+ justify-content: center;
163
+ background: var(--sw-call-layout-loading-bg, rgba(0, 0, 0, 0.6));
164
+ }
165
+
166
+ .spinner {
167
+ animation: spin 1s linear infinite;
168
+ color: rgba(255, 255, 255, 0.85);
169
+ }
170
+
171
+ @keyframes spin {
172
+ to {
173
+ transform: rotate(360deg);
174
+ }
175
+ }
176
+
177
+ /* ================================================================== *
178
+ * CONTROLS *
179
+ * ================================================================== */
180
+ .controls {
181
+ grid-area: controls;
182
+ position: relative;
183
+ z-index: 10;
184
+ overflow: visible;
185
+ min-width: 0;
186
+ }
187
+
188
+ /* ================================================================== *
189
+ * TRANSCRIPT PANE *
190
+ * ================================================================== */
191
+ .transcript-pane {
192
+ grid-area: transcript;
193
+ overflow: hidden;
194
+ min-width: 0;
195
+ min-height: 0;
196
+
197
+ /* Animate width via grid + clip the overflow during collapse */
198
+ transition: opacity 350ms ease-in-out;
199
+ opacity: 0;
200
+ }
201
+
202
+ :host([transcript]) .transcript-pane {
203
+ opacity: 1;
204
+ }
205
+
206
+ .transcript-inner {
207
+ height: 100%;
208
+ width: 100%;
209
+ overflow: hidden;
210
+ display: flex;
211
+ flex-direction: column;
212
+ }
213
+
214
+ /* ================================================================== *
215
+ * NARROW / PORTRAIT — aspect-ratio <= ~4:3 *
216
+ * ================================================================== */
217
+ @container (max-aspect-ratio: 4/3) {
218
+ .root {
219
+ grid-template-rows: 1fr auto 0fr;
220
+ grid-template-columns: 1fr;
221
+ grid-template-areas:
222
+ 'video'
223
+ 'controls'
224
+ 'transcript';
225
+ }
226
+
227
+ /* Cap the video so it doesn't hog all space — leave room for
228
+ transcript. minmax(0, 3fr) keeps the video dominant but allows
229
+ the transcript row to claim meaningful space. */
230
+ :host([transcript]) .root {
231
+ grid-template-columns: 1fr;
232
+ grid-template-rows: minmax(0, 3fr) auto minmax(120px, 2fr);
233
+ }
234
+ }
235
+
236
+ /* ================================================================== *
237
+ * VERY WIDE — show transcript narrower *
238
+ * ================================================================== */
239
+ @container (min-aspect-ratio: 21/9) {
240
+ :host([transcript]) .root {
241
+ grid-template-columns: 1fr minmax(160px, 0.15fr);
242
+ }
243
+ }
244
+
245
+ /* ================================================================== *
246
+ * TINY CONTAINER GUARDS *
247
+ * ================================================================== */
248
+ @container (max-width: 240px) {
249
+ .floating-video {
250
+ display: none;
251
+ }
252
+ }
253
+
254
+ @container (max-width: 200px), (max-height: 200px) {
255
+ .transcript-pane {
256
+ display: none;
257
+ }
258
+ }
259
+ `;
260
+ i([
261
+ c({ type: Boolean, reflect: !0 })
262
+ ], e.prototype, "transcript", 2);
263
+ i([
264
+ c({ type: Boolean, reflect: !0 })
265
+ ], e.prototype, "loading", 2);
266
+ i([
267
+ c({ type: Boolean, reflect: !0 })
268
+ ], e.prototype, "shadow", 2);
269
+ i([
270
+ u()
271
+ ], e.prototype, "_fullscreen", 2);
272
+ e = i([
273
+ v("sw-ui-call-layout")
274
+ ], e);
275
+ export {
276
+ e as SwUiCallLayout
277
+ };
278
+ //# sourceMappingURL=sw-ui-call-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-ui-call-layout.js","sources":["../../../../src/components/UI/layout/sw-ui-call-layout.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport '../icons/sw-ui-icon.js';\n\n/**\n * Fluid call layout that adapts to any container shape.\n *\n * Uses the container's **aspect ratio** (not just width) to decide whether\n * the transcript pane sits beside the video (landscape) or below it\n * (portrait / narrow). The video area is always maximised.\n *\n * ```\n * Wide (landscape): Narrow (portrait):\n * ┌────────────────┬─────────┐ ┌─────────────────┐\n * │ VIDEO │ TRANSCR │ │ VIDEO │\n * │ (maximised) │ (side) │ │ (maximised) │\n * ├────────────────┴─────────┤ ├──────────────────┤\n * │ CONTROLS │ │ CONTROLS │\n * └──────────────────────────┘ ├──────────────────┤\n * │ TRANSCRIPT │\n * └──────────────────┘\n * ```\n *\n * @slot video - main video content\n * @slot background - element behind the video (e.g. `<sw-ui-background>`)\n * @slot floating-video - picture-in-picture overlay (absolute, bottom-right)\n * @slot controls - control bar beneath the video\n * @slot transcript - transcript panel (side or bottom)\n *\n * @prop {boolean} transcript - show / hide the transcript pane\n * @prop {boolean} loading - show a spinner overlay on the video area\n * @prop {boolean} shadow - apply a drop shadow to the host\n * @prop {boolean} fullscreen - (read-only) reflects the current fullscreen state\n *\n * @method toggleTranscript() - flip the transcript pane open / closed\n * @method toggleFullscreen() - enter or exit fullscreen\n * @method requestFullscreen() - inherited, enters fullscreen\n * @method exitFullscreen() - static, exits fullscreen\n *\n * @cssprop --sw-call-layout-radius [0] - border-radius on external corners\n * @cssprop --sw-call-layout-shadow - box-shadow when `shadow` is set\n * @cssprop --sw-call-layout-loading-bg [rgba(0,0,0,0.6)] - loading overlay background\n * @cssprop --loading-spinner-size [48] - spinner icon size (px, number)\n * @cssprop --sw-call-layout-transcript-transition [350ms ease-in-out] - open/close transition\n * @cssprop --sw-call-layout-pip-width [clamp(100px, 20%, 200px)] - PiP container width\n * @cssprop --sw-call-layout-pip-radius [8px] - PiP border-radius\n * @cssprop --sw-call-layout-pip-shadow [0 2px 8px rgba(0,0,0,0.5)] - PiP box-shadow\n * @cssprop --sw-call-layout-pip-bottom [12px] - PiP offset from bottom\n * @cssprop --sw-call-layout-pip-right [12px] - PiP offset from right\n */\n@customElement('sw-ui-call-layout')\nexport class SwUiCallLayout extends LitElement {\n @property({ type: Boolean, reflect: true }) transcript = false;\n @property({ type: Boolean, reflect: true }) loading = false;\n @property({ type: Boolean, reflect: true }) shadow = false;\n @state() private _fullscreen = false;\n\n /** Reflects as an attribute so CSS can target `:host([fullscreen])`. */\n get fullscreen(): boolean {\n return this._fullscreen;\n }\n\n toggleTranscript(): void {\n this.transcript = !this.transcript;\n }\n\n toggleFullscreen(): void {\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n } else {\n this.requestFullscreen().catch(() => {});\n }\n }\n\n private _onFullscreenChange = (): void => {\n const isFs = document.fullscreenElement === this;\n if (this._fullscreen !== isFs) {\n this._fullscreen = isFs;\n if (isFs) {\n this.setAttribute('fullscreen', '');\n } else {\n this.removeAttribute('fullscreen');\n }\n }\n };\n\n connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('fullscreenchange', this._onFullscreenChange);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('fullscreenchange', this._onFullscreenChange);\n }\n\n static styles = css`\n /* ================================================================== *\n * HOST *\n * ================================================================== */\n :host {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: var(--sw-call-layout-radius, var(--radius-md));\n overflow: hidden;\n font-family: var(--type-family-body);\n container-type: size;\n }\n\n :host([shadow]) {\n box-shadow: var(--sw-call-layout-shadow, var(--shadow-md));\n }\n\n /* ================================================================== *\n * FULLSCREEN *\n * ================================================================== */\n :host([fullscreen]) {\n border-radius: 0;\n box-shadow: none;\n width: 100vw;\n height: 100vh;\n background: black;\n }\n\n /* ================================================================== *\n * GRID — wide (landscape) default *\n * ================================================================== */\n .root {\n display: grid;\n height: 100%;\n grid-template-rows: 1fr auto;\n grid-template-columns: 1fr 0fr;\n grid-template-areas:\n 'video transcript'\n 'controls controls';\n }\n\n :host([transcript]) .root {\n grid-template-columns: 1fr minmax(180px, 0.25fr);\n }\n\n /* ================================================================== *\n * VIDEO AREA *\n * ================================================================== */\n .video {\n grid-area: video;\n display: grid;\n grid-template: 1fr / 1fr;\n position: relative;\n overflow: hidden;\n min-height: 0;\n min-width: 0;\n }\n\n /* ── Background layer ───────────────────────────────────────────── */\n slot[name='background'] {\n display: contents;\n }\n\n ::slotted([slot='background']) {\n grid-area: 1 / 1;\n z-index: 0;\n overflow: hidden;\n }\n\n /* ── Video content layer ────────────────────────────────────────── */\n .video-content {\n grid-area: 1 / 1;\n z-index: 1;\n min-height: 0;\n min-width: 0;\n }\n\n /* ── Floating PiP ───────────────────────────────────────────────── */\n .floating-video {\n position: absolute;\n bottom: var(--sw-call-layout-pip-bottom, 12px);\n right: var(--sw-call-layout-pip-right, 12px);\n width: var(--sw-call-layout-pip-width, clamp(80px, 20%, 200px));\n max-width: calc(100% - var(--sw-call-layout-pip-right, 12px) * 2);\n max-height: calc(100% - var(--sw-call-layout-pip-bottom, 12px) * 2);\n border-radius: var(--sw-call-layout-pip-radius, var(--radius-md));\n box-shadow: var(--sw-call-layout-pip-shadow, var(--shadow-md));\n overflow: hidden;\n z-index: 3;\n }\n\n /* ── Loading overlay ────────────────────────────────────────────── */\n .loading-overlay {\n grid-area: 1 / 1;\n z-index: 4;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--sw-call-layout-loading-bg, rgba(0, 0, 0, 0.6));\n }\n\n .spinner {\n animation: spin 1s linear infinite;\n color: rgba(255, 255, 255, 0.85);\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n /* ================================================================== *\n * CONTROLS *\n * ================================================================== */\n .controls {\n grid-area: controls;\n position: relative;\n z-index: 10;\n overflow: visible;\n min-width: 0;\n }\n\n /* ================================================================== *\n * TRANSCRIPT PANE *\n * ================================================================== */\n .transcript-pane {\n grid-area: transcript;\n overflow: hidden;\n min-width: 0;\n min-height: 0;\n\n /* Animate width via grid + clip the overflow during collapse */\n transition: opacity 350ms ease-in-out;\n opacity: 0;\n }\n\n :host([transcript]) .transcript-pane {\n opacity: 1;\n }\n\n .transcript-inner {\n height: 100%;\n width: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n /* ================================================================== *\n * NARROW / PORTRAIT — aspect-ratio <= ~4:3 *\n * ================================================================== */\n @container (max-aspect-ratio: 4/3) {\n .root {\n grid-template-rows: 1fr auto 0fr;\n grid-template-columns: 1fr;\n grid-template-areas:\n 'video'\n 'controls'\n 'transcript';\n }\n\n /* Cap the video so it doesn't hog all space — leave room for\n transcript. minmax(0, 3fr) keeps the video dominant but allows\n the transcript row to claim meaningful space. */\n :host([transcript]) .root {\n grid-template-columns: 1fr;\n grid-template-rows: minmax(0, 3fr) auto minmax(120px, 2fr);\n }\n }\n\n /* ================================================================== *\n * VERY WIDE — show transcript narrower *\n * ================================================================== */\n @container (min-aspect-ratio: 21/9) {\n :host([transcript]) .root {\n grid-template-columns: 1fr minmax(160px, 0.15fr);\n }\n }\n\n /* ================================================================== *\n * TINY CONTAINER GUARDS *\n * ================================================================== */\n @container (max-width: 240px) {\n .floating-video {\n display: none;\n }\n }\n\n @container (max-width: 200px), (max-height: 200px) {\n .transcript-pane {\n display: none;\n }\n }\n `;\n\n render() {\n return html`\n <div class=\"root\">\n <div class=\"video\">\n <slot name=\"background\"></slot>\n <div class=\"video-content\">\n <slot name=\"video\"></slot>\n </div>\n <div class=\"floating-video\">\n <slot name=\"floating-video\"></slot>\n </div>\n ${this.loading\n ? html`<div class=\"loading-overlay\">\n <sw-ui-icon\n class=\"spinner\"\n name=\"spinner\"\n .size=${48}\n ></sw-ui-icon>\n </div>`\n : nothing}\n </div>\n <div class=\"controls\">\n <slot name=\"controls\"></slot>\n </div>\n <div class=\"transcript-pane\">\n <div class=\"transcript-inner\">\n <slot name=\"transcript\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-ui-call-layout': SwUiCallLayout;\n }\n}\n"],"names":["SwUiCallLayout","LitElement","isFs","html","nothing","css","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { LitElement } from 'lit';
2
+ import '../icons/sw-ui-icon.js';
3
+ /** Formats supported by the content drawer. */
4
+ export type ContentFormat = 'text' | 'markdown' | 'code' | 'html';
5
+ /** Payload that drives the content drawer. */
6
+ export interface DisplayContentPayload {
7
+ title?: string;
8
+ content: string;
9
+ format: ContentFormat;
10
+ /** Prism language name (required when format === 'code'). */
11
+ language?: string;
12
+ }
13
+ /**
14
+ * Content drawer overlay for the call widget.
15
+ *
16
+ * Slides in from the right on wide containers; on narrow containers (parent
17
+ * width ≤ 480 px) it slides up from the bottom instead.
18
+ *
19
+ * Formats: `text` · `markdown` (marked + DOMPurify) · `code` (Prism) · `html` (DOMPurify)
20
+ *
21
+ * @fires sw-content-drawer-close - User clicked the close button. No detail.
22
+ */
23
+ export declare class SwUiContentDrawer extends LitElement {
24
+ static styles: import("lit").CSSResult;
25
+ open: boolean;
26
+ narrow: boolean;
27
+ title: string;
28
+ content: string;
29
+ format: ContentFormat;
30
+ language: string;
31
+ private _renderedHtml;
32
+ private _renderFormat;
33
+ private _copied;
34
+ private _renderId;
35
+ private _ro?;
36
+ connectedCallback(): void;
37
+ disconnectedCallback(): void;
38
+ protected updated(changed: Map<string, unknown>): void;
39
+ private _renderContent;
40
+ private _close;
41
+ private _copy;
42
+ private _renderBody;
43
+ render(): import("lit-html").TemplateResult<1>;
44
+ }
45
+ declare global {
46
+ interface HTMLElementTagNameMap {
47
+ 'sw-ui-content-drawer': SwUiContentDrawer;
48
+ }
49
+ }
50
+ //# sourceMappingURL=sw-ui-content-drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-ui-content-drawer.d.ts","sourceRoot":"","sources":["../../../../src/components/UI/layout/sw-ui-content-drawer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAGrD,OAAO,wBAAwB,CAAC;AAMhC,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAElE,8CAA8C;AAC9C,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqCD;;;;;;;;;GASG;AACH,qBACa,iBAAkB,SAAQ,UAAU;IAC/C,MAAM,CAAC,MAAM,0BA4OX;IAE0C,IAAI,UAAS;IACb,MAAM,UAAS;IAC/B,KAAK,SAAM;IACX,OAAO,SAAM;IACb,MAAM,EAAE,aAAa,CAAU;IAC/B,QAAQ,SAAM;IAEjC,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,OAAO,CAAS;IAGjC,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,GAAG,CAAC,CAAiB;IAE7B,iBAAiB,IAAI,IAAI;IAYzB,oBAAoB,IAAI,IAAI;IAM5B,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;YAOxC,cAAc;IAuC5B,OAAO,CAAC,MAAM;YAIA,KAAK;IAUnB,OAAO,CAAC,WAAW;IAenB,MAAM;CA6BP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,sBAAsB,EAAE,iBAAiB,CAAC;KAC3C;CACF"}