@oshara/voice-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +198 -0
  2. package/dist/appearance-CNWT8x1G.cjs +2 -0
  3. package/dist/appearance-CNWT8x1G.cjs.map +1 -0
  4. package/dist/appearance-i6QBkpCk.js +650 -0
  5. package/dist/appearance-i6QBkpCk.js.map +1 -0
  6. package/dist/consent-CK9VXNPa.js +54 -0
  7. package/dist/consent-CK9VXNPa.js.map +1 -0
  8. package/dist/consent-D7QNSkQD.cjs +2 -0
  9. package/dist/consent-D7QNSkQD.cjs.map +1 -0
  10. package/dist/core/analytics.d.ts +30 -0
  11. package/dist/core/appearance.d.ts +113 -0
  12. package/dist/core/audioSettings.d.ts +69 -0
  13. package/dist/core/consent.d.ts +17 -0
  14. package/dist/core/createVoiceAgent.d.ts +79 -0
  15. package/dist/core/events.d.ts +103 -0
  16. package/dist/core/formController.d.ts +28 -0
  17. package/dist/core/forms.d.ts +235 -0
  18. package/dist/core/index.d.ts +29 -0
  19. package/dist/core/prevContext.d.ts +26 -0
  20. package/dist/core/transport.d.ts +30 -0
  21. package/dist/core/types.d.ts +49 -0
  22. package/dist/core/voice.d.ts +79 -0
  23. package/dist/createVoiceAgent-BM3HODS6.js +1058 -0
  24. package/dist/createVoiceAgent-BM3HODS6.js.map +1 -0
  25. package/dist/createVoiceAgent-CJWxWzz6.cjs +4 -0
  26. package/dist/createVoiceAgent-CJWxWzz6.cjs.map +1 -0
  27. package/dist/index.cjs +2 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.js +44 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/react/index.d.ts +60 -0
  32. package/dist/react.cjs +2 -0
  33. package/dist/react.cjs.map +1 -0
  34. package/dist/react.js +115 -0
  35. package/dist/react.js.map +1 -0
  36. package/dist/styles.css +1838 -0
  37. package/dist/ui/index.d.ts +21 -0
  38. package/dist/ui/ui.d.ts +165 -0
  39. package/dist/ui.cjs +284 -0
  40. package/dist/ui.cjs.map +1 -0
  41. package/dist/ui.js +1153 -0
  42. package/dist/ui.js.map +1 -0
  43. package/package.json +67 -0
  44. package/src/core/analytics.ts +111 -0
  45. package/src/core/appearance.ts +464 -0
  46. package/src/core/audioSettings.ts +180 -0
  47. package/src/core/consent.ts +78 -0
  48. package/src/core/createVoiceAgent.ts +280 -0
  49. package/src/core/events.ts +120 -0
  50. package/src/core/formController.ts +317 -0
  51. package/src/core/forms.ts +861 -0
  52. package/src/core/index.ts +121 -0
  53. package/src/core/prevContext.ts +153 -0
  54. package/src/core/transport.ts +118 -0
  55. package/src/core/types.ts +66 -0
  56. package/src/core/voice.ts +1179 -0
  57. package/src/react/index.ts +238 -0
  58. package/src/ui/index.ts +507 -0
  59. package/src/ui/styles.css +1838 -0
  60. package/src/ui/ui.ts +1672 -0
  61. package/src/vite-env.d.ts +10 -0
