@lofcz/orb-ui 0.7.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 (37) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +330 -0
  3. package/dist/adapters/audio-level.d.ts +28 -0
  4. package/dist/adapters/elevenlabs/index.d.ts +85 -0
  5. package/dist/adapters/gemini-live/index.d.ts +70 -0
  6. package/dist/adapters/index.d.ts +8 -0
  7. package/dist/adapters/livekit/browser.d.ts +49 -0
  8. package/dist/adapters/livekit/index.d.ts +136 -0
  9. package/dist/adapters/openai-realtime/index.d.ts +37 -0
  10. package/dist/adapters/pipecat/index.d.ts +62 -0
  11. package/dist/adapters/types.d.ts +7 -0
  12. package/dist/adapters/vapi/index.d.ts +42 -0
  13. package/dist/adapters.cjs +1 -0
  14. package/dist/adapters.js +829 -0
  15. package/dist/components/Orb/Orb.d.ts +2 -0
  16. package/dist/components/Orb/Orb.types.d.ts +87 -0
  17. package/dist/components/Orb/index.d.ts +2 -0
  18. package/dist/components/Orb/signals.d.ts +3 -0
  19. package/dist/index.d.ts +4 -0
  20. package/dist/livekit-D-s4sYba.cjs +1 -0
  21. package/dist/livekit-Z3IMmWaG.js +316 -0
  22. package/dist/livekit-adapter.cjs +1 -0
  23. package/dist/livekit-adapter.js +30 -0
  24. package/dist/orb-ui.cjs +203 -0
  25. package/dist/orb-ui.js +984 -0
  26. package/dist/themes/bars/BarsTheme.d.ts +14 -0
  27. package/dist/themes/bars/index.d.ts +1 -0
  28. package/dist/themes/circle/CircleTheme.d.ts +14 -0
  29. package/dist/themes/circle/index.d.ts +1 -0
  30. package/dist/themes/cloud/CloudTheme.d.ts +14 -0
  31. package/dist/themes/cloud/index.d.ts +1 -0
  32. package/dist/themes/debug/DebugTheme.d.ts +15 -0
  33. package/dist/themes/debug/index.d.ts +1 -0
  34. package/dist/themes/index.d.ts +5 -0
  35. package/dist/themes/radial/RadialTheme.d.ts +13 -0
  36. package/dist/themes/radial/index.d.ts +1 -0
  37. package/package.json +122 -0
