@lofcz/orb-ui 0.7.0 → 0.7.1

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 +0 -0
  2. package/README.md +25 -1
  3. package/dist/adapters/audio-level.d.ts +0 -0
  4. package/dist/adapters/elevenlabs/index.d.ts +0 -0
  5. package/dist/adapters/gemini-live/index.d.ts +0 -0
  6. package/dist/adapters/index.d.ts +0 -0
  7. package/dist/adapters/livekit/browser.d.ts +0 -0
  8. package/dist/adapters/livekit/index.d.ts +0 -0
  9. package/dist/adapters/openai-realtime/index.d.ts +0 -0
  10. package/dist/adapters/pipecat/index.d.ts +0 -0
  11. package/dist/adapters/types.d.ts +0 -0
  12. package/dist/adapters/vapi/index.d.ts +0 -0
  13. package/dist/adapters.cjs +0 -0
  14. package/dist/adapters.js +0 -0
  15. package/dist/components/Orb/Orb.d.ts +1 -1
  16. package/dist/components/Orb/Orb.types.d.ts +35 -1
  17. package/dist/components/Orb/index.d.ts +1 -1
  18. package/dist/components/Orb/signals.d.ts +0 -0
  19. package/dist/index.d.ts +1 -1
  20. package/dist/livekit-D-s4sYba.cjs +0 -0
  21. package/dist/livekit-Z3IMmWaG.js +0 -0
  22. package/dist/livekit-adapter.cjs +0 -0
  23. package/dist/livekit-adapter.js +0 -0
  24. package/dist/orb-ui.cjs +1 -1
  25. package/dist/orb-ui.js +266 -210
  26. package/dist/themes/bars/BarsTheme.d.ts +0 -0
  27. package/dist/themes/bars/index.d.ts +0 -0
  28. package/dist/themes/circle/CircleTheme.d.ts +0 -0
  29. package/dist/themes/circle/index.d.ts +0 -0
  30. package/dist/themes/cloud/CloudTheme.d.ts +0 -0
  31. package/dist/themes/cloud/index.d.ts +0 -0
  32. package/dist/themes/debug/DebugTheme.d.ts +0 -0
  33. package/dist/themes/debug/index.d.ts +0 -0
  34. package/dist/themes/index.d.ts +0 -0
  35. package/dist/themes/radial/RadialTheme.d.ts +0 -0
  36. package/dist/themes/radial/index.d.ts +0 -0
  37. package/package.json +13 -5
package/dist/orb-ui.js CHANGED
@@ -1,22 +1,22 @@
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";
1
+ import { useCallback as e, useEffect as t, useLayoutEffect as n, useMemo as r, useRef as i, useState as a } from "react";
2
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
3
3
  //#region src/components/Orb/signals.ts
