@actioneer/ads 0.2.4 → 0.3.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 (62) hide show
  1. package/components/ai-elements/chain-of-thought.d.ts +88 -6
  2. package/components/ai-elements/chain-of-thought.js +370 -107
  3. package/components/ai-elements/chart.d.ts +30 -0
  4. package/components/ai-elements/chart.js +303 -0
  5. package/components/ai-elements/index.d.ts +2 -0
  6. package/components/ai-elements/message.d.ts +12 -2
  7. package/components/ai-elements/message.js +133 -100
  8. package/components/ai-elements/research-activity.d.ts +62 -0
  9. package/components/ai-elements/research-activity.js +278 -0
  10. package/components/ai-elements/task.d.ts +7 -3
  11. package/components/ai-elements/task.js +84 -52
  12. package/components/ai-elements/tool.js +39 -35
  13. package/components/ai-elements/voice.d.ts +7 -1
  14. package/components/ai-elements/voice.js +234 -180
  15. package/components/alert.js +28 -16
  16. package/components/answer.d.ts +16 -0
  17. package/components/answer.js +273 -249
  18. package/components/assistant-ui/attachment.js +5 -1
  19. package/components/assistant-ui/composer-deep-research.js +44 -29
  20. package/components/assistant-ui/composer-harness.js +45 -27
  21. package/components/assistant-ui/composer.js +16 -16
  22. package/components/assistant-ui/index.d.ts +0 -1
  23. package/components/assistant-ui/message.d.ts +7 -0
  24. package/components/assistant-ui/message.js +36 -36
  25. package/components/assistant-ui/thread.js +1 -1
  26. package/components/brand-texture.d.ts +37 -0
  27. package/components/brand-texture.js +54 -0
  28. package/components/code-block.d.ts +42 -0
  29. package/components/code-block.js +235 -0
  30. package/components/drawer.d.ts +1 -1
  31. package/components/file-dropzone.d.ts +32 -0
  32. package/components/file-dropzone.js +134 -0
  33. package/components/index.d.ts +10 -0
  34. package/components/index.js +482 -433
  35. package/components/infinite-canvas.d.ts +50 -0
  36. package/components/infinite-canvas.js +215 -0
  37. package/components/page-header.d.ts +22 -0
  38. package/components/page-header.js +52 -0
  39. package/components/resizable-panel.d.ts +29 -0
  40. package/components/resizable-panel.js +102 -0
  41. package/components/reveal.d.ts +36 -0
  42. package/components/reveal.js +35 -0
  43. package/components/scroll-area.d.ts +19 -0
  44. package/components/scroll-area.js +57 -0
  45. package/components/setting-row.d.ts +35 -0
  46. package/components/setting-row.js +86 -0
  47. package/components/sidebar.js +131 -131
  48. package/components/stepper.d.ts +40 -0
  49. package/components/stepper.js +102 -0
  50. package/components/table.js +16 -15
  51. package/components/tabs.js +1 -1
  52. package/lib/icons.d.ts +12 -0
  53. package/lib/icons.js +98 -95
  54. package/lib/motion.d.ts +7 -3
  55. package/lib/motion.js +29 -27
  56. package/llms.txt +123 -28
  57. package/manifest.json +883 -68
  58. package/package.json +2 -2
  59. package/styles.css +179 -30
  60. package/theme.css +29 -17
  61. package/components/assistant-ui/smart-message-text.d.ts +0 -15
  62. package/components/assistant-ui/smart-message-text.js +0 -29
@@ -1,21 +1,23 @@
1
1
  "use client";
2
- import { jsx as e, jsxs as c, Fragment as y } from "react/jsx-runtime";
2
+ import { jsx as e, jsxs as l, Fragment as _ } from "react/jsx-runtime";
3
3
  import * as s from "react";
