@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.
- package/LICENSE +0 -0
- package/README.md +25 -1
- package/dist/adapters/audio-level.d.ts +0 -0
- package/dist/adapters/elevenlabs/index.d.ts +0 -0
- package/dist/adapters/gemini-live/index.d.ts +0 -0
- package/dist/adapters/index.d.ts +0 -0
- package/dist/adapters/livekit/browser.d.ts +0 -0
- package/dist/adapters/livekit/index.d.ts +0 -0
- package/dist/adapters/openai-realtime/index.d.ts +0 -0
- package/dist/adapters/pipecat/index.d.ts +0 -0
- package/dist/adapters/types.d.ts +0 -0
- package/dist/adapters/vapi/index.d.ts +0 -0
- package/dist/adapters.cjs +0 -0
- package/dist/adapters.js +0 -0
- package/dist/components/Orb/Orb.d.ts +1 -1
- package/dist/components/Orb/Orb.types.d.ts +35 -1
- package/dist/components/Orb/index.d.ts +1 -1
- package/dist/components/Orb/signals.d.ts +0 -0
- package/dist/index.d.ts +1 -1
- package/dist/livekit-D-s4sYba.cjs +0 -0
- package/dist/livekit-Z3IMmWaG.js +0 -0
- package/dist/livekit-adapter.cjs +0 -0
- package/dist/livekit-adapter.js +0 -0
- package/dist/orb-ui.cjs +1 -1
- package/dist/orb-ui.js +266 -210
- package/dist/themes/bars/BarsTheme.d.ts +0 -0
- package/dist/themes/bars/index.d.ts +0 -0
- package/dist/themes/circle/CircleTheme.d.ts +0 -0
- package/dist/themes/circle/index.d.ts +0 -0
- package/dist/themes/cloud/CloudTheme.d.ts +0 -0
- package/dist/themes/cloud/index.d.ts +0 -0
- package/dist/themes/debug/DebugTheme.d.ts +0 -0
- package/dist/themes/debug/index.d.ts +0 -0
- package/dist/themes/index.d.ts +0 -0
- package/dist/themes/radial/RadialTheme.d.ts +0 -0
- package/dist/themes/radial/index.d.ts +0 -0
- 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,
|
|
2
|
-
import { jsx as
|
|
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
|
|
4
|
+
function c(e, t, n) {
|
|
5
5
|
return e ?? t?.state ?? n.state;
|
|
6
6
|
}
|
|
7
|
-
function
|
|
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
|
|
12
|
+
var u = [
|
|
13
13
|
"idle",
|
|
14
14
|
"connecting",
|
|
15
15
|
"listening",
|
|
16
16
|
"thinking",
|
|
17
17
|
"speaking",
|
|
18
18
|
"error"
|
|
19
|
-
],
|
|
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
|
|
28
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
54
|
+
/* @__PURE__ */ s("div", {
|
|
55
55
|
style: { marginBottom: 8 },
|
|
56
|
-
children: [/* @__PURE__ */
|
|
56
|
+
children: [/* @__PURE__ */ o("span", {
|
|
57
57
|
style: { color: "#555" },
|
|
58
58
|
children: "state "
|
|
59
|
-
}), /* @__PURE__ */
|
|
59
|
+
}), /* @__PURE__ */ o("span", {
|
|
60
60
|
style: {
|
|
61
|
-
color:
|
|
61
|
+
color: d[e],
|
|
62
62
|
fontWeight: "bold"
|
|
63
63
|
},
|
|
64
64
|
children: e
|
|
65
65
|
})]
|
|
66
66
|
}),
|
|
67
|
-
/* @__PURE__ */
|
|
67
|
+
/* @__PURE__ */ s("div", {
|
|
68
68
|
style: { marginBottom: 10 },
|
|
69
69
|
children: [
|
|
70
|
-
/* @__PURE__ */
|
|
70
|
+
/* @__PURE__ */ o("span", {
|
|
71
71
|
style: { color: "#555" },
|
|
72
72
|
children: "volume "
|
|
73
73
|
}),
|
|
74
|
-
/* @__PURE__ */
|
|
74
|
+
/* @__PURE__ */ o("span", {
|
|
75
75
|
style: { color: "#ccc" },
|
|
76
76
|
children: t.toFixed(2)
|
|
77
77
|
}),
|
|
78
|
-
/* @__PURE__ */
|
|
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__ */
|
|
86
|
+
children: /* @__PURE__ */ o("div", { style: {
|
|
87
87
|
height: "100%",
|
|
88
88
|
width: `${t * 100}%`,
|
|
89
|
-
background:
|
|
89
|
+
background: d[e],
|
|
90
90
|
borderRadius: 2,
|
|
91
91
|
transition: "width 50ms linear"
|
|
92
92
|
} })
|
|
93
93
|
})
|
|
94
94
|
]
|
|
95
95
|
}),
|
|
96
|
-
/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ s("div", {
|
|
97
97
|
style: { marginBottom: 10 },
|
|
98
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
105
|
+
}), /* @__PURE__ */ o("div", {
|
|
106
106
|
style: {
|
|
107
107
|
display: "flex",
|
|
108
108
|
flexWrap: "wrap",
|
|
109
109
|
gap: 4
|
|
110
110
|
},
|
|
111
|
-
children:
|
|
112
|
-
disabled:
|
|
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 ?
|
|
116
|
+
background: e === t ? d[t] : "#222",
|
|
117
117
|
color: e === t ? "#000" : "#888",
|
|
118
|
-
border: `1px solid ${e === t ?
|
|
118
|
+
border: `1px solid ${e === t ? d[t] : "#333"}`,
|
|
119
119
|
borderRadius: 3,
|
|
120
|
-
cursor:
|
|
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__ */
|
|
129
|
+
/* @__PURE__ */ s("div", {
|
|
130
130
|
style: {
|
|
131
131
|
display: "flex",
|
|
132
132
|
gap: 6
|
|
133
133
|
},
|
|
134
|
-
children: [/* @__PURE__ */
|
|
135
|
-
disabled:
|
|
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:
|
|
144
|
+
cursor: a ? "not-allowed" : "pointer",
|
|
145
145
|
fontSize: 11
|
|
146
146
|
},
|
|
147
147
|
children: "Start"
|
|
148
|
-
}), /* @__PURE__ */
|
|
149
|
-
disabled:
|
|
150
|
-
onClick:
|
|
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:
|
|
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
|
|
170
|
-
function
|
|
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
|
|
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
|
-
},
|
|
185
|
-
function
|
|
186
|
-
let E =
|
|
187
|
-
|
|
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 =
|
|
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 =
|
|
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" ?
|
|
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) *
|
|
206
|
-
let l =
|
|
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 [
|
|
213
|
-
t.style.transform = `scale(${j.current})`, t.style.background = `rgb(${
|
|
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(${
|
|
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 =
|
|
228
|
-
j.current += (1 - j.current) *
|
|
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) *
|
|
232
|
-
o + (r[1] - o) *
|
|
233
|
-
s + (r[2] - s) *
|
|
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) <
|
|
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 =
|
|
249
|
-
width:
|
|
250
|
-
height:
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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:
|
|
295
|
+
background: h[e]
|
|
296
296
|
}
|
|
297
297
|
})]
|
|
298
298
|
});
|
|
299
|
-
return u ? /* @__PURE__ */
|
|
300
|
-
...
|
|
299
|
+
return u ? /* @__PURE__ */ o("button", {
|
|
300
|
+
...f,
|
|
301
301
|
type: "button",
|
|
302
|
-
className:
|
|
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__ */
|
|
319
|
-
...
|
|
320
|
-
className:
|
|
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
|
|
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
|
|
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
|
|
343
|
-
let f =
|
|
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 =
|
|
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 =
|
|
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 <
|
|
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
|
|
369
|
+
let r = e === "speaking" ? 1 : .4, a = () => {
|
|
370
370
|
let o = g.current, s = Date.now() / 1e3;
|
|
371
|
-
for (let
|
|
372
|
-
let a = .5 + .15 * Math.sin(s *
|
|
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[
|
|
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[
|
|
378
|
+
h.current[i] += (c - h.current[i]) * l;
|
|
379
379
|
}
|
|
380
|
-
u(h.current,
|
|
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(),
|
|
385
|
+
let e = Date.now(), r = () => {
|
|
386
386
|
let a = (Date.now() - e) / 1e3;
|
|
387
387
|
s();
|
|
388
|
-
for (let e = 0; e <
|
|
389
|
-
let r = (a * .6 + e /
|
|
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,
|
|
392
|
+
u(h.current, i), m.current = requestAnimationFrame(r);
|
|
393
393
|
};
|
|
394
|
-
return m.current = requestAnimationFrame(
|
|
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 <
|
|
400
|
-
u(h.current,
|
|
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,
|
|
404
|
-
let C =
|
|
405
|
-
width:
|
|
406
|
-
height:
|
|
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__ */
|
|
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:
|
|
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:
|
|
440
|
+
maxHeight: E,
|
|
441
441
|
height: M,
|
|
442
442
|
borderRadius: T,
|
|
443
|
-
background:
|
|
443
|
+
background: A[e] ?? A.idle
|
|
444
444
|
}
|
|
445
445
|
}, n))
|
|
446
446
|
});
|
|
447
|
-
return l ? /* @__PURE__ */
|
|
447
|
+
return l ? /* @__PURE__ */ o("button", {
|
|
448
448
|
...d,
|
|
449
449
|
type: "button",
|
|
450
|
-
className:
|
|
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__ */
|
|
466
|
+
}) : /* @__PURE__ */ o("div", {
|
|
467
467
|
...d,
|
|
468
|
-
className:
|
|
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
|
|
476
|
-
function
|
|
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
|
|
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
|
|
485
|
+
function q(e, t, n) {
|
|
486
486
|
return e + (t - e) * n;
|
|
487
487
|
}
|
|
488
|
-
function
|
|
489
|
-
let r =
|
|
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
|
|
492
|
+
function Y(e) {
|
|
493
493
|
return e === "listening" || e === "speaking" || e === "thinking";
|
|
494
494
|
}
|
|
495
|
-
function
|
|
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 =
|
|
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 <=
|
|
556
|
-
if (e <= 480) return
|
|
557
|
-
let t = e -
|
|
558
|
-
return t >=
|
|
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:
|
|
561
|
-
let p =
|
|
562
|
-
|
|
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 =
|
|
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 =
|
|
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 && (
|
|
584
|
-
let h =
|
|
585
|
-
u = m ? 0 :
|
|
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 *
|
|
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 :
|
|
590
|
-
let E =
|
|
591
|
-
f = m ? O :
|
|
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 :
|
|
593
|
+
x = m ? k : K(x, k, 12, i);
|
|
594
594
|
let A = d * x;
|
|
595
|
-
D && (A =
|
|
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 =
|
|
599
|
-
A = t *
|
|
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 :
|
|
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:
|
|
612
|
-
height:
|
|
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__ */
|
|
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__ */
|
|
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:
|
|
638
|
+
background: B,
|
|
639
639
|
opacity: 0,
|
|
640
|
-
transform: `scale(${
|
|
640
|
+
transform: `scale(${z})`,
|
|
641
641
|
transformOrigin: "center",
|
|
642
642
|
willChange: "opacity, transform"
|
|
643
643
|
}
|
|
644
644
|
}),
|
|
645
|
-
/* @__PURE__ */
|
|
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(${
|
|
656
|
+
transform: `scale(${z})`,
|
|
657
657
|
transformOrigin: "center",
|
|
658
658
|
willChange: "opacity, transform"
|
|
659
659
|
}
|
|
660
660
|
}),
|
|
661
|
-
/* @__PURE__ */
|
|
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__ */
|
|
685
|
+
return u ? /* @__PURE__ */ o("button", {
|
|
686
686
|
...f,
|
|
687
687
|
type: "button",
|
|
688
|
-
className:
|
|
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__ */
|
|
704
|
+
}) : /* @__PURE__ */ o("div", {
|
|
705
705
|
...f,
|
|
706
|
-
className:
|
|
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
|
|
714
|
+
function Z(e, t = 0, n = 1) {
|
|
715
715
|
return Math.min(n, Math.max(t, e));
|
|
716
716
|
}
|
|
717
|
-
function
|
|
717
|
+
function Q(e, t, n, r) {
|
|
718
718
|
return e + (t - e) * (1 - Math.exp(-n * r));
|
|
719
719
|
}
|
|
720
|
-
function
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
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:
|
|
802
|
-
let p =
|
|
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 _ =
|
|
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 =
|
|
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, _ =
|
|
824
|
-
b = p ? 0 :
|
|
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 :
|
|
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 =
|
|
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:
|
|
844
|
-
height:
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
916
|
+
}) : /* @__PURE__ */ o(ge, { active: y })
|
|
917
917
|
}) : null]
|
|
918
918
|
});
|
|
919
|
-
return u ? /* @__PURE__ */
|
|
920
|
-
className:
|
|
919
|
+
return u ? /* @__PURE__ */ o("div", {
|
|
920
|
+
className: a,
|
|
921
921
|
style: S,
|
|
922
922
|
children: C
|
|
923
|
-
}) : /* @__PURE__ */
|
|
923
|
+
}) : /* @__PURE__ */ o("div", {
|
|
924
924
|
...f,
|
|
925
|
-
className:
|
|
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
|
|
933
|
-
let [
|
|
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 (
|
|
936
|
-
}, [
|
|
937
|
-
let
|
|
938
|
-
|
|
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
|
-
|
|
941
|
-
|
|
942
|
-
E,
|
|
943
|
-
_,
|
|
950
|
+
u,
|
|
951
|
+
g,
|
|
944
952
|
v
|
|
945
|
-
]),
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
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 (
|
|
959
|
-
case "circle": return /* @__PURE__ */
|
|
960
|
-
...
|
|
961
|
-
onClick:
|
|
1014
|
+
switch (d) {
|
|
1015
|
+
case "circle": return /* @__PURE__ */ o(E, {
|
|
1016
|
+
...H,
|
|
1017
|
+
onClick: R
|
|
962
1018
|
});
|
|
963
|
-
case "bars": return /* @__PURE__ */
|
|
964
|
-
...
|
|
965
|
-
onClick:
|
|
1019
|
+
case "bars": return /* @__PURE__ */ o(M, {
|
|
1020
|
+
...H,
|
|
1021
|
+
onClick: R
|
|
966
1022
|
});
|
|
967
|
-
case "cloud": return /* @__PURE__ */
|
|
968
|
-
...
|
|
969
|
-
onClick:
|
|
1023
|
+
case "cloud": return /* @__PURE__ */ o(se, {
|
|
1024
|
+
...H,
|
|
1025
|
+
onClick: R
|
|
970
1026
|
});
|
|
971
|
-
case "radial": return /* @__PURE__ */
|
|
972
|
-
...
|
|
973
|
-
onClick:
|
|
1027
|
+
case "radial": return /* @__PURE__ */ o(_e, {
|
|
1028
|
+
...H,
|
|
1029
|
+
onClick: R
|
|
974
1030
|
});
|
|
975
|
-
default: return /* @__PURE__ */
|
|
976
|
-
...
|
|
977
|
-
disabled:
|
|
978
|
-
onStart:
|
|
979
|
-
onStop:
|
|
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 {
|
|
1040
|
+
export { ve as Orb, ve as VoiceOrb };
|