@@ -0,0 +1,1838 @@
1
+ :host {
2
+ all: initial;
3
+
4
+ /* Defaults are overwritten at runtime by applyAppearance(). */
5
+ --va-primary: #6366f1;
6
+ --va-primary-text: #ffffff;
7
+ --va-accent: #22d3ee;
8
+ --va-accent-text: #0b1020;
9
+ --va-background: #ffffff;
10
+ --va-surface: #f6f7fb;
11
+ --va-text: #0f172a;
12
+ --va-text-muted: #64748b;
13
+ --va-user-bubble: #6366f1;
14
+ --va-user-bubble-text: #ffffff;
15
+ --va-agent-bubble: #f1f5f9;
16
+ --va-agent-bubble-text: #0f172a;
17
+
18
+ --va-fab-size: 64px;
19
+ --va-panel-width: 380px;
20
+ --va-panel-height: 620px;
21
+ --va-border-radius: 24px;
22
+
23
+ --va-edge-offset: 24px;
24
+ --va-panel-offset: calc(var(--va-fab-size) + 20px);
25
+ --va-font: -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, sans-serif;
26
+
27
+ font-family: var(--va-font);
28
+ -webkit-font-smoothing: antialiased;
29
+ -moz-osx-font-smoothing: grayscale;
30
+ }
31
+
32
+ *, *::before, *::after { box-sizing: border-box; }
33
+
34
+ /* ───────── Floating action button ───────── */
35
+
36
+ .fab {
37
+ position: fixed;
38
+ width: var(--va-fab-size);
39
+ height: var(--va-fab-size);
40
+ border-radius: 999px;
41
+ background: var(--va-primary);
42
+ background-image: linear-gradient(135deg, var(--va-primary), var(--va-accent));
43
+ color: var(--va-primary-text);
44
+ border: none;
45
+ cursor: pointer;
46
+ box-shadow:
47
+ 0 12px 30px -8px color-mix(in srgb, var(--va-primary) 55%, transparent),
48
+ 0 4px 12px rgba(0, 0, 0, 0.16);
49
+ display: inline-flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ z-index: 2147483646;
53
+ transition: transform 0.18s ease, box-shadow 0.18s ease, padding 0.2s ease;
54
+ overflow: hidden;
55
+ padding: 0;
56
+ font-family: inherit;
57
+ font-size: 14px;
58
+ font-weight: 600;
59
+ letter-spacing: 0.005em;
60
+ line-height: 1;
61
+ white-space: nowrap;
62
+ }
63
+ .fab::before {
64
+ content: "";
65
+ position: absolute;
66
+ inset: 0;
67
+ border-radius: inherit;
68
+ background: radial-gradient(circle at 30% 22%, rgba(255, 255, 255, 0.32), transparent 55%);
69
+ pointer-events: none;
70
+ }
71
+ .fab:hover {
72
+ transform: translateY(-2px);
73
+ box-shadow:
74
+ 0 18px 40px -10px color-mix(in srgb, var(--va-primary) 70%, transparent),
75
+ 0 6px 16px rgba(0, 0, 0, 0.2);
76
+ }
77
+ .fab:active { transform: translateY(0); }
78
+ .fab .fab-icon {
79
+ position: relative;
80
+ display: inline-flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ width: calc(var(--va-fab-size) * 0.42);
84
+ height: calc(var(--va-fab-size) * 0.42);
85
+ flex-shrink: 0;
86
+ }
87
+ .fab .fab-icon svg {
88
+ width: 100%;
89
+ height: 100%;
90
+ }
91
+ .fab .fab-text {
92
+ position: relative;
93
+ display: inline-flex;
94
+ flex-direction: column;
95
+ align-items: flex-start;
96
+ justify-content: center;
97
+ line-height: 1;
98
+ text-align: left;
99
+ }
100
+ .fab .fab-label {
101
+ display: block;
102
+ font-size: 14px;
103
+ font-weight: 600;
104
+ letter-spacing: 0.005em;
105
+ line-height: 1.1;
106
+ }
107
+ .fab .fab-sublabel {
108
+ display: none;
109
+ margin-top: 3px;
110
+ font-size: 10.5px;
111
+ font-weight: 500;
112
+ letter-spacing: 0.04em;
113
+ line-height: 1.1;
114
+ opacity: 0.82;
115
+ }
116
+ .fab.has-sublabel .fab-sublabel {
117
+ display: block;
118
+ }
119
+ .fab.has-label {
120
+ width: auto;
121
+ height: auto;
122
+ min-height: calc(var(--va-fab-size) * 0.82);
123
+ padding: 8px 22px 8px 16px;
124
+ gap: 12px;
125
+ }
126
+ .fab.has-sublabel {
127
+ min-height: calc(var(--va-fab-size) * 0.95);
128
+ padding: 10px 22px 10px 16px;
129
+ }
130
+ .fab.has-label .fab-icon {
131
+ width: calc(var(--va-fab-size) * 0.58);
132
+ height: calc(var(--va-fab-size) * 0.58);
133
+ border-radius: 50%;
134
+ background: rgba(255, 255, 255, 0.16);
135
+ box-shadow:
136
+ inset 0 0 0 1px rgba(255, 255, 255, 0.22),
137
+ inset 0 1px 0 rgba(255, 255, 255, 0.28),
138
+ 0 4px 10px -4px rgba(0, 0, 0, 0.25);
139
+ -webkit-backdrop-filter: blur(6px);
140
+ backdrop-filter: blur(6px);
141
+ overflow: hidden;
142
+ }
143
+ .fab.has-label .fab-icon svg {
144
+ width: 56%;
145
+ height: 56%;
146
+ }
147
+ .fab.has-label .fab-logo {
148
+ border-radius: 50%;
149
+ }
150
+ .fab .fab-logo,
151
+ .fab img.fab-logo {
152
+ position: relative;
153
+ width: 100%;
154
+ height: 100%;
155
+ object-fit: cover;
156
+ border-radius: 50%;
157
+ }
158
+
159
+ /* ───────── Panel container ───────── */
160
+
161
+ .panel {
162
+ position: fixed;
163
+ /* Never wider than the viewport (minus the edge gaps on both sides), so the
164
+ panel stays fully on-screen on narrow phones instead of clipping right. */
165
+ width: min(var(--va-panel-width), calc(100vw - 2 * var(--va-edge-offset)));
166
+ height: var(--va-panel-height);
167
+ /* The panel is anchored `bottom`/`top: var(--va-panel-offset)` next to the
168
+ FAB, so the room it has to grow into is the viewport minus that offset and
169
+ a matching gap at the far edge — otherwise a tall panel runs off the top.
170
+ dvh tracks the visible area when mobile browser chrome shows/hides. */
171
+ max-height: calc(100vh - var(--va-panel-offset) - var(--va-edge-offset));
172
+ max-height: calc(100dvh - var(--va-panel-offset) - var(--va-edge-offset));
173
+ background: var(--va-background);
174
+ color: var(--va-text);
175
+ border-radius: var(--va-border-radius);
176
+ box-shadow:
177
+ 0 30px 70px -16px rgba(15, 23, 42, 0.32),
178
+ 0 10px 24px -10px rgba(15, 23, 42, 0.18);
179
+ display: flex;
180
+ flex-direction: column;
181
+ overflow: hidden;
182
+ z-index: 2147483647;
183
+ border: 1px solid color-mix(in srgb, var(--va-text) 7%, transparent);
184
+ animation: va-panel-in 0.24s cubic-bezier(0.16, 1, 0.3, 1);
185
+ transition: transform 0.24s ease, opacity 0.24s ease, height 0.3s ease;
186
+ }
187
+
188
+ .panel[data-screen="call"]:not(.with-transcript) {
189
+ height: auto;
190
+ }
191
+
192
+ @keyframes va-panel-in {
193
+ from { opacity: 0; transform: translateY(10px) scale(0.98); }
194
+ to { opacity: 1; transform: translateY(0) scale(1); }
195
+ }
196
+
197
+ /* Position anchors */
198
+ :host([data-position="bottom-right"]) .fab,
199
+ :host(:not([data-position])) .fab {
200
+ right: var(--va-edge-offset);
201
+ bottom: var(--va-edge-offset);
202
+ }
203
+ :host([data-position="bottom-right"]) .panel,
204
+ :host(:not([data-position])) .panel {
205
+ right: var(--va-edge-offset);
206
+ bottom: var(--va-panel-offset);
207
+ }
208
+ :host([data-position="bottom-left"]) .fab {
209
+ left: var(--va-edge-offset);
210
+ bottom: var(--va-edge-offset);
211
+ }
212
+ :host([data-position="bottom-left"]) .panel {
213
+ left: var(--va-edge-offset);
214
+ bottom: var(--va-panel-offset);
215
+ }
216
+ :host([data-position="top-right"]) .fab {
217
+ right: var(--va-edge-offset);
218
+ top: var(--va-edge-offset);
219
+ }
220
+ :host([data-position="top-right"]) .panel {
221
+ right: var(--va-edge-offset);
222
+ top: var(--va-panel-offset);
223
+ }
224
+ :host([data-position="top-left"]) .fab {
225
+ left: var(--va-edge-offset);
226
+ top: var(--va-edge-offset);
227
+ }
228
+ :host([data-position="top-left"]) .panel {
229
+ left: var(--va-edge-offset);
230
+ top: var(--va-panel-offset);
231
+ }
232
+
233
+ /* ───────── Small-screen adaptation ─────────
234
+ On phones, shrink the edge gaps so the (viewport-capped) panel uses more of
235
+ the screen and sits closer to the FAB. Width/height already clamp to the
236
+ viewport via min()/max-height above; this just tightens the margins. Scoped
237
+ to floating mode — inline embeds fill their own container. */
238
+ @media (max-width: 460px) {
239
+ :host(:not([data-inline])) {
240
+ --va-edge-offset: 12px;
241
+ --va-panel-offset: calc(var(--va-fab-size) + 12px);
242
+ }
243
+ /* Pin both edges to the same gap (and let width fill between them) so the
244
+ left and right margins are always symmetrical, whichever corner the FAB
245
+ is anchored to. Overrides the single-side corner anchors above. */
246
+ :host(:not([data-inline])) .panel {
247
+ left: var(--va-edge-offset);
248
+ right: var(--va-edge-offset);
249
+ width: auto;
250
+ }
251
+ }
252
+
253
+ /* ───────── Inline / embedded mode ─────────
254
+ Placed after the corner anchors so its `inset` overrides them. */
255
+ :host([data-inline]) {
256
+ display: block;
257
+ width: 100%;
258
+ height: 100%;
259
+ }
260
+ :host([data-inline]) .fab { display: none; }
261
+ :host([data-inline]) .panel {
262
+ position: absolute;
263
+ inset: 0;
264
+ width: 100%;
265
+ height: 100%;
266
+ max-height: none;
267
+ border-radius: 0;
268
+ border: none;
269
+ box-shadow: none;
270
+ animation: none;
271
+ }
272
+
273
+ /* ───────── Close button ───────── */
274
+
275
+ .close {
276
+ position: absolute;
277
+ top: 14px;
278
+ right: 14px;
279
+ width: 32px;
280
+ height: 32px;
281
+ border-radius: 50%;
282
+ background: color-mix(in srgb, var(--va-text) 6%, transparent);
283
+ border: none;
284
+ color: var(--va-text);
285
+ cursor: pointer;
286
+ display: flex;
287
+ align-items: center;
288
+ justify-content: center;
289
+ padding: 0;
290
+ z-index: 5;
291
+ transition: background 0.15s ease, transform 0.15s ease;
292
+ -webkit-backdrop-filter: blur(8px);
293
+ backdrop-filter: blur(8px);
294
+ }
295
+ .close:hover {
296
+ background: color-mix(in srgb, var(--va-text) 14%, transparent);
297
+ transform: scale(1.06);
298
+ }
299
+ .close svg { width: 16px; height: 16px; }
300
+ :host([data-close-button-hide]) .close { display: none; }
301
+
302
+ /* ───────── Screen base ───────── */
303
+
304
+ .screen {
305
+ flex: 1;
306
+ min-height: 0;
307
+ display: flex;
308
+ flex-direction: column;
309
+ animation: va-screen-in 0.3s cubic-bezier(0.16, 1, 0.3, 1);
310
+ }
311
+ @keyframes va-screen-in {
312
+ from { opacity: 0; transform: translateY(6px); }
313
+ to { opacity: 1; transform: translateY(0); }
314
+ }
315
+
316
+ /* ───────── Welcome screen ───────── */
317
+
318
+ .screen-welcome {
319
+ background:
320
+ radial-gradient(95% 70% at 50% -10%, color-mix(in srgb, var(--va-primary) 14%, transparent), transparent 65%),
321
+ radial-gradient(75% 55% at 105% 115%, color-mix(in srgb, var(--va-accent) 14%, transparent), transparent 65%),
322
+ var(--va-background);
323
+ align-items: stretch;
324
+ justify-content: space-between;
325
+ padding: 56px 28px 18px;
326
+ text-align: center;
327
+ position: relative;
328
+ }
329
+ .welcome-inner {
330
+ display: flex;
331
+ flex-direction: column;
332
+ align-items: center;
333
+ gap: 0;
334
+ max-width: 100%;
335
+ margin: auto 0;
336
+ }
337
+
338
+ .welcome-logo {
339
+ position: relative;
340
+ width: 88px;
341
+ height: 88px;
342
+ border-radius: 50%;
343
+ background: linear-gradient(135deg, var(--va-primary), var(--va-accent));
344
+ display: flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ color: var(--va-primary-text);
348
+ box-shadow:
349
+ 0 18px 44px -16px color-mix(in srgb, var(--va-primary) 55%, transparent),
350
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
351
+ overflow: hidden;
352
+ }
353
+ .welcome-logo::before {
354
+ content: "";
355
+ position: absolute;
356
+ inset: -10px;
357
+ border-radius: 50%;
358
+ background: radial-gradient(circle at center, color-mix(in srgb, var(--va-primary) 22%, transparent), transparent 70%);
359
+ z-index: -1;
360
+ filter: blur(6px);
361
+ }
362
+ .welcome-logo::after {
363
+ content: "";
364
+ position: absolute;
365
+ inset: 0;
366
+ border-radius: inherit;
367
+ background: radial-gradient(circle at 30% 22%, rgba(255, 255, 255, 0.42), transparent 55%);
368
+ pointer-events: none;
369
+ }
370
+ .welcome-logo-img {
371
+ width: 100%;
372
+ height: 100%;
373
+ object-fit: cover;
374
+ border-radius: inherit;
375
+ position: relative;
376
+ }
377
+ .welcome-logo-fallback {
378
+ position: relative;
379
+ display: flex;
380
+ align-items: center;
381
+ justify-content: center;
382
+ width: 48%;
383
+ height: 48%;
384
+ color: var(--va-primary-text);
385
+ }
386
+ .welcome-logo-fallback svg { width: 100%; height: 100%; }
387
+
388
+ .welcome-status {
389
+ margin-top: 18px;
390
+ display: inline-flex;
391
+ align-items: center;
392
+ gap: 7px;
393
+ padding: 5px 11px;
394
+ border-radius: 999px;
395
+ background: color-mix(in srgb, var(--va-text) 5%, transparent);
396
+ border: 1px solid color-mix(in srgb, var(--va-text) 7%, transparent);
397
+ font-size: 11px;
398
+ font-weight: 600;
399
+ letter-spacing: 0.04em;
400
+ color: var(--va-text-muted);
401
+ text-transform: uppercase;
402
+ }
403
+ .welcome-status-dot {
404
+ width: 6px;
405
+ height: 6px;
406
+ border-radius: 50%;
407
+ background: #22c55e;
408
+ box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.5);
409
+ animation: va-pulse-status 1.8s ease-out infinite;
410
+ }
411
+ @keyframes va-pulse-status {
412
+ 0% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.45); }
413
+ 70% { box-shadow: 0 0 0 7px rgba(34, 197, 94, 0); }
414
+ 100% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0); }
415
+ }
416
+
417
+ .welcome-name {
418
+ margin: 14px 0 6px;
419
+ font-size: 22px;
420
+ font-weight: 600;
421
+ letter-spacing: -0.022em;
422
+ color: var(--va-text);
423
+ line-height: 1.2;
424
+ }
425
+ .welcome-desc {
426
+ margin: 0 0 18px;
427
+ font-size: 13.5px;
428
+ line-height: 1.55;
429
+ color: var(--va-text-muted);
430
+ max-width: 260px;
431
+ font-weight: 400;
432
+ }
433
+
434
+ /* ───────── Language picker (welcome) ───────── */
435
+
436
+ .lang-picker {
437
+ position: relative;
438
+ margin: 0 0 16px;
439
+ width: 100%;
440
+ max-width: 260px;
441
+ display: flex;
442
+ justify-content: center;
443
+ }
444
+
445
+ .lang-trigger {
446
+ display: inline-flex;
447
+ align-items: center;
448
+ gap: 10px;
449
+ padding: 8px 10px 8px 14px;
450
+ border-radius: 999px;
451
+ border: 1px solid color-mix(in srgb, var(--va-text) 10%, transparent);
452
+ background: color-mix(in srgb, var(--va-background) 92%, var(--va-text) 8%);
453
+ color: var(--va-text);
454
+ cursor: pointer;
455
+ font-family: inherit;
456
+ font-size: 13px;
457
+ font-weight: 500;
458
+ line-height: 1;
459
+ letter-spacing: -0.005em;
460
+ transition: border-color 0.15s ease, background 0.15s ease,
461
+ box-shadow 0.15s ease, transform 0.15s ease;
462
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
463
+ -webkit-backdrop-filter: blur(6px);
464
+ backdrop-filter: blur(6px);
465
+ }
466
+ .lang-trigger:hover {
467
+ border-color: color-mix(in srgb, var(--va-primary) 35%, transparent);
468
+ background: color-mix(in srgb, var(--va-primary) 7%, var(--va-background));
469
+ transform: translateY(-1px);
470
+ box-shadow: 0 6px 16px -10px color-mix(in srgb, var(--va-primary) 40%, transparent);
471
+ }
472
+ .lang-trigger:focus-visible {
473
+ outline: none;
474
+ border-color: var(--va-primary);
475
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--va-primary) 22%, transparent);
476
+ }
477
+
478
+ .lang-trigger-icon {
479
+ display: inline-flex;
480
+ align-items: center;
481
+ justify-content: center;
482
+ width: 16px;
483
+ height: 16px;
484
+ color: var(--va-primary);
485
+ opacity: 0.9;
486
+ flex-shrink: 0;
487
+ }
488
+ .lang-trigger-icon svg { width: 100%; height: 100%; }
489
+
490
+ .lang-trigger-text {
491
+ display: inline-flex;
492
+ flex-direction: column;
493
+ align-items: flex-start;
494
+ line-height: 1;
495
+ gap: 3px;
496
+ min-width: 0;
497
+ }
498
+ .lang-trigger-eyebrow {
499
+ font-size: 9px;
500
+ font-weight: 600;
501
+ letter-spacing: 0.14em;
502
+ text-transform: uppercase;
503
+ color: var(--va-text-muted);
504
+ opacity: 0.8;
505
+ }
506
+ .lang-trigger-label {
507
+ font-size: 13px;
508
+ font-weight: 600;
509
+ color: var(--va-text);
510
+ letter-spacing: -0.005em;
511
+ white-space: nowrap;
512
+ }
513
+
514
+ .lang-trigger-code {
515
+ font-size: 10.5px;
516
+ font-weight: 700;
517
+ letter-spacing: 0.08em;
518
+ padding: 4px 8px;
519
+ border-radius: 999px;
520
+ background: linear-gradient(135deg, var(--va-primary), var(--va-accent));
521
+ color: var(--va-primary-text);
522
+ line-height: 1;
523
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
524
+ }
525
+
526
+ .lang-trigger-chev {
527
+ display: inline-flex;
528
+ align-items: center;
529
+ justify-content: center;
530
+ width: 14px;
531
+ height: 14px;
532
+ color: var(--va-text-muted);
533
+ transition: transform 0.18s ease, color 0.18s ease;
534
+ }
535
+ .lang-trigger-chev svg { width: 100%; height: 100%; }
536
+ .lang-picker[data-open="true"] .lang-trigger-chev {
537
+ transform: rotate(180deg);
538
+ color: var(--va-primary);
539
+ }
540
+ .lang-picker[data-open="true"] .lang-trigger {
541
+ border-color: color-mix(in srgb, var(--va-primary) 45%, transparent);
542
+ background: color-mix(in srgb, var(--va-primary) 6%, var(--va-background));
543
+ }
544
+
545
+ .lang-menu {
546
+ position: absolute;
547
+ left: 50%;
548
+ bottom: calc(100% + 8px);
549
+ transform: translateX(-50%);
550
+ min-width: min(220px, calc(100vw - 2 * var(--va-edge-offset) - 24px));
551
+ max-width: min(280px, calc(100vw - 2 * var(--va-edge-offset) - 24px));
552
+ background: var(--va-background);
553
+ border: 1px solid color-mix(in srgb, var(--va-text) 10%, transparent);
554
+ border-radius: 16px;
555
+ padding: 6px;
556
+ z-index: 4;
557
+ box-shadow:
558
+ 0 18px 40px -14px rgba(15, 23, 42, 0.32),
559
+ 0 6px 16px -8px rgba(15, 23, 42, 0.16);
560
+ display: flex;
561
+ flex-direction: column;
562
+ gap: 2px;
563
+ animation: va-lang-menu-in 0.16s cubic-bezier(0.16, 1, 0.3, 1);
564
+ }
565
+ .lang-menu[hidden] { display: none; }
566
+ @keyframes va-lang-menu-in {
567
+ from { opacity: 0; transform: translate(-50%, 6px); }
568
+ to { opacity: 1; transform: translate(-50%, 0); }
569
+ }
570
+
571
+ .lang-option {
572
+ display: flex;
573
+ align-items: center;
574
+ gap: 10px;
575
+ padding: 9px 10px 9px 12px;
576
+ border: none;
577
+ background: transparent;
578
+ border-radius: 11px;
579
+ cursor: pointer;
580
+ font-family: inherit;
581
+ text-align: left;
582
+ color: var(--va-text);
583
+ transition: background 0.12s ease, color 0.12s ease;
584
+ }
585
+ .lang-option:hover {
586
+ background: color-mix(in srgb, var(--va-text) 6%, transparent);
587
+ }
588
+ .lang-option-text {
589
+ display: inline-flex;
590
+ flex-direction: column;
591
+ gap: 2px;
592
+ flex: 1;
593
+ min-width: 0;
594
+ }
595
+ .lang-option-native {
596
+ font-size: 13.5px;
597
+ font-weight: 600;
598
+ line-height: 1.15;
599
+ letter-spacing: -0.005em;
600
+ color: var(--va-text);
601
+ }
602
+ .lang-option-label {
603
+ font-size: 11px;
604
+ line-height: 1.1;
605
+ color: var(--va-text-muted);
606
+ letter-spacing: 0.01em;
607
+ }
608
+ .lang-option-code {
609
+ font-size: 10px;
610
+ font-weight: 700;
611
+ letter-spacing: 0.1em;
612
+ padding: 3px 7px;
613
+ border-radius: 999px;
614
+ background: color-mix(in srgb, var(--va-text) 8%, transparent);
615
+ color: var(--va-text-muted);
616
+ line-height: 1;
617
+ }
618
+ .lang-option-check {
619
+ display: inline-flex;
620
+ align-items: center;
621
+ justify-content: center;
622
+ width: 16px;
623
+ height: 16px;
624
+ color: var(--va-primary);
625
+ opacity: 0;
626
+ transform: scale(0.6);
627
+ transition: opacity 0.14s ease, transform 0.14s ease;
628
+ }
629
+ .lang-option-check svg { width: 100%; height: 100%; }
630
+ .lang-option.is-active {
631
+ background: color-mix(in srgb, var(--va-primary) 10%, transparent);
632
+ }
633
+ .lang-option.is-active .lang-option-code {
634
+ background: linear-gradient(135deg, var(--va-primary), var(--va-accent));
635
+ color: var(--va-primary-text);
636
+ }
637
+ .lang-option.is-active .lang-option-check {
638
+ opacity: 1;
639
+ transform: scale(1);
640
+ }
641
+ .start-btn {
642
+ position: relative;
643
+ display: inline-flex;
644
+ align-items: center;
645
+ gap: 10px;
646
+ padding: 13px 26px;
647
+ border: none;
648
+ border-radius: 999px;
649
+ background: linear-gradient(135deg, var(--va-primary), var(--va-accent));
650
+ color: var(--va-primary-text);
651
+ font-family: inherit;
652
+ font-size: 14.5px;
653
+ font-weight: 600;
654
+ letter-spacing: 0.005em;
655
+ cursor: pointer;
656
+ box-shadow:
657
+ 0 14px 30px -12px color-mix(in srgb, var(--va-primary) 60%, transparent),
658
+ 0 2px 8px rgba(0, 0, 0, 0.08),
659
+ inset 0 1px 0 rgba(255, 255, 255, 0.25);
660
+ transition: transform 0.16s ease, box-shadow 0.16s ease, filter 0.16s ease;
661
+ overflow: hidden;
662
+ }
663
+ .start-btn::before {
664
+ content: "";
665
+ position: absolute;
666
+ inset: 0;
667
+ border-radius: inherit;
668
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.18), transparent 45%);
669
+ pointer-events: none;
670
+ }
671
+ .start-btn:hover {
672
+ transform: translateY(-1px);
673
+ box-shadow:
674
+ 0 18px 36px -12px color-mix(in srgb, var(--va-primary) 70%, transparent),
675
+ 0 4px 12px rgba(0, 0, 0, 0.12),
676
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
677
+ filter: brightness(1.04);
678
+ }
679
+ .start-btn:active { transform: translateY(0); filter: brightness(0.96); }
680
+ .start-btn:disabled { opacity: 0.6; cursor: not-allowed; transform: none; }
681
+ .start-btn-icon { display: inline-flex; position: relative; }
682
+ .start-btn-icon svg { width: 17px; height: 17px; }
683
+ .start-btn-label { position: relative; }
684
+
685
+ .consent {
686
+ margin: 12px auto 0;
687
+ max-width: 280px;
688
+ font-size: 11.5px;
689
+ line-height: 1.45;
690
+ color: var(--va-text-muted);
691
+ text-align: center;
692
+ display: flex;
693
+ flex-wrap: wrap;
694
+ align-items: center;
695
+ justify-content: center;
696
+ gap: 4px;
697
+ }
698
+ .consent[hidden] { display: none; }
699
+ .consent-text { opacity: 0.85; }
700
+ .consent-link {
701
+ color: var(--va-primary);
702
+ font-weight: 600;
703
+ text-decoration: underline;
704
+ text-decoration-color: color-mix(in srgb, var(--va-primary) 35%, transparent);
705
+ text-underline-offset: 2px;
706
+ transition: text-decoration-color 0.15s ease, color 0.15s ease;
707
+ }
708
+ .consent-link:hover {
709
+ text-decoration-color: var(--va-primary);
710
+ }
711
+ .consent-link:focus-visible {
712
+ outline: none;
713
+ border-radius: 4px;
714
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--va-primary) 22%, transparent);
715
+ }
716
+ .welcome-foot {
717
+ display: block;
718
+ font-size: 10.5px;
719
+ letter-spacing: 0.14em;
720
+ text-transform: uppercase;
721
+ color: var(--va-text-muted);
722
+ opacity: 0.55;
723
+ text-decoration: none;
724
+ font-weight: 500;
725
+ padding-top: 14px;
726
+ margin-top: 14px;
727
+ border-top: 1px solid color-mix(in srgb, var(--va-text) 6%, transparent);
728
+ transition: opacity 0.15s ease;
729
+ }
730
+ .welcome-foot.is-link { cursor: pointer; }
731
+ .welcome-foot.is-link:hover { opacity: 0.9; }
732
+
733
+ /* ───────── Call screen ───────── */
734
+
735
+ .screen-call {
736
+ position: relative;
737
+ background:
738
+ radial-gradient(120% 70% at 50% -10%, color-mix(in srgb, var(--va-primary) 13%, transparent), transparent 70%),
739
+ radial-gradient(80% 50% at 100% 110%, color-mix(in srgb, var(--va-accent) 10%, transparent), transparent 70%),
740
+ var(--va-background);
741
+ }
742
+
743
+ .call-header {
744
+ padding: 20px 56px 8px 22px;
745
+ display: flex;
746
+ align-items: center;
747
+ gap: 12px;
748
+ }
749
+ .call-timer {
750
+ margin-left: auto;
751
+ display: inline-flex;
752
+ align-items: center;
753
+ gap: 6px;
754
+ padding: 5px 10px;
755
+ border-radius: 999px;
756
+ background: color-mix(in srgb, var(--va-text) 6%, transparent);
757
+ border: 1px solid color-mix(in srgb, var(--va-text) 10%, transparent);
758
+ font-size: 12px;
759
+ font-weight: 600;
760
+ font-variant-numeric: tabular-nums;
761
+ color: var(--va-text-muted);
762
+ letter-spacing: 0.02em;
763
+ line-height: 1;
764
+ flex-shrink: 0;
765
+ transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
766
+ }
767
+ .call-timer[hidden] { display: none; }
768
+ .call-timer.warning {
769
+ background: color-mix(in srgb, #ef4444 14%, transparent);
770
+ border-color: color-mix(in srgb, #ef4444 35%, transparent);
771
+ color: #ef4444;
772
+ animation: va-timer-pulse 1s ease-in-out infinite;
773
+ }
774
+ @keyframes va-timer-pulse {
775
+ 0%, 100% { opacity: 1; }
776
+ 50% { opacity: 0.65; }
777
+ }
778
+ .call-id {
779
+ display: flex;
780
+ align-items: center;
781
+ gap: 12px;
782
+ min-width: 0;
783
+ }
784
+ .call-logo {
785
+ position: relative;
786
+ width: 42px;
787
+ height: 42px;
788
+ border-radius: 14px;
789
+ background: linear-gradient(135deg, var(--va-primary), var(--va-accent));
790
+ display: flex;
791
+ align-items: center;
792
+ justify-content: center;
793
+ color: var(--va-primary-text);
794
+ overflow: hidden;
795
+ flex-shrink: 0;
796
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.22);
797
+ }
798
+ .call-logo-img { width: 100%; height: 100%; object-fit: cover; border-radius: inherit; }
799
+ .call-logo-fallback { width: 55%; height: 55%; display: flex; align-items: center; justify-content: center; }
800
+ .call-logo-fallback svg { width: 100%; height: 100%; }
801
+ .call-id-text { min-width: 0; }
802
+ .call-name {
803
+ font-size: 14.5px;
804
+ font-weight: 600;
805
+ color: var(--va-text);
806
+ letter-spacing: -0.01em;
807
+ white-space: nowrap;
808
+ overflow: hidden;
809
+ text-overflow: ellipsis;
810
+ }
811
+ .call-status {
812
+ font-size: 12px;
813
+ color: var(--va-text-muted);
814
+ display: inline-flex;
815
+ align-items: center;
816
+ gap: 6px;
817
+ white-space: nowrap;
818
+ overflow: hidden;
819
+ text-overflow: ellipsis;
820
+ margin-top: 2px;
821
+ }
822
+ .call-status::before {
823
+ content: "";
824
+ width: 6px;
825
+ height: 6px;
826
+ border-radius: 50%;
827
+ background: var(--va-accent);
828
+ box-shadow: 0 0 0 0 color-mix(in srgb, var(--va-accent) 60%, transparent);
829
+ animation: va-pulse-dot 1.6s ease-out infinite;
830
+ flex-shrink: 0;
831
+ }
832
+ @keyframes va-pulse-dot {
833
+ 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--va-accent) 50%, transparent); }
834
+ 70% { box-shadow: 0 0 0 8px color-mix(in srgb, var(--va-accent) 0%, transparent); }
835
+ 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--va-accent) 0%, transparent); }
836
+ }
837
+
838
+ /* ───────── Orb stage ───────── */
839
+
840
+ .call-stage {
841
+ flex-shrink: 0;
842
+ display: flex;
843
+ flex-direction: column;
844
+ align-items: center;
845
+ justify-content: center;
846
+ gap: 14px;
847
+ padding: 18px 16px 12px;
848
+ }
849
+ .orb {
850
+ position: relative;
851
+ width: 140px;
852
+ height: 140px;
853
+ display: flex;
854
+ align-items: center;
855
+ justify-content: center;
856
+ }
857
+ .orb-core {
858
+ position: relative;
859
+ width: 76px;
860
+ height: 76px;
861
+ border-radius: 50%;
862
+ background: radial-gradient(
863
+ circle at 30% 28%,
864
+ color-mix(in srgb, var(--va-primary) 25%, white) 0%,
865
+ var(--va-primary) 55%,
866
+ color-mix(in srgb, var(--va-primary) 70%, black) 100%
867
+ );
868
+ box-shadow:
869
+ inset 0 -12px 22px rgba(0, 0, 0, 0.22),
870
+ inset 0 5px 10px rgba(255, 255, 255, 0.28),
871
+ 0 12px 32px -8px color-mix(in srgb, var(--va-primary) 55%, transparent);
872
+ transition: transform 0.3s ease;
873
+ }
874
+ .orb-core::before {
875
+ content: "";
876
+ position: absolute;
877
+ inset: 12% 28% 50% 16%;
878
+ border-radius: 50%;
879
+ background: radial-gradient(ellipse at center, rgba(255, 255, 255, 0.5), transparent 70%);
880
+ filter: blur(2px);
881
+ pointer-events: none;
882
+ }
883
+ .orb-ring {
884
+ position: absolute;
885
+ border-radius: 50%;
886
+ border: 2px solid color-mix(in srgb, var(--va-primary) 35%, transparent);
887
+ opacity: 0;
888
+ inset: 0;
889
+ }
890
+ .orb-ring-1 { animation: va-ring 2.6s ease-out infinite; }
891
+ .orb-ring-2 { animation: va-ring 2.6s ease-out 0.65s infinite; }
892
+ .orb-ring-3 { animation: va-ring 2.6s ease-out 1.3s infinite; }
893
+ @keyframes va-ring {
894
+ 0% { transform: scale(0.55); opacity: 0; }
895
+ 20% { opacity: 0.7; }
896
+ 100% { transform: scale(1); opacity: 0; }
897
+ }
898
+ .orb:not(.listening):not(.speaking):not(.connecting) .orb-ring {
899
+ animation-play-state: paused;
900
+ opacity: 0;
901
+ }
902
+ .orb.connecting .orb-ring {
903
+ border-color: color-mix(in srgb, var(--va-text-muted) 40%, transparent);
904
+ }
905
+
906
+ .orb.listening .orb-ring { border-color: color-mix(in srgb, var(--va-accent) 55%, transparent); }
907
+ .orb.speaking .orb-core { animation: va-orb-pulse 1.1s ease-in-out infinite; }
908
+ .orb.speaking .orb-ring { border-color: color-mix(in srgb, var(--va-primary) 60%, transparent); }
909
+ @keyframes va-orb-pulse {
910
+ 0%, 100% { transform: scale(1); }
911
+ 50% { transform: scale(1.09); }
912
+ }
913
+
914
+ /* Thinking: a slow rotating accent ring + gentle breathing core, distinct
915
+ from listening (idle rings), speaking (fast pulse) and connecting. Reads
916
+ as "working on it" rather than "talking". */
917
+ .orb.thinking .orb-ring {
918
+ animation-play-state: running;
919
+ border-color: color-mix(in srgb, var(--va-accent) 50%, transparent);
920
+ }
921
+ .orb.thinking .orb-core {
922
+ animation: va-orb-think 2.4s ease-in-out infinite;
923
+ }
924
+ .orb.thinking::after {
925
+ content: "";
926
+ position: absolute;
927
+ inset: 6px;
928
+ border-radius: 50%;
929
+ border: 2px solid transparent;
930
+ border-top-color: color-mix(in srgb, var(--va-accent) 70%, transparent);
931
+ border-right-color: color-mix(in srgb, var(--va-primary) 45%, transparent);
932
+ animation: va-orb-spin 1.6s linear infinite;
933
+ pointer-events: none;
934
+ }
935
+ @keyframes va-orb-think {
936
+ 0%, 100% { transform: scale(0.96); opacity: 0.85; }
937
+ 50% { transform: scale(1.04); opacity: 1; }
938
+ }
939
+ @keyframes va-orb-spin {
940
+ to { transform: rotate(360deg); }
941
+ }
942
+
943
+ .orb-label {
944
+ font-size: 11px;
945
+ letter-spacing: 0.12em;
946
+ text-transform: uppercase;
947
+ color: var(--va-text-muted);
948
+ font-weight: 600;
949
+ }
950
+
951
+ /* Contextual processing line under the orb ("Searching the knowledge base…").
952
+ Subtle, muted, fades in. */
953
+ .agent-status-line {
954
+ margin-top: 2px;
955
+ max-width: 86%;
956
+ text-align: center;
957
+ font-size: 12px;
958
+ line-height: 1.35;
959
+ color: var(--va-text-muted);
960
+ opacity: 0.9;
961
+ animation: va-status-fade 0.18s ease-out;
962
+ }
963
+ .agent-status-line[hidden] {
964
+ display: none;
965
+ }
966
+ @keyframes va-status-fade {
967
+ from { opacity: 0; transform: translateY(2px); }
968
+ to { opacity: 0.9; transform: translateY(0); }
969
+ }
970
+
971
+ /* ───────── Transcript ───────── */
972
+
973
+ .transcript {
974
+ flex: 1;
975
+ min-height: 0;
976
+ overflow-y: auto;
977
+ padding: 6px 18px 14px;
978
+ display: flex;
979
+ flex-direction: column;
980
+ gap: 8px;
981
+ scroll-behavior: smooth;
982
+ mask-image: linear-gradient(to bottom, transparent 0, black 14px, black calc(100% - 14px), transparent 100%);
983
+ -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 14px, black calc(100% - 14px), transparent 100%);
984
+ }
985
+ .transcript::-webkit-scrollbar { width: 6px; }
986
+ .transcript::-webkit-scrollbar-thumb {
987
+ background: color-mix(in srgb, var(--va-text) 14%, transparent);
988
+ border-radius: 999px;
989
+ }
990
+ .transcript:empty::before {
991
+ content: attr(data-placeholder);
992
+ display: block;
993
+ font-size: 12px;
994
+ color: var(--va-text-muted);
995
+ text-align: center;
996
+ padding-top: 22px;
997
+ opacity: 0.7;
998
+ }
999
+ .transcript-msg {
1000
+ max-width: 86%;
1001
+ padding: 9px 13px;
1002
+ border-radius: 16px;
1003
+ font-size: 13.5px;
1004
+ line-height: 1.45;
1005
+ white-space: normal;
1006
+ word-wrap: break-word;
1007
+ animation: va-msg-in 0.2s ease-out;
1008
+ }
1009
+ .transcript-msg p { margin: 0 0 0.4em; }
1010
+ .transcript-msg p:last-child { margin-bottom: 0; }
1011
+ .transcript-msg strong { font-weight: 700; }
1012
+ .transcript-msg em { font-style: italic; }
1013
+ .transcript-msg code {
1014
+ font-family: ui-monospace, "SFMono-Regular", Consolas, monospace;
1015
+ font-size: 0.88em;
1016
+ background: rgba(0, 0, 0, 0.1);
1017
+ padding: 0.1em 0.3em;
1018
+ border-radius: 3px;
1019
+ }
1020
+ .transcript-msg.user code { background: rgba(255, 255, 255, 0.2); }
1021
+ .transcript-msg pre {
1022
+ margin: 0.4em 0;
1023
+ padding: 0.5em 0.7em;
1024
+ background: rgba(0, 0, 0, 0.08);
1025
+ border-radius: 6px;
1026
+ overflow-x: auto;
1027
+ white-space: pre;
1028
+ font-size: 0.88em;
1029
+ }
1030
+ .transcript-msg.user pre { background: rgba(255, 255, 255, 0.15); }
1031
+ .transcript-msg pre code { background: none; padding: 0; }
1032
+ .transcript-msg ul, .transcript-msg ol { margin: 0.3em 0; padding-left: 1.4em; }
1033
+ .transcript-msg li { margin: 0.15em 0; }
1034
+ .transcript-msg h1, .transcript-msg h2, .transcript-msg h3 { margin: 0.3em 0 0.2em; font-weight: 700; line-height: 1.2; }
1035
+ .transcript-msg h1 { font-size: 1.1em; }
1036
+ .transcript-msg h2 { font-size: 1.05em; }
1037
+ .transcript-msg h3 { font-size: 1em; }
1038
+ .transcript-msg a { color: inherit; text-decoration: underline; opacity: 0.85; }
1039
+ @keyframes va-msg-in {
1040
+ from { opacity: 0; transform: translateY(4px); }
1041
+ to { opacity: 1; transform: translateY(0); }
1042
+ }
1043
+ .transcript-msg.user {
1044
+ align-self: flex-end;
1045
+ background: var(--va-user-bubble);
1046
+ color: var(--va-user-bubble-text);
1047
+ border-bottom-right-radius: 6px;
1048
+ box-shadow: 0 2px 8px -4px color-mix(in srgb, var(--va-user-bubble) 60%, transparent);
1049
+ }
1050
+ .transcript-msg.agent {
1051
+ align-self: flex-start;
1052
+ background: var(--va-agent-bubble);
1053
+ color: var(--va-agent-bubble-text);
1054
+ border-bottom-left-radius: 6px;
1055
+ box-shadow: 0 2px 8px -6px rgba(15, 23, 42, 0.18);
1056
+ }
1057
+ .transcript-msg.system {
1058
+ align-self: center;
1059
+ background: transparent;
1060
+ color: var(--va-agent-bubble-text);
1061
+ opacity: 0.7;
1062
+ font-size: 0.85em;
1063
+ font-style: italic;
1064
+ box-shadow: none;
1065
+ text-align: center;
1066
+ }
1067
+ .transcript-msg.interim { opacity: 0.78; }
1068
+ .transcript-msg.interim::after {
1069
+ content: "▍";
1070
+ display: inline-block;
1071
+ margin-left: 2px;
1072
+ font-style: normal;
1073
+ animation: va-caret 1s steps(2, end) infinite;
1074
+ }
1075
+ @keyframes va-caret {
1076
+ 0%, 60% { opacity: 1; }
1077
+ 61%, 100% { opacity: 0; }
1078
+ }
1079
+
1080
+ /* ───────── Text input row ───────── */
1081
+
1082
+ .text-input-row {
1083
+ display: flex;
1084
+ align-items: flex-end;
1085
+ gap: 8px;
1086
+ padding: 8px 14px 4px;
1087
+ border-top: 1px solid color-mix(in srgb, var(--va-text) 8%, transparent);
1088
+ }
1089
+ .text-input-row[hidden] { display: none; }
1090
+ .text-input {
1091
+ flex: 1;
1092
+ font-family: inherit;
1093
+ font-size: 13px;
1094
+ line-height: 1.45;
1095
+ padding: 9px 12px;
1096
+ border-radius: 18px;
1097
+ border: 1px solid color-mix(in srgb, var(--va-text) 14%, transparent);
1098
+ background: color-mix(in srgb, var(--va-text) 5%, var(--va-background));
1099
+ color: var(--va-text);
1100
+ resize: none;
1101
+ overflow-y: hidden;
1102
+ max-height: 96px;
1103
+ outline: none;
1104
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
1105
+ }
1106
+ .text-input::placeholder { color: var(--va-text-muted); opacity: 0.7; }
1107
+ .text-input:focus {
1108
+ border-color: var(--va-primary);
1109
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--va-primary) 20%, transparent);
1110
+ }
1111
+ .text-send-btn {
1112
+ flex-shrink: 0;
1113
+ width: 36px;
1114
+ height: 36px;
1115
+ border-radius: 50%;
1116
+ border: none;
1117
+ cursor: pointer;
1118
+ display: flex;
1119
+ align-items: center;
1120
+ justify-content: center;
1121
+ background: var(--va-primary);
1122
+ color: var(--va-primary-text);
1123
+ padding: 0;
1124
+ transition: transform 0.15s ease, background 0.15s ease, opacity 0.15s ease;
1125
+ }
1126
+ .text-send-btn svg { width: 15px; height: 15px; }
1127
+ .text-send-btn:hover { transform: scale(1.08); }
1128
+ .text-send-btn:active { transform: scale(0.96); }
1129
+ .text-send-btn:disabled { opacity: 0.4; cursor: not-allowed; transform: none; }
1130
+
1131
+ /* ───────── Call control bar ───────── */
1132
+
1133
+ .call-controls {
1134
+ display: flex;
1135
+ justify-content: center;
1136
+ align-items: center;
1137
+ gap: 22px;
1138
+ padding: 16px 18px 24px;
1139
+ }
1140
+ .ctl-btn {
1141
+ position: relative;
1142
+ width: 56px;
1143
+ height: 56px;
1144
+ border-radius: 50%;
1145
+ border: none;
1146
+ cursor: pointer;
1147
+ display: flex;
1148
+ align-items: center;
1149
+ justify-content: center;
1150
+ color: var(--va-text);
1151
+ background: color-mix(in srgb, var(--va-text) 8%, transparent);
1152
+ transition: transform 0.15s ease, background 0.15s ease, box-shadow 0.15s ease, color 0.15s ease;
1153
+ padding: 0;
1154
+ }
1155
+ .ctl-btn svg { width: 22px; height: 22px; }
1156
+ .ctl-btn:hover:not(:disabled) {
1157
+ background: color-mix(in srgb, var(--va-text) 14%, transparent);
1158
+ transform: translateY(-1px);
1159
+ }
1160
+ .ctl-btn:active:not(:disabled) { transform: translateY(0); }
1161
+ .ctl-btn:disabled { opacity: 0.38; cursor: not-allowed; }
1162
+
1163
+ .ctl-mute.is-active {
1164
+ background: var(--va-text);
1165
+ color: var(--va-background);
1166
+ box-shadow: 0 8px 18px -8px color-mix(in srgb, var(--va-text) 70%, transparent);
1167
+ }
1168
+
1169
+ .ctl-end {
1170
+ background: #ef4444;
1171
+ color: #ffffff;
1172
+ box-shadow: 0 12px 26px -10px rgba(239, 68, 68, 0.65);
1173
+ }
1174
+ .ctl-end:hover:not(:disabled) {
1175
+ background: #dc2626;
1176
+ box-shadow: 0 16px 32px -10px rgba(239, 68, 68, 0.75);
1177
+ }
1178
+ .ctl-end:disabled { background: color-mix(in srgb, #ef4444 50%, transparent); }
1179
+
1180
+ /* ───────── Form screen ───────── */
1181
+
1182
+ .screen-form {
1183
+ background:
1184
+ radial-gradient(110% 65% at 50% -10%, color-mix(in srgb, var(--va-primary) 12%, transparent), transparent 70%),
1185
+ var(--va-background);
1186
+ flex-direction: column;
1187
+ }
1188
+
1189
+ .form-header {
1190
+ position: relative;
1191
+ display: flex;
1192
+ align-items: center;
1193
+ gap: 12px;
1194
+ padding: 18px 96px 8px 14px;
1195
+ }
1196
+ .form-header-text {
1197
+ flex: 1 1 auto;
1198
+ }
1199
+ .form-call-controls {
1200
+ position: absolute;
1201
+ top: 14px;
1202
+ right: 56px;
1203
+ display: flex;
1204
+ align-items: center;
1205
+ gap: 6px;
1206
+ z-index: 4;
1207
+ }
1208
+ .form-call-controls[hidden] { display: none; }
1209
+ .form-call-controls button {
1210
+ width: 32px;
1211
+ height: 32px;
1212
+ border-radius: 50%;
1213
+ border: none;
1214
+ cursor: pointer;
1215
+ display: inline-flex;
1216
+ align-items: center;
1217
+ justify-content: center;
1218
+ padding: 0;
1219
+ color: var(--va-text);
1220
+ background: color-mix(in srgb, var(--va-text) 6%, transparent);
1221
+ transition: background 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease, color 0.15s ease;
1222
+ -webkit-backdrop-filter: blur(8px);
1223
+ backdrop-filter: blur(8px);
1224
+ }
1225
+ .form-call-controls button svg {
1226
+ width: 15px;
1227
+ height: 15px;
1228
+ }
1229
+ .form-call-controls button:hover:not(:disabled) {
1230
+ background: color-mix(in srgb, var(--va-text) 14%, transparent);
1231
+ transform: translateY(-1px);
1232
+ }
1233
+ .form-call-controls button:disabled { opacity: 0.5; cursor: not-allowed; }
1234
+ .form-call-controls .form-mute.is-active {
1235
+ background: var(--va-text);
1236
+ color: var(--va-background);
1237
+ }
1238
+ .form-call-controls .form-end {
1239
+ background: #ef4444;
1240
+ color: #ffffff;
1241
+ box-shadow: 0 6px 14px -6px rgba(239, 68, 68, 0.55);
1242
+ }
1243
+ .form-call-controls .form-end:hover:not(:disabled) {
1244
+ background: #dc2626;
1245
+ box-shadow: 0 10px 18px -8px rgba(239, 68, 68, 0.7);
1246
+ }
1247
+ .form-transcript {
1248
+ max-height: 130px;
1249
+ flex-shrink: 0;
1250
+ overflow-y: auto;
1251
+ padding: 6px 16px 8px;
1252
+ display: flex;
1253
+ flex-direction: column;
1254
+ gap: 6px;
1255
+ border-bottom: 1px solid color-mix(in srgb, var(--va-text) 8%, transparent);
1256
+ background: color-mix(in srgb, var(--va-text) 3%, var(--va-background));
1257
+ scroll-behavior: smooth;
1258
+ mask-image: linear-gradient(to bottom, transparent 0, black 10px, black calc(100% - 10px), transparent 100%);
1259
+ -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 10px, black calc(100% - 10px), transparent 100%);
1260
+ }
1261
+ .form-transcript[hidden] { display: none; }
1262
+ .form-transcript::-webkit-scrollbar { width: 4px; }
1263
+ .form-transcript::-webkit-scrollbar-thumb {
1264
+ background: color-mix(in srgb, var(--va-text) 14%, transparent);
1265
+ border-radius: 999px;
1266
+ }
1267
+
1268
+ .form-back {
1269
+ width: 32px;
1270
+ height: 32px;
1271
+ border-radius: 50%;
1272
+ border: none;
1273
+ background: color-mix(in srgb, var(--va-text) 6%, transparent);
1274
+ color: var(--va-text);
1275
+ cursor: pointer;
1276
+ display: inline-flex;
1277
+ align-items: center;
1278
+ justify-content: center;
1279
+ padding: 0;
1280
+ transition: background 0.15s ease, transform 0.15s ease;
1281
+ }
1282
+ .form-back svg {
1283
+ width: 16px;
1284
+ height: 16px;
1285
+ transform: rotate(90deg);
1286
+ }
1287
+ .form-back:hover {
1288
+ background: color-mix(in srgb, var(--va-text) 12%, transparent);
1289
+ transform: translateY(-1px);
1290
+ }
1291
+ .form-header-text {
1292
+ display: flex;
1293
+ flex-direction: column;
1294
+ gap: 2px;
1295
+ min-width: 0;
1296
+ }
1297
+ .form-eyebrow {
1298
+ font-size: 10px;
1299
+ font-weight: 700;
1300
+ letter-spacing: 0.18em;
1301
+ text-transform: uppercase;
1302
+ color: var(--va-primary);
1303
+ opacity: 0.85;
1304
+ }
1305
+ .form-title {
1306
+ font-size: 16px;
1307
+ font-weight: 600;
1308
+ letter-spacing: -0.01em;
1309
+ color: var(--va-text);
1310
+ }
1311
+
1312
+ .form-body {
1313
+ flex: 1;
1314
+ min-height: 0;
1315
+ overflow-y: auto;
1316
+ padding: 6px 18px 18px;
1317
+ display: flex;
1318
+ flex-direction: column;
1319
+ gap: 12px;
1320
+ }
1321
+ .form-body::-webkit-scrollbar { width: 6px; }
1322
+ .form-body::-webkit-scrollbar-thumb {
1323
+ background: color-mix(in srgb, var(--va-text) 14%, transparent);
1324
+ border-radius: 999px;
1325
+ }
1326
+ .form-subtitle {
1327
+ margin: 0 0 4px;
1328
+ font-size: 12.5px;
1329
+ line-height: 1.5;
1330
+ color: var(--va-text-muted);
1331
+ }
1332
+ .form-fields {
1333
+ display: flex;
1334
+ flex-direction: column;
1335
+ gap: 12px;
1336
+ }
1337
+ .form-field {
1338
+ display: flex;
1339
+ flex-direction: column;
1340
+ gap: 6px;
1341
+ }
1342
+ .form-label {
1343
+ font-size: 11.5px;
1344
+ font-weight: 600;
1345
+ letter-spacing: 0.02em;
1346
+ color: var(--va-text);
1347
+ opacity: 0.85;
1348
+ }
1349
+ .form-input {
1350
+ font-family: inherit;
1351
+ font-size: 13px;
1352
+ line-height: 1.4;
1353
+ padding: 10px 12px;
1354
+ border-radius: 12px;
1355
+ border: 1px solid color-mix(in srgb, var(--va-text) 14%, transparent);
1356
+ background: var(--va-background);
1357
+ color: var(--va-text);
1358
+ width: 100%;
1359
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
1360
+ outline: none;
1361
+ }
1362
+ .form-input::placeholder { color: var(--va-text-muted); opacity: 0.7; }
1363
+ .form-input:focus {
1364
+ border-color: var(--va-primary);
1365
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--va-primary) 22%, transparent);
1366
+ }
1367
+ .form-input:disabled { opacity: 0.55; cursor: not-allowed; }
1368
+ .form-textarea { resize: vertical; min-height: 76px; }
1369
+ .form-select { appearance: none; padding-right: 32px; cursor: pointer; }
1370
+
1371
+ .form-error,
1372
+ .form-success {
1373
+ font-size: 12.5px;
1374
+ line-height: 1.45;
1375
+ padding: 9px 12px;
1376
+ border-radius: 10px;
1377
+ border: 1px solid transparent;
1378
+ }
1379
+ .form-error {
1380
+ background: color-mix(in srgb, #ef4444 10%, transparent);
1381
+ border-color: color-mix(in srgb, #ef4444 30%, transparent);
1382
+ color: #b91c1c;
1383
+ }
1384
+ .form-success {
1385
+ background: color-mix(in srgb, #10b981 10%, transparent);
1386
+ border-color: color-mix(in srgb, #10b981 28%, transparent);
1387
+ color: #047857;
1388
+ }
1389
+
1390
+ .form-actions {
1391
+ display: flex;
1392
+ gap: 10px;
1393
+ padding: 12px 18px 18px;
1394
+ border-top: 1px solid color-mix(in srgb, var(--va-text) 6%, transparent);
1395
+ }
1396
+ .form-cancel,
1397
+ .form-submit {
1398
+ flex: 1;
1399
+ font-family: inherit;
1400
+ font-size: 13.5px;
1401
+ font-weight: 600;
1402
+ letter-spacing: 0.005em;
1403
+ padding: 11px 16px;
1404
+ border-radius: 999px;
1405
+ cursor: pointer;
1406
+ border: none;
1407
+ transition: transform 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
1408
+ }
1409
+ .form-cancel {
1410
+ background: color-mix(in srgb, var(--va-text) 8%, transparent);
1411
+ color: var(--va-text);
1412
+ }
1413
+ .form-cancel:hover:not(:disabled) {
1414
+ background: color-mix(in srgb, var(--va-text) 14%, transparent);
1415
+ }
1416
+ .form-submit {
1417
+ background: linear-gradient(135deg, var(--va-primary), var(--va-accent));
1418
+ color: var(--va-primary-text);
1419
+ box-shadow: 0 10px 24px -12px color-mix(in srgb, var(--va-primary) 60%, transparent);
1420
+ }
1421
+ .form-submit:hover:not(:disabled) {
1422
+ transform: translateY(-1px);
1423
+ filter: brightness(1.04);
1424
+ }
1425
+ .form-submit:disabled,
1426
+ .form-cancel:disabled { opacity: 0.55; cursor: not-allowed; transform: none; }
1427
+ .form-submit.is-busy .form-submit-label::after {
1428
+ content: "…";
1429
+ margin-left: 2px;
1430
+ }
1431
+
1432
+ /* ---- Stepper indicator ---- */
1433
+ .form-stepper {
1434
+ display: flex;
1435
+ align-items: center;
1436
+ justify-content: center;
1437
+ gap: 8px;
1438
+ padding: 4px 18px 0;
1439
+ }
1440
+ .form-stepper[hidden] { display: none; }
1441
+ .form-stepper-dot {
1442
+ width: 22px;
1443
+ height: 4px;
1444
+ border-radius: 999px;
1445
+ background: color-mix(in srgb, var(--va-text) 14%, transparent);
1446
+ transition: background 0.2s ease, transform 0.2s ease;
1447
+ }
1448
+ .form-stepper-dot.is-done {
1449
+ background: color-mix(in srgb, var(--va-primary) 60%, transparent);
1450
+ }
1451
+ .form-stepper-dot.is-active {
1452
+ background: linear-gradient(90deg, var(--va-primary), var(--va-accent));
1453
+ transform: scaleY(1.4);
1454
+ }
1455
+
1456
+ /* ---- Grid layout ---- */
1457
+ .form-fields.is-grid {
1458
+ flex-direction: row;
1459
+ flex-wrap: wrap;
1460
+ }
1461
+ .form-fields.is-grid > .form-field {
1462
+ flex: 1 1 100%;
1463
+ min-width: 0;
1464
+ }
1465
+ .form-fields.is-grid > .form-field.is-half {
1466
+ flex: 1 1 calc(50% - 6px);
1467
+ }
1468
+
1469
+ /* ---- Compact density ---- */
1470
+ .form-fields.is-compact { gap: 8px; }
1471
+ .form-fields.is-compact .form-field { gap: 4px; }
1472
+ .form-fields.is-compact .form-input { padding: 8px 11px; font-size: 12.5px; }
1473
+
1474
+ /* ---- Inline labels (label sits in front of the input) ---- */
1475
+ .form-fields.is-inline-labels .form-field {
1476
+ flex-direction: row;
1477
+ align-items: center;
1478
+ gap: 10px;
1479
+ }
1480
+ .form-fields.is-inline-labels .form-label {
1481
+ flex: 0 0 38%;
1482
+ margin: 0;
1483
+ }
1484
+ .form-fields.is-inline-labels .form-input,
1485
+ .form-fields.is-inline-labels .form-choice-group {
1486
+ flex: 1 1 auto;
1487
+ }
1488
+
1489
+ /* ---- Helper text ---- */
1490
+ .form-help {
1491
+ font-size: 11.5px;
1492
+ line-height: 1.4;
1493
+ color: var(--va-text-muted);
1494
+ }
1495
+
1496
+ /* ---- Inline per-field validation errors ---- */
1497
+ .form-field-error {
1498
+ font-size: 11.5px;
1499
+ line-height: 1.4;
1500
+ color: #b91c1c;
1501
+ }
1502
+ .form-field.is-invalid .form-input,
1503
+ .form-field.is-invalid .form-textarea,
1504
+ .form-field.is-invalid .form-select {
1505
+ border-color: #ef4444;
1506
+ }
1507
+ .form-field.is-invalid .form-input:focus,
1508
+ .form-field.is-invalid .form-textarea:focus,
1509
+ .form-field.is-invalid .form-select:focus {
1510
+ box-shadow: 0 0 0 3px color-mix(in srgb, #ef4444 22%, transparent);
1511
+ }
1512
+
1513
+ /* ---- Display blocks (read-only heading/description rows) ---- */
1514
+ .form-display {
1515
+ display: flex;
1516
+ flex-direction: column;
1517
+ gap: 4px;
1518
+ padding: 10px 12px;
1519
+ border-radius: 12px;
1520
+ background: color-mix(in srgb, var(--va-primary) 5%, transparent);
1521
+ border: 1px solid color-mix(in srgb, var(--va-primary) 14%, transparent);
1522
+ }
1523
+ .form-display-title {
1524
+ font-size: 13px;
1525
+ font-weight: 600;
1526
+ color: var(--va-text);
1527
+ }
1528
+ .form-display-body {
1529
+ margin: 0;
1530
+ font-size: 12.5px;
1531
+ line-height: 1.45;
1532
+ color: var(--va-text-muted);
1533
+ }
1534
+
1535
+ /* ---- Radio / checkbox groups ---- */
1536
+ .form-choice-group {
1537
+ display: flex;
1538
+ flex-direction: column;
1539
+ gap: 6px;
1540
+ }
1541
+ .form-choice {
1542
+ display: flex;
1543
+ align-items: center;
1544
+ gap: 8px;
1545
+ font-size: 13px;
1546
+ color: var(--va-text);
1547
+ cursor: pointer;
1548
+ padding: 6px 10px;
1549
+ border-radius: 10px;
1550
+ border: 1px solid color-mix(in srgb, var(--va-text) 10%, transparent);
1551
+ background: color-mix(in srgb, var(--va-background) 92%, var(--va-text) 8%);
1552
+ transition: border-color 0.15s ease, background 0.15s ease;
1553
+ }
1554
+ .form-choice:hover {
1555
+ border-color: color-mix(in srgb, var(--va-primary) 35%, transparent);
1556
+ background: color-mix(in srgb, var(--va-primary) 6%, var(--va-background));
1557
+ }
1558
+ .form-choice input[type="radio"],
1559
+ .form-choice input[type="checkbox"] {
1560
+ accent-color: var(--va-primary);
1561
+ margin: 0;
1562
+ }
1563
+ .form-field.is-inline-bool {
1564
+ flex-direction: row;
1565
+ align-items: center;
1566
+ gap: 10px;
1567
+ }
1568
+ .form-field.is-inline-bool .form-label {
1569
+ order: 2;
1570
+ flex: 1 1 auto;
1571
+ }
1572
+ .form-field.is-inline-bool .form-checkbox {
1573
+ order: 1;
1574
+ accent-color: var(--va-primary);
1575
+ width: 18px;
1576
+ height: 18px;
1577
+ margin: 0;
1578
+ }
1579
+
1580
+ /* ---- Step-back button (sits beside cancel on stepper forms) ---- */
1581
+ .form-step-back {
1582
+ font-family: inherit;
1583
+ font-size: 13.5px;
1584
+ font-weight: 600;
1585
+ padding: 11px 14px;
1586
+ border-radius: 999px;
1587
+ border: none;
1588
+ cursor: pointer;
1589
+ background: color-mix(in srgb, var(--va-text) 8%, transparent);
1590
+ color: var(--va-text);
1591
+ transition: background 0.15s ease;
1592
+ }
1593
+ .form-step-back:hover:not(:disabled) {
1594
+ background: color-mix(in srgb, var(--va-text) 14%, transparent);
1595
+ }
1596
+ .form-step-back:disabled { opacity: 0.55; cursor: not-allowed; }
1597
+ .form-step-back[hidden] { display: none; }
1598
+
1599
+ /* ───────── Audio settings drawer ───────── */
1600
+
1601
+ .ctl-settings.is-active {
1602
+ background: color-mix(in srgb, var(--va-primary) 22%, transparent);
1603
+ color: var(--va-primary);
1604
+ }
1605
+ .ctl-settings[hidden] { display: none; }
1606
+
1607
+ .audio-drawer {
1608
+ position: absolute;
1609
+ left: 0;
1610
+ right: 0;
1611
+ bottom: 0;
1612
+ max-height: 80%;
1613
+ background: var(--va-background);
1614
+ border-top: 1px solid color-mix(in srgb, var(--va-text) 8%, transparent);
1615
+ box-shadow: 0 -16px 32px -16px rgba(0, 0, 0, 0.18);
1616
+ display: flex;
1617
+ flex-direction: column;
1618
+ border-top-left-radius: 18px;
1619
+ border-top-right-radius: 18px;
1620
+ z-index: 6;
1621
+ transform: translateY(8px);
1622
+ opacity: 0;
1623
+ transition: transform 0.18s ease, opacity 0.18s ease;
1624
+ pointer-events: none;
1625
+ }
1626
+ .audio-drawer.is-open {
1627
+ transform: translateY(0);
1628
+ opacity: 1;
1629
+ pointer-events: auto;
1630
+ }
1631
+ .audio-drawer[hidden] { display: none; }
1632
+
1633
+ .audio-drawer-head {
1634
+ display: flex;
1635
+ align-items: center;
1636
+ justify-content: space-between;
1637
+ padding: 14px 16px 8px;
1638
+ border-bottom: 1px solid color-mix(in srgb, var(--va-text) 6%, transparent);
1639
+ }
1640
+ .audio-drawer-title {
1641
+ font-weight: 600;
1642
+ font-size: 14px;
1643
+ color: var(--va-text);
1644
+ }
1645
+ .audio-drawer-close {
1646
+ width: 28px;
1647
+ height: 28px;
1648
+ border-radius: 50%;
1649
+ border: none;
1650
+ background: transparent;
1651
+ color: var(--va-text-muted);
1652
+ cursor: pointer;
1653
+ display: inline-flex;
1654
+ align-items: center;
1655
+ justify-content: center;
1656
+ }
1657
+ .audio-drawer-close svg { width: 16px; height: 16px; }
1658
+ .audio-drawer-close:hover {
1659
+ background: color-mix(in srgb, var(--va-text) 8%, transparent);
1660
+ color: var(--va-text);
1661
+ }
1662
+
1663
+ .audio-drawer-body {
1664
+ padding: 12px 16px 18px;
1665
+ overflow-y: auto;
1666
+ display: flex;
1667
+ flex-direction: column;
1668
+ gap: 10px;
1669
+ }
1670
+
1671
+ .audio-row {
1672
+ display: flex;
1673
+ flex-direction: column;
1674
+ gap: 6px;
1675
+ }
1676
+ .audio-row-label {
1677
+ font-size: 12px;
1678
+ font-weight: 500;
1679
+ color: var(--va-text-muted);
1680
+ display: flex;
1681
+ justify-content: space-between;
1682
+ align-items: center;
1683
+ }
1684
+ .audio-volume-value {
1685
+ font-variant-numeric: tabular-nums;
1686
+ color: var(--va-text);
1687
+ font-size: 12px;
1688
+ }
1689
+ .audio-row-meter .audio-meter {
1690
+ height: 6px;
1691
+ border-radius: 999px;
1692
+ background: color-mix(in srgb, var(--va-text) 10%, transparent);
1693
+ overflow: hidden;
1694
+ }
1695
+ .audio-meter-bar {
1696
+ height: 100%;
1697
+ width: 0%;
1698
+ background: linear-gradient(90deg, var(--va-primary), var(--va-accent));
1699
+ transition: width 0.08s linear;
1700
+ }
1701
+
1702
+ .audio-row-select select,
1703
+ .audio-row-slider input[type="range"] {
1704
+ width: 100%;
1705
+ font-family: inherit;
1706
+ }
1707
+ .audio-row-select select {
1708
+ padding: 8px 10px;
1709
+ border-radius: 10px;
1710
+ border: 1px solid color-mix(in srgb, var(--va-text) 14%, transparent);
1711
+ background: var(--va-surface);
1712
+ color: var(--va-text);
1713
+ font-size: 13px;
1714
+ }
1715
+ .audio-row-select select:focus {
1716
+ outline: 2px solid color-mix(in srgb, var(--va-primary) 35%, transparent);
1717
+ outline-offset: 1px;
1718
+ }
1719
+ .audio-row-slider input[type="range"] {
1720
+ -webkit-appearance: none;
1721
+ appearance: none;
1722
+ height: 4px;
1723
+ background: color-mix(in srgb, var(--va-text) 12%, transparent);
1724
+ border-radius: 999px;
1725
+ }
1726
+ .audio-row-slider input[type="range"]::-webkit-slider-thumb {
1727
+ -webkit-appearance: none;
1728
+ appearance: none;
1729
+ width: 16px;
1730
+ height: 16px;
1731
+ border-radius: 50%;
1732
+ background: var(--va-primary);
1733
+ cursor: pointer;
1734
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);
1735
+ }
1736
+ .audio-row-slider input[type="range"]::-moz-range-thumb {
1737
+ width: 16px;
1738
+ height: 16px;
1739
+ border-radius: 50%;
1740
+ background: var(--va-primary);
1741
+ border: none;
1742
+ cursor: pointer;
1743
+ }
1744
+
1745
+ .audio-toggles {
1746
+ display: flex;
1747
+ flex-direction: column;
1748
+ gap: 2px;
1749
+ margin-top: 2px;
1750
+ }
1751
+ .audio-toggle {
1752
+ display: flex;
1753
+ align-items: center;
1754
+ gap: 12px;
1755
+ padding: 8px 0;
1756
+ border-bottom: 1px solid color-mix(in srgb, var(--va-text) 6%, transparent);
1757
+ }
1758
+ .audio-toggle:last-child { border-bottom: none; }
1759
+ .audio-toggle-text {
1760
+ flex: 1 1 auto;
1761
+ display: flex;
1762
+ flex-direction: column;
1763
+ gap: 2px;
1764
+ }
1765
+ .audio-toggle-label {
1766
+ font-size: 13px;
1767
+ font-weight: 500;
1768
+ color: var(--va-text);
1769
+ }
1770
+ .audio-toggle-hint {
1771
+ font-size: 11.5px;
1772
+ color: var(--va-text-muted);
1773
+ }
1774
+ .audio-toggle input[type="checkbox"] {
1775
+ appearance: none;
1776
+ -webkit-appearance: none;
1777
+ width: 36px;
1778
+ height: 20px;
1779
+ border-radius: 999px;
1780
+ background: color-mix(in srgb, var(--va-text) 18%, transparent);
1781
+ position: relative;
1782
+ cursor: pointer;
1783
+ transition: background 0.15s ease;
1784
+ flex-shrink: 0;
1785
+ margin: 0;
1786
+ }
1787
+ .audio-toggle input[type="checkbox"]::after {
1788
+ content: "";
1789
+ position: absolute;
1790
+ width: 16px;
1791
+ height: 16px;
1792
+ border-radius: 50%;
1793
+ background: #ffffff;
1794
+ top: 2px;
1795
+ left: 2px;
1796
+ transition: left 0.15s ease;
1797
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
1798
+ }
1799
+ .audio-toggle input[type="checkbox"]:checked {
1800
+ background: var(--va-primary);
1801
+ }
1802
+ .audio-toggle input[type="checkbox"]:checked::after {
1803
+ left: 18px;
1804
+ }
1805
+ .audio-toggle input[type="checkbox"]:disabled {
1806
+ opacity: 0.5;
1807
+ cursor: not-allowed;
1808
+ }
1809
+
1810
+ .audio-diag {
1811
+ margin-top: 4px;
1812
+ border-top: 1px solid color-mix(in srgb, var(--va-text) 6%, transparent);
1813
+ padding-top: 8px;
1814
+ }
1815
+ .audio-diag summary {
1816
+ font-size: 12px;
1817
+ font-weight: 500;
1818
+ color: var(--va-text-muted);
1819
+ cursor: pointer;
1820
+ user-select: none;
1821
+ padding: 4px 0;
1822
+ }
1823
+ .audio-diag summary::marker { color: var(--va-text-muted); }
1824
+ .audio-diag-list {
1825
+ display: grid;
1826
+ grid-template-columns: max-content 1fr;
1827
+ gap: 4px 12px;
1828
+ margin: 8px 0 0;
1829
+ font-size: 11.5px;
1830
+ }
1831
+ .audio-diag-list dt {
1832
+ color: var(--va-text-muted);
1833
+ }
1834
+ .audio-diag-list dd {
1835
+ color: var(--va-text);
1836
+ margin: 0;
1837
+ font-variant-numeric: tabular-nums;
1838
+ }