4
- import { MotionConfig as Z, motion as B, useReducedMotion as K } from "motion/react";
5
- import { cn as T } from "../../lib/cn.js";
6
- import { EASE_OUT as F, EASE_IN_OUT as X } from "../../lib/motion.js";
7
- import { Button as G } from "../button.js";
8
- import { Tooltip as j } from "../tooltip.js";
9
- import { AgentAudioVisualizerAura as J } from "../agents-ui/agent-audio-visualizer-aura.js";
10
- import { AgentAudioVisualizerWave as Q } from "../agents-ui/agent-audio-visualizer-wave.js";
11
- import { Call as ee, PhoneOff as oe, MicOff as te, Mic as ie } from "../../lib/icons.js";
12
- const Te = [
4
+ import { MotionConfig as Q, motion as U, useReducedMotion as ee } from "motion/react";
5
+ import { cn as z } from "../../lib/cn.js";
6
+ import { EASE_OUT as G, EASE_IN_OUT as oe } from "../../lib/motion.js";
7
+ import { Button as W } from "../button.js";
8
+ import { Tooltip as Z } from "../tooltip.js";
9
+ import { AgentAudioVisualizerAura as te } from "../agents-ui/agent-audio-visualizer-aura.js";
10
+ import { AgentAudioVisualizerWave as ie } from "../agents-ui/agent-audio-visualizer-wave.js";
11
+ import { Call as re, PhoneOff as ne, MicOff as ce, Mic as le } from "../../lib/icons.js";
12
+ const Ie = [
13
13
  "default",
14
+ "identity",
15
+ "mono",
14
16
  "blue",
15
17
  "violet",
16
18
  "emerald",
17
19
  "sunset"
18
- ], re = ["orb", "aura", "wave"], $e = [
20
+ ], se = ["orb", "aura", "wave"], Ve = [
19
21
  "idle",
20
22
  "connecting",
21
23
  "listening",
@@ -81,7 +83,7 @@ const Te = [
81
83
  sheen: "#ffffff",
82
84
  accent: "#f080d0"
83
85
  }
84
- }, ne = {
86
+ }, ae = {
85
87
  idle: { scale: [1, 1.04, 1], opacity: 1, duration: 4 },
86
88
  connecting: { scale: [1, 1.06, 1], opacity: 1, duration: 1.3 },
87
89
  listening: { scale: [1, 1.09, 1], opacity: 1, duration: 1.7 },
@@ -89,14 +91,14 @@ const Te = [
89
91
  speaking: { scale: [1, 1.12, 0.99, 1.07, 1], opacity: 1, duration: 0.95 },
90
92
  muted: { scale: [1, 1.02, 1], opacity: 0.7, duration: 5 },
91
93
  asleep: { scale: [1, 1.015, 1], opacity: 0.45, duration: 6 }
92
- }, ce = {
94
+ }, ue = {
93
95
  command: { idle: 0, think: 42 },
94
96
  glint: { idle: 5, think: 65 },
95
97
  halo: { idle: 20, think: 80 },
96
98
  mana: { idle: 0, think: 28 },
97
99
  obsidian: { idle: 4, think: 48 },
98
100
  opal: { idle: 9, think: 40 }
99
- }, le = {
101
+ }, fe = {
100
102
  idle: "idle",
101
103
  connecting: "think",
102
104
  listening: "idle",
@@ -104,17 +106,17 @@ const Te = [
104
106
  speaking: "idle",
105
107
  muted: "slow",
106
108
  asleep: "stop"
107
- }, se = {
109
+ }, de = {
108
110
  listening: { count: 2, duration: 1.7, maxScale: 1.7, peak: 0.4 },
109
111
  connecting: { count: 1, duration: 1.9, maxScale: 1.55, peak: 0.32 }
110
112
  };
111
- function ae(r, o) {
113
+ function pe(r, o) {
112
114
  switch (r) {
113
115
  case "command": {
114
116
  const t = C.command, i = `${o}-cmd`;
115
117
  return {
116
- defs: /* @__PURE__ */ c(y, { children: [
117
- /* @__PURE__ */ c("linearGradient", { id: i, x1: "0", y1: "1", x2: "1", y2: "0", children: [
118
+ defs: /* @__PURE__ */ l(_, { children: [
119
+ /* @__PURE__ */ l("linearGradient", { id: i, x1: "0", y1: "1", x2: "1", y2: "0", children: [
118
120
  /* @__PURE__ */ e("stop", { offset: "0%", stopColor: t.silverDeep }),
119
121
  /* @__PURE__ */ e("stop", { offset: "45%", stopColor: t.silver }),
120
122
  /* @__PURE__ */ e("stop", { offset: "70%", stopColor: t.sheen }),
@@ -140,7 +142,7 @@ function ae(r, o) {
140
142
  const t = C.glint;
141
143
  return {
142
144
  defs: null,
143
- body: /* @__PURE__ */ c(y, { children: [
145
+ body: /* @__PURE__ */ l(_, { children: [
144
146
  /* @__PURE__ */ e(
145
147
  "path",
146
148
  {
@@ -161,8 +163,8 @@ function ae(r, o) {
161
163
  case "halo": {
162
164
  const t = C.halo, i = `${o}-halo`;
163
165
  return {
164
- defs: /* @__PURE__ */ c(y, { children: [
165
- /* @__PURE__ */ c("linearGradient", { id: i, x1: "0", y1: "0", x2: "1", y2: "1", children: [
166
+ defs: /* @__PURE__ */ l(_, { children: [
167
+ /* @__PURE__ */ l("linearGradient", { id: i, x1: "0", y1: "0", x2: "1", y2: "1", children: [
166
168
  /* @__PURE__ */ e("stop", { offset: "0%", stopColor: t.ringLite }),
167
169
  /* @__PURE__ */ e("stop", { offset: "50%", stopColor: t.ring }),
168
170
  /* @__PURE__ */ e("stop", { offset: "100%", stopColor: t.ringLite })
@@ -170,7 +172,7 @@ function ae(r, o) {
170
172
  /* @__PURE__ */ e("filter", { id: `${i}-glow`, x: "-60%", y: "-60%", width: "220%", height: "220%", children: /* @__PURE__ */ e("feGaussianBlur", { stdDeviation: "4" }) })
171
173
  ] }),
172
174
  // Warm-white glow + the crisp silver ring stay fixed …
173
- under: /* @__PURE__ */ c(y, { children: [
175
+ under: /* @__PURE__ */ l(_, { children: [
174
176
  /* @__PURE__ */ e(
175
177
  "circle",
176
178
  {
@@ -202,8 +204,8 @@ function ae(r, o) {
202
204
  case "mana": {
203
205
  const t = C.mana, i = `${o}-mana`;
204
206
  return {
205
- defs: /* @__PURE__ */ c(y, { children: [
206
- /* @__PURE__ */ c("radialGradient", { id: i, cx: "0.4", cy: "0.34", r: "0.75", children: [
207
+ defs: /* @__PURE__ */ l(_, { children: [
208
+ /* @__PURE__ */ l("radialGradient", { id: i, cx: "0.4", cy: "0.34", r: "0.75", children: [
207
209
  /* @__PURE__ */ e("stop", { offset: "0%", stopColor: t.lit }),
208
210
  /* @__PURE__ */ e("stop", { offset: "45%", stopColor: t.body }),
209
211
  /* @__PURE__ */ e("stop", { offset: "78%", stopColor: t.mid }),
@@ -213,9 +215,9 @@ function ae(r, o) {
213
215
  /* @__PURE__ */ e("clipPath", { id: `${i}-c`, children: /* @__PURE__ */ e("circle", { cx: 50, cy: 50, r: 32 }) })
214
216
  ] }),
215
217
  // Sphere + cloudy internal texture rotate inside the clipped circle …
216
- body: /* @__PURE__ */ c("g", { clipPath: `url(#${i}-c)`, children: [
218
+ body: /* @__PURE__ */ l("g", { clipPath: `url(#${i}-c)`, children: [
217
219
  /* @__PURE__ */ e("circle", { cx: 50, cy: 50, r: 32, fill: `url(#${i})` }),
218
- /* @__PURE__ */ c("g", { filter: `url(#${i}-b)`, children: [
220
+ /* @__PURE__ */ l("g", { filter: `url(#${i}-b)`, children: [
219
221
  /* @__PURE__ */ e(
220
222
  "ellipse",
221
223
  {
@@ -244,7 +246,7 @@ function ae(r, o) {
244
246
  ] })
245
247
  ] }),
246
248
  // … while the ice-blue + white speculars stay put (fixed light source).
247
- over: /* @__PURE__ */ c("g", { children: [
249
+ over: /* @__PURE__ */ l("g", { children: [
248
250
  /* @__PURE__ */ e(
249
251
  "ellipse",
250
252
  {
@@ -277,18 +279,18 @@ function ae(r, o) {
277
279
  case "opal": {
278
280
  const t = C.opal, i = `${o}-opal`;
279
281
  return {
280
- defs: /* @__PURE__ */ c(y, { children: [
282
+ defs: /* @__PURE__ */ l(_, { children: [
281
283
  /* @__PURE__ */ e("filter", { id: `${i}-b`, x: "-30%", y: "-30%", width: "160%", height: "160%", children: /* @__PURE__ */ e("feGaussianBlur", { stdDeviation: "7" }) }),
282
284
  /* @__PURE__ */ e("clipPath", { id: `${i}-c`, children: /* @__PURE__ */ e("circle", { cx: 50, cy: 50, r: 33 }) }),
283
- /* @__PURE__ */ c("radialGradient", { id: `${i}-sheen`, cx: "0.4", cy: "0.32", r: "0.5", children: [
285
+ /* @__PURE__ */ l("radialGradient", { id: `${i}-sheen`, cx: "0.4", cy: "0.32", r: "0.5", children: [
284
286
  /* @__PURE__ */ e("stop", { offset: "0%", stopColor: t.sheen, stopOpacity: 0.55 }),
285
287
  /* @__PURE__ */ e("stop", { offset: "60%", stopColor: t.sheen, stopOpacity: 0 })
286
288
  ] })
287
289
  ] }),
288
290
  // The multi-hue field drifts (rotates slowly) so the colors melt.
289
- body: /* @__PURE__ */ c("g", { clipPath: `url(#${i}-c)`, children: [
291
+ body: /* @__PURE__ */ l("g", { clipPath: `url(#${i}-c)`, children: [
290
292
  /* @__PURE__ */ e("circle", { cx: 50, cy: 50, r: 33, fill: t.pink }),
291
- /* @__PURE__ */ c("g", { filter: `url(#${i}-b)`, children: [
293
+ /* @__PURE__ */ l("g", { filter: `url(#${i}-b)`, children: [
292
294
  /* @__PURE__ */ e("ellipse", { cx: 50, cy: 24, rx: 27, ry: 23, fill: t.crimson }),
293
295
  /* @__PURE__ */ e("ellipse", { cx: 40, cy: 20, rx: 14, ry: 12, fill: t.rust }),
294
296
  /* @__PURE__ */ e("ellipse", { cx: 26, cy: 52, rx: 22, ry: 26, fill: t.magenta }),
@@ -305,15 +307,15 @@ function ae(r, o) {
305
307
  default: {
306
308
  const t = C.obsidian, i = `${o}-obs`;
307
309
  return {
308
- defs: /* @__PURE__ */ c(y, { children: [
309
- /* @__PURE__ */ c("linearGradient", { id: `${i}-b`, x1: "0", y1: "0", x2: "0", y2: "1", children: [
310
+ defs: /* @__PURE__ */ l(_, { children: [
311
+ /* @__PURE__ */ l("linearGradient", { id: `${i}-b`, x1: "0", y1: "0", x2: "0", y2: "1", children: [
310
312
  /* @__PURE__ */ e("stop", { offset: "0%", stopColor: t.hi }),
311
313
  /* @__PURE__ */ e("stop", { offset: "34%", stopColor: t.body }),
312
314
  /* @__PURE__ */ e("stop", { offset: "54%", stopColor: t.horizon }),
313
315
  /* @__PURE__ */ e("stop", { offset: "72%", stopColor: t.body }),
314
316
  /* @__PURE__ */ e("stop", { offset: "100%", stopColor: t.low })
315
317
  ] }),
316
- /* @__PURE__ */ c("radialGradient", { id: `${i}-core`, cx: "0.42", cy: "0.4", r: "0.65", children: [
318
+ /* @__PURE__ */ l("radialGradient", { id: `${i}-core`, cx: "0.42", cy: "0.4", r: "0.65", children: [
317
319
  /* @__PURE__ */ e("stop", { offset: "0%", stopColor: t.coreLite }),
318
320
  /* @__PURE__ */ e("stop", { offset: "100%", stopColor: t.coreDark })
319
321
  ] }),
@@ -321,7 +323,7 @@ function ae(r, o) {
321
323
  /* @__PURE__ */ e("clipPath", { id: `${i}-c`, children: /* @__PURE__ */ e("circle", { cx: 50, cy: 50, r: 32 }) })
322
324
  ] }),
323
325
  // Chrome body + gray crescent core + rim accents rotate …
324
- body: /* @__PURE__ */ c("g", { clipPath: `url(#${i}-c)`, children: [
326
+ body: /* @__PURE__ */ l("g", { clipPath: `url(#${i}-c)`, children: [
325
327
  /* @__PURE__ */ e("circle", { cx: 50, cy: 50, r: 32, fill: `url(#${i}-b)` }),
326
328
  /* @__PURE__ */ e(
327
329
  "circle",
@@ -358,35 +360,35 @@ function ae(r, o) {
358
360
  }
359
361
  }
360
362
  }
361
- const q = s.forwardRef(({ state: r, variant: o, className: t, ariaLabel: i }, n) => {
362
- const p = s.useId().replace(/[:]/g, ""), d = ae(o, p), m = ne[r], g = C[o].accent, a = se[r], h = le[r], v = ce[o], k = h === "think" ? v.think : h === "idle" ? v.idle : h === "slow" ? v.idle * 0.4 : 0, x = k > 0, _ = x ? { duration: 360 / k, ease: "linear", repeat: 1 / 0 } : { duration: 0.2, ease: F };
363
- return /* @__PURE__ */ e(Z, { reducedMotion: "user", children: /* @__PURE__ */ e(
364
- B.div,
363
+ const K = s.forwardRef(({ state: r, variant: o, className: t, ariaLabel: i }, n) => {
364
+ const h = s.useId().replace(/[:]/g, ""), u = pe(o, h), g = ae[r], k = C[o].accent, p = de[r], d = fe[r], v = ue[o], m = d === "think" ? v.think : d === "idle" ? v.idle : d === "slow" ? v.idle * 0.4 : 0, x = m > 0, L = x ? { duration: 360 / m, ease: "linear", repeat: 1 / 0 } : { duration: 0.2, ease: G };
365
+ return /* @__PURE__ */ e(Q, { reducedMotion: "user", children: /* @__PURE__ */ e(
366
+ U.div,
365
367
  {
366
368
  ref: n,
367
369
  role: "img",
368
370
  "aria-label": i ?? `AI voice, ${r}`,
369
371
  "data-state": r,
370
372
  "data-variant": o,
371
- className: T(
373
+ className: z(
372
374
  "relative inline-flex size-16 shrink-0 items-center justify-center",
373
375
  t
374
376
  ),
375
- animate: { scale: m.scale, opacity: m.opacity },
377
+ animate: { scale: g.scale, opacity: g.opacity },
376
378
  transition: {
377
379
  scale: {
378
- duration: m.duration,
379
- ease: X,
380
+ duration: g.duration,
381
+ ease: oe,
380
382
  repeat: 1 / 0,
381
383
  repeatType: "loop"
382
384
  },
383
- opacity: { duration: 0.2, ease: F }
385
+ opacity: { duration: 0.2, ease: G }
384
386
  },
385
- children: /* @__PURE__ */ c("svg", { viewBox: "0 0 100 100", className: "size-full", fill: "none", "aria-hidden": !0, children: [
386
- d.defs && /* @__PURE__ */ e("defs", { children: d.defs }),
387
- d.under,
388
- a && Array.from({ length: a.count }).map((L, P) => /* @__PURE__ */ e(
389
- B.rect,
387
+ children: /* @__PURE__ */ l("svg", { viewBox: "0 0 100 100", className: "size-full", fill: "none", "aria-hidden": !0, children: [
388
+ u.defs && /* @__PURE__ */ e("defs", { children: u.defs }),
389
+ u.under,
390
+ p && Array.from({ length: p.count }).map((D, y) => /* @__PURE__ */ e(
391
+ U.rect,
390
392
  {
391
393
  x: 20,
392
394
  y: 20,
@@ -394,36 +396,51 @@ const q = s.forwardRef(({ state: r, variant: o, className: t, ariaLabel: i }, n)
394
396
  height: 60,
395
397
  rx: o === "command" ? 18 : 30,
396
398
  fill: "none",
397
- stroke: g,
399
+ stroke: k,
398
400
  strokeWidth: 2.5,
399
401
  style: { transformBox: "fill-box", transformOrigin: "center" },
400
402
  initial: { scale: 0.95, opacity: 0 },
401
- animate: { scale: a.maxScale, opacity: [0, a.peak, 0] },
403
+ animate: { scale: p.maxScale, opacity: [0, p.peak, 0] },
402
404
  transition: {
403
- duration: a.duration,
404
- ease: F,
405
+ duration: p.duration,
406
+ ease: G,
405
407
  repeat: 1 / 0,
406
- delay: P * (a.duration / 2)
408
+ delay: y * (p.duration / 2)
407
409
  }
408
410
  },
409
- P
411
+ y
410
412
  )),
411
413
  /* @__PURE__ */ e(
412
- B.g,
414
+ U.g,
413
415
  {
414
416
  style: { transformBox: "fill-box", transformOrigin: "center" },
415
417
  animate: { rotate: x ? 360 : 0 },
416
- transition: _,
417
- children: d.body
418
+ transition: L,
419
+ children: u.body
418
420
  }
419
421
  ),
420
- d.over
422
+ u.over
421
423
  ] })
422
424
  }
423
425
  ) });
424
426
  });
425
- q.displayName = "PersonaVisual";
426
- const H = {
427
+ K.displayName = "PersonaVisual";
428
+ const X = {
429
+ /**
430
+ * Base colours for `seed`-derived hues. The shader rotates these by u_hue,
431
+ * so each seed lands on its own colourway from one shared palette.
432
+ */
433
+ identity: [
434
+ [0.08, 0.78, 1],
435
+ [0.58, 0.24, 1],
436
+ [1, 0.16, 0.58]
437
+ ],
438
+ /** Neutral greys, for monochrome products that take no chromatic accent. */
439
+ mono: [
440
+ [0.62, 0.62, 0.65],
441
+ [0.26, 0.26, 0.29],
442
+ [0.86, 0.86, 0.89]
443
+ ],
427
444
  default: [
428
445
  [0.08, 0.78, 1],
429
446
  [0.58, 0.24, 1],
@@ -449,7 +466,9 @@ const H = {
449
466
  [1, 0.12, 0.46],
450
467
  [0.58, 0.18, 1]
451
468
  ]
452
- }, ue = {
469
+ }, me = {
470
+ identity: 0.65,
471
+ mono: 0,
453
472
  default: 0.65,
454
473
  blue: 0.3,
455
474
  violet: 0.5,
@@ -461,7 +480,7 @@ const H = {
461
480
  listening: { speed: 0.4, amplitude: 0.14, glow: 0.5, brightness: 0.85, pulse: 0, saturation: 1 },
462
481
  speaking: { speed: 1.4, amplitude: 0.35, glow: 0.9, brightness: 1, pulse: 0, saturation: 1 },
463
482
  muted: { speed: 0.06, amplitude: 0.015, glow: 0.08, brightness: 0.35, pulse: 0, saturation: 0.2 }
464
- }, U = {
483
+ }, M = {
465
484
  idle: w.idle,
466
485
  connecting: w.connecting,
467
486
  listening: w.listening,
@@ -469,13 +488,13 @@ const H = {
469
488
  speaking: w.speaking,
470
489
  muted: w.muted,
471
490
  asleep: { ...w.idle, brightness: 0.35, speed: 0.08 }
472
- }, de = `#version 300 es
491
+ }, he = `#version 300 es
473
492
  in vec2 a_position;
474
493
  out vec2 v_uv;
475
494
  void main() {
476
495
  v_uv = a_position * 0.5 + 0.5;
477
496
  gl_Position = vec4(a_position, 0.0, 1.0);
478
- }`, fe = `#version 300 es
497
+ }`, ge = `#version 300 es
479
498
  precision highp float;
480
499
 
481
500
  in vec2 v_uv;
@@ -488,6 +507,8 @@ uniform float u_glow;
488
507
  uniform float u_brightness;
489
508
  uniform float u_pulse;
490
509
  uniform float u_saturation;
510
+ uniform float u_seed;
511
+ uniform float u_hue;
491
512
  uniform vec3 u_color0;
492
513
  uniform vec3 u_color1;
493
514
  uniform vec3 u_color2;
@@ -499,6 +520,13 @@ vec4 mod289(vec4 x) { return x - floor(x / 289.0) * 289.0; }
499
520
  vec4 permute(vec4 x) { return mod289((x * 34.0 + 1.0) * x); }
500
521
  vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }
501
522
 
523
+ /** Rotate an RGB triple around the grey axis — used for per-identity hues. */
524
+ vec3 hueRotate(vec3 c, float a) {
525
+ const vec3 k = vec3(0.57735026);
526
+ float ca = cos(a);
527
+ return c * ca + cross(k, c) * sin(a) + k * dot(k, c) * (1.0 - ca);
528
+ }
529
+
502
530
  float snoise(vec3 v) {
503
531
  const vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0);
504
532
  vec3 i = floor(v + dot(v, vec3(C.y)));
@@ -557,15 +585,20 @@ void main() {
557
585
  return;
558
586
  }
559
587
 
560
- float n1 = snoise(vec3(uv * 2.0, t * 0.6)) * 0.5 + 0.5;
561
- float n2 = snoise(vec3(uv * 3.5 + 7.0, t * 0.9)) * 0.5 + 0.5;
562
- float n3 = snoise(vec3(uv * 1.5 - 3.0, t * 0.4 + 10.0)) * 0.5 + 0.5;
588
+ // u_seed offsets only the noise sample coordinates, so an identity changes
589
+ // the internal pattern while the circle, glow and speculars stay identical.
590
+ float sx = u_seed * 13.7;
591
+ float sz = u_seed * 5.3;
592
+
593
+ float n1 = snoise(vec3(uv * 2.0 + sx, t * 0.6 + sz)) * 0.5 + 0.5;
594
+ float n2 = snoise(vec3(uv * 3.5 + 7.0 + sx, t * 0.9 + sz)) * 0.5 + 0.5;
595
+ float n3 = snoise(vec3(uv * 1.5 - 3.0 + sx, t * 0.4 + 10.0 + sz)) * 0.5 + 0.5;
563
596
 
564
597
  vec2 distort = vec2(
565
- snoise(vec3(uv * 2.0 + 5.0, t * 0.7)),
566
- snoise(vec3(uv * 2.0 + 15.0, t * 0.7))
598
+ snoise(vec3(uv * 2.0 + 5.0 + sx, t * 0.7 + sz)),
599
+ snoise(vec3(uv * 2.0 + 15.0 + sx, t * 0.7 + sz))
567
600
  ) * u_amplitude * 2.0;
568
- float n4 = snoise(vec3((uv + distort) * 3.0, t * 0.5)) * 0.5 + 0.5;
601
+ float n4 = snoise(vec3((uv + distort) * 3.0 + sx, t * 0.5 + sz)) * 0.5 + 0.5;
569
602
 
570
603
  vec3 col = mix(u_color0, u_color1, n1);
571
604
  col = mix(col, u_color2, n2 * 0.5);
@@ -592,6 +625,8 @@ void main() {
592
625
 
593
626
  float pulseFactor = 1.0 + u_pulse * sin(u_time * 3.5) * 0.35;
594
627
 
628
+ col = hueRotate(col, u_hue);
629
+
595
630
  float lum = dot(col, vec3(0.299, 0.587, 0.114));
596
631
  col = mix(vec3(lum), col, u_saturation);
597
632
 
@@ -599,31 +634,31 @@ void main() {
599
634
 
600
635
  fragColor = vec4(col, circle);
601
636
  }`;
602
- function W(r, o, t) {
637
+ function Y(r, o, t) {
603
638
  const i = r.createShader(o);
604
639
  return i ? (r.shaderSource(i, t), r.compileShader(i), r.getShaderParameter(i, r.COMPILE_STATUS) ? i : (r.deleteShader(i), null)) : null;
605
640
  }
606
- function pe(r) {
641
+ function ve(r) {
607
642
  const o = r.getContext("webgl2", {
608
643
  alpha: !0,
609
644
  premultipliedAlpha: !1,
610
645
  antialias: !0
611
646
  });
612
647
  if (!o) return null;
613
- const t = W(o, o.VERTEX_SHADER, de), i = W(o, o.FRAGMENT_SHADER, fe);
648
+ const t = Y(o, o.VERTEX_SHADER, he), i = Y(o, o.FRAGMENT_SHADER, ge);
614
649
  if (!t || !i) return null;
615
650
  const n = o.createProgram();
616
651
  if (o.attachShader(n, t), o.attachShader(n, i), o.linkProgram(n), !o.getProgramParameter(n, o.LINK_STATUS)) return null;
617
652
  o.useProgram(n);
618
- const p = o.createBuffer();
619
- o.bindBuffer(o.ARRAY_BUFFER, p), o.bufferData(
653
+ const h = o.createBuffer();
654
+ o.bindBuffer(o.ARRAY_BUFFER, h), o.bufferData(
620
655
  o.ARRAY_BUFFER,
621
656
  new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]),
622
657
  o.STATIC_DRAW
623
658
  );
624
- const d = o.getAttribLocation(n, "a_position");
625
- o.enableVertexAttribArray(d), o.vertexAttribPointer(d, 2, o.FLOAT, !1, 0, 0), o.enable(o.BLEND), o.blendFunc(o.SRC_ALPHA, o.ONE_MINUS_SRC_ALPHA);
626
- const m = {
659
+ const u = o.getAttribLocation(n, "a_position");
660
+ o.enableVertexAttribArray(u), o.vertexAttribPointer(u, 2, o.FLOAT, !1, 0, 0), o.enable(o.BLEND), o.blendFunc(o.SRC_ALPHA, o.ONE_MINUS_SRC_ALPHA);
661
+ const g = {
627
662
  u_time: o.getUniformLocation(n, "u_time"),
628
663
  u_speed: o.getUniformLocation(n, "u_speed"),
629
664
  u_amplitude: o.getUniformLocation(n, "u_amplitude"),
@@ -631,138 +666,157 @@ function pe(r) {
631
666
  u_brightness: o.getUniformLocation(n, "u_brightness"),
632
667
  u_pulse: o.getUniformLocation(n, "u_pulse"),
633
668
  u_saturation: o.getUniformLocation(n, "u_saturation"),
669
+ u_seed: o.getUniformLocation(n, "u_seed"),
670
+ u_hue: o.getUniformLocation(n, "u_hue"),
634
671
  u_color0: o.getUniformLocation(n, "u_color0"),
635
672
  u_color1: o.getUniformLocation(n, "u_color1"),
636
673
  u_color2: o.getUniformLocation(n, "u_color2"),
637
674
  u_dpr: o.getUniformLocation(n, "u_dpr")
638
675
  };
639
- return { gl: o, uniforms: m };
676
+ return { gl: o, uniforms: g };
677
+ }
678
+ function xe(r) {
679
+ if (r === void 0) return 0;
680
+ if (typeof r == "number") return r;
681
+ let o = 0;
682
+ for (let t = 0; t < r.length; t += 1)
683
+ o = (o << 5) - o + r.charCodeAt(t) | 0;
684
+ return Math.abs(o) % 1e3 / 1e3;
640
685
  }
641
686
  function E(r, o, t) {
642
687
  return r + (o - r) * t;
643
688
  }
644
- const me = s.memo(function({
689
+ const ye = s.memo(function({
645
690
  state: o,
646
691
  palette: t,
647
692
  volume: i,
648
- reduced: n
693
+ reduced: n,
694
+ seed: h,
695
+ hue: u
649
696
  }) {
650
- const p = s.useRef(0);
651
- p.current = i;
697
+ const g = s.useRef(0);
698
+ g.current = i;
699
+ const k = s.useRef(h);
700
+ k.current = h;
701
+ const p = s.useRef(u);
702
+ p.current = u;
652
703
  const d = s.useRef(n);
653
704
  d.current = n;
654
- const m = s.useRef(null), g = s.useRef(null), a = s.useRef(0), h = s.useRef(performance.now()), v = s.useRef({ ...U.idle }), k = s.useRef({ ...U.idle });
705
+ const v = s.useRef(null), m = s.useRef(null), x = s.useRef(0), L = s.useRef(performance.now()), D = s.useRef({ ...M.idle }), y = s.useRef({ ...M.idle });
655
706
  s.useEffect(() => {
656
- k.current = { ...U[o] };
707
+ y.current = { ...M[o] };
657
708
  }, [o]);
658
- const x = H[t], _ = s.useRef(x);
659
- _.current = x;
660
- const [L, P] = s.useState(!1);
709
+ const P = X[t], T = s.useRef(P);
710
+ T.current = P;
711
+ const [j, q] = s.useState(!1);
661
712
  s.useEffect(() => {
662
- const b = requestAnimationFrame(() => P(!0));
713
+ const b = requestAnimationFrame(() => q(!0));
663
714
  return () => {
664
- cancelAnimationFrame(b), P(!1);
715
+ cancelAnimationFrame(b), q(!1);
665
716
  };
666
717
  }, []);
667
- const D = s.useCallback(() => {
668
- const b = g.current;
718
+ const O = s.useCallback(() => {
719
+ const b = m.current;
669
720
  if (!b) return;
670
- const { gl: l, uniforms: f } = b, A = m.current;
671
- if (!A) return;
672
- const u = v.current, S = k.current, R = 0.045;
673
- u.speed = E(u.speed, S.speed, R), u.amplitude = E(u.amplitude, S.amplitude, R), u.glow = E(u.glow, S.glow, R), u.brightness = E(u.brightness, S.brightness, R), u.pulse = E(u.pulse, S.pulse, R), u.saturation = E(u.saturation, S.saturation, R);
674
- const Y = (performance.now() - h.current) / 1e3, z = window.devicePixelRatio || 1, M = A.getBoundingClientRect(), O = Math.round(M.width * z), I = Math.round(M.height * z);
675
- (A.width !== O || A.height !== I) && (A.width = O, A.height = I), l.viewport(0, 0, O, I), l.clearColor(0, 0, 0, 0), l.clear(l.COLOR_BUFFER_BIT);
676
- const $ = d.current ? 0 : 1, N = p.current * $, V = _.current;
677
- l.uniform1f(f.u_time, Y), l.uniform1f(f.u_speed, (u.speed + N * 0.4) * $), l.uniform1f(f.u_amplitude, (u.amplitude + N * 0.12) * $), l.uniform1f(f.u_glow, u.glow + N * 0.2), l.uniform1f(f.u_brightness, u.brightness), l.uniform1f(f.u_pulse, u.pulse * $), l.uniform1f(f.u_saturation, u.saturation), l.uniform3fv(f.u_color0, V[0]), l.uniform3fv(f.u_color1, V[1]), l.uniform3fv(f.u_color2, V[2]), l.uniform1f(f.u_dpr, z), l.drawArrays(l.TRIANGLE_STRIP, 0, 4), a.current = requestAnimationFrame(D);
721
+ const { gl: c, uniforms: f } = b, R = v.current;
722
+ if (!R) return;
723
+ const a = D.current, A = y.current, S = 0.045;
724
+ a.speed = E(a.speed, A.speed, S), a.amplitude = E(a.amplitude, A.amplitude, S), a.glow = E(a.glow, A.glow, S), a.brightness = E(a.brightness, A.brightness, S), a.pulse = E(a.pulse, A.pulse, S), a.saturation = E(a.saturation, A.saturation, S);
725
+ const J = (performance.now() - L.current) / 1e3, I = window.devicePixelRatio || 1, H = R.getBoundingClientRect(), V = Math.round(H.width * I), B = Math.round(H.height * I);
726
+ (R.width !== V || R.height !== B) && (R.width = V, R.height = B), c.viewport(0, 0, V, B), c.clearColor(0, 0, 0, 0), c.clear(c.COLOR_BUFFER_BIT);
727
+ const $ = d.current ? 0 : 1, N = g.current * $, F = T.current;
728
+ c.uniform1f(f.u_time, J), c.uniform1f(f.u_speed, (a.speed + N * 0.4) * $), c.uniform1f(f.u_amplitude, (a.amplitude + N * 0.12) * $), c.uniform1f(f.u_glow, a.glow + N * 0.2), c.uniform1f(f.u_brightness, a.brightness), c.uniform1f(f.u_pulse, a.pulse * $), c.uniform1f(f.u_saturation, a.saturation), c.uniform1f(f.u_seed, k.current), c.uniform1f(f.u_hue, p.current), c.uniform3fv(f.u_color0, F[0]), c.uniform3fv(f.u_color1, F[1]), c.uniform3fv(f.u_color2, F[2]), c.uniform1f(f.u_dpr, I), c.drawArrays(c.TRIANGLE_STRIP, 0, 4), x.current = requestAnimationFrame(O);
678
729
  }, []);
679
730
  return s.useEffect(() => {
680
- if (!L) return;
681
- const b = m.current;
682
- if (b && (g.current = pe(b), !!g.current))
683
- return a.current = requestAnimationFrame(D), () => {
684
- cancelAnimationFrame(a.current);
685
- const l = g.current;
686
- if (l) {
687
- const f = l.gl.getExtension("WEBGL_lose_context");
731
+ if (!j) return;
732
+ const b = v.current;
733
+ if (b && (m.current = ve(b), !!m.current))
734
+ return x.current = requestAnimationFrame(O), () => {
735
+ cancelAnimationFrame(x.current);
736
+ const c = m.current;
737
+ if (c) {
738
+ const f = c.gl.getExtension("WEBGL_lose_context");
688
739
  f == null || f.loseContext();
689
740
  }
690
- g.current = null;
741
+ m.current = null;
691
742
  };
692
- }, [L, D]), /* @__PURE__ */ e("canvas", { ref: m, className: "size-full", "data-state": o });
693
- }), ge = s.forwardRef(
743
+ }, [j, O]), /* @__PURE__ */ e("canvas", { ref: v, className: "size-full", "data-state": o });
744
+ }), _e = s.forwardRef(
694
745
  ({
695
746
  state: r = "idle",
696
747
  variant: o = "orb",
697
748
  className: t,
698
749
  volume: i = 0,
699
750
  palette: n = "default",
700
- onReady: p,
701
- "aria-label": d,
702
- ...m
703
- }, g) => {
704
- const a = re.includes(o) ? o : "orb", h = K() ?? !1, v = Math.min(1, Math.max(0, i));
751
+ seed: h,
752
+ onReady: u,
753
+ "aria-label": g,
754
+ ...k
755
+ }, p) => {
756
+ const d = se.includes(o) ? o : "orb", v = ee() ?? !1, m = Math.min(1, Math.max(0, i)), x = s.useMemo(() => xe(h), [h]), L = n === "identity" ? x * Math.PI * 2 : 0;
705
757
  if (s.useEffect(() => {
706
- p == null || p();
707
- }, []), a === "orb" || a === "aura" || a === "wave") {
708
- const x = H[n][0], _ = ue[n], L = a === "orb" ? /* @__PURE__ */ e(
709
- me,
758
+ u == null || u();
759
+ }, []), d === "orb" || d === "aura" || d === "wave") {
760
+ const y = X[n][0], P = me[n], T = d === "orb" ? /* @__PURE__ */ e(
761
+ ye,
710
762
  {
711
763
  state: r,
712
764
  palette: n,
713
- volume: v,
714
- reduced: h
765
+ volume: m,
766
+ reduced: v,
767
+ seed: x,
768
+ hue: L
715
769
  }
716
- ) : a === "aura" ? /* @__PURE__ */ e(
717
- J,
770
+ ) : d === "aura" ? /* @__PURE__ */ e(
771
+ te,
718
772
  {
719
773
  state: r,
720
- volume: v,
721
- reduced: h,
722
- color: x,
723
- colorShift: _
774
+ volume: m,
775
+ reduced: v,
776
+ color: y,
777
+ colorShift: P
724
778
  }
725
779
  ) : /* @__PURE__ */ e(
726
- Q,
780
+ ie,
727
781
  {
728
782
  state: r,
729
- volume: v,
730
- reduced: h,
731
- color: x,
732
- colorShift: _
783
+ volume: m,
784
+ reduced: v,
785
+ color: y,
786
+ colorShift: P
733
787
  }
734
788
  );
735
789
  return /* @__PURE__ */ e(
736
790
  "div",
737
791
  {
738
- ...m,
739
- ref: g,
792
+ ...k,
793
+ ref: p,
740
794
  role: "img",
741
- "aria-label": d ?? `AI voice, ${r}`,
795
+ "aria-label": g ?? `AI voice, ${r}`,
742
796
  "data-state": r,
743
- "data-variant": a,
744
- className: T(
797
+ "data-variant": d,
798
+ className: z(
745
799
  "relative inline-flex size-16 shrink-0 items-center justify-center",
746
800
  t
747
801
  ),
748
- children: L
802
+ children: T
749
803
  }
750
804
  );
751
805
  }
752
806
  return /* @__PURE__ */ e(
753
- q,
807
+ K,
754
808
  {
755
- ref: g,
809
+ ref: p,
756
810
  state: r,
757
- variant: a,
811
+ variant: d,
758
812
  className: t,
759
- ariaLabel: d
813
+ ariaLabel: g
760
814
  }
761
815
  );
762
816
  }
763
817
  );
764
- ge.displayName = "Voice";
765
- const he = {
818
+ _e.displayName = "Voice";
819
+ const be = {
766
820
  idle: "bg-muted-foreground",
767
821
  connecting: "bg-warning motion-safe:animate-pulse",
768
822
  listening: "bg-success",
@@ -771,46 +825,46 @@ const he = {
771
825
  muted: "bg-danger",
772
826
  asleep: "bg-muted-foreground opacity-50"
773
827
  };
774
- function ve({ state: r = "idle", className: o }) {
828
+ function we({ state: r = "idle", className: o }) {
775
829
  return /* @__PURE__ */ e(
776
830
  "span",
777
831
  {
778
832
  "aria-hidden": !0,
779
- className: T(
833
+ className: z(
780
834
  "inline-block size-2.5 shrink-0 rounded-dot transition-[background-color,opacity] duration-(--duration-normal) ease-out motion-reduce:transition-none",
781
- he[r],
835
+ be[r],
782
836
  o
783
837
  )
784
838
  }
785
839
  );
786
840
  }
787
- function xe({
841
+ function Ce({
788
842
  onConnect: r,
789
843
  disabled: o,
790
844
  className: t
791
845
  }) {
792
846
  return /* @__PURE__ */ e(
793
- G,
847
+ W,
794
848
  {
795
849
  variant: "solid",
796
850
  size: "sm",
797
851
  disabled: o,
798
852
  onClick: r,
799
- startContent: /* @__PURE__ */ e(ee, {}),
853
+ startContent: /* @__PURE__ */ e(re, {}),
800
854
  className: t,
801
855
  children: "Connect"
802
856
  }
803
857
  );
804
858
  }
805
- function ye({
859
+ function ke({
806
860
  isMuted: r = !1,
807
861
  onMute: o,
808
862
  onUnmute: t,
809
863
  disabled: i,
810
864
  className: n
811
865
  }) {
812
- return /* @__PURE__ */ e(j, { content: r ? "Unmute" : "Mute", children: /* @__PURE__ */ e(
813
- G,
866
+ return /* @__PURE__ */ e(Z, { content: r ? "Unmute" : "Mute", children: /* @__PURE__ */ e(
867
+ W,
814
868
  {
815
869
  variant: "ghost",
816
870
  size: "icon-sm",
@@ -818,58 +872,58 @@ function ye({
818
872
  "aria-label": r ? "Unmute" : "Mute",
819
873
  onClick: () => r ? t == null ? void 0 : t() : o == null ? void 0 : o(),
820
874
  className: n,
821
- children: r ? /* @__PURE__ */ e(te, {}) : /* @__PURE__ */ e(ie, {})
875
+ children: r ? /* @__PURE__ */ e(ce, {}) : /* @__PURE__ */ e(le, {})
822
876
  }
823
877
  ) });
824
878
  }
825
- function _e({
879
+ function Re({
826
880
  onDisconnect: r,
827
881
  disabled: o,
828
882
  className: t
829
883
  }) {
830
- return /* @__PURE__ */ e(j, { content: "Disconnect", children: /* @__PURE__ */ e(
831
- G,
884
+ return /* @__PURE__ */ e(Z, { content: "Disconnect", children: /* @__PURE__ */ e(
885
+ W,
832
886
  {
833
887
  variant: "ghost",
834
888
  size: "icon-sm",
835
889
  disabled: o,
836
890
  "aria-label": "Disconnect",
837
891
  onClick: r,
838
- className: T("text-danger hover:text-danger", t),
839
- children: /* @__PURE__ */ e(oe, {})
892
+ className: z("text-danger hover:text-danger", t),
893
+ children: /* @__PURE__ */ e(ne, {})
840
894
  }
841
895
  ) });
842
896
  }
843
- function be(r, o) {
897
+ function Ae(r, o) {
844
898
  return r === "ended" ? "idle" : r === "starting" ? "connecting" : o ? "muted" : "listening";
845
899
  }
846
- function De({
900
+ function Be({
847
901
  status: r,
848
902
  isMuted: o = !1,
849
903
  onConnect: t,
850
904
  onMute: i,
851
905
  onUnmute: n,
852
- onDisconnect: p,
853
- className: d
906
+ onDisconnect: h,
907
+ className: u
854
908
  }) {
855
- return /* @__PURE__ */ c("div", { className: T("flex items-center gap-2", d), children: [
856
- /* @__PURE__ */ e(ve, { state: be(r, o) }),
857
- r === "ended" && /* @__PURE__ */ e(xe, { onConnect: t }),
909
+ return /* @__PURE__ */ l("div", { className: z("flex items-center gap-2", u), children: [
910
+ /* @__PURE__ */ e(we, { state: Ae(r, o) }),
911
+ r === "ended" && /* @__PURE__ */ e(Ce, { onConnect: t }),
858
912
  r === "starting" && /* @__PURE__ */ e("span", { className: "text-base text-secondary", children: "Connecting…" }),
859
- r === "running" && /* @__PURE__ */ c(y, { children: [
860
- /* @__PURE__ */ e(ye, { isMuted: o, onMute: i, onUnmute: n }),
861
- /* @__PURE__ */ e(_e, { onDisconnect: p })
913
+ r === "running" && /* @__PURE__ */ l(_, { children: [
914
+ /* @__PURE__ */ e(ke, { isMuted: o, onMute: i, onUnmute: n }),
915
+ /* @__PURE__ */ e(Re, { onDisconnect: h })
862
916
  ] })
863
917
  ] });
864
918
  }
865
919
  export {
866
- Te as VOICE_PALETTES,
867
- $e as VOICE_STATES,
868
- re as VOICE_VARIANTS,
869
- ge as Voice,
870
- xe as VoiceConnectButton,
871
- De as VoiceControl,
872
- _e as VoiceDisconnectButton,
873
- ye as VoiceMuteButton,
874
- ve as VoiceStatusDot
920
+ Ie as VOICE_PALETTES,
921
+ Ve as VOICE_STATES,
922
+ se as VOICE_VARIANTS,
923
+ _e as Voice,
924
+ Ce as VoiceConnectButton,
925
+ Be as VoiceControl,
926
+ Re as VoiceDisconnectButton,
927
+ ke as VoiceMuteButton,
928
+ we as VoiceStatusDot
875
929
  };