@handled-ai/design-system 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -4
- package/dist/charts/bar-chart-component.d.ts +24 -0
- package/dist/charts/bar-chart-component.js +123 -0
- package/dist/charts/bar-chart-component.js.map +1 -0
- package/dist/charts/chart-tooltip.d.ts +26 -0
- package/dist/charts/chart-tooltip.js +69 -0
- package/dist/charts/chart-tooltip.js.map +1 -0
- package/dist/charts/chart.d.ts +64 -0
- package/dist/charts/chart.js +285 -0
- package/dist/charts/chart.js.map +1 -0
- package/dist/charts/donut-chart.d.ts +21 -0
- package/dist/charts/donut-chart.js +96 -0
- package/dist/charts/donut-chart.js.map +1 -0
- package/dist/charts/index.d.ts +11 -0
- package/dist/charts/index.js +10 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/pipeline-overview.d.ts +76 -0
- package/dist/charts/pipeline-overview.js +372 -0
- package/dist/charts/pipeline-overview.js.map +1 -0
- package/dist/charts/sankey-chart.d.ts +52 -0
- package/dist/charts/sankey-chart.js +219 -0
- package/dist/charts/sankey-chart.js.map +1 -0
- package/dist/charts/top-line-metrics.d.ts +26 -0
- package/dist/charts/top-line-metrics.js +224 -0
- package/dist/charts/top-line-metrics.js.map +1 -0
- package/dist/charts/trend-area-chart.d.ts +21 -0
- package/dist/charts/trend-area-chart.js +150 -0
- package/dist/charts/trend-area-chart.js.map +1 -0
- package/dist/charts/volume-analysis-chart.d.ts +19 -0
- package/dist/charts/volume-analysis-chart.js +121 -0
- package/dist/charts/volume-analysis-chart.js.map +1 -0
- package/dist/components/activity-detail.d.ts +38 -0
- package/dist/components/activity-detail.js +163 -0
- package/dist/components/activity-detail.js.map +1 -0
- package/dist/components/activity-log.d.ts +21 -0
- package/dist/components/activity-log.js +61 -0
- package/dist/components/activity-log.js.map +1 -0
- package/dist/components/agent-popover.d.ts +71 -0
- package/dist/components/agent-popover.js +282 -0
- package/dist/components/agent-popover.js.map +1 -0
- package/dist/components/agent-widget.d.ts +24 -0
- package/dist/components/agent-widget.js +117 -0
- package/dist/components/agent-widget.js.map +1 -0
- package/dist/components/avatar.d.ts +13 -0
- package/dist/components/avatar.js +140 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +12 -0
- package/dist/components/badge.js +75 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +13 -0
- package/dist/components/button.js +83 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.d.ts +11 -0
- package/dist/components/card.js +119 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/contact-list.d.ts +34 -0
- package/dist/components/contact-list.js +84 -0
- package/dist/components/contact-list.js.map +1 -0
- package/dist/components/dashboard-cards.d.ts +10 -0
- package/dist/components/dashboard-cards.js +164 -0
- package/dist/components/dashboard-cards.js.map +1 -0
- package/dist/components/data-table-display.d.ts +19 -0
- package/dist/components/data-table-display.js +109 -0
- package/dist/components/data-table-display.js.map +1 -0
- package/dist/components/data-table-filter.d.ts +18 -0
- package/dist/components/data-table-filter.js +107 -0
- package/dist/components/data-table-filter.js.map +1 -0
- package/dist/components/data-table-quick-views.d.ts +13 -0
- package/dist/components/data-table-quick-views.js +90 -0
- package/dist/components/data-table-quick-views.js.map +1 -0
- package/dist/components/data-table-toolbar.d.ts +18 -0
- package/dist/components/data-table-toolbar.js +45 -0
- package/dist/components/data-table-toolbar.js.map +1 -0
- package/dist/components/data-table.d.ts +39 -0
- package/dist/components/data-table.js +821 -0
- package/dist/components/data-table.js.map +1 -0
- package/dist/components/detail-view.d.ts +44 -0
- package/dist/components/detail-view.js +165 -0
- package/dist/components/detail-view.js.map +1 -0
- package/dist/components/dialog.d.ts +19 -0
- package/dist/components/dialog.js +188 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +27 -0
- package/dist/components/dropdown-menu.js +279 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/entity-panel.d.ts +69 -0
- package/dist/components/entity-panel.js +584 -0
- package/dist/components/entity-panel.js.map +1 -0
- package/dist/components/inbox-row.d.ts +27 -0
- package/dist/components/inbox-row.js +139 -0
- package/dist/components/inbox-row.js.map +1 -0
- package/dist/components/inbox-toolbar.d.ts +21 -0
- package/dist/components/inbox-toolbar.js +203 -0
- package/dist/components/inbox-toolbar.js.map +1 -0
- package/dist/components/input.d.ts +5 -0
- package/dist/components/input.js +50 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/insights-filter-bar.d.ts +21 -0
- package/dist/components/insights-filter-bar.js +99 -0
- package/dist/components/insights-filter-bar.js.map +1 -0
- package/dist/components/item-list-display.d.ts +22 -0
- package/dist/components/item-list-display.js +240 -0
- package/dist/components/item-list-display.js.map +1 -0
- package/dist/components/item-list-filter.d.ts +16 -0
- package/dist/components/item-list-filter.js +87 -0
- package/dist/components/item-list-filter.js.map +1 -0
- package/dist/components/item-list-toolbar.d.ts +25 -0
- package/dist/components/item-list-toolbar.js +79 -0
- package/dist/components/item-list-toolbar.js.map +1 -0
- package/dist/components/item-list.d.ts +20 -0
- package/dist/components/item-list.js +702 -0
- package/dist/components/item-list.js.map +1 -0
- package/dist/components/label.d.ts +6 -0
- package/dist/components/label.js +55 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/message.d.ts +23 -0
- package/dist/components/message.js +117 -0
- package/dist/components/message.js.map +1 -0
- package/dist/components/metric-card.d.ts +25 -0
- package/dist/components/metric-card.js +107 -0
- package/dist/components/metric-card.js.map +1 -0
- package/dist/components/performance-metrics-table.d.ts +38 -0
- package/dist/components/performance-metrics-table.js +342 -0
- package/dist/components/performance-metrics-table.js.map +1 -0
- package/dist/components/preview-list.d.ts +14 -0
- package/dist/components/preview-list.js +83 -0
- package/dist/components/preview-list.js.map +1 -0
- package/dist/components/progress.d.ts +6 -0
- package/dist/components/progress.js +69 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/quick-action-chat-area.d.ts +24 -0
- package/dist/components/quick-action-chat-area.js +178 -0
- package/dist/components/quick-action-chat-area.js.map +1 -0
- package/dist/components/quick-action-modal.d.ts +30 -0
- package/dist/components/quick-action-modal.js +288 -0
- package/dist/components/quick-action-modal.js.map +1 -0
- package/dist/components/quick-action-sidebar-nav.d.ts +51 -0
- package/dist/components/quick-action-sidebar-nav.js +528 -0
- package/dist/components/quick-action-sidebar-nav.js.map +1 -0
- package/dist/components/recommended-actions-section.d.ts +23 -0
- package/dist/components/recommended-actions-section.js +215 -0
- package/dist/components/recommended-actions-section.js.map +1 -0
- package/dist/components/report-card.d.ts +26 -0
- package/dist/components/report-card.js +69 -0
- package/dist/components/report-card.js.map +1 -0
- package/dist/components/score-analysis-modal.d.ts +26 -0
- package/dist/components/score-analysis-modal.js +141 -0
- package/dist/components/score-analysis-modal.js.map +1 -0
- package/dist/components/score-breakdown.d.ts +17 -0
- package/dist/components/score-breakdown.js +162 -0
- package/dist/components/score-breakdown.js.map +1 -0
- package/dist/components/score-feedback.d.ts +40 -0
- package/dist/components/score-feedback.js +209 -0
- package/dist/components/score-feedback.js.map +1 -0
- package/dist/components/score-ring.d.ts +14 -0
- package/dist/components/score-ring.js +79 -0
- package/dist/components/score-ring.js.map +1 -0
- package/dist/components/scroll-area.d.ts +7 -0
- package/dist/components/scroll-area.js +101 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +17 -0
- package/dist/components/select.js +228 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +6 -0
- package/dist/components/separator.js +61 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +16 -0
- package/dist/components/sheet.js +168 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +73 -0
- package/dist/components/sidebar.js +723 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/signal-feedback-inline.d.ts +51 -0
- package/dist/components/signal-feedback-inline.js +548 -0
- package/dist/components/signal-feedback-inline.js.map +1 -0
- package/dist/components/simple-data-table.d.ts +15 -0
- package/dist/components/simple-data-table.js +91 -0
- package/dist/components/simple-data-table.js.map +1 -0
- package/dist/components/skeleton.d.ts +5 -0
- package/dist/components/skeleton.js +44 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/status-badge.d.ts +10 -0
- package/dist/components/status-badge.js +82 -0
- package/dist/components/status-badge.js.map +1 -0
- package/dist/components/styled-bar-list.d.ts +20 -0
- package/dist/components/styled-bar-list.js +59 -0
- package/dist/components/styled-bar-list.js.map +1 -0
- package/dist/components/suggested-actions.d.ts +110 -0
- package/dist/components/suggested-actions.js +1538 -0
- package/dist/components/suggested-actions.js.map +1 -0
- package/dist/components/table.d.ts +12 -0
- package/dist/components/table.js +147 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +14 -0
- package/dist/components/tabs.js +129 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +5 -0
- package/dist/components/textarea.js +47 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/timeline-activity.d.ts +34 -0
- package/dist/components/timeline-activity.js +181 -0
- package/dist/components/timeline-activity.js.map +1 -0
- package/dist/components/tooltip.d.ts +9 -0
- package/dist/components/tooltip.js +93 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/view-mode-toggle.d.ts +16 -0
- package/dist/components/view-mode-toggle.js +24 -0
- package/dist/components/view-mode-toggle.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +21 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/index.d.ts +68 -1878
- package/dist/index.js +69 -10918
- package/dist/index.js.map +1 -1
- package/dist/lib/icons.d.ts +18 -0
- package/dist/lib/icons.js +21 -0
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/prototype/index.d.ts +20 -0
- package/dist/prototype/index.js +8 -0
- package/dist/prototype/index.js.map +1 -0
- package/dist/prototype/prototype-accounts-view.d.ts +22 -0
- package/dist/prototype/prototype-accounts-view.js +70 -0
- package/dist/prototype/prototype-accounts-view.js.map +1 -0
- package/dist/prototype/prototype-admin-view.d.ts +21 -0
- package/dist/prototype/prototype-admin-view.js +53 -0
- package/dist/prototype/prototype-admin-view.js.map +1 -0
- package/dist/prototype/prototype-config.d.ts +226 -0
- package/dist/prototype/prototype-config.js +1 -0
- package/dist/prototype/prototype-config.js.map +1 -0
- package/dist/prototype/prototype-inbox-view.d.ts +48 -0
- package/dist/prototype/prototype-inbox-view.js +701 -0
- package/dist/prototype/prototype-inbox-view.js.map +1 -0
- package/dist/prototype/prototype-insights-view.d.ts +23 -0
- package/dist/prototype/prototype-insights-view.js +335 -0
- package/dist/prototype/prototype-insights-view.js.map +1 -0
- package/dist/prototype/prototype-shell.d.ts +40 -0
- package/dist/prototype/prototype-shell.js +190 -0
- package/dist/prototype/prototype-shell.js.map +1 -0
- package/dist/prototype/prototype-work-queue-view.d.ts +8 -0
- package/dist/prototype/prototype-work-queue-view.js +17 -0
- package/dist/prototype/prototype-work-queue-view.js.map +1 -0
- package/dist/three/agent-orb.d.ts +39 -0
- package/dist/three/agent-orb.js +500 -0
- package/dist/three/agent-orb.js.map +1 -0
- package/dist/three/index.d.ts +2 -0
- package/dist/three/index.js +2 -0
- package/dist/three/index.js.map +1 -0
- package/package.json +98 -17
- package/src/charts/bar-chart-component.tsx +150 -0
- package/src/charts/chart-tooltip.tsx +86 -0
- package/src/charts/chart.tsx +371 -0
- package/src/charts/donut-chart.tsx +112 -0
- package/src/charts/index.ts +13 -0
- package/src/charts/pipeline-overview.tsx +476 -0
- package/src/charts/sankey-chart.tsx +290 -0
- package/src/charts/top-line-metrics.tsx +261 -0
- package/src/charts/trend-area-chart.tsx +150 -0
- package/src/charts/volume-analysis-chart.tsx +124 -0
- package/src/components/activity-detail.tsx +233 -0
- package/src/components/activity-log.tsx +89 -0
- package/src/components/agent-popover.tsx +373 -0
- package/src/components/agent-widget.tsx +163 -0
- package/src/components/avatar.tsx +109 -0
- package/src/components/badge.tsx +48 -0
- package/src/components/button.tsx +59 -0
- package/src/components/card.tsx +92 -0
- package/src/components/contact-list.tsx +121 -0
- package/src/components/dashboard-cards.tsx +170 -0
- package/src/components/data-table-display.tsx +139 -0
- package/src/components/data-table-filter.tsx +138 -0
- package/src/components/data-table-quick-views.tsx +103 -0
- package/src/components/data-table-toolbar.tsx +56 -0
- package/src/components/data-table.tsx +915 -0
- package/src/components/detail-view.tsx +237 -0
- package/src/components/dialog.tsx +158 -0
- package/src/components/dropdown-menu.tsx +257 -0
- package/src/components/entity-panel.tsx +767 -0
- package/src/components/inbox-row.tsx +132 -0
- package/src/components/inbox-toolbar.tsx +213 -0
- package/src/components/input.tsx +21 -0
- package/src/components/insights-filter-bar.tsx +132 -0
- package/src/components/item-list-display.tsx +278 -0
- package/src/components/item-list-filter.tsx +118 -0
- package/src/components/item-list-toolbar.tsx +97 -0
- package/src/components/item-list.tsx +843 -0
- package/src/components/label.tsx +24 -0
- package/src/components/message.tsx +83 -0
- package/src/components/metric-card.tsx +178 -0
- package/src/components/performance-metrics-table.tsx +442 -0
- package/src/components/preview-list.tsx +62 -0
- package/src/components/progress.tsx +31 -0
- package/src/components/quick-action-chat-area.tsx +156 -0
- package/src/components/quick-action-modal.tsx +331 -0
- package/src/components/quick-action-sidebar-nav.tsx +592 -0
- package/src/components/recommended-actions-section.tsx +258 -0
- package/src/components/report-card.tsx +106 -0
- package/src/components/score-analysis-modal.tsx +172 -0
- package/src/components/score-breakdown.tsx +179 -0
- package/src/components/score-feedback.tsx +288 -0
- package/src/components/score-ring.tsx +87 -0
- package/src/components/scroll-area.tsx +58 -0
- package/src/components/select.tsx +190 -0
- package/src/components/separator.tsx +28 -0
- package/src/components/sheet.tsx +143 -0
- package/src/components/sidebar.tsx +726 -0
- package/src/components/signal-feedback-inline.tsx +591 -0
- package/src/components/simple-data-table.tsx +124 -0
- package/src/components/skeleton.tsx +15 -0
- package/src/components/status-badge.tsx +63 -0
- package/src/components/styled-bar-list.tsx +70 -0
- package/src/components/suggested-actions.tsx +1985 -0
- package/src/components/table.tsx +116 -0
- package/src/components/tabs.tsx +91 -0
- package/src/components/textarea.tsx +18 -0
- package/src/components/timeline-activity.tsx +234 -0
- package/src/components/tooltip.tsx +57 -0
- package/src/components/view-mode-toggle.tsx +39 -0
- package/src/hooks/use-mobile.ts +21 -0
- package/src/index.ts +77 -0
- package/src/lib/icons.ts +18 -0
- package/src/lib/utils.ts +6 -0
- package/src/prototype/index.ts +11 -0
- package/src/prototype/prototype-accounts-view.tsx +112 -0
- package/src/prototype/prototype-admin-view.tsx +67 -0
- package/src/prototype/prototype-config.ts +243 -0
- package/src/prototype/prototype-inbox-view.tsx +810 -0
- package/src/prototype/prototype-insights-view.tsx +379 -0
- package/src/prototype/prototype-shell.tsx +219 -0
- package/src/prototype/prototype-work-queue-view.tsx +30 -0
- package/src/styles/globals.css +299 -0
- package/src/three/agent-orb.tsx +557 -0
- package/src/three/index.ts +5 -0
- package/src/types/r3f.d.ts +8 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
"use client";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
6
|
+
import { useTexture } from "@react-three/drei";
|
|
7
|
+
import { Canvas, useFrame, useThree } from "@react-three/fiber";
|
|
8
|
+
import {
|
|
9
|
+
Color,
|
|
10
|
+
Uniform,
|
|
11
|
+
RepeatWrapping
|
|
12
|
+
} from "three";
|
|
13
|
+
import { cn } from "../lib/utils.js";
|
|
14
|
+
const PERLIN_NOISE_URL = "https://storage.googleapis.com/eleven-public-cdn/images/perlin-noise.png";
|
|
15
|
+
function AgentOrb({
|
|
16
|
+
state = null,
|
|
17
|
+
colors,
|
|
18
|
+
volumeMode = "auto",
|
|
19
|
+
manualInput,
|
|
20
|
+
manualOutput,
|
|
21
|
+
inputVolumeRef,
|
|
22
|
+
outputVolumeRef,
|
|
23
|
+
getInputVolume,
|
|
24
|
+
getOutputVolume,
|
|
25
|
+
seed,
|
|
26
|
+
showGlow = true,
|
|
27
|
+
className
|
|
28
|
+
}) {
|
|
29
|
+
const resolvedColors = useResolvedColors(colors);
|
|
30
|
+
const isSpeaking = state === "talking";
|
|
31
|
+
const isListening = state === "listening";
|
|
32
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("relative h-full w-full", className), children: [
|
|
33
|
+
showGlow && /* @__PURE__ */ jsx(
|
|
34
|
+
GlowLayer,
|
|
35
|
+
{
|
|
36
|
+
isSpeaking,
|
|
37
|
+
isListening
|
|
38
|
+
}
|
|
39
|
+
),
|
|
40
|
+
/* @__PURE__ */ jsx(
|
|
41
|
+
"div",
|
|
42
|
+
{
|
|
43
|
+
className: cn(
|
|
44
|
+
"relative z-10 w-full h-full transition-transform duration-700 ease-out",
|
|
45
|
+
isListening ? "scale-90" : "scale-100"
|
|
46
|
+
),
|
|
47
|
+
children: /* @__PURE__ */ jsx(
|
|
48
|
+
AgentOrbCanvas,
|
|
49
|
+
{
|
|
50
|
+
colors: resolvedColors,
|
|
51
|
+
seed,
|
|
52
|
+
agentState: state,
|
|
53
|
+
volumeMode,
|
|
54
|
+
manualInput,
|
|
55
|
+
manualOutput,
|
|
56
|
+
inputVolumeRef,
|
|
57
|
+
outputVolumeRef,
|
|
58
|
+
getInputVolume,
|
|
59
|
+
getOutputVolume,
|
|
60
|
+
className: "w-full h-full"
|
|
61
|
+
}
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
)
|
|
65
|
+
] });
|
|
66
|
+
}
|
|
67
|
+
function useResolvedColors(colors) {
|
|
68
|
+
const ref = useRef(colors != null ? colors : ["#000000", "#000000"]);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (colors) {
|
|
71
|
+
ref.current = colors;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (typeof document === "undefined") return;
|
|
75
|
+
const style = getComputedStyle(document.documentElement);
|
|
76
|
+
const primary = style.getPropertyValue("--primary").trim() || "#000000";
|
|
77
|
+
ref.current = [primary, primary];
|
|
78
|
+
}, [colors]);
|
|
79
|
+
return ref.current;
|
|
80
|
+
}
|
|
81
|
+
function GlowLayer({ isSpeaking, isListening }) {
|
|
82
|
+
return /* @__PURE__ */ jsxs(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
className: cn(
|
|
86
|
+
"absolute inset-0 flex items-center justify-center transition-all duration-700 ease-out",
|
|
87
|
+
isListening ? "scale-90" : "scale-100"
|
|
88
|
+
),
|
|
89
|
+
children: [
|
|
90
|
+
isListening && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
91
|
+
/* @__PURE__ */ jsx(
|
|
92
|
+
"div",
|
|
93
|
+
{
|
|
94
|
+
className: "absolute inset-0 rounded-full animate-[spin_8s_linear_infinite]",
|
|
95
|
+
style: {
|
|
96
|
+
background: "conic-gradient(from 0deg, color-mix(in srgb, var(--primary) 30%, transparent) 0deg, transparent 60deg, color-mix(in srgb, var(--primary) 30%, transparent) 120deg, transparent 180deg, color-mix(in srgb, var(--primary) 30%, transparent) 240deg, transparent 300deg)",
|
|
97
|
+
filter: "blur(20px)"
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
),
|
|
101
|
+
/* @__PURE__ */ jsx(
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
className: "absolute inset-0 rounded-full animate-[spin_12s_linear_infinite_reverse]",
|
|
105
|
+
style: {
|
|
106
|
+
background: "conic-gradient(from 45deg, transparent 0deg, color-mix(in srgb, var(--primary) 20%, transparent) 90deg, transparent 180deg, color-mix(in srgb, var(--primary) 20%, transparent) 270deg)",
|
|
107
|
+
filter: "blur(25px)"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
] }),
|
|
112
|
+
isSpeaking && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
113
|
+
/* @__PURE__ */ jsx(
|
|
114
|
+
"div",
|
|
115
|
+
{
|
|
116
|
+
className: "absolute inset-0 rounded-full animate-[spin_6s_linear_infinite]",
|
|
117
|
+
style: {
|
|
118
|
+
background: "conic-gradient(from 0deg, color-mix(in srgb, var(--primary) 40%, transparent) 0deg, transparent 45deg, color-mix(in srgb, var(--primary) 40%, transparent) 90deg, transparent 135deg, color-mix(in srgb, var(--primary) 40%, transparent) 180deg, transparent 225deg, color-mix(in srgb, var(--primary) 40%, transparent) 270deg, transparent 315deg)",
|
|
119
|
+
filter: "blur(30px)"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
),
|
|
123
|
+
/* @__PURE__ */ jsx(
|
|
124
|
+
"div",
|
|
125
|
+
{
|
|
126
|
+
className: "absolute inset-0 rounded-full animate-pulse",
|
|
127
|
+
style: {
|
|
128
|
+
animationDuration: "2s",
|
|
129
|
+
background: "radial-gradient(circle, color-mix(in srgb, var(--primary) 30%, transparent) 0%, transparent 70%)",
|
|
130
|
+
filter: "blur(20px)"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
] }),
|
|
135
|
+
!isSpeaking && !isListening && /* @__PURE__ */ jsx(
|
|
136
|
+
"div",
|
|
137
|
+
{
|
|
138
|
+
className: "absolute inset-0 rounded-full",
|
|
139
|
+
style: {
|
|
140
|
+
background: "radial-gradient(circle, color-mix(in srgb, var(--primary) 15%, transparent) 0%, transparent 70%)",
|
|
141
|
+
filter: "blur(25px)"
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
function AgentOrbCanvas({
|
|
150
|
+
colors = ["#000000", "#000000"],
|
|
151
|
+
seed,
|
|
152
|
+
agentState = null,
|
|
153
|
+
volumeMode = "auto",
|
|
154
|
+
manualInput,
|
|
155
|
+
manualOutput,
|
|
156
|
+
inputVolumeRef,
|
|
157
|
+
outputVolumeRef,
|
|
158
|
+
getInputVolume,
|
|
159
|
+
getOutputVolume,
|
|
160
|
+
className,
|
|
161
|
+
resizeDebounce = 100
|
|
162
|
+
}) {
|
|
163
|
+
return /* @__PURE__ */ jsx("div", { className: className != null ? className : "relative h-full w-full", children: /* @__PURE__ */ jsx(
|
|
164
|
+
Canvas,
|
|
165
|
+
{
|
|
166
|
+
resize: { debounce: resizeDebounce },
|
|
167
|
+
gl: { alpha: true, antialias: true, premultipliedAlpha: true },
|
|
168
|
+
children: /* @__PURE__ */ jsx(
|
|
169
|
+
OrbScene,
|
|
170
|
+
{
|
|
171
|
+
colors,
|
|
172
|
+
seed,
|
|
173
|
+
agentState,
|
|
174
|
+
volumeMode,
|
|
175
|
+
manualInput,
|
|
176
|
+
manualOutput,
|
|
177
|
+
inputVolumeRef,
|
|
178
|
+
outputVolumeRef,
|
|
179
|
+
getInputVolume,
|
|
180
|
+
getOutputVolume
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
}
|
|
184
|
+
) });
|
|
185
|
+
}
|
|
186
|
+
function OrbScene({
|
|
187
|
+
colors,
|
|
188
|
+
seed,
|
|
189
|
+
agentState,
|
|
190
|
+
volumeMode,
|
|
191
|
+
manualInput,
|
|
192
|
+
manualOutput,
|
|
193
|
+
inputVolumeRef,
|
|
194
|
+
outputVolumeRef,
|
|
195
|
+
getInputVolume,
|
|
196
|
+
getOutputVolume
|
|
197
|
+
}) {
|
|
198
|
+
const { gl } = useThree();
|
|
199
|
+
const circleRef = useRef(null);
|
|
200
|
+
const initialColorsRef = useRef(colors);
|
|
201
|
+
const targetColor1Ref = useRef(new Color(colors[0]));
|
|
202
|
+
const targetColor2Ref = useRef(new Color(colors[1]));
|
|
203
|
+
const animSpeedRef = useRef(0.1);
|
|
204
|
+
const perlinNoiseTexture = useTexture(PERLIN_NOISE_URL);
|
|
205
|
+
const agentRef = useRef(agentState);
|
|
206
|
+
const modeRef = useRef(volumeMode);
|
|
207
|
+
const curInRef = useRef(0);
|
|
208
|
+
const curOutRef = useRef(0);
|
|
209
|
+
useEffect(() => {
|
|
210
|
+
agentRef.current = agentState;
|
|
211
|
+
}, [agentState]);
|
|
212
|
+
useEffect(() => {
|
|
213
|
+
modeRef.current = volumeMode;
|
|
214
|
+
}, [volumeMode]);
|
|
215
|
+
useEffect(() => {
|
|
216
|
+
targetColor1Ref.current = new Color(colors[0]);
|
|
217
|
+
targetColor2Ref.current = new Color(colors[1]);
|
|
218
|
+
}, [colors]);
|
|
219
|
+
const random = useMemo(
|
|
220
|
+
() => splitmix32(seed != null ? seed : Math.floor(Math.random() * 2 ** 32)),
|
|
221
|
+
[seed]
|
|
222
|
+
);
|
|
223
|
+
const offsets = useMemo(
|
|
224
|
+
() => new Float32Array(Array.from({ length: 7 }, () => random() * Math.PI * 2)),
|
|
225
|
+
[random]
|
|
226
|
+
);
|
|
227
|
+
useEffect(() => {
|
|
228
|
+
const apply = () => {
|
|
229
|
+
if (!circleRef.current) return;
|
|
230
|
+
const isDark = document.documentElement.classList.contains("dark");
|
|
231
|
+
circleRef.current.material.uniforms.uInverted.value = isDark ? 1 : 0;
|
|
232
|
+
};
|
|
233
|
+
apply();
|
|
234
|
+
const observer = new MutationObserver(apply);
|
|
235
|
+
observer.observe(document.documentElement, { attributes: true, attributeFilter: ["class"] });
|
|
236
|
+
return () => observer.disconnect();
|
|
237
|
+
}, []);
|
|
238
|
+
useFrame((_, delta) => {
|
|
239
|
+
var _a, _b, _c, _d, _e;
|
|
240
|
+
const mat = (_a = circleRef.current) == null ? void 0 : _a.material;
|
|
241
|
+
if (!mat) return;
|
|
242
|
+
const u = mat.uniforms;
|
|
243
|
+
u.uTime.value += delta * 0.5;
|
|
244
|
+
if (u.uOpacity.value < 1) {
|
|
245
|
+
u.uOpacity.value = Math.min(1, u.uOpacity.value + delta * 2);
|
|
246
|
+
}
|
|
247
|
+
let targetIn = 0;
|
|
248
|
+
let targetOut = 0.3;
|
|
249
|
+
if (modeRef.current === "manual") {
|
|
250
|
+
targetIn = clamp01((_c = (_b = manualInput != null ? manualInput : inputVolumeRef == null ? void 0 : inputVolumeRef.current) != null ? _b : getInputVolume == null ? void 0 : getInputVolume()) != null ? _c : 0);
|
|
251
|
+
targetOut = clamp01((_e = (_d = manualOutput != null ? manualOutput : outputVolumeRef == null ? void 0 : outputVolumeRef.current) != null ? _d : getOutputVolume == null ? void 0 : getOutputVolume()) != null ? _e : 0);
|
|
252
|
+
} else {
|
|
253
|
+
const t = u.uTime.value * 2;
|
|
254
|
+
if (agentRef.current === null) {
|
|
255
|
+
targetIn = 0;
|
|
256
|
+
targetOut = 0.3;
|
|
257
|
+
} else if (agentRef.current === "listening") {
|
|
258
|
+
targetIn = clamp01(0.55 + Math.sin(t * 3.2) * 0.35);
|
|
259
|
+
targetOut = 0.45;
|
|
260
|
+
} else if (agentRef.current === "talking") {
|
|
261
|
+
targetIn = clamp01(0.65 + Math.sin(t * 4.8) * 0.22);
|
|
262
|
+
targetOut = clamp01(0.75 + Math.sin(t * 3.6) * 0.22);
|
|
263
|
+
} else {
|
|
264
|
+
const base = 0.38 + 0.07 * Math.sin(t * 0.7);
|
|
265
|
+
const wander = 0.05 * Math.sin(t * 2.1) * Math.sin(t * 0.37 + 1.2);
|
|
266
|
+
targetIn = clamp01(base + wander);
|
|
267
|
+
targetOut = clamp01(0.48 + 0.12 * Math.sin(t * 1.05 + 0.6));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
curInRef.current += (targetIn - curInRef.current) * 0.2;
|
|
271
|
+
curOutRef.current += (targetOut - curOutRef.current) * 0.2;
|
|
272
|
+
const targetSpeed = 0.1 + (1 - Math.pow(curOutRef.current - 1, 2)) * 0.9;
|
|
273
|
+
animSpeedRef.current += (targetSpeed - animSpeedRef.current) * 0.12;
|
|
274
|
+
u.uAnimation.value += delta * animSpeedRef.current;
|
|
275
|
+
u.uInputVolume.value = curInRef.current;
|
|
276
|
+
u.uOutputVolume.value = curOutRef.current;
|
|
277
|
+
u.uColor1.value.lerp(targetColor1Ref.current, 0.08);
|
|
278
|
+
u.uColor2.value.lerp(targetColor2Ref.current, 0.08);
|
|
279
|
+
});
|
|
280
|
+
useEffect(() => {
|
|
281
|
+
const canvas = gl.domElement;
|
|
282
|
+
const onContextLost = (event) => {
|
|
283
|
+
event.preventDefault();
|
|
284
|
+
setTimeout(() => {
|
|
285
|
+
gl.forceContextRestore();
|
|
286
|
+
}, 1);
|
|
287
|
+
};
|
|
288
|
+
canvas.addEventListener("webglcontextlost", onContextLost, false);
|
|
289
|
+
return () => canvas.removeEventListener("webglcontextlost", onContextLost, false);
|
|
290
|
+
}, [gl]);
|
|
291
|
+
const uniforms = useMemo(() => {
|
|
292
|
+
perlinNoiseTexture.wrapS = RepeatWrapping;
|
|
293
|
+
perlinNoiseTexture.wrapT = RepeatWrapping;
|
|
294
|
+
const isDark = typeof document !== "undefined" && document.documentElement.classList.contains("dark");
|
|
295
|
+
return {
|
|
296
|
+
uColor1: new Uniform(new Color(initialColorsRef.current[0])),
|
|
297
|
+
uColor2: new Uniform(new Color(initialColorsRef.current[1])),
|
|
298
|
+
uOffsets: { value: offsets },
|
|
299
|
+
uPerlinTexture: new Uniform(perlinNoiseTexture),
|
|
300
|
+
uTime: new Uniform(0),
|
|
301
|
+
uAnimation: new Uniform(0.1),
|
|
302
|
+
uInverted: new Uniform(isDark ? 1 : 0),
|
|
303
|
+
uInputVolume: new Uniform(0),
|
|
304
|
+
uOutputVolume: new Uniform(0),
|
|
305
|
+
uOpacity: new Uniform(0)
|
|
306
|
+
};
|
|
307
|
+
}, [perlinNoiseTexture, offsets]);
|
|
308
|
+
return /* @__PURE__ */ jsxs("mesh", { ref: circleRef, children: [
|
|
309
|
+
/* @__PURE__ */ jsx("circleGeometry", { args: [3.5, 64] }),
|
|
310
|
+
/* @__PURE__ */ jsx(
|
|
311
|
+
"shaderMaterial",
|
|
312
|
+
{
|
|
313
|
+
uniforms,
|
|
314
|
+
fragmentShader,
|
|
315
|
+
vertexShader,
|
|
316
|
+
transparent: true
|
|
317
|
+
}
|
|
318
|
+
)
|
|
319
|
+
] });
|
|
320
|
+
}
|
|
321
|
+
function splitmix32(a) {
|
|
322
|
+
return function() {
|
|
323
|
+
a |= 0;
|
|
324
|
+
a = a + 2654435769 | 0;
|
|
325
|
+
let t = a ^ a >>> 16;
|
|
326
|
+
t = Math.imul(t, 569420461);
|
|
327
|
+
t = t ^ t >>> 15;
|
|
328
|
+
t = Math.imul(t, 1935289751);
|
|
329
|
+
return ((t = t ^ t >>> 15) >>> 0) / 4294967296;
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
function clamp01(n) {
|
|
333
|
+
if (!Number.isFinite(n)) return 0;
|
|
334
|
+
return Math.min(1, Math.max(0, n));
|
|
335
|
+
}
|
|
336
|
+
const vertexShader = (
|
|
337
|
+
/* glsl */
|
|
338
|
+
`
|
|
339
|
+
uniform float uTime;
|
|
340
|
+
uniform sampler2D uPerlinTexture;
|
|
341
|
+
varying vec2 vUv;
|
|
342
|
+
void main() {
|
|
343
|
+
vUv = uv;
|
|
344
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
345
|
+
}
|
|
346
|
+
`
|
|
347
|
+
);
|
|
348
|
+
const fragmentShader = (
|
|
349
|
+
/* glsl */
|
|
350
|
+
`
|
|
351
|
+
uniform float uTime;
|
|
352
|
+
uniform float uAnimation;
|
|
353
|
+
uniform float uInverted;
|
|
354
|
+
uniform float uOffsets[7];
|
|
355
|
+
uniform vec3 uColor1;
|
|
356
|
+
uniform vec3 uColor2;
|
|
357
|
+
uniform float uInputVolume;
|
|
358
|
+
uniform float uOutputVolume;
|
|
359
|
+
uniform float uOpacity;
|
|
360
|
+
uniform sampler2D uPerlinTexture;
|
|
361
|
+
varying vec2 vUv;
|
|
362
|
+
|
|
363
|
+
const float PI = 3.14159265358979323846;
|
|
364
|
+
|
|
365
|
+
bool drawOval(vec2 polarUv, vec2 polarCenter, float a, float b, bool reverseGradient, float softness, out vec4 color) {
|
|
366
|
+
vec2 p = polarUv - polarCenter;
|
|
367
|
+
float oval = (p.x * p.x) / (a * a) + (p.y * p.y) / (b * b);
|
|
368
|
+
float edge = smoothstep(1.0, 1.0 - softness, oval);
|
|
369
|
+
if (edge > 0.0) {
|
|
370
|
+
float gradient = reverseGradient ? (1.0 - (p.x / a + 1.0) / 2.0) : ((p.x / a + 1.0) / 2.0);
|
|
371
|
+
gradient = mix(0.5, gradient, 0.1);
|
|
372
|
+
color = vec4(vec3(gradient), 0.85 * edge);
|
|
373
|
+
return true;
|
|
374
|
+
}
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
vec3 colorRamp(float grayscale, vec3 color1, vec3 color2, vec3 color3, vec3 color4) {
|
|
379
|
+
if (grayscale < 0.33) return mix(color1, color2, grayscale * 3.0);
|
|
380
|
+
else if (grayscale < 0.66) return mix(color2, color3, (grayscale - 0.33) * 3.0);
|
|
381
|
+
else return mix(color3, color4, (grayscale - 0.66) * 3.0);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
vec2 hash2(vec2 p) {
|
|
385
|
+
return fract(sin(vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)))) * 43758.5453);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
float noise2D(vec2 p) {
|
|
389
|
+
vec2 i = floor(p);
|
|
390
|
+
vec2 f = fract(p);
|
|
391
|
+
vec2 u = f * f * (3.0 - 2.0 * f);
|
|
392
|
+
float n = mix(
|
|
393
|
+
mix(dot(hash2(i + vec2(0.0, 0.0)), f - vec2(0.0, 0.0)),
|
|
394
|
+
dot(hash2(i + vec2(1.0, 0.0)), f - vec2(1.0, 0.0)), u.x),
|
|
395
|
+
mix(dot(hash2(i + vec2(0.0, 1.0)), f - vec2(0.0, 1.0)),
|
|
396
|
+
dot(hash2(i + vec2(1.0, 1.0)), f - vec2(1.0, 1.0)), u.x),
|
|
397
|
+
u.y
|
|
398
|
+
);
|
|
399
|
+
return 0.5 + 0.5 * n;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
float sharpRing(vec3 decomposed, float time) {
|
|
403
|
+
float ringStart = 1.0;
|
|
404
|
+
float ringWidth = 0.3;
|
|
405
|
+
float noiseScale = 5.0;
|
|
406
|
+
float noise = mix(
|
|
407
|
+
noise2D(vec2(decomposed.x, time) * noiseScale),
|
|
408
|
+
noise2D(vec2(decomposed.y, time) * noiseScale),
|
|
409
|
+
decomposed.z
|
|
410
|
+
);
|
|
411
|
+
noise = (noise - 0.5) * 2.5;
|
|
412
|
+
return ringStart + noise * ringWidth * 1.5;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
float smoothRing(vec3 decomposed, float time) {
|
|
416
|
+
float ringStart = 0.9;
|
|
417
|
+
float ringWidth = 0.2;
|
|
418
|
+
float noiseScale = 6.0;
|
|
419
|
+
float noise = mix(
|
|
420
|
+
noise2D(vec2(decomposed.x, time) * noiseScale),
|
|
421
|
+
noise2D(vec2(decomposed.y, time) * noiseScale),
|
|
422
|
+
decomposed.z
|
|
423
|
+
);
|
|
424
|
+
noise = (noise - 0.5) * 5.0;
|
|
425
|
+
return ringStart + noise * ringWidth;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
float flow(vec3 decomposed, float time) {
|
|
429
|
+
return mix(
|
|
430
|
+
texture(uPerlinTexture, vec2(time, decomposed.x / 2.0)).r,
|
|
431
|
+
texture(uPerlinTexture, vec2(time, decomposed.y / 2.0)).r,
|
|
432
|
+
decomposed.z
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
void main() {
|
|
437
|
+
vec2 uv = vUv * 2.0 - 1.0;
|
|
438
|
+
float radius = length(uv);
|
|
439
|
+
float theta = atan(uv.y, uv.x);
|
|
440
|
+
if (theta < 0.0) theta += 2.0 * PI;
|
|
441
|
+
|
|
442
|
+
vec3 decomposed = vec3(
|
|
443
|
+
theta / (2.0 * PI),
|
|
444
|
+
mod(theta / (2.0 * PI) + 0.5, 1.0) + 1.0,
|
|
445
|
+
abs(theta / PI - 1.0)
|
|
446
|
+
);
|
|
447
|
+
|
|
448
|
+
float noise = flow(decomposed, radius * 0.03 - uAnimation * 0.2) - 0.5;
|
|
449
|
+
theta += noise * mix(0.08, 0.25, uOutputVolume);
|
|
450
|
+
|
|
451
|
+
vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
|
|
452
|
+
float originalCenters[7] = float[7](0.0, 0.5 * PI, 1.0 * PI, 1.5 * PI, 2.0 * PI, 2.5 * PI, 3.0 * PI);
|
|
453
|
+
float centers[7];
|
|
454
|
+
for (int i = 0; i < 7; i++) {
|
|
455
|
+
centers[i] = originalCenters[i] + 0.5 * sin(uTime / 20.0 + uOffsets[i]);
|
|
456
|
+
}
|
|
457
|
+
float a, b;
|
|
458
|
+
vec4 ovalColor;
|
|
459
|
+
for (int i = 0; i < 7; i++) {
|
|
460
|
+
float noise = texture(uPerlinTexture, vec2(mod(centers[i] + uTime * 0.05, 1.0), 0.5)).r;
|
|
461
|
+
a = 0.5 + noise * 0.3;
|
|
462
|
+
b = noise * mix(3.5, 2.5, uInputVolume);
|
|
463
|
+
bool reverseGradient = (i % 2 == 1);
|
|
464
|
+
float distTheta = min(abs(theta - centers[i]), min(abs(theta + 2.0 * PI - centers[i]), abs(theta - 2.0 * PI - centers[i])));
|
|
465
|
+
float distRadius = radius;
|
|
466
|
+
float softness = 0.6;
|
|
467
|
+
if (drawOval(vec2(distTheta, distRadius), vec2(0.0, 0.0), a, b, reverseGradient, softness, ovalColor)) {
|
|
468
|
+
color.rgb = mix(color.rgb, ovalColor.rgb, ovalColor.a);
|
|
469
|
+
color.a = max(color.a, ovalColor.a);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
float ringRadius1 = sharpRing(decomposed, uTime * 0.1);
|
|
474
|
+
float ringRadius2 = smoothRing(decomposed, uTime * 0.1);
|
|
475
|
+
float inputRadius1 = radius + uInputVolume * 0.2;
|
|
476
|
+
float inputRadius2 = radius + uInputVolume * 0.15;
|
|
477
|
+
float opacity1 = mix(0.2, 0.6, uInputVolume);
|
|
478
|
+
float opacity2 = mix(0.15, 0.45, uInputVolume);
|
|
479
|
+
float ringAlpha1 = (inputRadius2 >= ringRadius1) ? opacity1 : 0.0;
|
|
480
|
+
float ringAlpha2 = smoothstep(ringRadius2 - 0.05, ringRadius2 + 0.05, inputRadius1) * opacity2;
|
|
481
|
+
float totalRingAlpha = max(ringAlpha1, ringAlpha2);
|
|
482
|
+
vec3 ringColor = vec3(1.0);
|
|
483
|
+
color.rgb = 1.0 - (1.0 - color.rgb) * (1.0 - ringColor * totalRingAlpha);
|
|
484
|
+
|
|
485
|
+
vec3 color1 = vec3(0.0, 0.0, 0.0);
|
|
486
|
+
vec3 color2 = uColor1;
|
|
487
|
+
vec3 color3 = uColor2;
|
|
488
|
+
vec3 color4 = vec3(1.0, 1.0, 1.0);
|
|
489
|
+
float luminance = mix(color.r, 1.0 - color.r, uInverted);
|
|
490
|
+
color.rgb = colorRamp(luminance, color1, color2, color3, color4);
|
|
491
|
+
color.a *= uOpacity;
|
|
492
|
+
gl_FragColor = color;
|
|
493
|
+
}
|
|
494
|
+
`
|
|
495
|
+
);
|
|
496
|
+
export {
|
|
497
|
+
AgentOrb,
|
|
498
|
+
AgentOrbCanvas
|
|
499
|
+
};
|
|
500
|
+
//# sourceMappingURL=agent-orb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/three/agent-orb.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { useEffect, useMemo, useRef } from \"react\"\nimport { useTexture } from \"@react-three/drei\"\nimport { Canvas, useFrame, useThree } from \"@react-three/fiber\"\nimport {\n Color,\n Uniform,\n RepeatWrapping,\n type Mesh,\n type CircleGeometry,\n type ShaderMaterial,\n} from \"three\"\nimport { cn } from \"../lib/utils\"\n\nexport type AgentOrbState = null | \"thinking\" | \"listening\" | \"talking\"\n\nexport interface AgentOrbProps {\n state?: AgentOrbState\n colors?: [string, string]\n volumeMode?: \"auto\" | \"manual\"\n manualInput?: number\n manualOutput?: number\n inputVolumeRef?: React.RefObject<number>\n outputVolumeRef?: React.RefObject<number>\n getInputVolume?: () => number\n getOutputVolume?: () => number\n seed?: number\n showGlow?: boolean\n className?: string\n}\n\nconst PERLIN_NOISE_URL =\n \"https://storage.googleapis.com/eleven-public-cdn/images/perlin-noise.png\"\n\n/**\n * Full AgentOrb with optional CSS glow wrapper.\n * Colors default to CSS `--primary` via computed style at mount time.\n */\nexport function AgentOrb({\n state = null,\n colors,\n volumeMode = \"auto\",\n manualInput,\n manualOutput,\n inputVolumeRef,\n outputVolumeRef,\n getInputVolume,\n getOutputVolume,\n seed,\n showGlow = true,\n className,\n}: AgentOrbProps) {\n const resolvedColors = useResolvedColors(colors)\n const isSpeaking = state === \"talking\"\n const isListening = state === \"listening\"\n\n return (\n <div className={cn(\"relative h-full w-full\", className)}>\n {showGlow && (\n <GlowLayer\n isSpeaking={isSpeaking}\n isListening={isListening}\n />\n )}\n <div\n className={cn(\n \"relative z-10 w-full h-full transition-transform duration-700 ease-out\",\n isListening ? \"scale-90\" : \"scale-100\",\n )}\n >\n <AgentOrbCanvas\n colors={resolvedColors}\n seed={seed}\n agentState={state}\n volumeMode={volumeMode}\n manualInput={manualInput}\n manualOutput={manualOutput}\n inputVolumeRef={inputVolumeRef}\n outputVolumeRef={outputVolumeRef}\n getInputVolume={getInputVolume}\n getOutputVolume={getOutputVolume}\n className=\"w-full h-full\"\n />\n </div>\n </div>\n )\n}\n\nfunction useResolvedColors(colors?: [string, string]): [string, string] {\n const ref = useRef<[string, string]>(colors ?? [\"#000000\", \"#000000\"])\n\n useEffect(() => {\n if (colors) {\n ref.current = colors\n return\n }\n if (typeof document === \"undefined\") return\n const style = getComputedStyle(document.documentElement)\n const primary = style.getPropertyValue(\"--primary\").trim() || \"#000000\"\n ref.current = [primary, primary]\n }, [colors])\n\n return ref.current\n}\n\n/* ----- Glow Layer (CSS animations) ----- */\n\nfunction GlowLayer({ isSpeaking, isListening }: { isSpeaking: boolean; isListening: boolean }) {\n return (\n <div\n className={cn(\n \"absolute inset-0 flex items-center justify-center transition-all duration-700 ease-out\",\n isListening ? \"scale-90\" : \"scale-100\",\n )}\n >\n {isListening && (\n <>\n <div\n className=\"absolute inset-0 rounded-full animate-[spin_8s_linear_infinite]\"\n style={{\n background:\n \"conic-gradient(from 0deg, color-mix(in srgb, var(--primary) 30%, transparent) 0deg, transparent 60deg, color-mix(in srgb, var(--primary) 30%, transparent) 120deg, transparent 180deg, color-mix(in srgb, var(--primary) 30%, transparent) 240deg, transparent 300deg)\",\n filter: \"blur(20px)\",\n }}\n />\n <div\n className=\"absolute inset-0 rounded-full animate-[spin_12s_linear_infinite_reverse]\"\n style={{\n background:\n \"conic-gradient(from 45deg, transparent 0deg, color-mix(in srgb, var(--primary) 20%, transparent) 90deg, transparent 180deg, color-mix(in srgb, var(--primary) 20%, transparent) 270deg)\",\n filter: \"blur(25px)\",\n }}\n />\n </>\n )}\n\n {isSpeaking && (\n <>\n <div\n className=\"absolute inset-0 rounded-full animate-[spin_6s_linear_infinite]\"\n style={{\n background:\n \"conic-gradient(from 0deg, color-mix(in srgb, var(--primary) 40%, transparent) 0deg, transparent 45deg, color-mix(in srgb, var(--primary) 40%, transparent) 90deg, transparent 135deg, color-mix(in srgb, var(--primary) 40%, transparent) 180deg, transparent 225deg, color-mix(in srgb, var(--primary) 40%, transparent) 270deg, transparent 315deg)\",\n filter: \"blur(30px)\",\n }}\n />\n <div\n className=\"absolute inset-0 rounded-full animate-pulse\"\n style={{\n animationDuration: \"2s\",\n background:\n \"radial-gradient(circle, color-mix(in srgb, var(--primary) 30%, transparent) 0%, transparent 70%)\",\n filter: \"blur(20px)\",\n }}\n />\n </>\n )}\n\n {!isSpeaking && !isListening && (\n <div\n className=\"absolute inset-0 rounded-full\"\n style={{\n background:\n \"radial-gradient(circle, color-mix(in srgb, var(--primary) 15%, transparent) 0%, transparent 70%)\",\n filter: \"blur(25px)\",\n }}\n />\n )}\n </div>\n )\n}\n\n/* ----- Raw Three.js Canvas (exported for advanced use) ----- */\n\ninterface AgentOrbCanvasProps {\n colors?: [string, string]\n seed?: number\n agentState?: AgentOrbState\n volumeMode?: \"auto\" | \"manual\"\n manualInput?: number\n manualOutput?: number\n inputVolumeRef?: React.RefObject<number>\n outputVolumeRef?: React.RefObject<number>\n getInputVolume?: () => number\n getOutputVolume?: () => number\n className?: string\n resizeDebounce?: number\n}\n\nexport function AgentOrbCanvas({\n colors = [\"#000000\", \"#000000\"],\n seed,\n agentState = null,\n volumeMode = \"auto\",\n manualInput,\n manualOutput,\n inputVolumeRef,\n outputVolumeRef,\n getInputVolume,\n getOutputVolume,\n className,\n resizeDebounce = 100,\n}: AgentOrbCanvasProps) {\n return (\n <div className={className ?? \"relative h-full w-full\"}>\n <Canvas\n resize={{ debounce: resizeDebounce }}\n gl={{ alpha: true, antialias: true, premultipliedAlpha: true }}\n >\n <OrbScene\n colors={colors}\n seed={seed}\n agentState={agentState}\n volumeMode={volumeMode}\n manualInput={manualInput}\n manualOutput={manualOutput}\n inputVolumeRef={inputVolumeRef}\n outputVolumeRef={outputVolumeRef}\n getInputVolume={getInputVolume}\n getOutputVolume={getOutputVolume}\n />\n </Canvas>\n </div>\n )\n}\n\n/* ----- Internal Scene ----- */\n\nfunction OrbScene({\n colors,\n seed,\n agentState,\n volumeMode,\n manualInput,\n manualOutput,\n inputVolumeRef,\n outputVolumeRef,\n getInputVolume,\n getOutputVolume,\n}: {\n colors: [string, string]\n seed?: number\n agentState: AgentOrbState\n volumeMode: \"auto\" | \"manual\"\n manualInput?: number\n manualOutput?: number\n inputVolumeRef?: React.RefObject<number>\n outputVolumeRef?: React.RefObject<number>\n getInputVolume?: () => number\n getOutputVolume?: () => number\n}) {\n const { gl } = useThree()\n const circleRef = useRef<Mesh<CircleGeometry, ShaderMaterial>>(null)\n const initialColorsRef = useRef<[string, string]>(colors)\n const targetColor1Ref = useRef(new Color(colors[0]))\n const targetColor2Ref = useRef(new Color(colors[1]))\n const animSpeedRef = useRef(0.1)\n const perlinNoiseTexture = useTexture(PERLIN_NOISE_URL)\n\n const agentRef = useRef<AgentOrbState>(agentState)\n const modeRef = useRef<\"auto\" | \"manual\">(volumeMode)\n const curInRef = useRef(0)\n const curOutRef = useRef(0)\n\n useEffect(() => { agentRef.current = agentState }, [agentState])\n useEffect(() => { modeRef.current = volumeMode }, [volumeMode])\n useEffect(() => {\n targetColor1Ref.current = new Color(colors[0])\n targetColor2Ref.current = new Color(colors[1])\n }, [colors])\n\n const random = useMemo(\n () => splitmix32(seed ?? Math.floor(Math.random() * 2 ** 32)),\n [seed],\n )\n const offsets = useMemo(\n () => new Float32Array(Array.from({ length: 7 }, () => random() * Math.PI * 2)),\n [random],\n )\n\n useEffect(() => {\n const apply = () => {\n if (!circleRef.current) return\n const isDark = document.documentElement.classList.contains(\"dark\")\n circleRef.current.material.uniforms.uInverted.value = isDark ? 1 : 0\n }\n apply()\n const observer = new MutationObserver(apply)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] })\n return () => observer.disconnect()\n }, [])\n\n useFrame((_, delta: number) => {\n const mat = circleRef.current?.material\n if (!mat) return\n const u = mat.uniforms\n u.uTime.value += delta * 0.5\n\n if (u.uOpacity.value < 1) {\n u.uOpacity.value = Math.min(1, u.uOpacity.value + delta * 2)\n }\n\n let targetIn = 0\n let targetOut = 0.3\n if (modeRef.current === \"manual\") {\n targetIn = clamp01(manualInput ?? inputVolumeRef?.current ?? getInputVolume?.() ?? 0)\n targetOut = clamp01(manualOutput ?? outputVolumeRef?.current ?? getOutputVolume?.() ?? 0)\n } else {\n const t = u.uTime.value * 2\n if (agentRef.current === null) {\n targetIn = 0; targetOut = 0.3\n } else if (agentRef.current === \"listening\") {\n targetIn = clamp01(0.55 + Math.sin(t * 3.2) * 0.35); targetOut = 0.45\n } else if (agentRef.current === \"talking\") {\n targetIn = clamp01(0.65 + Math.sin(t * 4.8) * 0.22)\n targetOut = clamp01(0.75 + Math.sin(t * 3.6) * 0.22)\n } else {\n const base = 0.38 + 0.07 * Math.sin(t * 0.7)\n const wander = 0.05 * Math.sin(t * 2.1) * Math.sin(t * 0.37 + 1.2)\n targetIn = clamp01(base + wander)\n targetOut = clamp01(0.48 + 0.12 * Math.sin(t * 1.05 + 0.6))\n }\n }\n\n curInRef.current += (targetIn - curInRef.current) * 0.2\n curOutRef.current += (targetOut - curOutRef.current) * 0.2\n\n const targetSpeed = 0.1 + (1 - Math.pow(curOutRef.current - 1, 2)) * 0.9\n animSpeedRef.current += (targetSpeed - animSpeedRef.current) * 0.12\n\n u.uAnimation.value += delta * animSpeedRef.current\n u.uInputVolume.value = curInRef.current\n u.uOutputVolume.value = curOutRef.current\n u.uColor1.value.lerp(targetColor1Ref.current, 0.08)\n u.uColor2.value.lerp(targetColor2Ref.current, 0.08)\n })\n\n useEffect(() => {\n const canvas = gl.domElement\n const onContextLost = (event: Event) => {\n event.preventDefault()\n setTimeout(() => { gl.forceContextRestore() }, 1)\n }\n canvas.addEventListener(\"webglcontextlost\", onContextLost, false)\n return () => canvas.removeEventListener(\"webglcontextlost\", onContextLost, false)\n }, [gl])\n\n const uniforms = useMemo(() => {\n perlinNoiseTexture.wrapS = RepeatWrapping\n perlinNoiseTexture.wrapT = RepeatWrapping\n const isDark =\n typeof document !== \"undefined\" && document.documentElement.classList.contains(\"dark\")\n return {\n uColor1: new Uniform(new Color(initialColorsRef.current[0])),\n uColor2: new Uniform(new Color(initialColorsRef.current[1])),\n uOffsets: { value: offsets },\n uPerlinTexture: new Uniform(perlinNoiseTexture),\n uTime: new Uniform(0),\n uAnimation: new Uniform(0.1),\n uInverted: new Uniform(isDark ? 1 : 0),\n uInputVolume: new Uniform(0),\n uOutputVolume: new Uniform(0),\n uOpacity: new Uniform(0),\n }\n }, [perlinNoiseTexture, offsets])\n\n return (\n <mesh ref={circleRef}>\n <circleGeometry args={[3.5, 64]} />\n <shaderMaterial\n uniforms={uniforms}\n fragmentShader={fragmentShader}\n vertexShader={vertexShader}\n transparent\n />\n </mesh>\n )\n}\n\n/* ----- Utilities ----- */\n\nfunction splitmix32(a: number) {\n return function () {\n a |= 0\n a = (a + 0x9e3779b9) | 0\n let t = a ^ (a >>> 16)\n t = Math.imul(t, 0x21f0aaad)\n t = t ^ (t >>> 15)\n t = Math.imul(t, 0x735a2d97)\n return ((t = t ^ (t >>> 15)) >>> 0) / 4294967296\n }\n}\n\nfunction clamp01(n: number) {\n if (!Number.isFinite(n)) return 0\n return Math.min(1, Math.max(0, n))\n}\n\n/* ----- Shaders ----- */\n\nconst vertexShader = /* glsl */ `\nuniform float uTime;\nuniform sampler2D uPerlinTexture;\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`\n\nconst fragmentShader = /* glsl */ `\nuniform float uTime;\nuniform float uAnimation;\nuniform float uInverted;\nuniform float uOffsets[7];\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform float uInputVolume;\nuniform float uOutputVolume;\nuniform float uOpacity;\nuniform sampler2D uPerlinTexture;\nvarying vec2 vUv;\n\nconst float PI = 3.14159265358979323846;\n\nbool drawOval(vec2 polarUv, vec2 polarCenter, float a, float b, bool reverseGradient, float softness, out vec4 color) {\n vec2 p = polarUv - polarCenter;\n float oval = (p.x * p.x) / (a * a) + (p.y * p.y) / (b * b);\n float edge = smoothstep(1.0, 1.0 - softness, oval);\n if (edge > 0.0) {\n float gradient = reverseGradient ? (1.0 - (p.x / a + 1.0) / 2.0) : ((p.x / a + 1.0) / 2.0);\n gradient = mix(0.5, gradient, 0.1);\n color = vec4(vec3(gradient), 0.85 * edge);\n return true;\n }\n return false;\n}\n\nvec3 colorRamp(float grayscale, vec3 color1, vec3 color2, vec3 color3, vec3 color4) {\n if (grayscale < 0.33) return mix(color1, color2, grayscale * 3.0);\n else if (grayscale < 0.66) return mix(color2, color3, (grayscale - 0.33) * 3.0);\n else return mix(color3, color4, (grayscale - 0.66) * 3.0);\n}\n\nvec2 hash2(vec2 p) {\n return fract(sin(vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)))) * 43758.5453);\n}\n\nfloat noise2D(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n float n = mix(\n mix(dot(hash2(i + vec2(0.0, 0.0)), f - vec2(0.0, 0.0)),\n dot(hash2(i + vec2(1.0, 0.0)), f - vec2(1.0, 0.0)), u.x),\n mix(dot(hash2(i + vec2(0.0, 1.0)), f - vec2(0.0, 1.0)),\n dot(hash2(i + vec2(1.0, 1.0)), f - vec2(1.0, 1.0)), u.x),\n u.y\n );\n return 0.5 + 0.5 * n;\n}\n\nfloat sharpRing(vec3 decomposed, float time) {\n float ringStart = 1.0;\n float ringWidth = 0.3;\n float noiseScale = 5.0;\n float noise = mix(\n noise2D(vec2(decomposed.x, time) * noiseScale),\n noise2D(vec2(decomposed.y, time) * noiseScale),\n decomposed.z\n );\n noise = (noise - 0.5) * 2.5;\n return ringStart + noise * ringWidth * 1.5;\n}\n\nfloat smoothRing(vec3 decomposed, float time) {\n float ringStart = 0.9;\n float ringWidth = 0.2;\n float noiseScale = 6.0;\n float noise = mix(\n noise2D(vec2(decomposed.x, time) * noiseScale),\n noise2D(vec2(decomposed.y, time) * noiseScale),\n decomposed.z\n );\n noise = (noise - 0.5) * 5.0;\n return ringStart + noise * ringWidth;\n}\n\nfloat flow(vec3 decomposed, float time) {\n return mix(\n texture(uPerlinTexture, vec2(time, decomposed.x / 2.0)).r,\n texture(uPerlinTexture, vec2(time, decomposed.y / 2.0)).r,\n decomposed.z\n );\n}\n\nvoid main() {\n vec2 uv = vUv * 2.0 - 1.0;\n float radius = length(uv);\n float theta = atan(uv.y, uv.x);\n if (theta < 0.0) theta += 2.0 * PI;\n\n vec3 decomposed = vec3(\n theta / (2.0 * PI),\n mod(theta / (2.0 * PI) + 0.5, 1.0) + 1.0,\n abs(theta / PI - 1.0)\n );\n\n float noise = flow(decomposed, radius * 0.03 - uAnimation * 0.2) - 0.5;\n theta += noise * mix(0.08, 0.25, uOutputVolume);\n\n vec4 color = vec4(1.0, 1.0, 1.0, 1.0);\n float originalCenters[7] = float[7](0.0, 0.5 * PI, 1.0 * PI, 1.5 * PI, 2.0 * PI, 2.5 * PI, 3.0 * PI);\n float centers[7];\n for (int i = 0; i < 7; i++) {\n centers[i] = originalCenters[i] + 0.5 * sin(uTime / 20.0 + uOffsets[i]);\n }\n float a, b;\n vec4 ovalColor;\n for (int i = 0; i < 7; i++) {\n float noise = texture(uPerlinTexture, vec2(mod(centers[i] + uTime * 0.05, 1.0), 0.5)).r;\n a = 0.5 + noise * 0.3;\n b = noise * mix(3.5, 2.5, uInputVolume);\n bool reverseGradient = (i % 2 == 1);\n float distTheta = min(abs(theta - centers[i]), min(abs(theta + 2.0 * PI - centers[i]), abs(theta - 2.0 * PI - centers[i])));\n float distRadius = radius;\n float softness = 0.6;\n if (drawOval(vec2(distTheta, distRadius), vec2(0.0, 0.0), a, b, reverseGradient, softness, ovalColor)) {\n color.rgb = mix(color.rgb, ovalColor.rgb, ovalColor.a);\n color.a = max(color.a, ovalColor.a);\n }\n }\n\n float ringRadius1 = sharpRing(decomposed, uTime * 0.1);\n float ringRadius2 = smoothRing(decomposed, uTime * 0.1);\n float inputRadius1 = radius + uInputVolume * 0.2;\n float inputRadius2 = radius + uInputVolume * 0.15;\n float opacity1 = mix(0.2, 0.6, uInputVolume);\n float opacity2 = mix(0.15, 0.45, uInputVolume);\n float ringAlpha1 = (inputRadius2 >= ringRadius1) ? opacity1 : 0.0;\n float ringAlpha2 = smoothstep(ringRadius2 - 0.05, ringRadius2 + 0.05, inputRadius1) * opacity2;\n float totalRingAlpha = max(ringAlpha1, ringAlpha2);\n vec3 ringColor = vec3(1.0);\n color.rgb = 1.0 - (1.0 - color.rgb) * (1.0 - ringColor * totalRingAlpha);\n\n vec3 color1 = vec3(0.0, 0.0, 0.0);\n vec3 color2 = uColor1;\n vec3 color3 = uColor2;\n vec3 color4 = vec3(1.0, 1.0, 1.0);\n float luminance = mix(color.r, 1.0 - color.r, uInverted);\n color.rgb = colorRamp(luminance, color1, color2, color3, color4);\n color.a *= uOpacity;\n gl_FragColor = color;\n}\n`\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/three/index.ts"],"sourcesContent":["/**\n * @handled-ai/design-system/three\n * Three.js / WebGL components\n */\nexport * from \"./agent-orb\"\n"],"mappings":"AAIA,cAAc;","names":[]}
|