package/dist/orb-ui.js ADDED
@@ -0,0 +1,984 @@
1
+ import { useCallback as e, useEffect as t, useLayoutEffect as n, useRef as r, useState as i } from "react";
2
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
3
+ //#region src/components/Orb/signals.ts
4
+ function s(e, t, n) {
5
+ return e ?? t?.state ?? n.state;
6
+ }
7
+ function c(e, t, n) {
8
+ return e === void 0 ? t === "listening" ? n.inputVolume ?? n.volume ?? 0 : t === "speaking" ? n.outputVolume ?? n.volume ?? 0 : n.volume ?? 0 : e;
9
+ }
10
+ //#endregion
11
+ //#region src/themes/debug/DebugTheme.tsx
12
+ var l = [
13
+ "idle",
14
+ "connecting",
15
+ "listening",
16
+ "thinking",
17
+ "speaking",
18
+ "error"
19
+ ], u = {
20
+ idle: "#888",
21
+ connecting: "#f0c040",
22
+ listening: "#40c0f0",
23
+ thinking: "#c084fc",
24
+ speaking: "#40f080",
25
+ error: "#f04040"
26
+ };
27
+ function d({ state: e, volume: t, size: n, className: r, style: i, disabled: s = !1, onStart: c, onStop: d, ...f }) {
28
+ return /* @__PURE__ */ o("div", {
29
+ ...f,
30
+ className: r,
31
+ style: {
32
+ width: n,
33
+ fontFamily: "monospace",
34
+ fontSize: 12,
35
+ background: "#111",
36
+ color: "#ccc",
37
+ border: "1px solid #333",
38
+ borderRadius: 8,
39
+ padding: 12,
40
+ boxSizing: "border-box",
41
+ userSelect: "none",
42
+ ...i
43
+ },
44
+ children: [
45
+ /* @__PURE__ */ a("div", {
46
+ style: {
47
+ color: "#555",
48
+ marginBottom: 10,
49
+ fontSize: 10,
50
+ letterSpacing: 1
51
+ },
52
+ children: "ORB DEBUG"
53
+ }),
54
+ /* @__PURE__ */ o("div", {
55
+ style: { marginBottom: 8 },
56
+ children: [/* @__PURE__ */ a("span", {
57
+ style: { color: "#555" },
58
+ children: "state "
59
+ }), /* @__PURE__ */ a("span", {
60
+ style: {
61
+ color: u[e],
62
+ fontWeight: "bold"
63
+ },
64
+ children: e
65
+ })]
66
+ }),
67
+ /* @__PURE__ */ o("div", {
68
+ style: { marginBottom: 10 },
69
+ children: [
70
+ /* @__PURE__ */ a("span", {
71
+ style: { color: "#555" },
72
+ children: "volume "
73
+ }),
74
+ /* @__PURE__ */ a("span", {
75
+ style: { color: "#ccc" },
76
+ children: t.toFixed(2)
77
+ }),
78
+ /* @__PURE__ */ a("div", {
79
+ style: {
80
+ marginTop: 4,
81
+ height: 4,
82
+ background: "#222",
83
+ borderRadius: 2,
84
+ overflow: "hidden"
85
+ },
86
+ children: /* @__PURE__ */ a("div", { style: {
87
+ height: "100%",
88
+ width: `${t * 100}%`,
89
+ background: u[e],
90
+ borderRadius: 2,
91
+ transition: "width 50ms linear"
92
+ } })
93
+ })
94
+ ]
95
+ }),
96
+ /* @__PURE__ */ o("div", {
97
+ style: { marginBottom: 10 },
98
+ children: [/* @__PURE__ */ a("div", {
99
+ style: {
100
+ color: "#555",
101
+ marginBottom: 4,
102
+ fontSize: 10
103
+ },
104
+ children: "force state"
105
+ }), /* @__PURE__ */ a("div", {
106
+ style: {
107
+ display: "flex",
108
+ flexWrap: "wrap",
109
+ gap: 4
110
+ },
111
+ children: l.map((t) => /* @__PURE__ */ a("button", {
112
+ disabled: s,
113
+ style: {
114
+ fontSize: 10,
115
+ padding: "2px 6px",
116
+ background: e === t ? u[t] : "#222",
117
+ color: e === t ? "#000" : "#888",
118
+ border: `1px solid ${e === t ? u[t] : "#333"}`,
119
+ borderRadius: 3,
120
+ cursor: s ? "not-allowed" : "pointer"
121
+ },
122
+ onClick: () => {
123
+ console.warn(`[orb-ui debug] To force state '${t}', use controlled mode: <Orb state="${t}" />`);
124
+ },
125
+ children: t
126
+ }, t))
127
+ })]
128
+ }),
129
+ /* @__PURE__ */ o("div", {
130
+ style: {
131
+ display: "flex",
132
+ gap: 6
133
+ },
134
+ children: [/* @__PURE__ */ a("button", {
135
+ disabled: s,
136
+ onClick: c,
137
+ style: {
138
+ flex: 1,
139
+ padding: "4px 0",
140
+ background: "#1a3a1a",
141
+ color: "#40f080",
142
+ border: "1px solid #40f080",
143
+ borderRadius: 4,
144
+ cursor: s ? "not-allowed" : "pointer",
145
+ fontSize: 11
146
+ },
147
+ children: "Start"
148
+ }), /* @__PURE__ */ a("button", {
149
+ disabled: s,
150
+ onClick: d,
151
+ style: {
152
+ flex: 1,
153
+ padding: "4px 0",
154
+ background: "#3a1a1a",
155
+ color: "#f04040",
156
+ border: "1px solid #f04040",
157
+ borderRadius: 4,
158
+ cursor: s ? "not-allowed" : "pointer",
159
+ fontSize: 11
160
+ },
161
+ children: "Stop"
162
+ })]
163
+ })
164
+ ]
165
+ });
166
+ }
167
+ //#endregion
168
+ //#region src/themes/circle/CircleTheme.tsx
169
+ var f = typeof window < "u" ? n : t;
170
+ function p(e) {
171
+ return [
172
+ parseInt(e.slice(1, 3), 16),
173
+ parseInt(e.slice(3, 5), 16),
174
+ parseInt(e.slice(5, 7), 16)
175
+ ];
176
+ }
177
+ var m = {
178
+ idle: "#cccccc",
179
+ connecting: "#cccccc",
180
+ listening: "#999999",
181
+ thinking: "#d8d8d8",
182
+ speaking: "#e8e8e8",
183
+ error: "#f87171"
184
+ }, h = "\n@keyframes orb-circle-idle-pulse {\n from { transform: scale(1); }\n to { transform: scale(1.06); }\n}\n@keyframes orb-circle-connecting-pulse {\n 0% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.6; transform: scale(0.95); }\n 100% { opacity: 1; transform: scale(1); }\n}\n", g = .95, _ = .08, v = .82, y = .18, b = 24, x = 0, S = .55, C = .12, w = .002;
185
+ function T({ state: e, volume: n, size: i, className: s, style: c, disabled: l = !1, interactive: u = !1, onClick: d, ...T }) {
186
+ let E = r(null), D = r(null), O = r(null), k = r(0), A = r(n);
187
+ f(() => {
188
+ A.current = n;
189
+ }, [n]);
190
+ let j = r(1), M = r(0), N = r(p(m.idle)), P = .06, F = r(v), I = r(y);
191
+ t(() => {
192
+ let e = "orb-circle-keyframes";
193
+ if (!document.getElementById(e)) {
194
+ let t = document.createElement("style");
195
+ t.id = e, t.textContent = h, document.head.appendChild(t);
196
+ }
197
+ }, []), t(() => {
198
+ let t = E.current;
199
+ if (t) {
200
+ if (e === "listening" || e === "speaking") {
201
+ let n = e === "speaking" ? g : v, r = e === "speaking" ? _ : y, i = e === "speaking" ? b : x, a = () => {
202
+ let o = A.current;
203
+ F.current += (n - F.current) * P, I.current += (r - I.current) * P;
204
+ let s = F.current + o * I.current, c = o * i;
205
+ e === "listening" ? (j.current += (s - j.current) * S, M.current += (c - M.current) * S) : (j.current = s, M.current = c);
206
+ let l = p(m[e]), [u, d, f] = N.current;
207
+ N.current = [
208
+ u + (l[0] - u) * .05,
209
+ d + (l[1] - d) * .05,
210
+ f + (l[2] - f) * .05
211
+ ];
212
+ let [h, g, _] = N.current.map(Math.round);
213
+ t.style.transform = `scale(${j.current})`, t.style.background = `rgb(${h},${g},${_})`, t.style.boxShadow = "none", t.style.animation = "none";
214
+ let v = D.current;
215
+ if (v) {
216
+ let e = M.current;
217
+ v.style.transform = `scale(${j.current})`, v.style.boxShadow = e > .5 ? `0 0 ${e}px ${e * .4}px rgb(${h},${g},${_})` : "none";
218
+ }
219
+ k.current = requestAnimationFrame(a);
220
+ };
221
+ return k.current = requestAnimationFrame(a), () => {
222
+ cancelAnimationFrame(k.current);
223
+ };
224
+ }
225
+ {
226
+ cancelAnimationFrame(k.current);
227
+ let n = m[e] ?? m.idle, r = p(n), i = () => {
228
+ j.current += (1 - j.current) * C, M.current += (0 - M.current) * C;
229
+ let [a, o, s] = N.current;
230
+ N.current = [
231
+ a + (r[0] - a) * C,
232
+ o + (r[1] - o) * C,
233
+ s + (r[2] - s) * C
234
+ ];
235
+ let [c, l, u] = N.current.map(Math.round);
236
+ t.style.transform = `scale(${j.current})`, t.style.background = `rgb(${c},${l},${u})`, t.style.boxShadow = "none", t.style.animation = "none", D.current && (D.current.style.transform = `scale(${j.current})`, D.current.style.boxShadow = "none");
237
+ let d = Math.abs(j.current - 1) < w, f = M.current < .1, p = N.current.every((e, t) => Math.abs(e - r[t]) < 1);
238
+ if (d && f && p) {
239
+ j.current = 1, M.current = 0, N.current = r, t.style.transform = "", t.style.boxShadow = "none", t.style.background = n, D.current && (D.current.style.transform = "scale(1)", D.current.style.boxShadow = "none"), e === "idle" ? t.style.animation = "orb-circle-idle-pulse 3s ease-in-out infinite alternate" : e === "connecting" || e === "thinking" ? t.style.animation = "orb-circle-connecting-pulse 1.5s ease-in-out infinite" : t.style.animation = "none";
240
+ return;
241
+ }
242
+ k.current = requestAnimationFrame(i);
243
+ };
244
+ return k.current = requestAnimationFrame(i), () => cancelAnimationFrame(k.current);
245
+ }
246
+ }
247
+ }, [e]);
248
+ let L = i * .55, R = {
249
+ width: i,
250
+ height: i,
251
+ display: "flex",
252
+ alignItems: "center",
253
+ justifyContent: "center",
254
+ position: "relative",
255
+ ...c
256
+ }, z = /* @__PURE__ */ o("span", {
257
+ ref: O,
258
+ onMouseEnter: () => {
259
+ O.current && u && !l && (O.current.style.transform = "scale(1.06)", O.current.style.filter = "brightness(1.12)");
260
+ },
261
+ onMouseLeave: () => {
262
+ O.current && (O.current.style.transform = "scale(1)", O.current.style.filter = "brightness(1)");
263
+ },
264
+ onTouchEnd: () => {
265
+ setTimeout(() => {
266
+ O.current && (O.current.style.transform = "scale(1)", O.current.style.filter = "brightness(1)");
267
+ }, 200);
268
+ },
269
+ style: {
270
+ position: "relative",
271
+ display: "inline-block",
272
+ transition: "transform 0.3s ease, filter 0.3s ease",
273
+ cursor: u ? l ? "not-allowed" : "pointer" : "default",
274
+ borderRadius: "50%",
275
+ lineHeight: 0
276
+ },
277
+ children: [/* @__PURE__ */ a("span", {
278
+ ref: D,
279
+ style: {
280
+ position: "absolute",
281
+ display: "block",
282
+ width: L,
283
+ height: L,
284
+ borderRadius: "50%",
285
+ pointerEvents: "none"
286
+ }
287
+ }), /* @__PURE__ */ a("span", {
288
+ ref: E,
289
+ style: {
290
+ position: "relative",
291
+ display: "block",
292
+ width: L,
293
+ height: L,
294
+ borderRadius: "50%",
295
+ background: m[e]
296
+ }
297
+ })]
298
+ });
299
+ return u ? /* @__PURE__ */ a("button", {
300
+ ...T,
301
+ type: "button",
302
+ className: s,
303
+ disabled: l,
304
+ onClick: l ? void 0 : d,
305
+ style: {
306
+ appearance: "none",
307
+ WebkitAppearance: "none",
308
+ border: 0,
309
+ padding: 0,
310
+ margin: 0,
311
+ background: "transparent",
312
+ color: "inherit",
313
+ font: "inherit",
314
+ cursor: l ? "not-allowed" : "pointer",
315
+ ...R
316
+ },
317
+ children: z
318
+ }) : /* @__PURE__ */ a("div", {
319
+ ...T,
320
+ className: s,
321
+ style: R,
322
+ children: z
323
+ });
324
+ }
325
+ //#endregion
326
+ //#region src/themes/bars/BarsTheme.tsx
327
+ var E = 5, D = 1.4, O = Math.PI * 2 / E, k = {
328
+ idle: "#cccccc",
329
+ connecting: "#cccccc",
330
+ listening: "#999999",
331
+ thinking: "#d8d8d8",
332
+ speaking: "#e8e8e8",
333
+ error: "#f87171"
334
+ };
335
+ function A(e) {
336
+ return [
337
+ parseInt(e.slice(1, 3), 16),
338
+ parseInt(e.slice(3, 5), 16),
339
+ parseInt(e.slice(5, 7), 16)
340
+ ];
341
+ }
342
+ function j({ state: e, volume: n, size: i, className: o, style: s, disabled: c = !1, interactive: l = !1, onClick: u, ...d }) {
343
+ let f = r([]), p = r(null), m = r(0), h = r(Array(E).fill(0)), g = r(n), _ = r(!1), v = r(0), y = r(A(k.idle)), b = r(null), x = r(Array(E).fill(0)), S = r(e);
344
+ t(() => {
345
+ e !== S.current && (x.current = [...h.current], b.current = Date.now(), S.current = e);
346
+ }, [e]), t(() => {
347
+ g.current = n;
348
+ }, [n]), t(() => {
349
+ let t = i * .55, n = i * .06, r = k[e] ?? k.idle, a = i * .1, o = Array.from({ length: E }, (e, t) => 1 - .7 * (Math.abs(t - 2) / 2)), s = () => {
350
+ let e = l && !c, t = _.current && e ? a : 0;
351
+ v.current += (t - v.current) * .15;
352
+ }, u = (n, r) => {
353
+ s();
354
+ let i = A(r), [a, c, l] = y.current;
355
+ y.current = [
356
+ a + (i[0] - a) * .08,
357
+ c + (i[1] - c) * .08,
358
+ l + (i[2] - l) * .08
359
+ ];
360
+ let [u, d, p] = y.current.map(Math.round), m = `rgb(${u},${d},${p})`;
361
+ for (let r = 0; r < E; r++) {
362
+ let i = f.current[r];
363
+ if (!i) continue;
364
+ let a = e === "idle" ? o[r] : 1, s = v.current * a;
365
+ i.style.height = `${Math.min(n[r] + s, t)}px`, i.style.background = m, i.style.animation = "none";
366
+ }
367
+ };
368
+ if (e === "listening" || e === "speaking") {
369
+ let i = e === "speaking" ? 1 : .4, a = () => {
370
+ let o = g.current, s = Date.now() / 1e3;
371
+ for (let r = 0; r < E; r++) {
372
+ let a = .5 + .15 * Math.sin(s * D * i * Math.PI * 2 + r * O), c = n + (t - n) * o * a;
373
+ if (b.current !== null) {
374
+ let e = Date.now() - b.current, t = Math.min(e / 300, 1), n = 1 - (1 - t) * (1 - t);
375
+ c = x.current[r] + (c - x.current[r]) * n, t >= 1 && (b.current = null);
376
+ }
377
+ let l = e === "listening" ? .45 : 1;
378
+ h.current[r] += (c - h.current[r]) * l;
379
+ }
380
+ u(h.current, r), m.current = requestAnimationFrame(a);
381
+ };
382
+ return m.current = requestAnimationFrame(a), () => cancelAnimationFrame(m.current);
383
+ }
384
+ if (e === "connecting" || e === "thinking") {
385
+ let e = Date.now(), i = () => {
386
+ let a = (Date.now() - e) / 1e3;
387
+ s();
388
+ for (let e = 0; e < E; e++) {
389
+ let r = (a * .6 + e / E * .5) % 1, i = r < .5 ? Math.sin(r / .5 * Math.PI) : 0, o = n + (t * .4 - n) * i;
390
+ h.current[e] += (o - h.current[e]) * .15;
391
+ }
392
+ u(h.current, r), m.current = requestAnimationFrame(i);
393
+ };
394
+ return m.current = requestAnimationFrame(i), () => cancelAnimationFrame(m.current);
395
+ }
396
+ cancelAnimationFrame(m.current);
397
+ let d = () => {
398
+ s();
399
+ for (let e = 0; e < E; e++) h.current[e] += (n - h.current[e]) * .16;
400
+ u(h.current, r), m.current = requestAnimationFrame(d);
401
+ };
402
+ return m.current = requestAnimationFrame(d), () => cancelAnimationFrame(m.current);
403
+ }, [e, i]);
404
+ let C = i * .055, w = i * .035, T = i * .03, j = i * .55, M = i * .06, N = {
405
+ width: i,
406
+ height: i,
407
+ display: "flex",
408
+ alignItems: "center",
409
+ justifyContent: "center",
410
+ position: "relative",
411
+ ...s
412
+ }, P = /* @__PURE__ */ a("span", {
413
+ ref: p,
414
+ onMouseEnter: () => {
415
+ l && !c && (_.current = !0, p.current && (p.current.style.filter = "brightness(1.35)"));
416
+ },
417
+ onMouseLeave: () => {
418
+ _.current = !1, p.current && (p.current.style.filter = "brightness(1)");
419
+ },
420
+ onTouchEnd: () => {
421
+ setTimeout(() => {
422
+ _.current = !1, p.current && (p.current.style.filter = "brightness(1)");
423
+ }, 200);
424
+ },
425
+ style: {
426
+ display: "flex",
427
+ alignItems: "center",
428
+ justifyContent: "center",
429
+ gap: w,
430
+ transition: "filter 0.3s ease",
431
+ cursor: l ? c ? "not-allowed" : "pointer" : "default"
432
+ },
433
+ children: Array.from({ length: E }, (t, n) => /* @__PURE__ */ a("span", {
434
+ ref: (e) => {
435
+ f.current[n] = e;
436
+ },
437
+ style: {
438
+ width: C,
439
+ minHeight: M,
440
+ maxHeight: j,
441
+ height: M,
442
+ borderRadius: T,
443
+ background: k[e] ?? k.idle
444
+ }
445
+ }, n))
446
+ });
447
+ return l ? /* @__PURE__ */ a("button", {
448
+ ...d,
449
+ type: "button",
450
+ className: o,
451
+ disabled: c,
452
+ onClick: c ? void 0 : u,
453
+ style: {
454
+ appearance: "none",
455
+ WebkitAppearance: "none",
456
+ border: 0,
457
+ padding: 0,
458
+ margin: 0,
459
+ background: "transparent",
460
+ color: "inherit",
461
+ font: "inherit",
462
+ cursor: c ? "not-allowed" : "pointer",
463
+ ...N
464
+ },
465
+ children: P
466
+ }) : /* @__PURE__ */ a("div", {
467
+ ...d,
468
+ className: o,
469
+ style: N,
470
+ children: P
471
+ });
472
+ }
473
+ //#endregion
474
+ //#region src/themes/cloud/CloudTheme.tsx
475
+ var M = typeof window < "u" ? n : t, N = "\nattribute vec2 a_position;\n\nvoid main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n}\n", P = "\nprecision highp float;\n\nuniform vec2 u_resolution;\nuniform float u_time;\nuniform float u_activity;\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n\n return mix(\n mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x),\n mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), u.x),\n u.y\n );\n}\n\nfloat fbm(vec2 p) {\n float value = 0.0;\n float amplitude = 0.52;\n mat2 rotation = mat2(0.80, 0.60, -0.60, 0.80);\n\n for (int octave = 0; octave < 5; octave++) {\n value += amplitude * noise(p);\n p = rotation * p * 1.92 + vec2(9.7, 4.3);\n amplitude *= 0.5;\n }\n\n return value;\n}\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / u_resolution;\n vec2 centered = uv - 0.5;\n float radius = length(centered);\n float edge = 1.0 - smoothstep(0.488, 0.5, radius);\n\n if (edge <= 0.0) discard;\n\n vec2 p = centered * 2.0;\n float t = u_time;\n\n vec2 warp = vec2(\n fbm(p * 1.02 + vec2(t * 0.34, -t * 0.24)),\n fbm(p * 1.08 + vec2(-t * 0.27, t * 0.32) + vec2(6.7, 2.9))\n );\n vec2 curl = vec2(\n sin(p.y * 2.4 + t * 0.68 + warp.y * 3.2),\n cos(p.x * 2.1 - t * 0.61 + warp.x * 3.0)\n );\n vec2 warped =\n p +\n (warp - 0.5) * (1.18 + u_activity * 0.38) +\n curl * (0.035 + u_activity * 0.07);\n float broad = fbm(warped * 0.92 + vec2(t * 0.14, -t * 0.18));\n float folded = fbm(warped * 1.66 + vec2(-t * 0.23, t * 0.19) + 5.2);\n float field = mix(broad, folded, 0.3 + u_activity * 0.14);\n\n float horizon =\n 0.46 +\n 0.08 * sin((uv.x + warp.x * 0.2) * 5.4 + t * 0.42) +\n 0.16 * (broad - 0.5);\n float upper = smoothstep(horizon - 0.12, horizon + 0.08, uv.y);\n float band = exp(-pow((uv.y - horizon) * (5.2 + u_activity * 0.8), 2.0));\n float cloud = smoothstep(0.24, 0.79, field);\n\n vec3 deepPeriwinkle = vec3(0.36, 0.39, 0.985);\n vec3 upperPeriwinkle = vec3(0.48, 0.56, 0.985);\n vec3 lowerLavender = vec3(0.72, 0.78, 0.975);\n vec3 milk = vec3(0.89, 0.92, 0.995);\n\n vec3 color = mix(lowerLavender, upperPeriwinkle, upper);\n float upperDepth = upper * (0.14 + smoothstep(0.42, 0.78, folded) * 0.5);\n color = mix(color, deepPeriwinkle, upperDepth);\n\n float milkAmount = clamp(band * (0.42 + cloud * 0.62), 0.0, 0.88);\n color = mix(color, milk, milkAmount);\n\n float lowerMist = (1.0 - upper) * smoothstep(0.58, 0.9, broad) * 0.18;\n color = mix(color, milk, lowerMist);\n\n float grain = (noise(gl_FragCoord.xy * 0.64) - 0.5) / 255.0;\n color += grain;\n\n gl_FragColor = vec4(color, edge);\n}\n", F = .55, I = .204, L = .2145, R = .063, z = "#5659dc", ee = 1.178, B = 180, V = 300, H = 1350, te = 246, U = 420, ne = 354, re = 480;
476
+ function W(e, t = 0, n = 1) {
477
+ return Math.min(n, Math.max(t, e));
478
+ }
479
+ function G(e, t, n, r) {
480
+ return e + (t - e) * (1 - Math.exp(-n * r));
481
+ }
482
+ function ie(e) {
483
+ return 1 - (1 - e) ** 3;
484
+ }
485
+ function K(e, t, n) {
486
+ return e + (t - e) * n;
487
+ }
488
+ function q(e, t, n) {
489
+ let r = W((e - t) / (n - t));
490
+ return r * r * (3 - 2 * r);
491
+ }
492
+ function J(e) {
493
+ return e === "listening" || e === "speaking" || e === "thinking";
494
+ }
495
+ function Y(e, t, n) {
496
+ let r = e.createShader(t);
497
+ if (r) {
498
+ if (e.shaderSource(r, n), e.compileShader(r), !e.getShaderParameter(r, e.COMPILE_STATUS)) {
499
+ e.deleteShader(r);
500
+ return;
501
+ }
502
+ return r;
503
+ }
504
+ }
505
+ function ae(e, t) {
506
+ let n = e.getContext("webgl", {
507
+ alpha: !0,
508
+ antialias: !0,
509
+ premultipliedAlpha: !0
510
+ });
511
+ if (!n) return;
512
+ let r = Y(n, n.VERTEX_SHADER, N), i = Y(n, n.FRAGMENT_SHADER, P);
513
+ if (!r || !i) {
514
+ r && n.deleteShader(r), i && n.deleteShader(i);
515
+ return;
516
+ }
517
+ let a = n.createProgram(), o = n.createBuffer();
518
+ if (!a || !o) {
519
+ a && n.deleteProgram(a), o && n.deleteBuffer(o), n.deleteShader(r), n.deleteShader(i);
520
+ return;
521
+ }
522
+ if (n.attachShader(a, r), n.attachShader(a, i), n.linkProgram(a), !n.getProgramParameter(a, n.LINK_STATUS)) {
523
+ n.deleteProgram(a), n.deleteBuffer(o), n.deleteShader(r), n.deleteShader(i);
524
+ return;
525
+ }
526
+ let s = n.getAttribLocation(a, "a_position"), c = n.getUniformLocation(a, "u_resolution"), l = n.getUniformLocation(a, "u_time"), u = n.getUniformLocation(a, "u_activity");
527
+ if (s < 0 || !c || !l || !u) {
528
+ n.deleteProgram(a), n.deleteBuffer(o), n.deleteShader(r), n.deleteShader(i);
529
+ return;
530
+ }
531
+ let d = Math.min(window.devicePixelRatio || 1, 2), f = Math.max(1, Math.round(t * d));
532
+ return e.width = f, e.height = f, n.viewport(0, 0, f, f), n.useProgram(a), n.bindBuffer(n.ARRAY_BUFFER, o), n.bufferData(n.ARRAY_BUFFER, new Float32Array([
533
+ -1,
534
+ -1,
535
+ 1,
536
+ -1,
537
+ -1,
538
+ 1,
539
+ -1,
540
+ 1,
541
+ 1,
542
+ -1,
543
+ 1,
544
+ 1
545
+ ]), n.STATIC_DRAW), n.enableVertexAttribArray(s), n.vertexAttribPointer(s, 2, n.FLOAT, !1, 0, 0), n.uniform2f(c, f, f), {
546
+ draw(e, t) {
547
+ n.uniform1f(l, e), n.uniform1f(u, t), n.drawArrays(n.TRIANGLES, 0, 6);
548
+ },
549
+ destroy() {
550
+ n.deleteProgram(a), n.deleteBuffer(o), n.deleteShader(r), n.deleteShader(i);
551
+ }
552
+ };
553
+ }
554
+ function oe(e) {
555
+ if (e <= B) return R;
556
+ if (e <= 480) return K(R, ee, ie((e - B) / V));
557
+ let t = e - B - V;
558
+ return t >= H ? 1 : 1 + .17799999999999994 * (1 - W(t / H)) ** 2;
559
+ }
560
+ function se({ state: e, volume: n, size: i, className: s, style: c, disabled: l = !1, interactive: u = !1, onClick: d, ...f }) {
561
+ let p = r(null), m = r(null), h = r(null), g = r(e), _ = r(n), v = r(u), y = r(!1);
562
+ M(() => {
563
+ g.current = e, _.current = n, v.current = u;
564
+ }, [
565
+ u,
566
+ e,
567
+ n
568
+ ]);
569
+ let b = i * F;
570
+ t(() => {
571
+ let e = p.current, t = m.current, n = h.current;
572
+ if (!e || !t || !n) return;
573
+ let r = window.matchMedia("(prefers-reduced-motion: reduce)"), i = () => {
574
+ y.current = r.matches;
575
+ };
576
+ i(), r.addEventListener("change", i);
577
+ let a = ae(e, b);
578
+ a || (e.style.background = "linear-gradient(180deg, #626afb 2%, #8f9dfb 32%, #dde6fd 52%, #c9d3fb 84%)");
579
+ let o = 0, s = performance.now(), c = g.current, l = J(c) ? s : void 0, u = W(_.current), d = 1, f = +!!J(c), x = 1, S = +(c === "connecting"), C = 0, w = (r) => {
580
+ let i = Math.min((r - s) / 1e3, .05);
581
+ s = r;
582
+ let p = g.current, m = y.current;
583
+ p !== c && (J(p) && !J(c) && (l = r), (p === "idle" || p === "error") && (l = void 0), c = p);
584
+ let h = W(_.current);
585
+ u = m ? 0 : G(u, h, h > u ? 11 : 6, i);
586
+ let b = 1;
587
+ p === "listening" && (b = 1 - u * I), p === "speaking" && (b = 1 + u * L);
588
+ let T = Math.abs(b - 1) > Math.abs(d - 1) ? 12 : 6;
589
+ d = m ? 1 : G(d, b, T, i);
590
+ let E = J(p), D = p === "idle" && v.current, O = E || D ? 1 : 0;
591
+ f = m ? O : G(f, O, 14, i);
592
+ let k = E || D ? 1 : .92;
593
+ x = m ? k : G(x, k, 12, i);
594
+ let A = d * x;
595
+ D && (A = R);
596
+ let j = +!D, M = D ? f : 0;
597
+ if (E && l !== void 0 && !m) {
598
+ let e = r - l, t = oe(e), n = W((e - B - V) / H);
599
+ A = t * K(1, d, n), j = q(e, te, U), M = f * (1 - q(e, ne, re)), e >= 1830 && (l = void 0);
600
+ }
601
+ let N = +(p === "connecting");
602
+ S = m ? N : G(S, N, 18, i), e.style.opacity = String(f * j), e.style.transform = `scale(${A})`, t.style.opacity = String(M), t.style.transform = `scale(${A})`, n.style.opacity = String(S), n.style.transform = `rotate(${m ? 45 : r * .34}deg)`;
603
+ let P = .24, F = .1;
604
+ p === "listening" ? (P = .72 + u * .78, F = .28 + u * .32) : p === "speaking" && (P = 1.65 + u * 1.55, F = .66 + u * .34), m || (C += i * P), a?.draw(C, F), o = requestAnimationFrame(w);
605
+ };
606
+ return o = requestAnimationFrame(w), () => {
607
+ cancelAnimationFrame(o), r.removeEventListener("change", i), a?.destroy();
608
+ };
609
+ }, [b]);
610
+ let x = {
611
+ width: i,
612
+ height: i,
613
+ display: "flex",
614
+ alignItems: "center",
615
+ justifyContent: "center",
616
+ position: "relative",
617
+ ...c
618
+ }, S = /* @__PURE__ */ o("span", {
619
+ style: {
620
+ position: "relative",
621
+ display: "block",
622
+ width: b,
623
+ height: b,
624
+ borderRadius: "50%",
625
+ lineHeight: 0,
626
+ cursor: u ? l ? "not-allowed" : "pointer" : "default"
627
+ },
628
+ children: [
629
+ /* @__PURE__ */ a("span", {
630
+ ref: m,
631
+ "data-cloud-launch-dot": "",
632
+ "aria-hidden": "true",
633
+ style: {
634
+ position: "absolute",
635
+ inset: 0,
636
+ display: "block",
637
+ borderRadius: "50%",
638
+ background: z,
639
+ opacity: 0,
640
+ transform: `scale(${R})`,
641
+ transformOrigin: "center",
642
+ willChange: "opacity, transform"
643
+ }
644
+ }),
645
+ /* @__PURE__ */ a("canvas", {
646
+ ref: p,
647
+ "aria-hidden": "true",
648
+ style: {
649
+ position: "absolute",
650
+ inset: 0,
651
+ display: "block",
652
+ width: b,
653
+ height: b,
654
+ borderRadius: "50%",
655
+ opacity: 0,
656
+ transform: `scale(${R})`,
657
+ transformOrigin: "center",
658
+ willChange: "opacity, transform"
659
+ }
660
+ }),
661
+ /* @__PURE__ */ a("span", {
662
+ ref: h,
663
+ "aria-hidden": "true",
664
+ style: {
665
+ position: "absolute",
666
+ left: "50%",
667
+ top: "50%",
668
+ width: b * .105,
669
+ height: b * .105,
670
+ boxSizing: "border-box",
671
+ border: `${Math.max(1.5, b * .012)}px solid rgba(113, 120, 245, 0.24)`,
672
+ borderTopColor: "#777ff6",
673
+ borderRightColor: "#777ff6",
674
+ borderRadius: "50%",
675
+ opacity: 0,
676
+ transform: "rotate(0deg)",
677
+ transformOrigin: "center",
678
+ marginLeft: b * -.0525,
679
+ marginTop: b * -.0525,
680
+ willChange: "opacity, transform"
681
+ }
682
+ })
683
+ ]
684
+ });
685
+ return u ? /* @__PURE__ */ a("button", {
686
+ ...f,
687
+ type: "button",
688
+ className: s,
689
+ disabled: l,
690
+ onClick: l ? void 0 : d,
691
+ style: {
692
+ appearance: "none",
693
+ WebkitAppearance: "none",
694
+ border: 0,
695
+ padding: 0,
696
+ margin: 0,
697
+ background: "transparent",
698
+ color: "inherit",
699
+ font: "inherit",
700
+ cursor: l ? "not-allowed" : "pointer",
701
+ ...x
702
+ },
703
+ children: S
704
+ }) : /* @__PURE__ */ a("div", {
705
+ ...f,
706
+ className: s,
707
+ style: x,
708
+ children: S
709
+ });
710
+ }
711
+ //#endregion
712
+ //#region src/themes/radial/RadialTheme.tsx
713
+ var ce = typeof window < "u" ? n : t, le = "\nattribute vec2 a_position;\n\nvoid main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n}\n", ue = "\nprecision highp float;\n\nuniform vec2 u_resolution;\nuniform float u_time;\nuniform float u_rotation;\nuniform float u_listen;\nuniform float u_speak;\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / u_resolution;\n vec2 p = (uv - 0.5) * 2.0;\n float radius = length(p);\n float edge = 1.0 - smoothstep(0.993, 1.0, radius);\n\n if (edge <= 0.0) discard;\n\n float angle = atan(p.y, p.x);\n float warpStrength = 0.026 + u_speak * 0.105;\n float angularWarp =\n sin(angle * 3.0 - u_time * 0.54 + radius * 2.1) +\n 0.48 * sin(angle * 5.0 + u_time * 0.31 - radius * 3.7) +\n 0.22 * sin(angle * 8.0 - u_time * 0.19 + radius * 5.2);\n float phase =\n angle - 1.78 - u_rotation + angularWarp * warpStrength * (0.2 + radius * 0.8);\n\n // Two opposing dark lobes and two opposing aqua lobes form the main pinwheel.\n float lobeField = cos(phase * 2.0);\n float darkMix = smoothstep(-0.04, 0.38, lobeField);\n\n vec3 deepBlue = vec3(0.004, 0.105, 0.37);\n vec3 cobalt = vec3(0.015, 0.34, 0.76);\n vec3 aqua = vec3(0.24, 0.76, 0.79);\n vec3 paleAqua = vec3(0.77, 0.96, 0.95);\n\n float radialLight = 0.5 + 0.5 * sin(radius * 3.0 - u_time * 0.16);\n vec3 darkColor = mix(cobalt, deepBlue, 0.42 + 0.38 * radius);\n float darkRay = pow(max(lobeField, 0.0), 11.0);\n darkColor = mix(darkColor, aqua, darkRay * (0.18 + radialLight * 0.16));\n\n vec3 lightColor = mix(paleAqua, aqua, 0.5 + 0.2 * sin(radius * 3.4 + phase * 2.0));\n float lightRay = pow(max(-lobeField, 0.0), 5.0);\n lightColor = mix(lightColor, vec3(0.04, 0.42, 0.64), lightRay * 0.28);\n\n vec3 color = mix(lightColor, darkColor, darkMix);\n\n // Soft secondary streaks make each of the four lobes feel layered rather than flat.\n float secondaryRay = 0.5 + 0.5 * sin(phase * 6.0 + radius * 1.8 - u_time * 0.42);\n float rayStrength = (0.055 + u_speak * 0.045) * (0.25 + radius * 0.75);\n color = mix(color, vec3(0.26, 0.76, 0.8), secondaryRay * rayStrength);\n\n // The outer membrane keeps a circular perimeter while independent traveling waves\n // continuously reshape its inner boundary.\n float rimWave =\n 0.063 * sin(angle * 3.0 + u_time * 1.34) +\n 0.036 * sin(angle * 5.0 - u_time * 0.91 + 1.4) +\n 0.021 * sin(angle * 7.0 + u_time * 0.63 - 0.8) +\n 0.012 * sin(angle * 11.0 - u_time * 1.72 + sin(angle * 2.0 + u_time * 0.58));\n rimWave *= 1.0 + u_listen * 0.38;\n float rimInner = 0.82 + rimWave - u_listen * 0.2;\n float rim = smoothstep(rimInner - 0.02, rimInner + 0.015, radius);\n float rimStrength = rim * (0.3 + u_listen * 0.3);\n vec3 membrane = mix(\n vec3(0.47, 0.84, 0.84),\n vec3(0.76, 0.93, 0.92),\n smoothstep(0.78, 1.0, radius)\n );\n color = mix(color, membrane, clamp(rimStrength, 0.0, 0.72));\n\n // Only one transition direction becomes a bright seam, producing two opposing ribbons.\n float seamDirection = max(0.0, -sin(phase * 2.0));\n float seamExponent = mix(30.0, 3.2, smoothstep(0.05, 1.0, radius));\n float seam = pow(seamDirection, seamExponent) * (0.78 + radius * 0.25);\n color = mix(color, vec3(0.985, 0.995, 0.995), clamp(seam, 0.0, 0.96));\n\n // The drawing buffer uses premultiplied alpha. Premultiply the antialiased\n // perimeter so translucent edge pixels cannot become a bright outline.\n gl_FragColor = vec4(color * edge, edge);\n}\n", de = "\n@keyframes orb-radial-spinner {\n to { transform: rotate(360deg); }\n}\n@media (prefers-reduced-motion: reduce) {\n [data-radial-spinner] { animation: none !important; }\n}\n", fe = .66, pe = .2;
714
+ function X(e, t = 0, n = 1) {
715
+ return Math.min(n, Math.max(t, e));
716
+ }
717
+ function Z(e, t, n, r) {
718
+ return e + (t - e) * (1 - Math.exp(-n * r));
719
+ }
720
+ function Q(e, t, n) {
721
+ let r = e.createShader(t);
722
+ if (r) {
723
+ if (e.shaderSource(r, n), e.compileShader(r), !e.getShaderParameter(r, e.COMPILE_STATUS)) {
724
+ e.deleteShader(r);
725
+ return;
726
+ }
727
+ return r;
728
+ }
729
+ }
730
+ function me(e, t) {
731
+ let n = e.getContext("webgl", {
732
+ alpha: !0,
733
+ antialias: !0,
734
+ premultipliedAlpha: !0
735
+ });
736
+ if (!n) return;
737
+ let r = Q(n, n.VERTEX_SHADER, le), i = Q(n, n.FRAGMENT_SHADER, ue);
738
+ if (!r || !i) {
739
+ r && n.deleteShader(r), i && n.deleteShader(i);
740
+ return;
741
+ }
742
+ let a = n.createProgram(), o = n.createBuffer();
743
+ if (!a || !o) {
744
+ a && n.deleteProgram(a), o && n.deleteBuffer(o), n.deleteShader(r), n.deleteShader(i);
745
+ return;
746
+ }
747
+ if (n.attachShader(a, r), n.attachShader(a, i), n.linkProgram(a), !n.getProgramParameter(a, n.LINK_STATUS)) {
748
+ n.deleteProgram(a), n.deleteBuffer(o), n.deleteShader(r), n.deleteShader(i);
749
+ return;
750
+ }
751
+ let s = n.getAttribLocation(a, "a_position"), c = n.getUniformLocation(a, "u_resolution"), l = n.getUniformLocation(a, "u_time"), u = n.getUniformLocation(a, "u_rotation"), d = n.getUniformLocation(a, "u_listen"), f = n.getUniformLocation(a, "u_speak");
752
+ if (s < 0 || !c || !l || !u || !d || !f) {
753
+ n.deleteProgram(a), n.deleteBuffer(o), n.deleteShader(r), n.deleteShader(i);
754
+ return;
755
+ }
756
+ let p = Math.min(window.devicePixelRatio || 1, 2), m = Math.max(1, Math.round(t * p));
757
+ return e.width = m, e.height = m, n.viewport(0, 0, m, m), n.useProgram(a), n.bindBuffer(n.ARRAY_BUFFER, o), n.bufferData(n.ARRAY_BUFFER, new Float32Array([
758
+ -1,
759
+ -1,
760
+ 1,
761
+ -1,
762
+ -1,
763
+ 1,
764
+ -1,
765
+ 1,
766
+ 1,
767
+ -1,
768
+ 1,
769
+ 1
770
+ ]), n.STATIC_DRAW), n.enableVertexAttribArray(s), n.vertexAttribPointer(s, 2, n.FLOAT, !1, 0, 0), n.uniform2f(c, m, m), {
771
+ draw(e, t, r, i) {
772
+ n.uniform1f(l, e), n.uniform1f(u, t), n.uniform1f(d, r), n.uniform1f(f, i), n.drawArrays(n.TRIANGLES, 0, 6);
773
+ },
774
+ destroy() {
775
+ n.deleteProgram(a), n.deleteBuffer(o), n.deleteShader(r), n.deleteShader(i);
776
+ }
777
+ };
778
+ }
779
+ function he(e) {
780
+ return e !== "idle" && e !== "connecting" && e !== "error";
781
+ }
782
+ function ge({ active: e }) {
783
+ return /* @__PURE__ */ a("svg", {
784
+ "aria-hidden": "true",
785
+ fill: "none",
786
+ viewBox: "0 0 24 24",
787
+ style: {
788
+ display: "block",
789
+ width: "50%",
790
+ height: "50%",
791
+ transform: `rotate(${e ? 132 : -8}deg)`,
792
+ transformOrigin: "center",
793
+ transition: "transform 180ms ease"
794
+ },
795
+ children: /* @__PURE__ */ a("path", {
796
+ d: "M6.7 3.8 9.1 7a1.6 1.6 0 0 1-.2 2.1l-1.4 1.3a13.1 13.1 0 0 0 6.1 6.1l1.3-1.4a1.6 1.6 0 0 1 2.1-.2l3.2 2.4a1.6 1.6 0 0 1 .5 1.9l-.7 1.7c-.3.8-1.1 1.3-2 1.2C9.7 21.2 2.8 14.3 1.9 6c-.1-.9.4-1.7 1.2-2l1.7-.7a1.6 1.6 0 0 1 1.9.5Z",
797
+ fill: "currentColor"
798
+ })
799
+ });
800
+ }
801
+ function _e({ state: e, volume: n, size: i, className: s, style: c, disabled: l = !1, interactive: u = !1, onClick: d, ...f }) {
802
+ let p = r(null), m = r(e), h = r(n), g = r(!1);
803
+ ce(() => {
804
+ m.current = e, h.current = n;
805
+ }, [e, n]);
806
+ let _ = i * fe, v = _ * pe;
807
+ t(() => {
808
+ let e = "orb-radial-keyframes";
809
+ if (!document.getElementById(e)) {
810
+ let t = document.createElement("style");
811
+ t.id = e, t.textContent = de, document.head.appendChild(t);
812
+ }
813
+ }, []), t(() => {
814
+ let e = p.current;
815
+ if (!e) return;
816
+ let t = window.matchMedia("(prefers-reduced-motion: reduce)"), n = () => {
817
+ g.current = t.matches;
818
+ };
819
+ n(), t.addEventListener("change", n);
820
+ let r = me(e, _), i = 0, a = performance.now(), o = 0, s = .36, c = .62, l = .15, u = 0, d = 0, f = 0, v = 0, y = +(m.current === "speaking"), b = X(h.current), x = m.current === "listening" ? b : 0, S = m.current === "speaking" ? b : 0, C = (e) => {
821
+ let t = Math.min((e - a) / 1e3, .05);
822
+ a = e;
823
+ let n = m.current, p = g.current, _ = X(h.current);
824
+ b = p ? 0 : Z(b, _, _ > b ? 15 : 7, t);
825
+ let w = n === "listening" ? b : 0, T = n === "speaking" ? b : 0;
826
+ x = p ? 0 : Z(x, w, w > x ? 17 : 7, t), S = p ? 0 : Z(S, T, T > S ? 12 : 5, t);
827
+ let E = .36, D = .62, O = .15;
828
+ if (n === "connecting" ? (E = .42, D = .68, O = .13) : n === "listening" ? (E = .54 + x * .26, D = .78 + x * .18, O = .18 + x * .04) : n === "thinking" ? (E = .46, D = .72, O = .16) : n === "speaking" && (E = 1.05 + S * 1.15), !p) {
829
+ s = Z(s, E, 3.6, t), c = Z(c, D, 3.6, t), l = Z(l, O, 3.6, t), y = Z(y, +(n === "speaking"), n === "speaking" ? 3.8 : 3, t), o += t * s, f += t * c;
830
+ let e = 1.2 + S * 1.35 + Math.sin(o * 1.73) * .34 + Math.sin(o * .61 + .8) * .18;
831
+ v += t * Math.max(.65, e);
832
+ let r = Math.sin(f) * l + Math.sin(f * .47 + 1.1) * .032, i = Math.sin(v * 1.08), a = Math.sin(v * 2.47 + .9), p = Math.sin(v * .43 - .5), m = r + (i * (.13 + S * .17) + a * (.035 + S * .035) + p * .055 - r) * y, h = 4.2 + y * 3, g = h * h, _ = 2 * h;
833
+ d += ((m - u) * g - d * _) * t, u += d * t;
834
+ }
835
+ r?.draw(o, u, x, S), i = requestAnimationFrame(C);
836
+ };
837
+ return i = requestAnimationFrame(C), () => {
838
+ cancelAnimationFrame(i), t.removeEventListener("change", n), r?.destroy();
839
+ };
840
+ }, [_]);
841
+ let y = he(e), b = e === "connecting", x = _ + (u ? v * .5 : 0), S = {
842
+ "--orb-ui-radial-control-surround": "#fff",
843
+ width: i,
844
+ height: i,
845
+ display: "flex",
846
+ alignItems: "center",
847
+ justifyContent: "center",
848
+ position: "relative",
849
+ ...c
850
+ }, C = /* @__PURE__ */ o("span", {
851
+ style: {
852
+ position: "relative",
853
+ display: "block",
854
+ width: _,
855
+ height: x,
856
+ lineHeight: 0
857
+ },
858
+ children: [/* @__PURE__ */ a("canvas", {
859
+ ref: p,
860
+ "aria-hidden": "true",
861
+ "data-radial-surface": "",
862
+ style: {
863
+ position: "absolute",
864
+ left: 0,
865
+ top: 0,
866
+ display: "block",
867
+ width: _,
868
+ height: _,
869
+ borderRadius: "50%",
870
+ background: "conic-gradient(from 12deg, #06358d 0deg, #0b65b5 72deg, #c7f1ef 92deg, #45c2c8 172deg, #06358d 196deg, #0b65b5 254deg, #c7f1ef 278deg, #45c2c8 360deg)"
871
+ }
872
+ }), u ? /* @__PURE__ */ a("button", {
873
+ ...f,
874
+ type: "button",
875
+ "data-radial-control": "",
876
+ disabled: l,
877
+ onClick: l ? void 0 : d,
878
+ style: {
879
+ appearance: "none",
880
+ WebkitAppearance: "none",
881
+ position: "absolute",
882
+ left: "50%",
883
+ top: _ - v * .52,
884
+ width: v,
885
+ height: v,
886
+ display: "flex",
887
+ alignItems: "center",
888
+ justifyContent: "center",
889
+ boxSizing: "border-box",
890
+ padding: 0,
891
+ margin: 0,
892
+ border: 0,
893
+ borderRadius: "50%",
894
+ background: b ? "#9da1aa" : y ? "#ef4146" : "#080808",
895
+ color: "#fff",
896
+ boxShadow: `0 0 0 ${Math.max(3, v * .085)}px var(--orb-ui-radial-control-surround), 0 2px 5px rgba(0, 0, 0, 0.18)`,
897
+ cursor: l ? "not-allowed" : "pointer",
898
+ opacity: l ? .52 : 1,
899
+ transform: "translateX(-50%)",
900
+ transition: "background 160ms ease, opacity 160ms ease, transform 160ms ease",
901
+ font: "inherit"
902
+ },
903
+ children: b ? /* @__PURE__ */ a("span", {
904
+ "aria-hidden": "true",
905
+ "data-radial-spinner": "",
906
+ style: {
907
+ width: "42%",
908
+ height: "42%",
909
+ boxSizing: "border-box",
910
+ border: `${Math.max(1.5, v * .055)}px solid rgba(255, 255, 255, 0.38)`,
911
+ borderTopColor: "#fff",
912
+ borderRightColor: "#fff",
913
+ borderRadius: "50%",
914
+ animation: "orb-radial-spinner 760ms linear infinite"
915
+ }
916
+ }) : /* @__PURE__ */ a(ge, { active: y })
917
+ }) : null]
918
+ });
919
+ return u ? /* @__PURE__ */ a("div", {
920
+ className: s,
921
+ style: S,
922
+ children: C
923
+ }) : /* @__PURE__ */ a("div", {
924
+ ...f,
925
+ className: s,
926
+ style: S,
927
+ children: C
928
+ });
929
+ }
930
+ //#endregion
931
+ //#region src/components/Orb/Orb.tsx
932
+ function $({ signal: n, state: r, volume: o, adapter: l, theme: u = "debug", size: f = 200, className: p, style: m, disabled: h = !1, interactive: g = !0, onStart: _, onStop: v, ...y }) {
933
+ let [b, x] = i({ state: "idle" });
934
+ t(() => {
935
+ if (x({ state: "idle" }), l) return l.subscribe(x);
936
+ }, [l]);
937
+ let S = n ?? b, C = s(r, n, b), w = c(o, C, S), E = C !== "idle" && C !== "error", D = e(() => {
938
+ h || (E ? v ? v() : l?.stop?.() : _ ? _() : l?.start?.());
939
+ }, [
940
+ l,
941
+ h,
942
+ E,
943
+ _,
944
+ v
945
+ ]), O = E ? !!(l?.stop || v) : !!(l?.start || _), k = g && O, A = k && !h ? D : void 0, M = {
946
+ state: C,
947
+ volume: w,
948
+ size: f,
949
+ className: p,
950
+ style: m,
951
+ disabled: h,
952
+ ...y,
953
+ "aria-label": y["aria-label"] ?? (k ? `${E ? "Stop" : "Start"} voice session` : void 0)
954
+ }, N = {
955
+ ...M,
956
+ interactive: k
957
+ };
958
+ switch (u) {
959
+ case "circle": return /* @__PURE__ */ a(T, {
960
+ ...N,
961
+ onClick: A
962
+ });
963
+ case "bars": return /* @__PURE__ */ a(j, {
964
+ ...N,
965
+ onClick: A
966
+ });
967
+ case "cloud": return /* @__PURE__ */ a(se, {
968
+ ...N,
969
+ onClick: A
970
+ });
971
+ case "radial": return /* @__PURE__ */ a(_e, {
972
+ ...N,
973
+ onClick: A
974
+ });
975
+ default: return /* @__PURE__ */ a(d, {
976
+ ...M,
977
+ disabled: h || !g,
978
+ onStart: h || !g ? void 0 : _ ?? (() => l?.start?.()),
979
+ onStop: h || !g ? void 0 : v ?? (() => l?.stop?.())
980
+ });
981
+ }
982
+ }
983
+ //#endregion
984
+ export { $ as Orb, $ as VoiceOrb };