4
- function s(e, t, n) {
4
+ function c(e, t, n) {
5
5
  return e ?? t?.state ?? n.state;
6
6
  }
7
- function c(e, t, n) {
7
+ function l(e, t, n) {
8
8
  return e === void 0 ? t === "listening" ? n.inputVolume ?? n.volume ?? 0 : t === "speaking" ? n.outputVolume ?? n.volume ?? 0 : n.volume ?? 0 : e;
9
9
  }
10
10
  //#endregion
11
11
  //#region src/themes/debug/DebugTheme.tsx
12
- var l = [
12
+ var u = [
13
13
  "idle",
14
14
  "connecting",
15
15
  "listening",
16
16
  "thinking",
17
17
  "speaking",
18
18
  "error"
19
- ], u = {
19
+ ], d = {
20
20
  idle: "#888",
21
21
  connecting: "#f0c040",
22
22
  listening: "#40c0f0",
@@ -24,8 +24,8 @@ var l = [
24
24
  speaking: "#40f080",
25
25
  error: "#f04040"
26
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", {
27
+ function f({ state: e, volume: t, size: n, className: r, style: i, disabled: a = !1, onStart: c, onStop: l, ...f }) {
28
+ return /* @__PURE__ */ s("div", {
29
29
  ...f,
30
30
  className: r,
31
31
  style: {
@@ -42,7 +42,7 @@ function d({ state: e, volume: t, size: n, className: r, style: i, disabled: s =
42
42
  ...i
43
43
  },
44
44
  children: [
45
- /* @__PURE__ */ a("div", {
45
+ /* @__PURE__ */ o("div", {
46
46
  style: {
47
47
  color: "#555",
48
48
  marginBottom: 10,
@@ -51,31 +51,31 @@ function d({ state: e, volume: t, size: n, className: r, style: i, disabled: s =
51
51
  },
52
52
  children: "ORB DEBUG"
53
53
  }),
54
- /* @__PURE__ */ o("div", {
54
+ /* @__PURE__ */ s("div", {
55
55
  style: { marginBottom: 8 },
56
- children: [/* @__PURE__ */ a("span", {
56
+ children: [/* @__PURE__ */ o("span", {
57
57
  style: { color: "#555" },
58
58
  children: "state "
59
- }), /* @__PURE__ */ a("span", {
59
+ }), /* @__PURE__ */ o("span", {
60
60
  style: {
61
- color: u[e],
61
+ color: d[e],
62
62
  fontWeight: "bold"
63
63
  },
64
64
  children: e
65
65
  })]
66
66
  }),
67
- /* @__PURE__ */ o("div", {
67
+ /* @__PURE__ */ s("div", {
68
68
  style: { marginBottom: 10 },
69
69
  children: [
70
- /* @__PURE__ */ a("span", {
70
+ /* @__PURE__ */ o("span", {
71
71
  style: { color: "#555" },
72
72
  children: "volume "
73
73
  }),
74
- /* @__PURE__ */ a("span", {
74
+ /* @__PURE__ */ o("span", {
75
75
  style: { color: "#ccc" },
76
76
  children: t.toFixed(2)
77
77
  }),
78
- /* @__PURE__ */ a("div", {
78
+ /* @__PURE__ */ o("div", {
79
79
  style: {
80
80
  marginTop: 4,
81
81
  height: 4,
@@ -83,41 +83,41 @@ function d({ state: e, volume: t, size: n, className: r, style: i, disabled: s =
83
83
  borderRadius: 2,
84
84
  overflow: "hidden"
85
85
  },
86
- children: /* @__PURE__ */ a("div", { style: {
86
+ children: /* @__PURE__ */ o("div", { style: {
87
87
  height: "100%",
88
88
  width: `${t * 100}%`,
89
- background: u[e],
89
+ background: d[e],
90
90
  borderRadius: 2,
91
91
  transition: "width 50ms linear"
92
92
  } })
93
93
  })
94
94
  ]
95
95
  }),
96
- /* @__PURE__ */ o("div", {
96
+ /* @__PURE__ */ s("div", {
97
97
  style: { marginBottom: 10 },
98
- children: [/* @__PURE__ */ a("div", {
98
+ children: [/* @__PURE__ */ o("div", {
99
99
  style: {
100
100
  color: "#555",
101
101
  marginBottom: 4,
102
102
  fontSize: 10
103
103
  },
104
104
  children: "force state"
105
- }), /* @__PURE__ */ a("div", {
105
+ }), /* @__PURE__ */ o("div", {
106
106
  style: {
107
107
  display: "flex",
108
108
  flexWrap: "wrap",
109
109
  gap: 4
110
110
  },
111
- children: l.map((t) => /* @__PURE__ */ a("button", {
112
- disabled: s,
111
+ children: u.map((t) => /* @__PURE__ */ o("button", {
112
+ disabled: a,
113
113
  style: {
114
114
  fontSize: 10,
115
115
  padding: "2px 6px",
116
- background: e === t ? u[t] : "#222",
116
+ background: e === t ? d[t] : "#222",
117
117
  color: e === t ? "#000" : "#888",
118
- border: `1px solid ${e === t ? u[t] : "#333"}`,
118
+ border: `1px solid ${e === t ? d[t] : "#333"}`,
119
119
  borderRadius: 3,
120
- cursor: s ? "not-allowed" : "pointer"
120
+ cursor: a ? "not-allowed" : "pointer"
121
121
  },
122
122
  onClick: () => {
123
123
  console.warn(`[orb-ui debug] To force state '${t}', use controlled mode: <Orb state="${t}" />`);
@@ -126,13 +126,13 @@ function d({ state: e, volume: t, size: n, className: r, style: i, disabled: s =
126
126
  }, t))
127
127
  })]
128
128
  }),
129
- /* @__PURE__ */ o("div", {
129
+ /* @__PURE__ */ s("div", {
130
130
  style: {
131
131
  display: "flex",
132
132
  gap: 6
133
133
  },
134
- children: [/* @__PURE__ */ a("button", {
135
- disabled: s,
134
+ children: [/* @__PURE__ */ o("button", {
135
+ disabled: a,
136
136
  onClick: c,
137
137
  style: {
138
138
  flex: 1,
@@ -141,13 +141,13 @@ function d({ state: e, volume: t, size: n, className: r, style: i, disabled: s =
141
141
  color: "#40f080",
142
142
  border: "1px solid #40f080",
143
143
  borderRadius: 4,
144
- cursor: s ? "not-allowed" : "pointer",
144
+ cursor: a ? "not-allowed" : "pointer",
145
145
  fontSize: 11
146
146
  },
147
147
  children: "Start"
148
- }), /* @__PURE__ */ a("button", {
149
- disabled: s,
150
- onClick: d,
148
+ }), /* @__PURE__ */ o("button", {
149
+ disabled: a,
150
+ onClick: l,
151
151
  style: {
152
152
  flex: 1,
153
153
  padding: "4px 0",
@@ -155,7 +155,7 @@ function d({ state: e, volume: t, size: n, className: r, style: i, disabled: s =
155
155
  color: "#f04040",
156
156
  border: "1px solid #f04040",
157
157
  borderRadius: 4,
158
- cursor: s ? "not-allowed" : "pointer",
158
+ cursor: a ? "not-allowed" : "pointer",
159
159
  fontSize: 11
160
160
  },
161
161
  children: "Stop"
@@ -166,55 +166,55 @@ function d({ state: e, volume: t, size: n, className: r, style: i, disabled: s =
166
166
  }
167
167
  //#endregion
168
168
  //#region src/themes/circle/CircleTheme.tsx
169
- var f = typeof window < "u" ? n : t;
170
- function p(e) {
169
+ var p = typeof window < "u" ? n : t;
170
+ function m(e) {
171
171
  return [
172
172
  parseInt(e.slice(1, 3), 16),
173
173
  parseInt(e.slice(3, 5), 16),
174
174
  parseInt(e.slice(5, 7), 16)
175
175
  ];
176
176
  }
177
- var m = {
177
+ var h = {
178
178
  idle: "#cccccc",
179
179
  connecting: "#cccccc",
180
180
  listening: "#999999",
181
181
  thinking: "#d8d8d8",
182
182
  speaking: "#e8e8e8",
183
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(() => {
184
+ }, g = "\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", _ = .95, v = .08, y = .82, b = .18, x = 24, S = 0, C = .55, w = .12, T = .002;
185
+ function E({ state: e, volume: n, size: r, className: a, style: c, disabled: l = !1, interactive: u = !1, onClick: d, ...f }) {
186
+ let E = i(null), D = i(null), O = i(null), k = i(0), A = i(n);
187
+ p(() => {
188
188
  A.current = n;
189
189
  }, [n]);
190
- let j = r(1), M = r(0), N = r(p(m.idle)), P = .06, F = r(v), I = r(y);
190
+ let j = i(1), M = i(0), N = i(m(h.idle)), P = .06, F = i(y), I = i(b);
191
191
  t(() => {
192
192
  let e = "orb-circle-keyframes";
193
193
  if (!document.getElementById(e)) {
194
194
  let t = document.createElement("style");
195
- t.id = e, t.textContent = h, document.head.appendChild(t);
195
+ t.id = e, t.textContent = g, document.head.appendChild(t);
196
196
  }
197
197
  }, []), t(() => {
198
198
  let t = E.current;
199
199
  if (t) {
200
200
  if (e === "listening" || e === "speaking") {
201
- let n = e === "speaking" ? g : v, r = e === "speaking" ? _ : y, i = e === "speaking" ? b : x, a = () => {
201
+ let n = e === "speaking" ? _ : y, r = e === "speaking" ? v : b, i = e === "speaking" ? x : S, a = () => {
202
202
  let o = A.current;
203
203
  F.current += (n - F.current) * P, I.current += (r - I.current) * P;
204
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;
205
+ e === "listening" ? (j.current += (s - j.current) * C, M.current += (c - M.current) * C) : (j.current = s, M.current = c);
206
+ let l = m(h[e]), [u, d, f] = N.current;
207
207
  N.current = [
208
208
  u + (l[0] - u) * .05,
209
209
  d + (l[1] - d) * .05,
210
210
  f + (l[2] - f) * .05
211
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";
212
+ let [p, g, _] = N.current.map(Math.round);
213
+ t.style.transform = `scale(${j.current})`, t.style.background = `rgb(${p},${g},${_})`, t.style.boxShadow = "none", t.style.animation = "none";
214
214
  let v = D.current;
215
215
  if (v) {
216
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";
217
+ v.style.transform = `scale(${j.current})`, v.style.boxShadow = e > .5 ? `0 0 ${e}px ${e * .4}px rgb(${p},${g},${_})` : "none";
218
218
  }
219
219
  k.current = requestAnimationFrame(a);
220
220
  };
@@ -224,17 +224,17 @@ function T({ state: e, volume: n, size: i, className: s, style: c, disabled: l =
224
224
  }
225
225
  {
226
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;
227
+ let n = h[e] ?? h.idle, r = m(n), i = () => {
228
+ j.current += (1 - j.current) * w, M.current += (0 - M.current) * w;
229
229
  let [a, o, s] = N.current;
230
230
  N.current = [
231
- a + (r[0] - a) * C,
232
- o + (r[1] - o) * C,
233
- s + (r[2] - s) * C
231
+ a + (r[0] - a) * w,
232
+ o + (r[1] - o) * w,
233
+ s + (r[2] - s) * w
234
234
  ];
235
235
  let [c, l, u] = N.current.map(Math.round);
236
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);
237
+ let d = Math.abs(j.current - 1) < T, f = M.current < .1, p = N.current.every((e, t) => Math.abs(e - r[t]) < 1);
238
238
  if (d && f && p) {
239
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
240
  return;
@@ -245,15 +245,15 @@ function T({ state: e, volume: n, size: i, className: s, style: c, disabled: l =
245
245
  }
246
246
  }
247
247
  }, [e]);
248
- let L = i * .55, R = {
249
- width: i,
250
- height: i,
248
+ let L = r * .55, R = {
249
+ width: r,
250
+ height: r,
251
251
  display: "flex",
252
252
  alignItems: "center",
253
253
  justifyContent: "center",
254
254
  position: "relative",
255
255
  ...c
256
- }, z = /* @__PURE__ */ o("span", {
256
+ }, z = /* @__PURE__ */ s("span", {
257
257
  ref: O,
258
258
  onMouseEnter: () => {
259
259
  O.current && u && !l && (O.current.style.transform = "scale(1.06)", O.current.style.filter = "brightness(1.12)");
@@ -274,7 +274,7 @@ function T({ state: e, volume: n, size: i, className: s, style: c, disabled: l =
274
274
  borderRadius: "50%",
275
275
  lineHeight: 0
276
276
  },
277
- children: [/* @__PURE__ */ a("span", {
277
+ children: [/* @__PURE__ */ o("span", {
278
278
  ref: D,
279
279
  style: {
280
280
  position: "absolute",
@@ -284,7 +284,7 @@ function T({ state: e, volume: n, size: i, className: s, style: c, disabled: l =
284
284
  borderRadius: "50%",
285
285
  pointerEvents: "none"
286
286
  }
287
- }), /* @__PURE__ */ a("span", {
287
+ }), /* @__PURE__ */ o("span", {
288
288
  ref: E,
289
289
  style: {
290
290
  position: "relative",
@@ -292,14 +292,14 @@ function T({ state: e, volume: n, size: i, className: s, style: c, disabled: l =
292
292
  width: L,
293
293
  height: L,
294
294
  borderRadius: "50%",
295
- background: m[e]
295
+ background: h[e]
296
296
  }
297
297
  })]
298
298
  });
299
- return u ? /* @__PURE__ */ a("button", {
300
- ...T,
299
+ return u ? /* @__PURE__ */ o("button", {
300
+ ...f,
301
301
  type: "button",
302
- className: s,
302
+ className: a,
303
303
  disabled: l,
304
304
  onClick: l ? void 0 : d,
305
305
  style: {
@@ -315,16 +315,16 @@ function T({ state: e, volume: n, size: i, className: s, style: c, disabled: l =
315
315
  ...R
316
316
  },
317
317
  children: z
318
- }) : /* @__PURE__ */ a("div", {
319
- ...T,
320
- className: s,
318
+ }) : /* @__PURE__ */ o("div", {
319
+ ...f,
320
+ className: a,
321
321
  style: R,
322
322
  children: z
323
323
  });
324
324
  }
325
325
  //#endregion
326
326
  //#region src/themes/bars/BarsTheme.tsx
327
- var E = 5, D = 1.4, O = Math.PI * 2 / E, k = {
327
+ var D = 5, O = 1.4, k = Math.PI * 2 / D, A = {
328
328
  idle: "#cccccc",
329
329
  connecting: "#cccccc",
330
330
  listening: "#999999",
@@ -332,33 +332,33 @@ var E = 5, D = 1.4, O = Math.PI * 2 / E, k = {
332
332
  speaking: "#e8e8e8",
333
333
  error: "#f87171"
334
334
  };
335
- function A(e) {
335
+ function j(e) {
336
336
  return [
337
337
  parseInt(e.slice(1, 3), 16),
338
338
  parseInt(e.slice(3, 5), 16),
339
339
  parseInt(e.slice(5, 7), 16)
340
340
  ];
341
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);
342
+ function M({ state: e, volume: n, size: r, className: a, style: s, disabled: c = !1, interactive: l = !1, onClick: u, ...d }) {
343
+ let f = i([]), p = i(null), m = i(0), h = i(Array(D).fill(0)), g = i(n), _ = i(!1), v = i(0), y = i(j(A.idle)), b = i(null), x = i(Array(D).fill(0)), S = i(e);
344
344
  t(() => {
345
345
  e !== S.current && (x.current = [...h.current], b.current = Date.now(), S.current = e);
346
346
  }, [e]), t(() => {
347
347
  g.current = n;
348
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 = () => {
349
+ let t = r * .55, n = r * .06, i = A[e] ?? A.idle, a = r * .1, o = Array.from({ length: D }, (e, t) => 1 - .7 * (Math.abs(t - 2) / 2)), s = () => {
350
350
  let e = l && !c, t = _.current && e ? a : 0;
351
351
  v.current += (t - v.current) * .15;
352
352
  }, u = (n, r) => {
353
353
  s();
354
- let i = A(r), [a, c, l] = y.current;
354
+ let i = j(r), [a, c, l] = y.current;
355
355
  y.current = [
356
356
  a + (i[0] - a) * .08,
357
357
  c + (i[1] - c) * .08,
358
358
  l + (i[2] - l) * .08
359
359
  ];
360
360
  let [u, d, p] = y.current.map(Math.round), m = `rgb(${u},${d},${p})`;
361
- for (let r = 0; r < E; r++) {
361
+ for (let r = 0; r < D; r++) {
362
362
  let i = f.current[r];
363
363
  if (!i) continue;
364
364
  let a = e === "idle" ? o[r] : 1, s = v.current * a;
@@ -366,50 +366,50 @@ function j({ state: e, volume: n, size: i, className: o, style: s, disabled: c =
366
366
  }
367
367
  };
368
368
  if (e === "listening" || e === "speaking") {
369
- let i = e === "speaking" ? 1 : .4, a = () => {
369
+ let r = e === "speaking" ? 1 : .4, a = () => {
370
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;
371
+ for (let i = 0; i < D; i++) {
372
+ let a = .5 + .15 * Math.sin(s * O * r * Math.PI * 2 + i * k), c = n + (t - n) * o * a;
373
373
  if (b.current !== null) {
374
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);
375
+ c = x.current[i] + (c - x.current[i]) * n, t >= 1 && (b.current = null);
376
376
  }
377
377
  let l = e === "listening" ? .45 : 1;
378
- h.current[r] += (c - h.current[r]) * l;
378
+ h.current[i] += (c - h.current[i]) * l;
379
379
  }
380
- u(h.current, r), m.current = requestAnimationFrame(a);
380
+ u(h.current, i), m.current = requestAnimationFrame(a);
381
381
  };
382
382
  return m.current = requestAnimationFrame(a), () => cancelAnimationFrame(m.current);
383
383
  }
384
384
  if (e === "connecting" || e === "thinking") {
385
- let e = Date.now(), i = () => {
385
+ let e = Date.now(), r = () => {
386
386
  let a = (Date.now() - e) / 1e3;
387
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;
388
+ for (let e = 0; e < D; e++) {
389
+ let r = (a * .6 + e / D * .5) % 1, i = r < .5 ? Math.sin(r / .5 * Math.PI) : 0, o = n + (t * .4 - n) * i;
390
390
  h.current[e] += (o - h.current[e]) * .15;
391
391
  }
392
- u(h.current, r), m.current = requestAnimationFrame(i);
392
+ u(h.current, i), m.current = requestAnimationFrame(r);
393
393
  };
394
- return m.current = requestAnimationFrame(i), () => cancelAnimationFrame(m.current);
394
+ return m.current = requestAnimationFrame(r), () => cancelAnimationFrame(m.current);
395
395
  }
396
396
  cancelAnimationFrame(m.current);
397
397
  let d = () => {
398
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);
399
+ for (let e = 0; e < D; e++) h.current[e] += (n - h.current[e]) * .16;
400
+ u(h.current, i), m.current = requestAnimationFrame(d);
401
401
  };
402
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,
403
+ }, [e, r]);
404
+ let C = r * .055, w = r * .035, T = r * .03, E = r * .55, M = r * .06, N = {
405
+ width: r,
406
+ height: r,
407
407
  display: "flex",
408
408
  alignItems: "center",
409
409
  justifyContent: "center",
410
410
  position: "relative",
411
411
  ...s
412
- }, P = /* @__PURE__ */ a("span", {
412
+ }, P = /* @__PURE__ */ o("span", {
413
413
  ref: p,
414
414
  onMouseEnter: () => {
415
415
  l && !c && (_.current = !0, p.current && (p.current.style.filter = "brightness(1.35)"));
@@ -430,24 +430,24 @@ function j({ state: e, volume: n, size: i, className: o, style: s, disabled: c =
430
430
  transition: "filter 0.3s ease",
431
431
  cursor: l ? c ? "not-allowed" : "pointer" : "default"
432
432
  },
433
- children: Array.from({ length: E }, (t, n) => /* @__PURE__ */ a("span", {
433
+ children: Array.from({ length: D }, (t, n) => /* @__PURE__ */ o("span", {
434
434
  ref: (e) => {
435
435
  f.current[n] = e;
436
436
  },
437
437
  style: {
438
438
  width: C,
439
439
  minHeight: M,
440
- maxHeight: j,
440
+ maxHeight: E,
441
441
  height: M,
442
442
  borderRadius: T,
443
- background: k[e] ?? k.idle
443
+ background: A[e] ?? A.idle
444
444
  }
445
445
  }, n))
446
446
  });
447
- return l ? /* @__PURE__ */ a("button", {
447
+ return l ? /* @__PURE__ */ o("button", {
448
448
  ...d,
449
449
  type: "button",
450
- className: o,
450
+ className: a,
451
451
  disabled: c,
452
452
  onClick: c ? void 0 : u,
453
453
  style: {
@@ -463,36 +463,36 @@ function j({ state: e, volume: n, size: i, className: o, style: s, disabled: c =
463
463
  ...N
464
464
  },
465
465
  children: P
466
- }) : /* @__PURE__ */ a("div", {
466
+ }) : /* @__PURE__ */ o("div", {
467
467
  ...d,
468
- className: o,
468
+ className: a,
469
469
  style: N,
470
470
  children: P
471
471
  });
472
472
  }
473
473
  //#endregion
474
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) {
475
+ var N = typeof window < "u" ? n : t, P = "\nattribute vec2 a_position;\n\nvoid main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n}\n", F = "\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", I = .55, L = .204, R = .2145, z = .063, B = "#5659dc", V = 1.178, H = 180, U = 300, W = 1350, ee = 246, te = 420, ne = 354, re = 480;
476
+ function G(e, t = 0, n = 1) {
477
477
  return Math.min(n, Math.max(t, e));
478
478
  }
479
- function G(e, t, n, r) {
479
+ function K(e, t, n, r) {
480
480
  return e + (t - e) * (1 - Math.exp(-n * r));
481
481
  }
482
482
  function ie(e) {
483
483
  return 1 - (1 - e) ** 3;
484
484
  }
485
- function K(e, t, n) {
485
+ function q(e, t, n) {
486
486
  return e + (t - e) * n;
487
487
  }
488
- function q(e, t, n) {
489
- let r = W((e - t) / (n - t));
488
+ function J(e, t, n) {
489
+ let r = G((e - t) / (n - t));
490
490
  return r * r * (3 - 2 * r);
491
491
  }
492
- function J(e) {
492
+ function Y(e) {
493
493
  return e === "listening" || e === "speaking" || e === "thinking";
494
494
  }
495
- function Y(e, t, n) {
495
+ function X(e, t, n) {
496
496
  let r = e.createShader(t);
497
497
  if (r) {
498
498
  if (e.shaderSource(r, n), e.compileShader(r), !e.getShaderParameter(r, e.COMPILE_STATUS)) {
@@ -509,7 +509,7 @@ function ae(e, t) {
509
509
  premultipliedAlpha: !0
510
510
  });
511
511
  if (!n) return;
512
- let r = Y(n, n.VERTEX_SHADER, N), i = Y(n, n.FRAGMENT_SHADER, P);
512
+ let r = X(n, n.VERTEX_SHADER, P), i = X(n, n.FRAGMENT_SHADER, F);
513
513
  if (!r || !i) {
514
514
  r && n.deleteShader(r), i && n.deleteShader(i);
515
515
  return;
@@ -552,21 +552,21 @@ function ae(e, t) {
552
552
  };
553
553
  }
554
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;
555
+ if (e <= H) return z;
556
+ if (e <= 480) return q(z, V, ie((e - H) / U));
557
+ let t = e - H - U;
558
+ return t >= W ? 1 : 1 + .17799999999999994 * (1 - G(t / W)) ** 2;
559
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(() => {
560
+ function se({ state: e, volume: n, size: r, className: a, style: c, disabled: l = !1, interactive: u = !1, onClick: d, ...f }) {
561
+ let p = i(null), m = i(null), h = i(null), g = i(e), _ = i(n), v = i(u), y = i(!1);
562
+ N(() => {
563
563
  g.current = e, _.current = n, v.current = u;
564
564
  }, [
565
565
  u,
566
566
  e,
567
567
  n
568
568
  ]);
569
- let b = i * F;
569
+ let b = r * I;
570
570
  t(() => {
571
571
  let e = p.current, t = m.current, n = h.current;
572
572
  if (!e || !t || !n) return;
@@ -576,30 +576,30 @@ function se({ state: e, volume: n, size: i, className: s, style: c, disabled: l
576
576
  i(), r.addEventListener("change", i);
577
577
  let a = ae(e, b);
578
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) => {
579
+ let o = 0, s = performance.now(), c = g.current, l = Y(c) ? s : void 0, u = G(_.current), d = 1, f = +!!Y(c), x = 1, S = +(c === "connecting"), C = 0, w = (r) => {
580
580
  let i = Math.min((r - s) / 1e3, .05);
581
581
  s = r;
582
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);
583
+ p !== c && (Y(p) && !Y(c) && (l = r), (p === "idle" || p === "error") && (l = void 0), c = p);
584
+ let h = G(_.current);
585
+ u = m ? 0 : K(u, h, h > u ? 11 : 6, i);
586
586
  let b = 1;
587
- p === "listening" && (b = 1 - u * I), p === "speaking" && (b = 1 + u * L);
587
+ p === "listening" && (b = 1 - u * L), p === "speaking" && (b = 1 + u * R);
588
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);
589
+ d = m ? 1 : K(d, b, T, i);
590
+ let E = Y(p), D = p === "idle" && v.current, O = E || D ? 1 : 0;
591
+ f = m ? O : K(f, O, 14, i);
592
592
  let k = E || D ? 1 : .92;
593
- x = m ? k : G(x, k, 12, i);
593
+ x = m ? k : K(x, k, 12, i);
594
594
  let A = d * x;
595
- D && (A = R);
595
+ D && (A = z);
596
596
  let j = +!D, M = D ? f : 0;
597
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);
598
+ let e = r - l, t = oe(e), n = G((e - H - U) / W);
599
+ A = t * q(1, d, n), j = J(e, ee, te), M = f * (1 - J(e, ne, re)), e >= 1830 && (l = void 0);
600
600
  }
601
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)`;
602
+ S = m ? N : K(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
603
  let P = .24, F = .1;
604
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
605
  };
@@ -608,14 +608,14 @@ function se({ state: e, volume: n, size: i, className: s, style: c, disabled: l
608
608
  };
609
609
  }, [b]);
610
610
  let x = {
611
- width: i,
612
- height: i,
611
+ width: r,
612
+ height: r,
613
613
  display: "flex",
614
614
  alignItems: "center",
615
615
  justifyContent: "center",
616
616
  position: "relative",
617
617
  ...c
618
- }, S = /* @__PURE__ */ o("span", {
618
+ }, S = /* @__PURE__ */ s("span", {
619
619
  style: {
620
620
  position: "relative",
621
621
  display: "block",
@@ -626,7 +626,7 @@ function se({ state: e, volume: n, size: i, className: s, style: c, disabled: l
626
626
  cursor: u ? l ? "not-allowed" : "pointer" : "default"
627
627
  },
628
628
  children: [
629
- /* @__PURE__ */ a("span", {
629
+ /* @__PURE__ */ o("span", {
630
630
  ref: m,
631
631
  "data-cloud-launch-dot": "",
632
632
  "aria-hidden": "true",
@@ -635,14 +635,14 @@ function se({ state: e, volume: n, size: i, className: s, style: c, disabled: l
635
635
  inset: 0,
636
636
  display: "block",
637
637
  borderRadius: "50%",
638
- background: z,
638
+ background: B,
639
639
  opacity: 0,
640
- transform: `scale(${R})`,
640
+ transform: `scale(${z})`,
641
641
  transformOrigin: "center",
642
642
  willChange: "opacity, transform"
643
643
  }
644
644
  }),
645
- /* @__PURE__ */ a("canvas", {
645
+ /* @__PURE__ */ o("canvas", {
646
646
  ref: p,
647
647
  "aria-hidden": "true",
648
648
  style: {
@@ -653,12 +653,12 @@ function se({ state: e, volume: n, size: i, className: s, style: c, disabled: l
653
653
  height: b,
654
654
  borderRadius: "50%",
655
655
  opacity: 0,
656
- transform: `scale(${R})`,
656
+ transform: `scale(${z})`,
657
657
  transformOrigin: "center",
658
658
  willChange: "opacity, transform"
659
659
  }
660
660
  }),
661
- /* @__PURE__ */ a("span", {
661
+ /* @__PURE__ */ o("span", {
662
662
  ref: h,
663
663
  "aria-hidden": "true",
664
664
  style: {
@@ -682,10 +682,10 @@ function se({ state: e, volume: n, size: i, className: s, style: c, disabled: l
682
682
  })
683
683
  ]
684
684
  });
685
- return u ? /* @__PURE__ */ a("button", {
685
+ return u ? /* @__PURE__ */ o("button", {
686
686
  ...f,
687
687
  type: "button",
688
- className: s,
688
+ className: a,
689
689
  disabled: l,
690
690
  onClick: l ? void 0 : d,
691
691
  style: {
@@ -701,9 +701,9 @@ function se({ state: e, volume: n, size: i, className: s, style: c, disabled: l
701
701
  ...x
702
702
  },
703
703
  children: S
704
- }) : /* @__PURE__ */ a("div", {
704
+ }) : /* @__PURE__ */ o("div", {
705
705
  ...f,
706
- className: s,
706
+ className: a,
707
707
  style: x,
708
708
  children: S
709
709
  });
@@ -711,13 +711,13 @@ function se({ state: e, volume: n, size: i, className: s, style: c, disabled: l
711
711
  //#endregion
712
712
  //#region src/themes/radial/RadialTheme.tsx
713
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) {
714
+ function Z(e, t = 0, n = 1) {
715
715
  return Math.min(n, Math.max(t, e));
716
716
  }
717
- function Z(e, t, n, r) {
717
+ function Q(e, t, n, r) {
718
718
  return e + (t - e) * (1 - Math.exp(-n * r));
719
719
  }
720
- function Q(e, t, n) {
720
+ function $(e, t, n) {
721
721
  let r = e.createShader(t);
722
722
  if (r) {
723
723
  if (e.shaderSource(r, n), e.compileShader(r), !e.getShaderParameter(r, e.COMPILE_STATUS)) {
@@ -734,7 +734,7 @@ function me(e, t) {
734
734
  premultipliedAlpha: !0
735
735
  });
736
736
  if (!n) return;
737
- let r = Q(n, n.VERTEX_SHADER, le), i = Q(n, n.FRAGMENT_SHADER, ue);
737
+ let r = $(n, n.VERTEX_SHADER, le), i = $(n, n.FRAGMENT_SHADER, ue);
738
738
  if (!r || !i) {
739
739
  r && n.deleteShader(r), i && n.deleteShader(i);
740
740
  return;
@@ -780,7 +780,7 @@ function he(e) {
780
780
  return e !== "idle" && e !== "connecting" && e !== "error";
781
781
  }
782
782
  function ge({ active: e }) {
783
- return /* @__PURE__ */ a("svg", {
783
+ return /* @__PURE__ */ o("svg", {
784
784
  "aria-hidden": "true",
785
785
  fill: "none",
786
786
  viewBox: "0 0 24 24",
@@ -792,18 +792,18 @@ function ge({ active: e }) {
792
792
  transformOrigin: "center",
793
793
  transition: "transform 180ms ease"
794
794
  },
795
- children: /* @__PURE__ */ a("path", {
795
+ children: /* @__PURE__ */ o("path", {
796
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
797
  fill: "currentColor"
798
798
  })
799
799
  });
800
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);
801
+ function _e({ state: e, volume: n, size: r, className: a, style: c, disabled: l = !1, interactive: u = !1, onClick: d, ...f }) {
802
+ let p = i(null), m = i(e), h = i(n), g = i(!1);
803
803
  ce(() => {
804
804
  m.current = e, h.current = n;
805
805
  }, [e, n]);
806
- let _ = i * fe, v = _ * pe;
806
+ let _ = r * fe, v = _ * pe;
807
807
  t(() => {
808
808
  let e = "orb-radial-keyframes";
809
809
  if (!document.getElementById(e)) {
@@ -817,16 +817,16 @@ function _e({ state: e, volume: n, size: i, className: s, style: c, disabled: l
817
817
  g.current = t.matches;
818
818
  };
819
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) => {
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 = Z(h.current), x = m.current === "listening" ? b : 0, S = m.current === "speaking" ? b : 0, C = (e) => {
821
821
  let t = Math.min((e - a) / 1e3, .05);
822
822
  a = e;
823
- let n = m.current, p = g.current, _ = X(h.current);
824
- b = p ? 0 : Z(b, _, _ > b ? 15 : 7, t);
823
+ let n = m.current, p = g.current, _ = Z(h.current);
824
+ b = p ? 0 : Q(b, _, _ > b ? 15 : 7, t);
825
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);
826
+ x = p ? 0 : Q(x, w, w > x ? 17 : 7, t), S = p ? 0 : Q(S, T, T > S ? 12 : 5, t);
827
827
  let E = .36, D = .62, O = .15;
828
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;
829
+ s = Q(s, E, 3.6, t), c = Q(c, D, 3.6, t), l = Q(l, O, 3.6, t), y = Q(y, +(n === "speaking"), n === "speaking" ? 3.8 : 3, t), o += t * s, f += t * c;
830
830
  let e = 1.2 + S * 1.35 + Math.sin(o * 1.73) * .34 + Math.sin(o * .61 + .8) * .18;
831
831
  v += t * Math.max(.65, e);
832
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;
@@ -840,14 +840,14 @@ function _e({ state: e, volume: n, size: i, className: s, style: c, disabled: l
840
840
  }, [_]);
841
841
  let y = he(e), b = e === "connecting", x = _ + (u ? v * .5 : 0), S = {
842
842
  "--orb-ui-radial-control-surround": "#fff",
843
- width: i,
844
- height: i,
843
+ width: r,
844
+ height: r,
845
845
  display: "flex",
846
846
  alignItems: "center",
847
847
  justifyContent: "center",
848
848
  position: "relative",
849
849
  ...c
850
- }, C = /* @__PURE__ */ o("span", {
850
+ }, C = /* @__PURE__ */ s("span", {
851
851
  style: {
852
852
  position: "relative",
853
853
  display: "block",
@@ -855,7 +855,7 @@ function _e({ state: e, volume: n, size: i, className: s, style: c, disabled: l
855
855
  height: x,
856
856
  lineHeight: 0
857
857
  },
858
- children: [/* @__PURE__ */ a("canvas", {
858
+ children: [/* @__PURE__ */ o("canvas", {
859
859
  ref: p,
860
860
  "aria-hidden": "true",
861
861
  "data-radial-surface": "",
@@ -869,7 +869,7 @@ function _e({ state: e, volume: n, size: i, className: s, style: c, disabled: l
869
869
  borderRadius: "50%",
870
870
  background: "conic-gradient(from 12deg, #06358d 0deg, #0b65b5 72deg, #c7f1ef 92deg, #45c2c8 172deg, #06358d 196deg, #0b65b5 254deg, #c7f1ef 278deg, #45c2c8 360deg)"
871
871
  }
872
- }), u ? /* @__PURE__ */ a("button", {
872
+ }), u ? /* @__PURE__ */ o("button", {
873
873
  ...f,
874
874
  type: "button",
875
875
  "data-radial-control": "",
@@ -900,7 +900,7 @@ function _e({ state: e, volume: n, size: i, className: s, style: c, disabled: l
900
900
  transition: "background 160ms ease, opacity 160ms ease, transform 160ms ease",
901
901
  font: "inherit"
902
902
  },
903
- children: b ? /* @__PURE__ */ a("span", {
903
+ children: b ? /* @__PURE__ */ o("span", {
904
904
  "aria-hidden": "true",
905
905
  "data-radial-spinner": "",
906
906
  style: {
@@ -913,72 +913,128 @@ function _e({ state: e, volume: n, size: i, className: s, style: c, disabled: l
913
913
  borderRadius: "50%",
914
914
  animation: "orb-radial-spinner 760ms linear infinite"
915
915
  }
916
- }) : /* @__PURE__ */ a(ge, { active: y })
916
+ }) : /* @__PURE__ */ o(ge, { active: y })
917
917
  }) : null]
918
918
  });
919
- return u ? /* @__PURE__ */ a("div", {
920
- className: s,
919
+ return u ? /* @__PURE__ */ o("div", {
920
+ className: a,
921
921
  style: S,
922
922
  children: C
923
- }) : /* @__PURE__ */ a("div", {
923
+ }) : /* @__PURE__ */ o("div", {
924
924
  ...f,
925
- className: s,
925
+ className: a,
926
926
  style: S,
927
927
  children: C
928
928
  });
929
929
  }
930
930
  //#endregion
931
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" });
932
+ function ve({ signal: n, state: i, volume: s, adapter: u, theme: d = "debug", size: p = 200, className: m, style: h, disabled: g = !1, interactive: _ = !0, onStart: v, onStop: y, renderTheme: b, ...x }) {
933
+ let [S, C] = a({ state: "idle" });
934
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?.());
935
+ if (C({ state: "idle" }), u) return u.subscribe(C);
936
+ }, [u]);
937
+ let w = n ?? S, T = c(i, n, S), D = l(s, T, w), O = w.inputVolume ?? 0, k = w.outputVolume ?? 0, A = r(() => ({
938
+ ...w,
939
+ state: T,
940
+ inputVolume: O,
941
+ outputVolume: k
942
+ }), [
943
+ w,
944
+ O,
945
+ k,
946
+ T
947
+ ]), j = T !== "idle" && T !== "error", N = e(() => {
948
+ if (!g) return v ? v() : u?.start?.();
939
949
  }, [
940
- l,
941
- h,
942
- E,
943
- _,
950
+ u,
951
+ g,
944
952
  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
953
+ ]), P = e(() => {
954
+ if (!g) return y ? y() : u?.stop?.();
955
+ }, [
956
+ u,
957
+ g,
958
+ y
959
+ ]), F = e(() => j ? P() : N(), [
960
+ j,
961
+ N,
962
+ P
963
+ ]), I = j ? !!(u?.stop || y) : !!(u?.start || v), L = _ && I, R = L && !g ? F : void 0, z = x["aria-label"] ?? (L ? `${j ? "Stop" : "Start"} voice session` : void 0), B = {
964
+ ...x,
965
+ "aria-label": z
966
+ };
967
+ if (b) {
968
+ let e = {
969
+ ...x,
970
+ type: "button",
971
+ disabled: g || !L,
972
+ onClick: R,
973
+ "data-orb-ui-state": T,
974
+ "aria-label": z
975
+ };
976
+ return b({
977
+ state: T,
978
+ signal: A,
979
+ inputVolume: O,
980
+ outputVolume: k,
981
+ activity: D,
982
+ size: p,
983
+ isActive: j,
984
+ interactive: L,
985
+ disabled: g,
986
+ start: N,
987
+ stop: P,
988
+ toggle: F,
989
+ rootProps: {
990
+ className: m,
991
+ style: {
992
+ width: p,
993
+ height: p,
994
+ ...h
995
+ },
996
+ "data-orb-ui-theme": "custom",
997
+ "data-orb-ui-state": T
998
+ },
999
+ controlProps: e
1000
+ });
1001
+ }
1002
+ let V = {
1003
+ state: T,
1004
+ volume: D,
1005
+ size: p,
1006
+ className: m,
1007
+ style: h,
1008
+ disabled: g,
1009
+ ...B
1010
+ }, H = {
1011
+ ...V,
1012
+ interactive: L
957
1013
  };
958
- switch (u) {
959
- case "circle": return /* @__PURE__ */ a(T, {
960
- ...N,
961
- onClick: A
1014
+ switch (d) {
1015
+ case "circle": return /* @__PURE__ */ o(E, {
1016
+ ...H,
1017
+ onClick: R
962
1018
  });
963
- case "bars": return /* @__PURE__ */ a(j, {
964
- ...N,
965
- onClick: A
1019
+ case "bars": return /* @__PURE__ */ o(M, {
1020
+ ...H,
1021
+ onClick: R
966
1022
  });
967
- case "cloud": return /* @__PURE__ */ a(se, {
968
- ...N,
969
- onClick: A
1023
+ case "cloud": return /* @__PURE__ */ o(se, {
1024
+ ...H,
1025
+ onClick: R
970
1026
  });
971
- case "radial": return /* @__PURE__ */ a(_e, {
972
- ...N,
973
- onClick: A
1027
+ case "radial": return /* @__PURE__ */ o(_e, {
1028
+ ...H,
1029
+ onClick: R
974
1030
  });
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?.())
1031
+ default: return /* @__PURE__ */ o(f, {
1032
+ ...V,
1033
+ disabled: g || !_,
1034
+ onStart: g || !_ ? void 0 : N,
1035
+ onStop: g || !_ ? void 0 : P
980
1036
  });
981
1037
  }
982
1038
  }
983
1039
  //#endregion
984
- export { $ as Orb, $ as VoiceOrb };
1040
+ export { ve as Orb, ve as VoiceOrb };