@hanzo/ui 8.0.24 → 8.0.26

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 (97) hide show
  1. package/README.md +59 -0
  2. package/dist/ThemeToggleNext-AEDLHX5X.js +0 -1
  3. package/dist/ThemeToggleNext-N6ASYJ6J.cjs +0 -1
  4. package/dist/billing.cjs +0 -1
  5. package/dist/billing.js +0 -1
  6. package/dist/canvas.cjs +0 -1
  7. package/dist/canvas.js +0 -1
  8. package/dist/chunk-3NG33DV2.cjs +606 -0
  9. package/dist/chunk-3NG33DV2.cjs.map +1 -0
  10. package/dist/chunk-5CZOYONP.js +342 -0
  11. package/dist/chunk-5CZOYONP.js.map +1 -0
  12. package/dist/chunk-77AMCLN4.js +0 -1
  13. package/dist/chunk-7XDEUEWI.cjs +0 -1
  14. package/dist/{chunk-P2P6ST6J.js → chunk-7ZNK6JSS.js} +9 -395
  15. package/dist/chunk-7ZNK6JSS.js.map +1 -0
  16. package/dist/chunk-ARV3P4CE.cjs +0 -1
  17. package/dist/chunk-FVQXROBK.js +0 -1
  18. package/dist/chunk-GVCOAJLO.js +396 -0
  19. package/dist/chunk-GVCOAJLO.js.map +1 -0
  20. package/dist/chunk-GWNNLYX4.cjs +352 -0
  21. package/dist/chunk-GWNNLYX4.cjs.map +1 -0
  22. package/dist/chunk-MWBFAV3D.cjs +0 -1
  23. package/dist/{chunk-NBZDIMP3.cjs → chunk-ONVERVFG.cjs} +33 -439
  24. package/dist/chunk-ONVERVFG.cjs.map +1 -0
  25. package/dist/chunk-P2QU5MN5.js +554 -0
  26. package/dist/chunk-P2QU5MN5.js.map +1 -0
  27. package/dist/chunk-WHJR5S4L.cjs +417 -0
  28. package/dist/chunk-WHJR5S4L.cjs.map +1 -0
  29. package/dist/chunk-ZGTJCJ55.js +0 -1
  30. package/dist/dashboard.cjs +0 -1
  31. package/dist/dashboard.js +0 -1
  32. package/dist/data.cjs +0 -1
  33. package/dist/data.js +0 -1
  34. package/dist/framework/CollectionBuilder.d.ts +12 -0
  35. package/dist/framework/CollectionsBrowser.d.ts +26 -19
  36. package/dist/framework/DocTypeRecords.d.ts +31 -11
  37. package/dist/framework/MediaGrid.d.ts +42 -0
  38. package/dist/framework/RecordCards.d.ts +35 -0
  39. package/dist/framework/builder-logic.d.ts +76 -0
  40. package/dist/framework/client.d.ts +31 -44
  41. package/dist/framework/core.cjs +212 -0
  42. package/dist/framework/core.cjs.map +1 -0
  43. package/dist/framework/core.d.ts +6 -0
  44. package/dist/framework/core.js +3 -0
  45. package/dist/framework/core.js.map +1 -0
  46. package/dist/framework/data.d.ts +2 -2
  47. package/dist/framework/fields.d.ts +47 -4
  48. package/dist/framework/index.cjs +1339 -0
  49. package/dist/framework/index.cjs.map +1 -0
  50. package/dist/framework/index.d.ts +9 -23
  51. package/dist/framework/index.js +1118 -0
  52. package/dist/framework/index.js.map +1 -0
  53. package/dist/framework/media.d.ts +53 -0
  54. package/dist/framework/parts.d.ts +74 -0
  55. package/dist/framework/responsive.d.ts +41 -0
  56. package/dist/framework/types.d.ts +13 -7
  57. package/dist/gitops.cjs +0 -1
  58. package/dist/gitops.js +0 -1
  59. package/dist/gui-config.cjs +0 -1
  60. package/dist/gui-config.js +0 -1
  61. package/dist/index.cjs +0 -1
  62. package/dist/index.js +0 -1
  63. package/dist/network.cjs +0 -1
  64. package/dist/network.js +0 -1
  65. package/dist/oss.cjs +0 -1
  66. package/dist/oss.js +0 -1
  67. package/dist/primitives/bases/data/index.cjs +0 -1
  68. package/dist/primitives/bases/data/index.js +0 -1
  69. package/dist/product/SelectMenu.d.ts +13 -1
  70. package/dist/product/index.cjs +2061 -337
  71. package/dist/product/index.cjs.map +1 -1
  72. package/dist/product/index.js +1909 -4
  73. package/dist/product/index.js.map +1 -1
  74. package/dist/product/social/api.cjs +0 -1
  75. package/dist/product/social/api.js +0 -1
  76. package/dist/product/social/index.cjs +17 -17
  77. package/dist/product/social/index.js +3 -3
  78. package/dist/telemetry.cjs +0 -1
  79. package/dist/telemetry.js +0 -1
  80. package/dist/usage.cjs +0 -1
  81. package/dist/usage.js +0 -1
  82. package/dist/wallet.cjs +0 -1
  83. package/dist/wallet.js +0 -1
  84. package/package.json +12 -18
  85. package/dist/chunk-2BM42AZR.cjs +0 -2301
  86. package/dist/chunk-2BM42AZR.cjs.map +0 -1
  87. package/dist/chunk-7P7R7FC5.js +0 -2231
  88. package/dist/chunk-7P7R7FC5.js.map +0 -1
  89. package/dist/chunk-NBZDIMP3.cjs.map +0 -1
  90. package/dist/chunk-P2P6ST6J.js.map +0 -1
  91. package/dist/framework/Loader.d.ts +0 -4
  92. package/dist/framework.cjs +0 -760
  93. package/dist/framework.cjs.map +0 -1
  94. package/dist/framework.d.ts +0 -1
  95. package/dist/framework.js +0 -730
  96. package/dist/framework.js.map +0 -1
  97. package/dist/styles/hanzo-motion.css +0 -188
@@ -1,449 +1,2156 @@
1
- 'use client';
2
1
  'use strict';
3
2
 
4
- var chunk2BM42AZR_cjs = require('../chunk-2BM42AZR.cjs');
5
3
  var chunkARV3P4CE_cjs = require('../chunk-ARV3P4CE.cjs');
6
- var chunkNBZDIMP3_cjs = require('../chunk-NBZDIMP3.cjs');
7
- var chunk7XDEUEWI_cjs = require('../chunk-7XDEUEWI.cjs');
4
+ var chunkONVERVFG_cjs = require('../chunk-ONVERVFG.cjs');
8
5
  var chunkMWBFAV3D_cjs = require('../chunk-MWBFAV3D.cjs');
6
+ var chunkGWNNLYX4_cjs = require('../chunk-GWNNLYX4.cjs');
7
+ var chunkWHJR5S4L_cjs = require('../chunk-WHJR5S4L.cjs');
8
+ var chunk7XDEUEWI_cjs = require('../chunk-7XDEUEWI.cjs');
9
+ var react = require('react');
10
+ var gui = require('@hanzo/gui');
11
+ var jsxRuntime = require('react/jsx-runtime');
12
+ var lucideIcons2 = require('@hanzogui/lucide-icons-2');
13
+ var products = require('@hanzo/products');
14
+ var react$1 = require('@hanzo/logo/react');
15
+ var reactDom = require('react-dom');
9
16
 
17
+ var CHART_PALETTE = [
18
+ "#7c5cff",
19
+ "#23c562",
20
+ "#ff9f45",
21
+ "#3aa0ff",
22
+ "#ff5d8f",
23
+ "#16c0c8",
24
+ "#c084fc",
25
+ "#f4c245"
26
+ ];
27
+ var CHART_OTHER = "#64748b";
28
+ var ACCENT = CHART_PALETTE[0];
29
+ var GRID = "rgba(148,163,184,0.16)";
30
+ var AXIS = "rgba(148,163,184,0.85)";
31
+ var tone = (theme, key, fallback) => {
32
+ const v = theme[key];
33
+ const got = v?.get?.();
34
+ return typeof got === "string" ? got : fallback;
35
+ };
36
+ var rampOpacity = (i, n) => n <= 1 ? 0.9 : 0.95 - i / (n - 1) * 0.62;
37
+ function useContainerWidth() {
38
+ const ref = react.useRef(null);
39
+ const [w, setW] = react.useState(0);
40
+ react.useEffect(() => {
41
+ const el = ref.current;
42
+ if (!el) return;
43
+ const measure = () => setW(el.clientWidth);
44
+ measure();
45
+ const ro = new ResizeObserver(measure);
46
+ ro.observe(el);
47
+ return () => ro.disconnect();
48
+ }, []);
49
+ return { ref, w };
50
+ }
51
+ function Sparkline({
52
+ values,
53
+ width = 120,
54
+ height = 36,
55
+ color
56
+ }) {
57
+ const theme = gui.useTheme();
58
+ const clean = (values ?? []).filter((v) => Number.isFinite(v));
59
+ if (clean.length < 2) return null;
60
+ const stroke = color ?? tone(theme, "color11", "currentColor");
61
+ const max = Math.max(...clean);
62
+ const min = Math.min(...clean);
63
+ const span = max - min || 1;
64
+ const n = clean.length;
65
+ const px = (i) => i / (n - 1) * (width - 2) + 1;
66
+ const py = (v) => height - 2 - (v - min) / span * (height - 4);
67
+ const line = clean.map((v, i) => `${i === 0 ? "M" : "L"}${px(i).toFixed(1)},${py(v).toFixed(1)}`).join(" ");
68
+ const area = `${line} L${(width - 1).toFixed(1)},${height} L1,${height} Z`;
69
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width, height, "aria-hidden": true, style: { display: "block" }, children: [
70
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: area, fill: stroke, fillOpacity: 0.12 }),
71
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: line, fill: "none", stroke, strokeWidth: 1.5, strokeLinejoin: "round", strokeLinecap: "round" })
72
+ ] });
73
+ }
74
+ function Tooltip({ x, height, label, value }) {
75
+ const left = Math.max(0, x - 60);
76
+ return /* @__PURE__ */ jsxRuntime.jsx(
77
+ "div",
78
+ {
79
+ style: {
80
+ position: "absolute",
81
+ left,
82
+ top: 0,
83
+ height,
84
+ pointerEvents: "none",
85
+ display: "flex",
86
+ alignItems: "flex-start"
87
+ },
88
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
89
+ "div",
90
+ {
91
+ style: {
92
+ background: "rgba(15,17,21,0.94)",
93
+ border: "1px solid rgba(148,163,184,0.25)",
94
+ borderRadius: 8,
95
+ padding: "6px 9px",
96
+ fontSize: 11,
97
+ lineHeight: 1.35,
98
+ color: "#e2e8f0",
99
+ whiteSpace: "nowrap",
100
+ boxShadow: "0 4px 16px rgba(0,0,0,0.4)"
101
+ },
102
+ children: [
103
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: AXIS }, children: label }),
104
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontWeight: 700 }, children: value })
105
+ ]
106
+ }
107
+ )
108
+ }
109
+ );
110
+ }
111
+ function nearestIndex(clientX, rect, padL, innerW, n) {
112
+ if (n <= 1) return 0;
113
+ const mx = clientX - rect.left - padL;
114
+ const i = Math.round(mx / (innerW || 1) * (n - 1));
115
+ return Math.max(0, Math.min(n - 1, i));
116
+ }
117
+ function axisTicks(data) {
118
+ const n = data.length;
119
+ if (n === 0) return [];
120
+ if (n === 1) return [{ i: 0, label: data[0].label, anchor: "middle" }];
121
+ const mid = Math.floor((n - 1) / 2);
122
+ const out = [
123
+ { i: 0, label: data[0].label, anchor: "start" },
124
+ { i: n - 1, label: data[n - 1].label, anchor: "end" }
125
+ ];
126
+ if (n >= 5) out.splice(1, 0, { i: mid, label: data[mid].label, anchor: "middle" });
127
+ return out;
128
+ }
129
+ function LineChart({
130
+ data,
131
+ height = 210,
132
+ color = ACCENT,
133
+ formatValue = (v) => String(v)
134
+ }) {
135
+ const { ref, w } = useContainerWidth();
136
+ const [hover, setHover] = react.useState(null);
137
+ const padL = 10;
138
+ const padR = 10;
139
+ const padT = 12;
140
+ const padB = 24;
141
+ const n = data.length;
142
+ const innerW = Math.max(1, w - padL - padR);
143
+ const innerH = Math.max(1, height - padT - padB);
144
+ const max = Math.max(...data.map((d) => d.value), 1);
145
+ const x = (i) => padL + (n <= 1 ? innerW / 2 : i / (n - 1) * innerW);
146
+ const y = (v) => padT + innerH - v / max * innerH;
147
+ const line = data.map((d, i) => `${i === 0 ? "M" : "L"}${x(i).toFixed(1)},${y(d.value).toFixed(1)}`).join(" ");
148
+ const area = n >= 2 ? `${line} L${x(n - 1).toFixed(1)},${(padT + innerH).toFixed(1)} L${x(0).toFixed(1)},${(padT + innerH).toFixed(1)} Z` : "";
149
+ const ticks = axisTicks(data);
150
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, style: { position: "relative", width: "100%" }, children: [
151
+ w > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
152
+ "svg",
153
+ {
154
+ width: w,
155
+ height,
156
+ style: { display: "block" },
157
+ onMouseMove: (e) => setHover(nearestIndex(e.clientX, e.currentTarget.getBoundingClientRect(), padL, innerW, n)),
158
+ onMouseLeave: () => setHover(null),
159
+ children: [
160
+ [0, 0.5, 1].map((g) => /* @__PURE__ */ jsxRuntime.jsx("line", { x1: padL, x2: w - padR, y1: padT + innerH * g, y2: padT + innerH * g, stroke: GRID, strokeWidth: 1 }, g)),
161
+ area ? /* @__PURE__ */ jsxRuntime.jsx("path", { d: area, fill: color, fillOpacity: 0.1 }) : null,
162
+ n >= 2 ? /* @__PURE__ */ jsxRuntime.jsx("path", { d: line, fill: "none", stroke: color, strokeWidth: 2, strokeLinejoin: "round", strokeLinecap: "round" }) : null,
163
+ hover != null && data[hover] ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
164
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: x(hover), x2: x(hover), y1: padT, y2: padT + innerH, stroke: AXIS, strokeWidth: 1, strokeDasharray: "3 3" }),
165
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x(hover), cy: y(data[hover].value), r: 4, fill: color, stroke: "#0f1115", strokeWidth: 2 })
166
+ ] }) : null,
167
+ ticks.map((t) => /* @__PURE__ */ jsxRuntime.jsx("text", { x: x(t.i), y: height - 7, fontSize: 10, fill: AXIS, textAnchor: t.anchor, children: t.label }, t.i))
168
+ ]
169
+ }
170
+ ) : null,
171
+ hover != null && data[hover] ? /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { x: x(hover), height, label: data[hover].label, value: formatValue(data[hover].value) }) : null
172
+ ] });
173
+ }
174
+ function BarChart({
175
+ data,
176
+ height = 210,
177
+ color = ACCENT,
178
+ formatValue = (v) => String(v)
179
+ }) {
180
+ const { ref, w } = useContainerWidth();
181
+ const [hover, setHover] = react.useState(null);
182
+ const padL = 10;
183
+ const padR = 10;
184
+ const padT = 12;
185
+ const padB = 24;
186
+ const n = data.length;
187
+ const innerW = Math.max(1, w - padL - padR);
188
+ const innerH = Math.max(1, height - padT - padB);
189
+ const max = Math.max(...data.map((d) => d.value), 1);
190
+ const slot = innerW / Math.max(1, n);
191
+ const barW = Math.max(1, Math.min(slot * 0.62, 36));
192
+ const cx = (i) => padL + slot * i + slot / 2;
193
+ const ticks = axisTicks(data);
194
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, style: { position: "relative", width: "100%" }, children: [
195
+ w > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
196
+ "svg",
197
+ {
198
+ width: w,
199
+ height,
200
+ style: { display: "block" },
201
+ onMouseMove: (e) => {
202
+ const rect = e.currentTarget.getBoundingClientRect();
203
+ const i = Math.floor((e.clientX - rect.left - padL) / (slot || 1));
204
+ setHover(Math.max(0, Math.min(n - 1, i)));
205
+ },
206
+ onMouseLeave: () => setHover(null),
207
+ children: [
208
+ [0, 0.5, 1].map((g) => /* @__PURE__ */ jsxRuntime.jsx("line", { x1: padL, x2: w - padR, y1: padT + innerH * g, y2: padT + innerH * g, stroke: GRID, strokeWidth: 1 }, g)),
209
+ data.map((d, i) => {
210
+ const h = d.value / max * innerH;
211
+ return /* @__PURE__ */ jsxRuntime.jsx(
212
+ "rect",
213
+ {
214
+ x: cx(i) - barW / 2,
215
+ y: padT + innerH - h,
216
+ width: barW,
217
+ height: Math.max(0, h),
218
+ rx: Math.min(3, barW / 2),
219
+ fill: color,
220
+ fillOpacity: hover === i ? 1 : 0.78
221
+ },
222
+ i
223
+ );
224
+ }),
225
+ ticks.map((t) => /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx(t.i), y: height - 7, fontSize: 10, fill: AXIS, textAnchor: "middle", children: t.label }, t.i))
226
+ ]
227
+ }
228
+ ) : null,
229
+ hover != null && data[hover] ? /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { x: cx(hover), height, label: data[hover].label, value: formatValue(data[hover].value) }) : null
230
+ ] });
231
+ }
232
+ function Donut({
233
+ slices,
234
+ size = 160,
235
+ thickness = 22,
236
+ center,
237
+ legend = false
238
+ }) {
239
+ const theme = gui.useTheme();
240
+ const fg = tone(theme, "color12", "currentColor");
241
+ const positive = slices.filter((s) => s.value > 0);
242
+ const total = positive.reduce((sum, s) => sum + s.value, 0);
243
+ const r = size / 2;
244
+ const rInner = r - thickness;
245
+ const mid = (r + rInner) / 2;
246
+ if (total <= 0) {
247
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { items: "center", justify: "center", height: size, children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$6", color: "$color10", children: "\u2014" }) });
248
+ }
249
+ const ring = /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "relative", width: size, height: size }, children: [
250
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { width: size, height: size, style: { display: "block" }, children: positive.length === 1 ? /* @__PURE__ */ jsxRuntime.jsx(
251
+ "circle",
252
+ {
253
+ cx: r,
254
+ cy: r,
255
+ r: mid,
256
+ fill: "none",
257
+ stroke: positive[0].color ?? fg,
258
+ strokeOpacity: positive[0].color ? 1 : 0.9,
259
+ strokeWidth: thickness
260
+ }
261
+ ) : renderArcs(positive, total, r, rInner, fg) }),
262
+ center ? /* @__PURE__ */ jsxRuntime.jsx(
263
+ "div",
264
+ {
265
+ style: {
266
+ position: "absolute",
267
+ inset: 0,
268
+ display: "flex",
269
+ flexDirection: "column",
270
+ alignItems: "center",
271
+ justifyContent: "center",
272
+ textAlign: "center",
273
+ pointerEvents: "none"
274
+ },
275
+ children: center
276
+ }
277
+ ) : null
278
+ ] });
279
+ if (!legend) return ring;
280
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$4", items: "center", flexWrap: "wrap", children: [
281
+ ring,
282
+ /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { gap: "$1.5", flex: 1, minW: 150, children: positive.map((s, i) => /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2", items: "center", children: [
283
+ /* @__PURE__ */ jsxRuntime.jsx(
284
+ "div",
285
+ {
286
+ style: {
287
+ width: 10,
288
+ height: 10,
289
+ borderRadius: 2,
290
+ backgroundColor: s.color ?? AXIS,
291
+ opacity: s.color ? 1 : rampOpacity(i, positive.length)
292
+ }
293
+ }
294
+ ),
295
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color11", flex: 1, numberOfLines: 1, children: s.label }),
296
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.Text, { fontSize: "$2", color: "$color12", fontWeight: "600", children: [
297
+ Math.round(s.value / total * 100),
298
+ "%"
299
+ ] })
300
+ ] }, s.label)) })
301
+ ] });
302
+ }
303
+ function renderArcs(slices, total, rOuter, rInner, fg) {
304
+ let a0 = -Math.PI / 2;
305
+ const paths = [];
306
+ slices.forEach((s, idx) => {
307
+ const frac = Math.max(0, s.value) / total;
308
+ if (frac <= 0) return;
309
+ const a1 = a0 + frac * Math.PI * 2;
310
+ paths.push(
311
+ /* @__PURE__ */ jsxRuntime.jsx(
312
+ "path",
313
+ {
314
+ d: annularArc(rOuter, rOuter, rOuter, rInner, a0, Math.min(a1, a0 + Math.PI * 1.9999)),
315
+ fill: s.color ?? fg,
316
+ fillOpacity: s.color ? 1 : rampOpacity(idx, slices.length)
317
+ },
318
+ s.label || idx
319
+ )
320
+ );
321
+ a0 = a1;
322
+ });
323
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: paths });
324
+ }
325
+ function polar(cx, cy, rad, a) {
326
+ return [cx + rad * Math.cos(a), cy + rad * Math.sin(a)];
327
+ }
328
+ function annularArc(cx, cy, rOuter, rInner, a0, a1) {
329
+ const large = a1 - a0 > Math.PI ? 1 : 0;
330
+ const [x0, y0] = polar(cx, cy, rOuter, a0);
331
+ const [x1, y1] = polar(cx, cy, rOuter, a1);
332
+ const [x2, y2] = polar(cx, cy, rInner, a1);
333
+ const [x3, y3] = polar(cx, cy, rInner, a0);
334
+ return `M${x0},${y0} A${rOuter},${rOuter} 0 ${large} 1 ${x1},${y1} L${x2},${y2} A${rInner},${rInner} 0 ${large} 0 ${x3},${y3} Z`;
335
+ }
336
+ function BarRows({ bars }) {
337
+ const max = Math.max(0, ...bars.map((b) => b.value));
338
+ if (max <= 0) {
339
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color10", children: "\u2014" });
340
+ }
341
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { gap: "$2.5", children: bars.map((b) => /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$3", items: "center", children: [
342
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { width: 64, fontSize: "$2", color: "$color11", text: "right", children: b.label }),
343
+ /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { flex: 1, height: 10, bg: "$color3", rounded: "$2", overflow: "hidden", children: /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { height: 10, width: `${Math.max(2, b.value / max * 100)}%`, bg: "$color9", rounded: "$2" }) }),
344
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { width: 56, fontSize: "$2", color: "$color12", fontWeight: "600", children: b.value.toLocaleString() })
345
+ ] }, b.label)) });
346
+ }
347
+ var SERIES = ["#6ea8fe", "#7ee787", "#f0a868", "#c792ea", "#56d4c4", "#e879a6", "#d6c15a", "#8b9bb4"];
348
+ var colorForIndex = (i) => SERIES[i % SERIES.length];
349
+ var TRACK = "rgba(128,128,128,0.18)";
350
+ function utilColor(pct) {
351
+ if (pct >= 90) return "#e5534b";
352
+ if (pct >= 70) return "#f0a868";
353
+ return "#7ee787";
354
+ }
355
+ function Sparkline2({
356
+ points,
357
+ width = 104,
358
+ height = 30,
359
+ color = SERIES[0]
360
+ }) {
361
+ if (!points || points.length < 2) return null;
362
+ const min = Math.min(...points);
363
+ const max = Math.max(...points);
364
+ const span = max - min || 1;
365
+ const stepX = width / (points.length - 1);
366
+ const y = (v) => height - 2 - (v - min) / span * (height - 4);
367
+ const d = points.map((p, i) => `${i === 0 ? "M" : "L"}${(i * stepX).toFixed(1)},${y(p).toFixed(1)}`).join(" ");
368
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width, height, viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": "trend", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d, fill: "none", stroke: color, strokeWidth: 1.5, strokeLinejoin: "round", strokeLinecap: "round" }) });
369
+ }
370
+ function MiniBars({
371
+ bars,
372
+ width = 320,
373
+ height = 96,
374
+ color = SERIES[0]
375
+ }) {
376
+ if (!bars.length) return null;
377
+ const max = Math.max(...bars.map((b) => b.value), 1);
378
+ const gap = 4;
379
+ const bw = (width - gap * (bars.length - 1)) / bars.length;
380
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "100%", height, viewBox: `0 0 ${width} ${height}`, preserveAspectRatio: "none", role: "img", "aria-label": "bars", children: bars.map((b, i) => {
381
+ const h = Math.max(1, b.value / max * (height - 2));
382
+ return /* @__PURE__ */ jsxRuntime.jsx("rect", { x: i * (bw + gap), y: height - h, width: bw, height: h, rx: 2, fill: color, opacity: 0.85, children: /* @__PURE__ */ jsxRuntime.jsx("title", { children: `${b.label}: ${b.value}` }) }, b.label + i);
383
+ }) });
384
+ }
385
+ function UtilBar({ value, width = 120, color }) {
386
+ const v = Math.max(0, Math.min(100, value));
387
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width, height: 8, viewBox: `0 0 ${width} 8`, role: "img", "aria-label": `${Math.round(v)}%`, children: [
388
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 1, width, height: 6, rx: 3, fill: TRACK }),
389
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 1, width: v / 100 * width, height: 6, rx: 3, fill: color ?? utilColor(v) })
390
+ ] });
391
+ }
392
+ function LegendDot({ color, label, value }) {
393
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", justify: "space-between", children: [
394
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", children: [
395
+ /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { width: 10, height: 10, rounded: "$1", bg: color }),
396
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color11", children: label })
397
+ ] }),
398
+ value != null ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color12", fontWeight: "500", className: "hz-mono", children: value }) : null
399
+ ] });
400
+ }
401
+ function MetricCard({
402
+ icon,
403
+ label,
404
+ value,
405
+ caption,
406
+ spark,
407
+ sparkColor,
408
+ delta
409
+ }) {
410
+ const up = delta ? delta.pct >= 0 : false;
411
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.Card, { p: "$3.5", gap: "$2", borderWidth: 1, borderColor: "$borderColor", flex: 1, minW: 172, children: [
412
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", justify: "space-between", children: [
413
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", children: [
414
+ icon,
415
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color11", fontWeight: "500", children: label })
416
+ ] }),
417
+ delta ? /* @__PURE__ */ jsxRuntime.jsxs(gui.Text, { fontSize: "$1", color: up ? "#7ee787" : "#e5534b", children: [
418
+ up ? "\u25B2" : "\u25BC",
419
+ " ",
420
+ Math.abs(delta.pct),
421
+ "%"
422
+ ] }) : null
423
+ ] }),
424
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "flex-end", justify: "space-between", gap: "$2", children: [
425
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$8", fontWeight: "500", color: "$color12", numberOfLines: 1, className: "hz-mono", children: value }),
426
+ spark && spark.length >= 2 ? /* @__PURE__ */ jsxRuntime.jsx(Sparkline2, { points: spark, color: sparkColor ?? SERIES[0] }) : null
427
+ ] }),
428
+ caption ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", color: "$color10", numberOfLines: 1, children: caption }) : null
429
+ ] });
430
+ }
431
+ function HintButton({
432
+ icon,
433
+ iconAfter,
434
+ children,
435
+ onPress,
436
+ disabled,
437
+ hint,
438
+ theme
439
+ }) {
440
+ const btn = /* @__PURE__ */ jsxRuntime.jsx(
441
+ gui.Button,
442
+ {
443
+ size: "$2",
444
+ theme,
445
+ icon,
446
+ iconAfter,
447
+ disabled,
448
+ onPress: disabled ? void 0 : onPress,
449
+ children
450
+ }
451
+ );
452
+ if (!hint) return btn;
453
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { title: hint, style: { display: "inline-flex" }, children: btn });
454
+ }
455
+ function Panel({
456
+ title,
457
+ right,
458
+ children,
459
+ minW = 280,
460
+ grow = true
461
+ }) {
462
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.Card, { p: "$4", gap: "$3", borderWidth: 1, borderColor: "$borderColor", flex: grow ? 1 : void 0, minW, width: grow ? void 0 : "100%", children: [
463
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", justify: "space-between", gap: "$2", children: [
464
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$4", fontWeight: "500", color: "$color12", children: title }),
465
+ right
466
+ ] }),
467
+ children
468
+ ] });
469
+ }
470
+ function Donut2({
471
+ segments,
472
+ size = 160,
473
+ thickness = 18,
474
+ centerValue,
475
+ centerLabel,
476
+ trackColor = "#2a2d2e",
477
+ valueColor = "#ecedee",
478
+ labelColor = "#9ba1a6"
479
+ }) {
480
+ const total = segments.reduce((n, s) => n + Math.max(0, s.value), 0);
481
+ if (total <= 0) return null;
482
+ const r = (size - thickness) / 2;
483
+ const cx = size / 2;
484
+ const cy = size / 2;
485
+ const circ = 2 * Math.PI * r;
486
+ let offset = 0;
487
+ const arcs = segments.filter((s) => s.value > 0).map((s) => {
488
+ const frac = s.value / total;
489
+ const dash = frac * circ;
490
+ const node = /* @__PURE__ */ jsxRuntime.jsx(
491
+ "circle",
492
+ {
493
+ cx,
494
+ cy,
495
+ r,
496
+ fill: "none",
497
+ stroke: s.color,
498
+ strokeWidth: thickness,
499
+ strokeDasharray: `${dash} ${circ - dash}`,
500
+ strokeDashoffset: -offset
501
+ },
502
+ s.label
503
+ );
504
+ offset += dash;
505
+ return node;
506
+ });
507
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, role: "img", "aria-label": "Donut chart", children: [
508
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy, r, fill: "none", stroke: trackColor, strokeWidth: thickness }),
509
+ /* @__PURE__ */ jsxRuntime.jsx("g", { transform: `rotate(-90 ${cx} ${cy})`, children: arcs }),
510
+ centerValue ? /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy - 2, textAnchor: "middle", fontSize: size * 0.2, fontWeight: "800", fill: valueColor, children: centerValue }) : null,
511
+ centerLabel ? /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: cy + size * 0.13, textAnchor: "middle", fontSize: size * 0.08, fill: labelColor, children: centerLabel }) : null
512
+ ] });
513
+ }
10
514
 
515
+ // src/product/combobox/filter.ts
516
+ var hay = (o) => `${o.value} ${o.label ?? ""} ${o.hint ?? ""}`.toLowerCase();
517
+ function filterOptions(options, query) {
518
+ const q = query.trim().toLowerCase();
519
+ if (!q) return options;
520
+ return options.filter((o) => hay(o).includes(q));
521
+ }
522
+ function isKnownOption(options, value) {
523
+ return options.some((o) => o.value === value);
524
+ }
525
+ function ComboBox({
526
+ value,
527
+ onChange,
528
+ options,
529
+ loading = false,
530
+ error = null,
531
+ onRetry,
532
+ placeholder,
533
+ disabled,
534
+ emptyText = "No matches \u2014 press to use what you typed.",
535
+ minWidth = 240
536
+ }) {
537
+ const [open, setOpen] = react.useState(false);
538
+ const rowRef = react.useRef(null);
539
+ const anchorRect = react.useCallback(() => rowRef.current?.getBoundingClientRect() ?? null, []);
540
+ const anchorEl = react.useCallback(() => rowRef.current, []);
541
+ const filtered = react.useMemo(() => filterOptions(options, value), [options, value]);
542
+ const track = chunk7XDEUEWI_cjs.useEmit();
543
+ const pick = (v) => {
544
+ track({ component: "ComboBox", action: "select", id: v, value: filtered.length });
545
+ onChange(v);
546
+ setOpen(false);
547
+ };
548
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
549
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { ref: rowRef, items: "center", gap: "$2", minW: minWidth, children: [
550
+ /* @__PURE__ */ jsxRuntime.jsx(
551
+ gui.Input,
552
+ {
553
+ flex: 1,
554
+ value,
555
+ onChangeText: (v) => {
556
+ onChange(v);
557
+ if (!open) setOpen(true);
558
+ },
559
+ onFocus: () => setOpen(true),
560
+ disabled,
561
+ placeholder,
562
+ autoCapitalize: "none"
563
+ }
564
+ ),
565
+ /* @__PURE__ */ jsxRuntime.jsx(
566
+ gui.Button,
567
+ {
568
+ size: "$2",
569
+ chromeless: true,
570
+ disabled,
571
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.ChevronDown, { size: 16, opacity: 0.7 }),
572
+ onPress: () => {
573
+ track({ component: "ComboBox", action: open ? "close" : "open" });
574
+ setOpen((o) => !o);
575
+ },
576
+ "aria-label": "Show options"
577
+ }
578
+ )
579
+ ] }),
580
+ /* @__PURE__ */ jsxRuntime.jsx(
581
+ chunkGWNNLYX4_cjs.FloatingMenu,
582
+ {
583
+ open,
584
+ onClose: () => setOpen(false),
585
+ anchorRect,
586
+ anchorEl,
587
+ autoFocus: false,
588
+ minWidth,
589
+ maxHeight: 300,
590
+ children: loading ? /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", px: "$2", py: "$2", children: [
591
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Spinner, { size: "small", color: "$color11" }),
592
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color10", children: "Loading options\u2026" })
593
+ ] }) : error ? /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", px: "$2", py: "$2", children: [
594
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color10", flex: 1, numberOfLines: 2, children: error }),
595
+ onRetry ? /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$1", chromeless: true, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.RefreshCw, { size: 12 }), onPress: onRetry, "aria-label": "Retry" }) : null
596
+ ] }) : filtered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color10", px: "$2", py: "$2", children: emptyText }) : filtered.map((o) => /* @__PURE__ */ jsxRuntime.jsx(
597
+ chunkGWNNLYX4_cjs.MenuItemView,
598
+ {
599
+ label: o.label ?? o.value,
600
+ description: o.hint,
601
+ selected: o.value === value,
602
+ onSelect: () => pick(o.value)
603
+ },
604
+ o.value
605
+ ))
606
+ }
607
+ )
608
+ ] });
609
+ }
610
+ var ORDER = ["ai", "console", "app", "chat", "bot", "team", "billing"];
611
+ var SURFACES = ORDER.map((id) => {
612
+ const s = products.surfaceById(id);
613
+ return { id, label: s.label, href: s.href, hint: s.domain };
614
+ });
615
+ function otherSurfaces(current) {
616
+ return current ? SURFACES.filter((s) => s.id !== current) : SURFACES;
617
+ }
618
+ function HanzoMark({ size = 22, color = "currentColor" }) {
619
+ return /* @__PURE__ */ jsxRuntime.jsxs(
620
+ "svg",
621
+ {
622
+ width: size,
623
+ height: size,
624
+ viewBox: "0 0 67 67",
625
+ role: "img",
626
+ "aria-label": "Hanzo",
627
+ fill: color,
628
+ style: { display: "block", flexShrink: 0 },
629
+ children: [
630
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M22.21 67V44.6369H0V67H22.21Z" }),
631
+ /* @__PURE__ */ jsxRuntime.jsx("path", { opacity: 0.55, d: "M0 44.6369L22.21 46.8285V44.6369H0Z" }),
632
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z" }),
633
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M22.21 0H0V22.3184H22.21V0Z" }),
634
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M66.7198 0H44.5098V22.3184H66.7198V0Z" }),
635
+ /* @__PURE__ */ jsxRuntime.jsx("path", { opacity: 0.55, d: "M66.6753 22.3185L44.5098 20.0822V22.3185H66.6753Z" }),
636
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M66.7198 67V44.6369H44.5098V67H66.7198Z" })
637
+ ]
638
+ }
639
+ );
640
+ }
641
+ function BrandMark({
642
+ size = 20,
643
+ wordmark = "Hanzo",
644
+ animated = true
645
+ }) {
646
+ if (!animated) return /* @__PURE__ */ jsxRuntime.jsx(HanzoMark, { size });
647
+ return /* @__PURE__ */ jsxRuntime.jsx(react$1.HanzoLogo, { animated: true, size, wordmark });
648
+ }
649
+ var SURFACE_ICON = {
650
+ ai: lucideIcons2.Sparkles,
651
+ console: lucideIcons2.LayoutGrid,
652
+ app: lucideIcons2.AppWindow,
653
+ chat: lucideIcons2.MessageCircle,
654
+ bot: lucideIcons2.Bot,
655
+ team: lucideIcons2.Users,
656
+ billing: lucideIcons2.CreditCard
657
+ };
658
+ var openHref = (href) => {
659
+ if (typeof window !== "undefined") window.open(href, "_blank", "noopener");
660
+ };
661
+ function MenuRow({ icon, label, onPress }) {
662
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { onPress, cursor: "pointer", items: "center", gap: "$2.5", px: "$2", py: "$2", rounded: "$3", hoverStyle: { bg: "$color5" }, children: [
663
+ icon,
664
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color12", children: label })
665
+ ] });
666
+ }
667
+ function AppHeader({
668
+ brand,
669
+ wordmark = "Hanzo",
670
+ onBrand,
671
+ org,
672
+ children,
673
+ current,
674
+ surfaces,
675
+ open,
676
+ user,
677
+ menu,
678
+ theme,
679
+ onProfile,
680
+ onTeam,
681
+ onBilling,
682
+ onSignOut
683
+ }) {
684
+ const [appsOpen, setAppsOpen] = react.useState(false);
685
+ const [menuOpen, setMenuOpen] = react.useState(false);
686
+ const items = surfaces ?? otherSurfaces(current);
687
+ const launch = (s) => {
688
+ setAppsOpen(false);
689
+ if (open) open(s);
690
+ else openHref(s.href);
691
+ };
692
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", px: "$3", height: 52, borderBottomWidth: 1, borderColor: "$borderColor", bg: "$background", children: [
693
+ /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { items: "center", cursor: onBrand ? "pointer" : void 0, onPress: onBrand, children: brand ?? /* @__PURE__ */ jsxRuntime.jsx(BrandMark, { wordmark }) }),
694
+ org ? /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { items: "center", minW: 0, children: org }) : null,
695
+ /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { flex: 1, items: "center", minW: 0, children }),
696
+ items.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(gui.Popover, { open: appsOpen, onOpenChange: setAppsOpen, placement: "bottom-end", children: [
697
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", chromeless: true, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Grip, { size: 16 }), "aria-label": "Apps" }) }),
698
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Popover.Content, { bordered: true, elevate: true, p: "$2", width: 230, bg: "$color2", borderColor: "$borderColor", children: /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { gap: "$1", children: items.map((s) => {
699
+ const Icon = SURFACE_ICON[s.id];
700
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { onPress: () => launch(s), cursor: "pointer", items: "center", gap: "$2.5", px: "$2", py: "$2", rounded: "$3", hoverStyle: { bg: "$color5" }, children: [
701
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: 16 }),
702
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { flex: 1, fontSize: "$2", fontWeight: "600", color: "$color12", children: s.label }),
703
+ s.hint ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", color: "$color10", children: s.hint }) : null
704
+ ] }, s.id);
705
+ }) }) })
706
+ ] }) : null,
707
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.Popover, { open: menuOpen, onOpenChange: setMenuOpen, placement: "bottom-end", children: [
708
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", chromeless: true, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.UserRound, { size: 16 }), "aria-label": "Account", children: user ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color12", numberOfLines: 1, maxW: 140, children: user }) : null }) }),
709
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Popover.Content, { bordered: true, elevate: true, p: "$2", width: 220, bg: "$color2", borderColor: "$borderColor", children: menu ?? /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$1", children: [
710
+ onProfile ? /* @__PURE__ */ jsxRuntime.jsx(MenuRow, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.UserRound, { size: 15 }), label: "Profile", onPress: () => (setMenuOpen(false), onProfile()) }) : null,
711
+ theme !== null ? /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2.5", px: "$2", py: "$1", rounded: "$3", children: [
712
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { flex: 1, fontSize: "$2", color: "$color12", children: "Theme" }),
713
+ theme ?? /* @__PURE__ */ jsxRuntime.jsx(chunkARV3P4CE_cjs.ThemeToggle, {})
714
+ ] }) : null,
715
+ onTeam ? /* @__PURE__ */ jsxRuntime.jsx(MenuRow, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Settings2, { size: 15 }), label: "Team settings", onPress: () => (setMenuOpen(false), onTeam()) }) : null,
716
+ onBilling ? /* @__PURE__ */ jsxRuntime.jsx(MenuRow, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.CreditCard, { size: 15 }), label: "Billing", onPress: () => (setMenuOpen(false), onBilling()) }) : null,
717
+ onSignOut ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
718
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Separator, { borderColor: "$borderColor", my: "$1" }),
719
+ /* @__PURE__ */ jsxRuntime.jsx(MenuRow, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.LogOut, { size: 15 }), label: "Sign out", onPress: () => (setMenuOpen(false), onSignOut()) })
720
+ ] }) : null
721
+ ] }) })
722
+ ] })
723
+ ] });
724
+ }
725
+ function monogram(name) {
726
+ const words = name.trim().split(/[\s._/-]+/).filter(Boolean);
727
+ const letters = words.slice(0, 2).map((w) => w[0] ?? "").join("");
728
+ return (letters || name.trim().slice(0, 2)).toUpperCase();
729
+ }
730
+ function OrgMark({ org, size = 22, maxW }) {
731
+ if (org.logo) {
732
+ return /* @__PURE__ */ jsxRuntime.jsx(
733
+ "img",
734
+ {
735
+ src: org.logo,
736
+ alt: "",
737
+ style: {
738
+ height: size,
739
+ width: maxW ? "auto" : size,
740
+ maxWidth: maxW ?? size,
741
+ objectFit: "contain",
742
+ display: "block",
743
+ borderRadius: 6,
744
+ flexShrink: 0
745
+ }
746
+ }
747
+ );
748
+ }
749
+ return /* @__PURE__ */ jsxRuntime.jsx(
750
+ gui.YStack,
751
+ {
752
+ width: size,
753
+ height: size,
754
+ rounded: "$3",
755
+ bg: "$color4",
756
+ items: "center",
757
+ justify: "center",
758
+ style: { flexShrink: 0 },
759
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: Math.round(size * 0.4), fontWeight: "800", color: "$color12", children: monogram(org.displayName || org.name) })
760
+ }
761
+ );
762
+ }
11
763
 
12
- Object.defineProperty(exports, "AnimatedLogo", {
13
- enumerable: true,
14
- get: function () { return chunk2BM42AZR_cjs.AnimatedLogo; }
15
- });
16
- Object.defineProperty(exports, "AppHeader", {
17
- enumerable: true,
18
- get: function () { return chunk2BM42AZR_cjs.AppHeader; }
19
- });
20
- Object.defineProperty(exports, "BRANDS", {
21
- enumerable: true,
22
- get: function () { return chunk2BM42AZR_cjs.BRANDS; }
23
- });
24
- Object.defineProperty(exports, "BarChart", {
25
- enumerable: true,
26
- get: function () { return chunk2BM42AZR_cjs.BarChart; }
27
- });
28
- Object.defineProperty(exports, "BarRows", {
29
- enumerable: true,
30
- get: function () { return chunk2BM42AZR_cjs.BarRows; }
31
- });
32
- Object.defineProperty(exports, "BrandMark", {
764
+ // src/product/scope.ts
765
+ function browserStorage() {
766
+ if (typeof window === "undefined") return null;
767
+ try {
768
+ return window.localStorage;
769
+ } catch {
770
+ return null;
771
+ }
772
+ }
773
+ function orgScope(config) {
774
+ const key = config.key ?? "hanzo.org";
775
+ const selectedKey = `${key}.selected`;
776
+ const store = () => config.storage ?? browserStorage();
777
+ const read = (k) => {
778
+ try {
779
+ return store()?.getItem(k) ?? null;
780
+ } catch {
781
+ return null;
782
+ }
783
+ };
784
+ const write = (k, v) => {
785
+ try {
786
+ if (v === null) store()?.removeItem(k);
787
+ else store()?.setItem(k, v);
788
+ } catch {
789
+ }
790
+ };
791
+ const goHome = () => {
792
+ if (config.navigate) return config.navigate("/");
793
+ if (typeof window !== "undefined") window.location.assign("/");
794
+ };
795
+ const doReload = () => {
796
+ if (config.reload) return config.reload();
797
+ if (typeof window !== "undefined") window.location.reload();
798
+ };
799
+ const scope = {
800
+ currentOrg: () => read(key) || config.brandOrg,
801
+ setCurrentOrg: (org) => write(key, !org || org === config.brandOrg ? null : org),
802
+ isScopedAway: () => scope.currentOrg() !== config.brandOrg,
803
+ hasSelectedOrg: () => read(selectedKey) === "1",
804
+ enterOrg: (org) => {
805
+ if (!org) return;
806
+ scope.setCurrentOrg(org);
807
+ write(selectedKey, "1");
808
+ goHome();
809
+ },
810
+ leaveOrg: () => {
811
+ write(selectedKey, null);
812
+ scope.setCurrentOrg(config.brandOrg);
813
+ goHome();
814
+ },
815
+ switchOrg: (org) => {
816
+ if (!org || org === scope.currentOrg()) return;
817
+ scope.setCurrentOrg(org);
818
+ write(selectedKey, "1");
819
+ doReload();
820
+ }
821
+ };
822
+ return scope;
823
+ }
824
+ function filterOrgs(orgs, query) {
825
+ const q = query.trim().toLowerCase();
826
+ if (!q) return orgs;
827
+ return orgs.filter(
828
+ (o) => o.name.toLowerCase().includes(q) || (o.displayName ?? "").toLowerCase().includes(q)
829
+ );
830
+ }
831
+ var titleCase = (s) => s ? s[0].toUpperCase() + s.slice(1) : s;
832
+ function OrgSwitcher({ scope, orgs, pageSize = 20, current: given, create, picker = false }) {
833
+ const currentId = scope.currentOrg();
834
+ const [open, setOpen] = react.useState(false);
835
+ const [query, setQuery] = react.useState("");
836
+ const [debounced, setDebounced] = react.useState("");
837
+ const [rows, setRows] = react.useState([]);
838
+ const [loading, setLoading] = react.useState(false);
839
+ const [loadingMore, setLoadingMore] = react.useState(false);
840
+ const [hasMore, setHasMore] = react.useState(false);
841
+ const [creating, setCreating] = react.useState(false);
842
+ const [newName, setNewName] = react.useState("");
843
+ const [busy, setBusy] = react.useState(false);
844
+ const [err, setErr] = react.useState(null);
845
+ const pageRef = react.useRef(0);
846
+ const reqRef = react.useRef(0);
847
+ react.useEffect(() => {
848
+ const id = setTimeout(() => setDebounced(query.trim()), 250);
849
+ return () => clearTimeout(id);
850
+ }, [query]);
851
+ const fetchPage = react.useCallback(
852
+ async (page, q, append) => {
853
+ if (!orgs) return;
854
+ const token = ++reqRef.current;
855
+ append ? setLoadingMore(true) : setLoading(true);
856
+ try {
857
+ const incoming = await orgs(page, q);
858
+ if (token !== reqRef.current) return;
859
+ pageRef.current = page;
860
+ setRows((prev) => {
861
+ const merged = append ? [...prev] : [];
862
+ const seen = new Set(merged.map((o) => o.name));
863
+ for (const o of incoming) if (!seen.has(o.name)) merged.push(o);
864
+ return merged;
865
+ });
866
+ setHasMore(incoming.length >= pageSize);
867
+ } catch {
868
+ if (token !== reqRef.current) return;
869
+ if (!append) setRows([]);
870
+ setHasMore(false);
871
+ } finally {
872
+ if (token === reqRef.current) {
873
+ setLoading(false);
874
+ setLoadingMore(false);
875
+ }
876
+ }
877
+ },
878
+ [orgs, pageSize]
879
+ );
880
+ react.useEffect(() => {
881
+ if (!open || !orgs) return;
882
+ void fetchPage(0, debounced, false);
883
+ }, [open, debounced, fetchPage, orgs]);
884
+ const loadMore = react.useCallback(() => {
885
+ if (loading || loadingMore || !hasMore) return;
886
+ void fetchPage(pageRef.current + 1, debounced, true);
887
+ }, [loading, loadingMore, hasMore, debounced, fetchPage]);
888
+ const visible = react.useMemo(() => {
889
+ if (orgs) return filterOrgs(rows, query);
890
+ return [{ name: currentId, displayName: titleCase(currentId) }];
891
+ }, [orgs, rows, query, currentId]);
892
+ const current = react.useMemo(() => {
893
+ if (given && given.name === currentId) return given;
894
+ return rows.find((o) => o.name === currentId) ?? { name: currentId, displayName: titleCase(currentId) };
895
+ }, [given, rows, currentId]);
896
+ const currentLabel = current.displayName || titleCase(current.name);
897
+ const track = chunk7XDEUEWI_cjs.useEmit();
898
+ const select = react.useCallback(
899
+ (org) => {
900
+ track({ component: "OrgSwitcher", action: "select", id: org });
901
+ setOpen(false);
902
+ scope.switchOrg(org);
903
+ },
904
+ [scope, track]
905
+ );
906
+ const submitCreate = async () => {
907
+ const name = newName.trim();
908
+ if (!name || !create) return;
909
+ setBusy(true);
910
+ setErr(null);
911
+ try {
912
+ const org = await create(name);
913
+ scope.switchOrg(org);
914
+ } catch (e) {
915
+ setErr(e instanceof Error ? e.message : "Could not create the organization.");
916
+ setBusy(false);
917
+ }
918
+ };
919
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.Popover, { open, onOpenChange: setOpen, placement: "bottom-start", children: [
920
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { chromeless: true, height: 44, px: "$2", justify: "flex-start", "aria-label": `${currentLabel} \xB7 switch organization`, children: /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2.5", flex: 1, minW: 0, children: [
921
+ /* @__PURE__ */ jsxRuntime.jsx(OrgMark, { org: current, size: 30 }),
922
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { flex: 1, minW: 0, fontSize: "$4", fontWeight: "800", color: "$color12", numberOfLines: 1, children: currentLabel }),
923
+ /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.ChevronsUpDown, { size: 15, color: "$color9" })
924
+ ] }) }) }),
925
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Popover.Content, { bordered: true, elevate: true, p: "$2", width: 300, bg: "$color2", borderColor: "$borderColor", children: creating ? /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$2", children: [
926
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color12", fontWeight: "700", children: "Create organization" }),
927
+ /* @__PURE__ */ jsxRuntime.jsx(
928
+ gui.Input,
929
+ {
930
+ size: "$3",
931
+ placeholder: "Organization name",
932
+ value: newName,
933
+ onChangeText: setNewName,
934
+ autoCapitalize: "words",
935
+ onSubmitEditing: () => void submitCreate()
936
+ }
937
+ ),
938
+ err ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", color: "$red10", children: err }) : null,
939
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2", justify: "flex-end", children: [
940
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", chromeless: true, onPress: () => setCreating(false), disabled: busy, children: "Cancel" }),
941
+ /* @__PURE__ */ jsxRuntime.jsx(
942
+ gui.Button,
943
+ {
944
+ size: "$2",
945
+ onPress: () => void submitCreate(),
946
+ disabled: busy || !newName.trim(),
947
+ icon: busy ? /* @__PURE__ */ jsxRuntime.jsx(gui.Spinner, { size: "small" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Plus, { size: 14 }),
948
+ children: "Create"
949
+ }
950
+ )
951
+ ] })
952
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$1", children: [
953
+ orgs ? /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", px: "$2", py: "$1", rounded: "$3", borderWidth: 1, borderColor: "$borderColor", children: [
954
+ /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Search, { size: 13, opacity: 0.6 }),
955
+ /* @__PURE__ */ jsxRuntime.jsx(
956
+ gui.Input,
957
+ {
958
+ flex: 1,
959
+ size: "$2",
960
+ borderWidth: 0,
961
+ bg: "transparent",
962
+ placeholder: "Find organization\u2026",
963
+ value: query,
964
+ onChangeText: setQuery,
965
+ autoCapitalize: "none",
966
+ autoCorrect: false
967
+ }
968
+ )
969
+ ] }) : null,
970
+ /* @__PURE__ */ jsxRuntime.jsxs(
971
+ "div",
972
+ {
973
+ style: { maxHeight: 300, overflowY: "auto", display: "flex", flexDirection: "column" },
974
+ onScroll: (e) => {
975
+ const el = e.currentTarget;
976
+ if (el.scrollHeight - el.scrollTop - el.clientHeight < 48) loadMore();
977
+ },
978
+ children: [
979
+ loading ? /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", px: "$2", py: "$3", children: [
980
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Spinner, { size: "small", color: "$color11" }),
981
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color10", children: "Loading organizations\u2026" })
982
+ ] }) : visible.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { px: "$2", py: "$2", fontSize: "$2", color: "$color10", children: query.trim() ? `No organizations match \u201C${query.trim()}\u201D.` : "No organizations yet." }) : visible.map((org) => /* @__PURE__ */ jsxRuntime.jsxs(
983
+ gui.XStack,
984
+ {
985
+ onPress: () => select(org.name),
986
+ cursor: "pointer",
987
+ items: "center",
988
+ gap: "$2.5",
989
+ px: "$2",
990
+ py: "$2",
991
+ rounded: "$3",
992
+ bg: org.name === currentId ? "$color4" : "transparent",
993
+ hoverStyle: { bg: "$color5" },
994
+ children: [
995
+ /* @__PURE__ */ jsxRuntime.jsx(OrgMark, { org }),
996
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { flex: 1, fontSize: "$2", color: "$color12", numberOfLines: 1, children: org.displayName || org.name }),
997
+ org.name === currentId ? /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Check, { size: 15 }) : null
998
+ ]
999
+ },
1000
+ org.name
1001
+ )),
1002
+ loadingMore ? /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", px: "$2", py: "$2", children: [
1003
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Spinner, { size: "small", color: "$color11" }),
1004
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", color: "$color10", children: "Loading more\u2026" })
1005
+ ] }) : hasMore ? /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { onPress: loadMore, cursor: "pointer", items: "center", justify: "center", px: "$2", py: "$1.5", rounded: "$3", hoverStyle: { bg: "$color4" }, children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", color: "$color11", fontWeight: "600", children: "Load more" }) }) : null
1006
+ ]
1007
+ }
1008
+ ),
1009
+ create ? /* @__PURE__ */ jsxRuntime.jsxs(
1010
+ gui.XStack,
1011
+ {
1012
+ onPress: () => {
1013
+ setCreating(true);
1014
+ setErr(null);
1015
+ },
1016
+ cursor: "pointer",
1017
+ items: "center",
1018
+ gap: "$2.5",
1019
+ px: "$2",
1020
+ py: "$2",
1021
+ mt: "$1",
1022
+ rounded: "$3",
1023
+ borderTopWidth: 1,
1024
+ borderColor: "$borderColor",
1025
+ hoverStyle: { bg: "$color5" },
1026
+ children: [
1027
+ /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { width: 22, height: 22, rounded: "$3", bg: "$color3", items: "center", justify: "center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Plus, { size: 14 }) }),
1028
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color12", children: "Create organization" })
1029
+ ]
1030
+ }
1031
+ ) : null,
1032
+ picker ? /* @__PURE__ */ jsxRuntime.jsxs(
1033
+ gui.XStack,
1034
+ {
1035
+ onPress: () => {
1036
+ setOpen(false);
1037
+ scope.leaveOrg();
1038
+ },
1039
+ cursor: "pointer",
1040
+ items: "center",
1041
+ gap: "$2.5",
1042
+ px: "$2",
1043
+ py: "$2",
1044
+ rounded: "$3",
1045
+ hoverStyle: { bg: "$color5" },
1046
+ children: [
1047
+ /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { width: 22, height: 22, rounded: "$3", bg: "$color3", items: "center", justify: "center", children: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.LayoutGrid, { size: 14 }) }),
1048
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color12", children: "All organizations" })
1049
+ ]
1050
+ }
1051
+ ) : null
1052
+ ] }) })
1053
+ ] });
1054
+ }
1055
+ function ContextMenu({ children, items, disabled, minWidth = 200, maxHeight }) {
1056
+ const [state, setState] = react.useState({ open: false, x: 0, y: 0 });
1057
+ const close = react.useCallback(() => setState((s) => s.open ? { ...s, open: false } : s), []);
1058
+ const anchorRect = react.useCallback(
1059
+ () => ({ left: state.x, top: state.y, right: state.x, bottom: state.y, width: 0, height: 0 }),
1060
+ [state.x, state.y]
1061
+ );
1062
+ const childOnContextMenu = children.props.onContextMenu;
1063
+ const target = react.cloneElement(children, {
1064
+ onContextMenu: (e) => {
1065
+ childOnContextMenu?.(e);
1066
+ if (disabled) return;
1067
+ e.preventDefault();
1068
+ e.stopPropagation();
1069
+ setState({ open: true, x: e.clientX, y: e.clientY });
1070
+ }
1071
+ });
1072
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1073
+ target,
1074
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGWNNLYX4_cjs.FloatingMenu, { open: state.open, onClose: close, anchorRect, gap: 0, minWidth, maxHeight, children: chunkGWNNLYX4_cjs.renderMenuItems(items, close) })
1075
+ ] });
1076
+ }
1077
+ var isExternal = (href) => /^https?:\/\//.test(href);
1078
+ var defaultLink = ({ href, children, onNavigate }) => /* @__PURE__ */ jsxRuntime.jsx(
1079
+ "a",
1080
+ {
1081
+ href,
1082
+ onClick: onNavigate,
1083
+ ...isExternal(href) ? { target: "_blank", rel: "noopener noreferrer" } : null,
1084
+ style: { textDecoration: "none", color: "inherit", display: "block" },
1085
+ children
1086
+ }
1087
+ );
1088
+ function ProductCell({ product, link, icon, close }) {
1089
+ const glyph = icon?.(product.id);
1090
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { minW: 200, flex: 1, flexBasis: 200, children: link({
1091
+ href: product.url,
1092
+ onNavigate: close,
1093
+ children: /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2.5", items: "flex-start", p: "$2.5", rounded: "$4", borderWidth: 1, borderColor: "$borderColor", hoverStyle: { bg: "$color4" }, children: [
1094
+ glyph ? /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { pt: "$0.5", children: glyph }) : null,
1095
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { minW: 0, gap: "$0.5", children: [
1096
+ product.verb ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: 11, color: "$color10", textTransform: "uppercase", letterSpacing: 0.4, children: product.verb }) : null,
1097
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color12", children: product.name }),
1098
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: 12, color: "$color10", lineHeight: 16, children: product.job })
1099
+ ] })
1100
+ ] })
1101
+ }) });
1102
+ }
1103
+ function Column({ title, links, link, icon, close }) {
1104
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { minW: 160, flex: 1, gap: "$1", children: [
1105
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: 11, color: "$color10", textTransform: "uppercase", letterSpacing: 0.5, px: "$2", pb: "$1", children: title }),
1106
+ links.map((l) => /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { px: "$2", py: "$1", rounded: "$3", hoverStyle: { bg: "$color4" }, gap: "$2", items: "center", children: [
1107
+ icon?.(l.id) ?? null,
1108
+ link({
1109
+ href: l.href,
1110
+ onNavigate: close,
1111
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color11", children: l.label })
1112
+ })
1113
+ ] }, l.id))
1114
+ ] });
1115
+ }
1116
+ function Launcher({ menu, link, icon, close }) {
1117
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1118
+ gui.YStack,
1119
+ {
1120
+ position: "absolute",
1121
+ t: 52,
1122
+ l: 0,
1123
+ r: 0,
1124
+ z: 50,
1125
+ bg: "$background",
1126
+ borderBottomWidth: 1,
1127
+ borderColor: "$borderColor",
1128
+ px: "$4",
1129
+ py: "$4",
1130
+ gap: "$3",
1131
+ maxH: "80vh",
1132
+ overflow: "scroll",
1133
+ children: [
1134
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$3", flexWrap: "wrap", children: [
1135
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color11", children: menu.eyebrow }),
1136
+ /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { ml: "auto", children: link({
1137
+ href: menu.allProducts.href,
1138
+ onNavigate: close,
1139
+ children: /* @__PURE__ */ jsxRuntime.jsxs(gui.Text, { fontSize: "$2", color: "$color12", children: [
1140
+ menu.allProducts.label,
1141
+ " \u2192"
1142
+ ] })
1143
+ }) })
1144
+ ] }),
1145
+ /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { gap: "$2.5", flexWrap: "wrap", children: menu.products.map((p) => /* @__PURE__ */ jsxRuntime.jsx(ProductCell, { product: p, link, icon, close }, p.id)) }),
1146
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Separator, {}),
1147
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$4", flexWrap: "wrap", items: "flex-start", children: [
1148
+ /* @__PURE__ */ jsxRuntime.jsx(Column, { title: "Platform", links: menu.utilities, link, icon, close }),
1149
+ /* @__PURE__ */ jsxRuntime.jsx(Column, { title: "Install", links: menu.installs, link, icon, close })
1150
+ ] })
1151
+ ]
1152
+ }
1153
+ );
1154
+ }
1155
+ function Cta({ action, link }) {
1156
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { bg: "$color12", px: "$3", py: "$1.5", rounded: "$3", hoverStyle: { opacity: 0.9 }, children: link({
1157
+ href: action.href,
1158
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$background", children: action.label })
1159
+ }) });
1160
+ }
1161
+ function MobilePanel({ header, menu, link, icon, close }) {
1162
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1163
+ gui.YStack,
1164
+ {
1165
+ position: "absolute",
1166
+ t: 52,
1167
+ l: 0,
1168
+ r: 0,
1169
+ z: 50,
1170
+ bg: "$background",
1171
+ borderBottomWidth: 1,
1172
+ borderColor: "$borderColor",
1173
+ px: "$3",
1174
+ py: "$3",
1175
+ gap: "$3",
1176
+ maxH: "80vh",
1177
+ overflow: "scroll",
1178
+ children: [
1179
+ /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { gap: "$1", children: header.localNav.map((l) => /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { px: "$2", py: "$1.5", rounded: "$3", hoverStyle: { bg: "$color4" }, children: link({
1180
+ href: l.href,
1181
+ onNavigate: close,
1182
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color12", children: l.label })
1183
+ }) }, l.id)) }),
1184
+ menu ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1185
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Separator, {}),
1186
+ /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { gap: "$1", children: menu.products.map((p) => /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { px: "$2", py: "$1.5", rounded: "$3", hoverStyle: { bg: "$color4" }, gap: "$2", items: "center", children: [
1187
+ icon?.(p.id) ?? null,
1188
+ link({
1189
+ href: p.url,
1190
+ onNavigate: close,
1191
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color12", children: p.name })
1192
+ })
1193
+ ] }, p.id)) }),
1194
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Separator, {}),
1195
+ /* @__PURE__ */ jsxRuntime.jsx(Column, { title: "Platform", links: menu.utilities, link, icon, close }),
1196
+ /* @__PURE__ */ jsxRuntime.jsx(Column, { title: "Install", links: menu.installs, link, icon, close })
1197
+ ] }) : null
1198
+ ]
1199
+ }
1200
+ );
1201
+ }
1202
+ function SiteNav({ header, menu, brand, actions, link = defaultLink, icon, active, meetLabel = "Meet Hanzo" }) {
1203
+ const [launcher, setLauncher] = react.useState(false);
1204
+ const [mobile, setMobile] = react.useState(false);
1205
+ const root = react.useRef(null);
1206
+ react.useEffect(() => {
1207
+ if (!launcher && !mobile) return;
1208
+ const dismiss = () => {
1209
+ setLauncher(false);
1210
+ setMobile(false);
1211
+ };
1212
+ const onKey = (e) => {
1213
+ if (e.key === "Escape") dismiss();
1214
+ };
1215
+ const onDown = (e) => {
1216
+ if (root.current && !root.current.contains(e.target)) dismiss();
1217
+ };
1218
+ document.addEventListener("keydown", onKey);
1219
+ document.addEventListener("mousedown", onDown);
1220
+ return () => {
1221
+ document.removeEventListener("keydown", onKey);
1222
+ document.removeEventListener("mousedown", onDown);
1223
+ };
1224
+ }, [launcher, mobile]);
1225
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { ref: root, position: "relative", bg: "$background", children: [
1226
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$1", px: "$3", height: 52, borderBottomWidth: 1, borderColor: "$borderColor", children: [
1227
+ brand ? /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { items: "center", pr: "$2", children: brand }) : null,
1228
+ menu ? /* @__PURE__ */ jsxRuntime.jsx(
1229
+ gui.XStack,
1230
+ {
1231
+ cursor: "pointer",
1232
+ px: "$2.5",
1233
+ py: "$1.5",
1234
+ rounded: "$3",
1235
+ bg: launcher ? "$color4" : "transparent",
1236
+ hoverStyle: { bg: "$color4" },
1237
+ onPress: () => setLauncher(!launcher),
1238
+ accessibilityRole: "button",
1239
+ "aria-expanded": launcher,
1240
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color12", children: meetLabel })
1241
+ }
1242
+ ) : null,
1243
+ /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { items: "center", gap: "$0.5", flex: 1, minW: 0, $sm: { display: "none" }, children: header.localNav.map((l) => /* @__PURE__ */ jsxRuntime.jsx(
1244
+ gui.XStack,
1245
+ {
1246
+ px: "$2.5",
1247
+ py: "$1.5",
1248
+ rounded: "$3",
1249
+ hoverStyle: { bg: "$color4" },
1250
+ onMouseEnter: () => launcher && setLauncher(false),
1251
+ children: link({
1252
+ href: l.href,
1253
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: active === l.id ? "$color12" : "$color11", children: l.label })
1254
+ })
1255
+ },
1256
+ l.id
1257
+ )) }),
1258
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", ml: "auto", children: [
1259
+ actions,
1260
+ /* @__PURE__ */ jsxRuntime.jsx(Cta, { action: header.action, link }),
1261
+ /* @__PURE__ */ jsxRuntime.jsx(
1262
+ gui.XStack,
1263
+ {
1264
+ display: "none",
1265
+ $sm: { display: "flex" },
1266
+ cursor: "pointer",
1267
+ px: "$2",
1268
+ py: "$1.5",
1269
+ rounded: "$3",
1270
+ hoverStyle: { bg: "$color4" },
1271
+ onPress: () => setMobile(!mobile),
1272
+ accessibilityRole: "button",
1273
+ "aria-label": mobile ? "Close menu" : "Open menu",
1274
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color12", children: mobile ? "Close" : "Menu" })
1275
+ }
1276
+ )
1277
+ ] })
1278
+ ] }),
1279
+ launcher && menu ? /* @__PURE__ */ jsxRuntime.jsx(Launcher, { menu, link, icon, close: () => setLauncher(false) }) : null,
1280
+ mobile ? /* @__PURE__ */ jsxRuntime.jsx(MobilePanel, { header, menu, link, icon, close: () => setMobile(false) }) : null
1281
+ ] });
1282
+ }
1283
+ var isExternal2 = (href) => /^https?:\/\//.test(href);
1284
+ var defaultLink2 = ({ href, children }) => /* @__PURE__ */ jsxRuntime.jsx(
1285
+ "a",
1286
+ {
1287
+ href,
1288
+ ...isExternal2(href) ? { target: "_blank", rel: "noopener noreferrer" } : null,
1289
+ style: { textDecoration: "none", color: "inherit" },
1290
+ children
1291
+ }
1292
+ );
1293
+ function SiteFooter({ footer, brand, tagline, meta, link = defaultLink2 }) {
1294
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { borderTopWidth: 1, borderColor: "$borderColor", bg: "$background", px: "$4", py: "$5", gap: "$4", children: [
1295
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$5", flexWrap: "wrap", items: "flex-start", children: [
1296
+ brand || tagline ? /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$2", minW: 200, flex: 1, children: [
1297
+ brand,
1298
+ tagline ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: 12, color: "$color10", lineHeight: 18, maxW: 280, children: tagline }) : null
1299
+ ] }) : null,
1300
+ footer.columns.map((column) => /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$1.5", minW: 140, children: [
1301
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: 11, color: "$color10", textTransform: "uppercase", letterSpacing: 0.5, pb: "$1", children: column.title }),
1302
+ column.links.map((l) => /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { hoverStyle: { opacity: 0.7 }, children: link({
1303
+ href: l.href,
1304
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color11", children: l.label })
1305
+ }) }, l.id))
1306
+ ] }, column.id))
1307
+ ] }),
1308
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Separator, {}),
1309
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$3", flexWrap: "wrap", children: [
1310
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: 12, color: "$color10", children: footer.legal.copyright }),
1311
+ /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { items: "center", gap: "$3", flexWrap: "wrap", children: footer.legal.links.map((l) => /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { hoverStyle: { opacity: 0.7 }, children: link({
1312
+ href: l.href,
1313
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: 12, color: "$color10", children: l.label })
1314
+ }) }, l.id)) }),
1315
+ meta ? /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { ml: "auto", items: "center", gap: "$3", children: meta }) : null
1316
+ ] })
1317
+ ] });
1318
+ }
1319
+ function CommerceResource({
1320
+ title,
1321
+ subtitle,
1322
+ load,
1323
+ columns,
1324
+ rowKey,
1325
+ empty,
1326
+ hint,
1327
+ actions
1328
+ }) {
1329
+ const [state, setState] = react.useState({ phase: "loading" });
1330
+ const loadRef = react.useRef(load);
1331
+ loadRef.current = load;
1332
+ const reload = react.useCallback(() => {
1333
+ setState({ phase: "loading" });
1334
+ loadRef.current().then((r) => setState({ phase: "ready", data: r.rows })).catch((e) => setState({ phase: "error", error: chunkWHJR5S4L_cjs.classifyBackend(e) }));
1335
+ }, []);
1336
+ react.useEffect(() => {
1337
+ reload();
1338
+ }, [reload]);
1339
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1340
+ /* @__PURE__ */ jsxRuntime.jsx(
1341
+ chunkWHJR5S4L_cjs.PageHeader,
1342
+ {
1343
+ title,
1344
+ subtitle,
1345
+ actions: /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2", children: [
1346
+ actions?.(reload),
1347
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.RefreshCw, { size: 15 }), onPress: reload, children: "Refresh" })
1348
+ ] })
1349
+ }
1350
+ ),
1351
+ state.phase === "error" ? /* @__PURE__ */ jsxRuntime.jsx(chunkWHJR5S4L_cjs.BackendStateCard, { state: state.error, onRetry: reload, hint }) : /* @__PURE__ */ jsxRuntime.jsx(
1352
+ chunkONVERVFG_cjs.DataTable,
1353
+ {
1354
+ columns,
1355
+ rows: state.phase === "ready" ? state.data : [],
1356
+ loading: state.phase === "loading",
1357
+ rowKey,
1358
+ empty
1359
+ }
1360
+ )
1361
+ ] });
1362
+ }
1363
+ function ConfirmDelete({
1364
+ message,
1365
+ confirmLabel,
1366
+ run,
1367
+ onDone
1368
+ }) {
1369
+ const [busy, setBusy] = react.useState(false);
1370
+ const [err, setErr] = react.useState(null);
1371
+ const track = chunk7XDEUEWI_cjs.useEmit();
1372
+ const go = async () => {
1373
+ setBusy(true);
1374
+ setErr(null);
1375
+ track({ component: "ConfirmDelete", action: "confirm", id: confirmLabel });
1376
+ try {
1377
+ await run();
1378
+ onDone();
1379
+ } catch (e) {
1380
+ const message2 = chunkWHJR5S4L_cjs.classifyBackend(e).message || "Failed to delete.";
1381
+ track({ component: "ConfirmDelete", action: "error", id: confirmLabel, value: message2 });
1382
+ setErr(message2);
1383
+ setBusy(false);
1384
+ }
1385
+ };
1386
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$3", children: [
1387
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color11", children: message }),
1388
+ err ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$red10", children: err }) : null,
1389
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2", flexWrap: "wrap", children: [
1390
+ /* @__PURE__ */ jsxRuntime.jsx(
1391
+ gui.Button,
1392
+ {
1393
+ onPress: go,
1394
+ disabled: busy,
1395
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Trash2, { size: 15 }),
1396
+ style: { backgroundColor: "#dc2626", borderColor: "#dc2626", color: "#fff" },
1397
+ children: busy ? "Deleting\u2026" : confirmLabel
1398
+ }
1399
+ ),
1400
+ /* @__PURE__ */ jsxRuntime.jsx(
1401
+ gui.Button,
1402
+ {
1403
+ chromeless: true,
1404
+ onPress: () => {
1405
+ track({ component: "ConfirmDelete", action: "cancel", id: confirmLabel });
1406
+ onDone();
1407
+ },
1408
+ disabled: busy,
1409
+ children: "Cancel"
1410
+ }
1411
+ )
1412
+ ] })
1413
+ ] });
1414
+ }
1415
+ function Segmented({
1416
+ options,
1417
+ value,
1418
+ onChange,
1419
+ size = "$2",
1420
+ name
1421
+ }) {
1422
+ const track = chunk7XDEUEWI_cjs.useEmit();
1423
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { gap: "$1", flexWrap: "wrap", items: "center", children: options.map((o) => {
1424
+ const active = o.value === value;
1425
+ return /* @__PURE__ */ jsxRuntime.jsx(
1426
+ gui.Button,
1427
+ {
1428
+ size,
1429
+ bg: active ? "$color5" : "transparent",
1430
+ borderWidth: 1,
1431
+ borderColor: active ? "$color7" : "$borderColor",
1432
+ "aria-pressed": active,
1433
+ onPress: () => {
1434
+ track({ component: "Segmented", action: "filter", id: name, value: o.value });
1435
+ onChange(o.value);
1436
+ },
1437
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", fontWeight: active ? "700" : "500", color: active ? "$color12" : "$color11", children: o.label })
1438
+ },
1439
+ o.value
1440
+ );
1441
+ }) });
1442
+ }
1443
+ function SearchInput({
1444
+ value,
1445
+ onChange,
1446
+ placeholder,
1447
+ name
1448
+ }) {
1449
+ const track = chunk7XDEUEWI_cjs.useEmit();
1450
+ const onChangeTracked = (v) => {
1451
+ track({ component: "SearchInput", action: "search", id: name, value: chunk7XDEUEWI_cjs.textSize(v) });
1452
+ onChange(v);
1453
+ };
1454
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { flex: 1, minW: 180, items: "center", gap: "$2", px: "$3", borderWidth: 1, borderColor: "$borderColor", rounded: "$4", bg: "$color1", children: [
1455
+ /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Search, { size: 15, color: "$color10" }),
1456
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Input, { flex: 1, value, onChangeText: onChangeTracked, placeholder, borderWidth: 0, bg: "transparent", px: "$0", fontSize: "$3" })
1457
+ ] });
1458
+ }
1459
+
1460
+ // src/product/brand.ts
1461
+ var HANZO_MARK_CONTENT = '<path d="M22.21 67V44.6369H0V67H22.21Z"/><path d="M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z"/><path d="M22.21 0H0V22.3184H22.21V0Z"/><path d="M66.7198 0H44.5098V22.3184H66.7198V0Z"/><path d="M66.7198 67V44.6369H44.5098V67H66.7198Z"/>';
1462
+ var HANZO = {
1463
+ id: "hanzo",
1464
+ name: "Hanzo",
1465
+ viewBox: "0 0 67 67",
1466
+ content: HANZO_MARK_CONTENT,
1467
+ href: "https://hanzo.ai"
1468
+ };
1469
+ var LUX = {
1470
+ id: "lux",
1471
+ name: "Lux",
1472
+ viewBox: "0 0 100 100",
1473
+ content: '<path d="M50 85 L15 25 L85 25 Z"/>',
1474
+ href: "https://lux.network"
1475
+ };
1476
+ var ZOO = {
1477
+ id: "zoo",
1478
+ name: "Zoo",
1479
+ viewBox: "0 0 1024 1024",
1480
+ fullColor: true,
1481
+ content: '<defs><clipPath id="zooClip"><circle cx="512" cy="511" r="270"/></clipPath><clipPath id="zooGClip"><circle cx="513" cy="369" r="234"/></clipPath><clipPath id="zooRClip"><circle cx="365" cy="595" r="234"/></clipPath></defs><g clip-path="url(#zooClip)"><circle cx="513" cy="369" r="234" fill="#00A652"/><circle cx="365" cy="595" r="234" fill="#ED1C24"/><circle cx="643" cy="595" r="234" fill="#2E3192"/><g clip-path="url(#zooGClip)"><circle cx="365" cy="595" r="234" fill="#FCF006"/><circle cx="643" cy="595" r="234" fill="#01ACF1"/></g><g clip-path="url(#zooRClip)"><circle cx="643" cy="595" r="234" fill="#EA018E"/></g><g clip-path="url(#zooGClip)"><g clip-path="url(#zooRClip)"><circle cx="643" cy="595" r="234" fill="#FFFFFF"/></g></g></g>',
1482
+ href: "https://zoo.ngo"
1483
+ };
1484
+ var PARS = {
1485
+ id: "pars",
1486
+ name: "Pars",
1487
+ viewBox: "-120 -120 240 240",
1488
+ content: '<path d="M0,-100 L30,-60 L100,-40 L60,0 L100,40 L30,60 L0,100 L-30,60 L-100,40 L-60,0 L-100,-40 L-30,-60 Z" fill="none" stroke="currentColor" stroke-width="4" stroke-linejoin="round"/><path d="M0,-70 L22,-42 L70,-28 L42,0 L70,28 L22,42 L0,70 L-22,42 L-70,28 L-42,0 L-70,-28 L-22,-42 Z" fill="currentColor" fill-opacity="0.15" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/><circle r="55" fill="none" stroke="currentColor" stroke-width="1.5" opacity="0.4"/><circle r="35" fill="none" stroke="currentColor" stroke-width="1.5" opacity="0.4"/><circle r="8" fill="currentColor"/>',
1489
+ href: "https://pars.network"
1490
+ };
1491
+ var BRANDS = { hanzo: HANZO, lux: LUX, zoo: ZOO, pars: PARS };
1492
+ function resolveBrand(id) {
1493
+ return id && BRANDS[id] || HANZO;
1494
+ }
1495
+
1496
+ // src/product/animatedLogo.logic.ts
1497
+ var HOUSE_EASE = "cubic-bezier(0.16, 1, 0.3, 1)";
1498
+ var DEFAULT_DURATION_MS = 360;
1499
+ var DEFAULT_INTRO_MS = 1500;
1500
+ var DEFAULT_GAP = 8;
1501
+ function wordmarkText(name, surface) {
1502
+ const s = surface?.trim();
1503
+ return s ? `${name} ${s}` : name;
1504
+ }
1505
+ function isExpanded(s) {
1506
+ return s.hovered || s.focused || s.introShowing;
1507
+ }
1508
+ function wordmarkStyle(i) {
1509
+ return {
1510
+ width: i.expanded ? i.naturalWidth ?? "auto" : 0,
1511
+ opacity: i.expanded ? 1 : 0,
1512
+ marginLeft: i.expanded ? i.gap : 0,
1513
+ transition: i.reduce ? "none" : `width ${i.durationMs}ms ${i.easing}, opacity ${i.durationMs}ms ${i.easing}, margin-left ${i.durationMs}ms ${i.easing}`
1514
+ };
1515
+ }
1516
+ function usePrefersReducedMotion() {
1517
+ const [reduce, setReduce] = react.useState(false);
1518
+ react.useEffect(() => {
1519
+ if (typeof window === "undefined" || !window.matchMedia) return;
1520
+ const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
1521
+ const sync = () => setReduce(mq.matches);
1522
+ sync();
1523
+ mq.addEventListener("change", sync);
1524
+ return () => mq.removeEventListener("change", sync);
1525
+ }, []);
1526
+ return reduce;
1527
+ }
1528
+ function AnimatedLogo({
1529
+ surface,
1530
+ brand = HANZO,
1531
+ size = 22,
1532
+ gap = DEFAULT_GAP,
1533
+ introMs = DEFAULT_INTRO_MS,
1534
+ durationMs = DEFAULT_DURATION_MS,
1535
+ easing = HOUSE_EASE,
1536
+ href,
1537
+ onClick,
1538
+ component,
1539
+ className,
1540
+ style,
1541
+ "aria-label": ariaLabel
1542
+ }) {
1543
+ const reduce = usePrefersReducedMotion();
1544
+ const label = ariaLabel ?? wordmarkText(brand.name, surface);
1545
+ const [hovered, setHovered] = react.useState(false);
1546
+ const [focused, setFocused] = react.useState(false);
1547
+ const [introShowing, setIntroShowing] = react.useState(introMs > 0);
1548
+ const [naturalWidth, setNaturalWidth] = react.useState(void 0);
1549
+ const wordRef = react.useRef(null);
1550
+ react.useEffect(() => {
1551
+ if (introMs <= 0) return;
1552
+ if (reduce) {
1553
+ setIntroShowing(false);
1554
+ return;
1555
+ }
1556
+ const t = setTimeout(() => setIntroShowing(false), introMs);
1557
+ return () => clearTimeout(t);
1558
+ }, [introMs, reduce]);
1559
+ react.useLayoutEffect(() => {
1560
+ const el = wordRef.current;
1561
+ if (!el) return;
1562
+ const measure = () => setNaturalWidth(el.scrollWidth);
1563
+ measure();
1564
+ const fonts = typeof document !== "undefined" && document.fonts || null;
1565
+ if (fonts?.ready) fonts.ready.then(measure).catch(() => {
1566
+ });
1567
+ }, [brand.name, surface]);
1568
+ const expanded = isExpanded({ hovered, focused, introShowing });
1569
+ const ws = wordmarkStyle({ expanded, naturalWidth, gap, durationMs, easing, reduce });
1570
+ const Root = component ?? "a";
1571
+ const isAnchor = Root === "a";
1572
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1573
+ Root,
1574
+ {
1575
+ ...isAnchor ? { href: href ?? brand.href ?? "/" } : { href: href ?? brand.href },
1576
+ onClick,
1577
+ "aria-label": label,
1578
+ title: label,
1579
+ className,
1580
+ onMouseEnter: () => setHovered(true),
1581
+ onMouseLeave: () => setHovered(false),
1582
+ onFocus: () => setFocused(true),
1583
+ onBlur: () => setFocused(false),
1584
+ style: {
1585
+ display: "inline-flex",
1586
+ alignItems: "center",
1587
+ textDecoration: "none",
1588
+ color: "inherit",
1589
+ cursor: "pointer",
1590
+ ...style
1591
+ },
1592
+ children: [
1593
+ /* @__PURE__ */ jsxRuntime.jsx(
1594
+ "svg",
1595
+ {
1596
+ width: size,
1597
+ height: size,
1598
+ viewBox: brand.viewBox,
1599
+ "aria-hidden": "true",
1600
+ focusable: "false",
1601
+ fill: brand.fullColor ? void 0 : "currentColor",
1602
+ style: { display: "block", flexShrink: 0 },
1603
+ dangerouslySetInnerHTML: { __html: brand.content }
1604
+ }
1605
+ ),
1606
+ /* @__PURE__ */ jsxRuntime.jsx(
1607
+ "span",
1608
+ {
1609
+ ref: wordRef,
1610
+ "aria-hidden": "true",
1611
+ style: {
1612
+ display: "inline-block",
1613
+ overflow: "hidden",
1614
+ whiteSpace: "nowrap",
1615
+ fontWeight: 600,
1616
+ fontSize: 15,
1617
+ letterSpacing: "-0.01em",
1618
+ lineHeight: 1,
1619
+ width: ws.width,
1620
+ opacity: ws.opacity,
1621
+ marginLeft: ws.marginLeft,
1622
+ transition: ws.transition
1623
+ },
1624
+ children: label
1625
+ }
1626
+ )
1627
+ ]
1628
+ }
1629
+ );
1630
+ }
1631
+ function FadeIn({
1632
+ children,
1633
+ index = 0,
1634
+ step = 50,
1635
+ delayMs,
1636
+ style
1637
+ }) {
1638
+ const delay = delayMs ?? index * step;
1639
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hz-fade-up", style: { animationDelay: `${delay}ms`, ...style }, children });
1640
+ }
1641
+ function ProductIcon({
1642
+ icon: Icon,
1643
+ color,
1644
+ size = 24
1645
+ }) {
1646
+ const radius = Math.round(size * 0.28);
1647
+ const glyph = Math.round(size * 0.58);
1648
+ const tinted = typeof color === "string" && color.trim() !== "";
1649
+ if (tinted) {
1650
+ return /* @__PURE__ */ jsxRuntime.jsx(
1651
+ gui.XStack,
1652
+ {
1653
+ width: size,
1654
+ height: size,
1655
+ items: "center",
1656
+ justify: "center",
1657
+ rounded: radius,
1658
+ style: { backgroundColor: color },
1659
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: glyph, color: chunkONVERVFG_cjs.asColor("#ffffff") })
1660
+ }
1661
+ );
1662
+ }
1663
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { width: size, height: size, items: "center", justify: "center", rounded: radius, bg: "$color12", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: glyph, color: "$color1" }) });
1664
+ }
1665
+ var KNOWN = {
1666
+ openrouter: lucideIcons2.Globe,
1667
+ nvidia: lucideIcons2.Cpu
1668
+ };
1669
+ var isFirstParty = (provider) => {
1670
+ const p = provider.trim().toLowerCase();
1671
+ return p === "hanzo" || p === "zen";
1672
+ };
1673
+ function EnsoMark({ size, color }) {
1674
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: size, height: size, viewBox: "0 0 100 100", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M66.22 83.26 A37 37 0 1 1 85.57 60.20", fill: "none", stroke: color, strokeWidth: 11, strokeLinecap: "round" }) });
1675
+ }
1676
+ var HANZO_PATHS = [
1677
+ "M22.21 67V44.6369H0V67H22.21Z",
1678
+ "M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z",
1679
+ "M22.21 0H0V22.3184H22.21V0Z",
1680
+ "M66.7198 0H44.5098V22.3184H66.7198V0Z",
1681
+ "M66.7198 67V44.6369H44.5098V67H66.7198Z"
1682
+ ];
1683
+ function HanzoHMark({ size, color }) {
1684
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: size, height: size, viewBox: "0 0 67 67", "aria-hidden": "true", children: HANZO_PATHS.map((d) => /* @__PURE__ */ jsxRuntime.jsx("path", { d, fill: color }, d)) });
1685
+ }
1686
+ function providerInitials(provider) {
1687
+ const name = provider.trim();
1688
+ if (!name) return "\u2022";
1689
+ const words = name.split(/[\s/_-]+/).filter(Boolean);
1690
+ if (words.length >= 2) return (words[0][0] + words[1][0]).toUpperCase();
1691
+ return name.slice(0, 2).toUpperCase();
1692
+ }
1693
+ function ProviderLogo({ provider, size = 24 }) {
1694
+ const theme = gui.useTheme();
1695
+ const radius = Math.round(size * 0.28);
1696
+ const iconSize = Math.round(size * 0.56);
1697
+ if (isFirstParty(provider)) {
1698
+ const fg = theme.color1?.get() ?? "#000000";
1699
+ const markSize = Math.round(size * 0.66);
1700
+ const isZen = provider.trim().toLowerCase() === "zen";
1701
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { width: size, height: size, items: "center", justify: "center", rounded: radius, bg: "$color12", children: isZen ? /* @__PURE__ */ jsxRuntime.jsx(EnsoMark, { size: markSize, color: fg }) : /* @__PURE__ */ jsxRuntime.jsx(HanzoHMark, { size: Math.round(size * 0.56), color: fg }) });
1702
+ }
1703
+ const Known = KNOWN[provider.trim().toLowerCase()];
1704
+ if (Known) {
1705
+ return /* @__PURE__ */ jsxRuntime.jsx(
1706
+ gui.XStack,
1707
+ {
1708
+ width: size,
1709
+ height: size,
1710
+ items: "center",
1711
+ justify: "center",
1712
+ rounded: radius,
1713
+ bg: "$color3",
1714
+ borderWidth: 1,
1715
+ borderColor: "$borderColor",
1716
+ children: /* @__PURE__ */ jsxRuntime.jsx(Known, { size: iconSize, color: "$color11" })
1717
+ }
1718
+ );
1719
+ }
1720
+ return /* @__PURE__ */ jsxRuntime.jsx(
1721
+ gui.XStack,
1722
+ {
1723
+ width: size,
1724
+ height: size,
1725
+ items: "center",
1726
+ justify: "center",
1727
+ rounded: radius,
1728
+ bg: "$color3",
1729
+ borderWidth: 1,
1730
+ borderColor: "$borderColor",
1731
+ children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: Math.round(size * 0.4), fontWeight: "800", color: "$color11", children: providerInitials(provider) })
1732
+ }
1733
+ );
1734
+ }
1735
+ function GenericLogo({ size = 24 }) {
1736
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { width: size, height: size, items: "center", justify: "center", rounded: Math.round(size * 0.28), bg: "$color3", borderWidth: 1, borderColor: "$borderColor", children: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Server, { size: Math.round(size * 0.56), color: "$color11" }) });
1737
+ }
1738
+ function targetIndex(from, dy, rowH, count) {
1739
+ if (rowH <= 0 || count <= 0) return from;
1740
+ const raw = from + Math.round(dy / rowH);
1741
+ return Math.max(0, Math.min(raw, count - 1));
1742
+ }
1743
+ function rowShift(i, from, to, dy, rowH) {
1744
+ if (i === from) return dy;
1745
+ if (from < to && i > from && i <= to) return -rowH;
1746
+ if (from > to && i < from && i >= to) return rowH;
1747
+ return 0;
1748
+ }
1749
+ function Reorder({
1750
+ items,
1751
+ keyOf,
1752
+ rowHeight = 44,
1753
+ onReorder,
1754
+ renderItem
1755
+ }) {
1756
+ const [drag, setDrag] = react.useState(null);
1757
+ const startRef = react.useRef(null);
1758
+ const to = drag ? targetIndex(drag.from, drag.dy, rowHeight, items.length) : -1;
1759
+ const begin = react.useCallback(
1760
+ (index) => (e) => {
1761
+ const startY = e.clientY ?? e.nativeEvent?.clientY ?? 0;
1762
+ startRef.current = { from: index, startY };
1763
+ setDrag({ from: index, dy: 0 });
1764
+ const move = (ev) => {
1765
+ if (!startRef.current) return;
1766
+ setDrag({ from: startRef.current.from, dy: ev.clientY - startRef.current.startY });
1767
+ };
1768
+ const end = () => {
1769
+ const s = startRef.current;
1770
+ window.removeEventListener("pointermove", move);
1771
+ window.removeEventListener("pointerup", end);
1772
+ window.removeEventListener("pointercancel", end);
1773
+ startRef.current = null;
1774
+ setDrag((d) => {
1775
+ if (s && d) {
1776
+ const t = targetIndex(s.from, d.dy, rowHeight, items.length);
1777
+ if (t !== s.from) onReorder(s.from, t);
1778
+ }
1779
+ return null;
1780
+ });
1781
+ };
1782
+ window.addEventListener("pointermove", move);
1783
+ window.addEventListener("pointerup", end);
1784
+ window.addEventListener("pointercancel", end);
1785
+ },
1786
+ [items.length, rowHeight, onReorder]
1787
+ );
1788
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { children: items.map((item, i) => {
1789
+ const dragging = drag?.from === i;
1790
+ const shift = drag && to >= 0 ? rowShift(i, drag.from, to, drag.dy, rowHeight) : 0;
1791
+ return /* @__PURE__ */ jsxRuntime.jsx(
1792
+ gui.YStack,
1793
+ {
1794
+ height: rowHeight,
1795
+ justify: "center",
1796
+ className: "hz-drag-item",
1797
+ style: {
1798
+ transform: `translateY(${shift}px)`,
1799
+ zIndex: dragging ? 2 : 1,
1800
+ ...dragging ? { transition: "none", boxShadow: "0 8px 24px rgba(0,0,0,0.28)" } : null
1801
+ },
1802
+ children: renderItem(item, { onPointerDown: begin(i) }, dragging)
1803
+ },
1804
+ keyOf(item)
1805
+ );
1806
+ }) });
1807
+ }
1808
+ var ToastContext = react.createContext(null);
1809
+ var ACCENT2 = {
1810
+ success: "$green10",
1811
+ error: "$red10",
1812
+ info: "$color11"
1813
+ };
1814
+ var ICON = {
1815
+ success: lucideIcons2.CircleCheck,
1816
+ error: lucideIcons2.CircleX,
1817
+ info: lucideIcons2.Info
1818
+ };
1819
+ function ToastCard({ t, onClose }) {
1820
+ const Icon = ICON[t.kind];
1821
+ const accent = ACCENT2[t.kind];
1822
+ return /* @__PURE__ */ jsxRuntime.jsx(
1823
+ gui.Card,
1824
+ {
1825
+ width: 360,
1826
+ maxWidth: "90%",
1827
+ p: "$3",
1828
+ gap: "$2",
1829
+ bg: "$color2",
1830
+ borderWidth: 1,
1831
+ borderColor: "$borderColor",
1832
+ borderLeftWidth: 3,
1833
+ borderLeftColor: accent,
1834
+ rounded: "$4",
1835
+ elevation: "$2",
1836
+ children: /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2.5", items: "flex-start", children: [
1837
+ /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { pt: 1, children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: 18, color: accent }) }),
1838
+ /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { flex: 1, gap: "$1", children: [
1839
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", fontWeight: "700", color: "$color12", children: t.title }),
1840
+ t.description ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color11", children: t.description }) : null
1841
+ ] }),
1842
+ /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$1", chromeless: true, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.X, { size: 14 }), onPress: onClose, "aria-label": "Dismiss" })
1843
+ ] })
1844
+ }
1845
+ );
1846
+ }
1847
+ function ToastViewport({ toasts, dismiss }) {
1848
+ const [mounted, setMounted] = react.useState(false);
1849
+ react.useEffect(() => setMounted(true), []);
1850
+ if (!mounted || typeof document === "undefined") return null;
1851
+ return reactDom.createPortal(
1852
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "fixed", top: 16, right: 16, zIndex: 1e5, pointerEvents: "none" }, children: /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { gap: "$2", items: "flex-end", children: toasts.map((t) => /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { pointerEvents: "auto", children: /* @__PURE__ */ jsxRuntime.jsx(ToastCard, { t, onClose: () => dismiss(t.id) }) }, t.id)) }) }),
1853
+ document.body
1854
+ );
1855
+ }
1856
+ function ToastProvider({ children }) {
1857
+ const track = chunk7XDEUEWI_cjs.useEmit();
1858
+ const [toasts, setToasts] = react.useState([]);
1859
+ const timers = react.useRef(/* @__PURE__ */ new Map());
1860
+ const seq = react.useRef(0);
1861
+ const dismiss = react.useCallback((id) => {
1862
+ setToasts((ts) => ts.filter((t) => t.id !== id));
1863
+ const timer = timers.current.get(id);
1864
+ if (timer) {
1865
+ clearTimeout(timer);
1866
+ timers.current.delete(id);
1867
+ }
1868
+ }, []);
1869
+ const toast = react.useCallback(
1870
+ (input) => {
1871
+ const id = ++seq.current;
1872
+ const kind = input.kind ?? "info";
1873
+ const durationMs = input.durationMs ?? (kind === "error" ? 6e3 : 3500);
1874
+ track({ component: "Toast", action: kind === "error" ? "error" : "view", id: input.title, value: kind });
1875
+ setToasts((ts) => [...ts, { id, kind, title: input.title, description: input.description, durationMs }]);
1876
+ if (durationMs > 0) {
1877
+ timers.current.set(
1878
+ id,
1879
+ setTimeout(() => dismiss(id), durationMs)
1880
+ );
1881
+ }
1882
+ },
1883
+ [dismiss, track]
1884
+ );
1885
+ react.useEffect(() => {
1886
+ const map = timers.current;
1887
+ return () => map.forEach((t) => clearTimeout(t));
1888
+ }, []);
1889
+ const api = {
1890
+ toast,
1891
+ success: (title, description) => toast({ title, description, kind: "success" }),
1892
+ error: (title, description) => toast({ title, description, kind: "error" }),
1893
+ info: (title, description) => toast({ title, description, kind: "info" }),
1894
+ dismiss
1895
+ };
1896
+ return /* @__PURE__ */ jsxRuntime.jsxs(ToastContext.Provider, { value: api, children: [
1897
+ children,
1898
+ /* @__PURE__ */ jsxRuntime.jsx(ToastViewport, { toasts, dismiss })
1899
+ ] });
1900
+ }
1901
+ function useToast() {
1902
+ const ctx = react.useContext(ToastContext);
1903
+ if (!ctx) throw new Error("useToast must be used within <ToastProvider>");
1904
+ return ctx;
1905
+ }
1906
+
1907
+ Object.defineProperty(exports, "AgnosticThemeToggle", {
33
1908
  enumerable: true,
34
- get: function () { return chunk2BM42AZR_cjs.BrandMark; }
1909
+ get: function () { return chunkARV3P4CE_cjs.AgnosticThemeToggle; }
35
1910
  });
36
- Object.defineProperty(exports, "CHART_OTHER", {
1911
+ Object.defineProperty(exports, "ThemeToggle", {
37
1912
  enumerable: true,
38
- get: function () { return chunk2BM42AZR_cjs.CHART_OTHER; }
1913
+ get: function () { return chunkARV3P4CE_cjs.ThemeToggle; }
39
1914
  });
40
- Object.defineProperty(exports, "CHART_PALETTE", {
1915
+ Object.defineProperty(exports, "ThemeToggleNext", {
41
1916
  enumerable: true,
42
- get: function () { return chunk2BM42AZR_cjs.CHART_PALETTE; }
1917
+ get: function () { return chunkARV3P4CE_cjs.ThemeToggleNext; }
43
1918
  });
44
- Object.defineProperty(exports, "ComboBox", {
1919
+ Object.defineProperty(exports, "COMPOSE_MODES", {
45
1920
  enumerable: true,
46
- get: function () { return chunk2BM42AZR_cjs.ComboBox; }
1921
+ get: function () { return chunkONVERVFG_cjs.COMPOSE_MODES; }
47
1922
  });
48
- Object.defineProperty(exports, "CommerceResource", {
1923
+ Object.defineProperty(exports, "CampaignCard", {
49
1924
  enumerable: true,
50
- get: function () { return chunk2BM42AZR_cjs.CommerceResource; }
1925
+ get: function () { return chunkONVERVFG_cjs.CampaignCard; }
51
1926
  });
52
- Object.defineProperty(exports, "ConfirmDelete", {
1927
+ Object.defineProperty(exports, "ChannelBadge", {
53
1928
  enumerable: true,
54
- get: function () { return chunk2BM42AZR_cjs.ConfirmDelete; }
1929
+ get: function () { return chunkONVERVFG_cjs.ChannelBadge; }
55
1930
  });
56
- Object.defineProperty(exports, "ContextMenu", {
1931
+ Object.defineProperty(exports, "DataTable", {
57
1932
  enumerable: true,
58
- get: function () { return chunk2BM42AZR_cjs.ContextMenu; }
1933
+ get: function () { return chunkONVERVFG_cjs.DataTable; }
59
1934
  });
60
- Object.defineProperty(exports, "CustomModelMark", {
1935
+ Object.defineProperty(exports, "PostAgenda", {
61
1936
  enumerable: true,
62
- get: function () { return chunk2BM42AZR_cjs.Boxes; }
1937
+ get: function () { return chunkONVERVFG_cjs.PostAgenda; }
63
1938
  });
64
- Object.defineProperty(exports, "Donut", {
1939
+ Object.defineProperty(exports, "PostCard", {
65
1940
  enumerable: true,
66
- get: function () { return chunk2BM42AZR_cjs.Donut; }
1941
+ get: function () { return chunkONVERVFG_cjs.PostCard; }
67
1942
  });
68
- Object.defineProperty(exports, "DonutRing", {
1943
+ Object.defineProperty(exports, "PostComposer", {
69
1944
  enumerable: true,
70
- get: function () { return chunk2BM42AZR_cjs.Donut2; }
1945
+ get: function () { return chunkONVERVFG_cjs.PostComposer; }
71
1946
  });
72
- Object.defineProperty(exports, "DropdownMenu", {
1947
+ Object.defineProperty(exports, "ProviderReadinessList", {
73
1948
  enumerable: true,
74
- get: function () { return chunk2BM42AZR_cjs.DropdownMenu; }
1949
+ get: function () { return chunkONVERVFG_cjs.ProviderReadinessList; }
75
1950
  });
76
- Object.defineProperty(exports, "FadeIn", {
1951
+ Object.defineProperty(exports, "SLIDEOVER_LG", {
77
1952
  enumerable: true,
78
- get: function () { return chunk2BM42AZR_cjs.FadeIn; }
1953
+ get: function () { return chunkONVERVFG_cjs.LG; }
79
1954
  });
80
- Object.defineProperty(exports, "FloatingMenu", {
1955
+ Object.defineProperty(exports, "SlideOver", {
81
1956
  enumerable: true,
82
- get: function () { return chunk2BM42AZR_cjs.FloatingMenu; }
1957
+ get: function () { return chunkONVERVFG_cjs.SlideOver; }
83
1958
  });
84
- Object.defineProperty(exports, "GenericLogo", {
1959
+ Object.defineProperty(exports, "SocialResource", {
85
1960
  enumerable: true,
86
- get: function () { return chunk2BM42AZR_cjs.GenericLogo; }
1961
+ get: function () { return chunkONVERVFG_cjs.SocialResource; }
87
1962
  });
88
- Object.defineProperty(exports, "HANZO", {
1963
+ Object.defineProperty(exports, "SocialSummaryBar", {
89
1964
  enumerable: true,
90
- get: function () { return chunk2BM42AZR_cjs.HANZO; }
1965
+ get: function () { return chunkONVERVFG_cjs.SocialSummaryBar; }
91
1966
  });
92
- Object.defineProperty(exports, "HANZO_MARK_CONTENT", {
1967
+ Object.defineProperty(exports, "StatusTag", {
93
1968
  enumerable: true,
94
- get: function () { return chunk2BM42AZR_cjs.HANZO_MARK_CONTENT; }
1969
+ get: function () { return chunkONVERVFG_cjs.StatusTag; }
95
1970
  });
96
- Object.defineProperty(exports, "HanzoMark", {
1971
+ Object.defineProperty(exports, "ViewToggle", {
97
1972
  enumerable: true,
98
- get: function () { return chunk2BM42AZR_cjs.HanzoMark; }
1973
+ get: function () { return chunkONVERVFG_cjs.ViewToggle; }
99
1974
  });
100
- Object.defineProperty(exports, "HintButton", {
1975
+ Object.defineProperty(exports, "asColor", {
101
1976
  enumerable: true,
102
- get: function () { return chunk2BM42AZR_cjs.HintButton; }
1977
+ get: function () { return chunkONVERVFG_cjs.asColor; }
103
1978
  });
104
- Object.defineProperty(exports, "LUX", {
1979
+ Object.defineProperty(exports, "formatPostTime", {
105
1980
  enumerable: true,
106
- get: function () { return chunk2BM42AZR_cjs.LUX; }
1981
+ get: function () { return chunkONVERVFG_cjs.formatPostTime; }
107
1982
  });
108
- Object.defineProperty(exports, "LegendDot", {
1983
+ Object.defineProperty(exports, "parsePostTime", {
109
1984
  enumerable: true,
110
- get: function () { return chunk2BM42AZR_cjs.LegendDot; }
1985
+ get: function () { return chunkONVERVFG_cjs.parsePostTime; }
111
1986
  });
112
- Object.defineProperty(exports, "LineChart", {
1987
+ Object.defineProperty(exports, "postDayBucket", {
113
1988
  enumerable: true,
114
- get: function () { return chunk2BM42AZR_cjs.LineChart; }
1989
+ get: function () { return chunkONVERVFG_cjs.postDayBucket; }
115
1990
  });
116
- Object.defineProperty(exports, "MenuItemView", {
1991
+ Object.defineProperty(exports, "postPreview", {
117
1992
  enumerable: true,
118
- get: function () { return chunk2BM42AZR_cjs.MenuItemView; }
1993
+ get: function () { return chunkONVERVFG_cjs.postPreview; }
119
1994
  });
120
- Object.defineProperty(exports, "MenuLabelView", {
1995
+ Object.defineProperty(exports, "ACCOUNT_STATUSES", {
121
1996
  enumerable: true,
122
- get: function () { return chunk2BM42AZR_cjs.MenuLabelView; }
1997
+ get: function () { return chunkMWBFAV3D_cjs.ACCOUNT_STATUSES; }
123
1998
  });
124
- Object.defineProperty(exports, "MenuPanel", {
1999
+ Object.defineProperty(exports, "POST_STATUSES", {
125
2000
  enumerable: true,
126
- get: function () { return chunk2BM42AZR_cjs.MenuPanel; }
2001
+ get: function () { return chunkMWBFAV3D_cjs.POST_STATUSES; }
127
2002
  });
128
- Object.defineProperty(exports, "MenuSeparatorView", {
2003
+ Object.defineProperty(exports, "PROVIDERS", {
129
2004
  enumerable: true,
130
- get: function () { return chunk2BM42AZR_cjs.MenuSeparatorView; }
2005
+ get: function () { return chunkMWBFAV3D_cjs.PROVIDERS; }
131
2006
  });
132
- Object.defineProperty(exports, "MetricCard", {
2007
+ Object.defineProperty(exports, "createSocialApi", {
133
2008
  enumerable: true,
134
- get: function () { return chunk2BM42AZR_cjs.MetricCard; }
2009
+ get: function () { return chunkMWBFAV3D_cjs.createSocialApi; }
135
2010
  });
136
- Object.defineProperty(exports, "MetricSparkline", {
2011
+ Object.defineProperty(exports, "normalizeAccount", {
137
2012
  enumerable: true,
138
- get: function () { return chunk2BM42AZR_cjs.Sparkline2; }
2013
+ get: function () { return chunkMWBFAV3D_cjs.normalizeAccount; }
139
2014
  });
140
- Object.defineProperty(exports, "MiniBars", {
2015
+ Object.defineProperty(exports, "normalizeAccounts", {
141
2016
  enumerable: true,
142
- get: function () { return chunk2BM42AZR_cjs.MiniBars; }
2017
+ get: function () { return chunkMWBFAV3D_cjs.normalizeAccounts; }
143
2018
  });
144
- Object.defineProperty(exports, "OrgMark", {
2019
+ Object.defineProperty(exports, "normalizePost", {
145
2020
  enumerable: true,
146
- get: function () { return chunk2BM42AZR_cjs.OrgMark; }
2021
+ get: function () { return chunkMWBFAV3D_cjs.normalizePost; }
147
2022
  });
148
- Object.defineProperty(exports, "OrgSwitcher", {
2023
+ Object.defineProperty(exports, "normalizePosts", {
149
2024
  enumerable: true,
150
- get: function () { return chunk2BM42AZR_cjs.OrgSwitcher; }
2025
+ get: function () { return chunkMWBFAV3D_cjs.normalizePosts; }
151
2026
  });
152
- Object.defineProperty(exports, "PARS", {
2027
+ Object.defineProperty(exports, "normalizeProviderCapability", {
153
2028
  enumerable: true,
154
- get: function () { return chunk2BM42AZR_cjs.PARS; }
2029
+ get: function () { return chunkMWBFAV3D_cjs.normalizeProviderCapability; }
155
2030
  });
156
- Object.defineProperty(exports, "Panel", {
2031
+ Object.defineProperty(exports, "normalizeProviders", {
157
2032
  enumerable: true,
158
- get: function () { return chunk2BM42AZR_cjs.Panel; }
2033
+ get: function () { return chunkMWBFAV3D_cjs.normalizeProviders; }
159
2034
  });
160
- Object.defineProperty(exports, "PortalTheme", {
2035
+ Object.defineProperty(exports, "normalizeSummary", {
161
2036
  enumerable: true,
162
- get: function () { return chunk2BM42AZR_cjs.PortalTheme; }
2037
+ get: function () { return chunkMWBFAV3D_cjs.normalizeSummary; }
163
2038
  });
164
- Object.defineProperty(exports, "ProductIcon", {
2039
+ Object.defineProperty(exports, "DropdownMenu", {
165
2040
  enumerable: true,
166
- get: function () { return chunk2BM42AZR_cjs.ProductIcon; }
2041
+ get: function () { return chunkGWNNLYX4_cjs.DropdownMenu; }
167
2042
  });
168
- Object.defineProperty(exports, "ProviderLogo", {
2043
+ Object.defineProperty(exports, "FloatingMenu", {
169
2044
  enumerable: true,
170
- get: function () { return chunk2BM42AZR_cjs.ProviderLogo; }
2045
+ get: function () { return chunkGWNNLYX4_cjs.FloatingMenu; }
171
2046
  });
172
- Object.defineProperty(exports, "Reorder", {
2047
+ Object.defineProperty(exports, "MenuItemView", {
173
2048
  enumerable: true,
174
- get: function () { return chunk2BM42AZR_cjs.Reorder; }
2049
+ get: function () { return chunkGWNNLYX4_cjs.MenuItemView; }
175
2050
  });
176
- Object.defineProperty(exports, "SERIES", {
2051
+ Object.defineProperty(exports, "MenuLabelView", {
177
2052
  enumerable: true,
178
- get: function () { return chunk2BM42AZR_cjs.SERIES; }
2053
+ get: function () { return chunkGWNNLYX4_cjs.MenuLabelView; }
179
2054
  });
180
- Object.defineProperty(exports, "SURFACES", {
2055
+ Object.defineProperty(exports, "MenuPanel", {
181
2056
  enumerable: true,
182
- get: function () { return chunk2BM42AZR_cjs.SURFACES; }
2057
+ get: function () { return chunkGWNNLYX4_cjs.MenuPanel; }
183
2058
  });
184
- Object.defineProperty(exports, "SearchInput", {
2059
+ Object.defineProperty(exports, "MenuSeparatorView", {
185
2060
  enumerable: true,
186
- get: function () { return chunk2BM42AZR_cjs.SearchInput; }
2061
+ get: function () { return chunkGWNNLYX4_cjs.MenuSeparatorView; }
187
2062
  });
188
- Object.defineProperty(exports, "Segmented", {
2063
+ Object.defineProperty(exports, "PortalTheme", {
189
2064
  enumerable: true,
190
- get: function () { return chunk2BM42AZR_cjs.Segmented; }
2065
+ get: function () { return chunkGWNNLYX4_cjs.PortalTheme; }
191
2066
  });
192
2067
  Object.defineProperty(exports, "SelectMenu", {
193
2068
  enumerable: true,
194
- get: function () { return chunk2BM42AZR_cjs.SelectMenu; }
195
- });
196
- Object.defineProperty(exports, "SiteFooter", {
197
- enumerable: true,
198
- get: function () { return chunk2BM42AZR_cjs.SiteFooter; }
199
- });
200
- Object.defineProperty(exports, "SiteNav", {
201
- enumerable: true,
202
- get: function () { return chunk2BM42AZR_cjs.SiteNav; }
203
- });
204
- Object.defineProperty(exports, "Sparkline", {
205
- enumerable: true,
206
- get: function () { return chunk2BM42AZR_cjs.Sparkline; }
207
- });
208
- Object.defineProperty(exports, "ToastProvider", {
209
- enumerable: true,
210
- get: function () { return chunk2BM42AZR_cjs.ToastProvider; }
211
- });
212
- Object.defineProperty(exports, "UtilBar", {
213
- enumerable: true,
214
- get: function () { return chunk2BM42AZR_cjs.UtilBar; }
215
- });
216
- Object.defineProperty(exports, "ZOO", {
217
- enumerable: true,
218
- get: function () { return chunk2BM42AZR_cjs.ZOO; }
219
- });
220
- Object.defineProperty(exports, "colorForIndex", {
221
- enumerable: true,
222
- get: function () { return chunk2BM42AZR_cjs.colorForIndex; }
223
- });
224
- Object.defineProperty(exports, "filterOptions", {
225
- enumerable: true,
226
- get: function () { return chunk2BM42AZR_cjs.filterOptions; }
227
- });
228
- Object.defineProperty(exports, "filterOrgs", {
229
- enumerable: true,
230
- get: function () { return chunk2BM42AZR_cjs.filterOrgs; }
231
- });
232
- Object.defineProperty(exports, "isKnownOption", {
233
- enumerable: true,
234
- get: function () { return chunk2BM42AZR_cjs.isKnownOption; }
235
- });
236
- Object.defineProperty(exports, "monogram", {
237
- enumerable: true,
238
- get: function () { return chunk2BM42AZR_cjs.monogram; }
239
- });
240
- Object.defineProperty(exports, "orgScope", {
241
- enumerable: true,
242
- get: function () { return chunk2BM42AZR_cjs.orgScope; }
243
- });
244
- Object.defineProperty(exports, "otherSurfaces", {
245
- enumerable: true,
246
- get: function () { return chunk2BM42AZR_cjs.otherSurfaces; }
247
- });
248
- Object.defineProperty(exports, "providerInitials", {
249
- enumerable: true,
250
- get: function () { return chunk2BM42AZR_cjs.providerInitials; }
2069
+ get: function () { return chunkGWNNLYX4_cjs.SelectMenu; }
251
2070
  });
252
2071
  Object.defineProperty(exports, "renderMenuItems", {
253
2072
  enumerable: true,
254
- get: function () { return chunk2BM42AZR_cjs.renderMenuItems; }
255
- });
256
- Object.defineProperty(exports, "resolveBrand", {
257
- enumerable: true,
258
- get: function () { return chunk2BM42AZR_cjs.resolveBrand; }
259
- });
260
- Object.defineProperty(exports, "rowShift", {
261
- enumerable: true,
262
- get: function () { return chunk2BM42AZR_cjs.rowShift; }
263
- });
264
- Object.defineProperty(exports, "targetIndex", {
265
- enumerable: true,
266
- get: function () { return chunk2BM42AZR_cjs.targetIndex; }
267
- });
268
- Object.defineProperty(exports, "useContainerWidth", {
269
- enumerable: true,
270
- get: function () { return chunk2BM42AZR_cjs.useContainerWidth; }
271
- });
272
- Object.defineProperty(exports, "useToast", {
273
- enumerable: true,
274
- get: function () { return chunk2BM42AZR_cjs.useToast; }
275
- });
276
- Object.defineProperty(exports, "utilColor", {
277
- enumerable: true,
278
- get: function () { return chunk2BM42AZR_cjs.utilColor; }
279
- });
280
- Object.defineProperty(exports, "AgnosticThemeToggle", {
281
- enumerable: true,
282
- get: function () { return chunkARV3P4CE_cjs.AgnosticThemeToggle; }
283
- });
284
- Object.defineProperty(exports, "ThemeToggle", {
285
- enumerable: true,
286
- get: function () { return chunkARV3P4CE_cjs.ThemeToggle; }
287
- });
288
- Object.defineProperty(exports, "ThemeToggleNext", {
289
- enumerable: true,
290
- get: function () { return chunkARV3P4CE_cjs.ThemeToggleNext; }
2073
+ get: function () { return chunkGWNNLYX4_cjs.renderMenuItems; }
291
2074
  });
292
2075
  Object.defineProperty(exports, "BackendStateCard", {
293
2076
  enumerable: true,
294
- get: function () { return chunkNBZDIMP3_cjs.BackendStateCard; }
295
- });
296
- Object.defineProperty(exports, "COMPOSE_MODES", {
297
- enumerable: true,
298
- get: function () { return chunkNBZDIMP3_cjs.COMPOSE_MODES; }
299
- });
300
- Object.defineProperty(exports, "CampaignCard", {
301
- enumerable: true,
302
- get: function () { return chunkNBZDIMP3_cjs.CampaignCard; }
303
- });
304
- Object.defineProperty(exports, "ChannelBadge", {
305
- enumerable: true,
306
- get: function () { return chunkNBZDIMP3_cjs.ChannelBadge; }
307
- });
308
- Object.defineProperty(exports, "DataTable", {
309
- enumerable: true,
310
- get: function () { return chunkNBZDIMP3_cjs.DataTable; }
2077
+ get: function () { return chunkWHJR5S4L_cjs.BackendStateCard; }
311
2078
  });
312
2079
  Object.defineProperty(exports, "EmptyState", {
313
2080
  enumerable: true,
314
- get: function () { return chunkNBZDIMP3_cjs.EmptyState; }
2081
+ get: function () { return chunkWHJR5S4L_cjs.EmptyState; }
315
2082
  });
316
2083
  Object.defineProperty(exports, "FieldRow", {
317
2084
  enumerable: true,
318
- get: function () { return chunkNBZDIMP3_cjs.FieldRow; }
2085
+ get: function () { return chunkWHJR5S4L_cjs.FieldRow; }
319
2086
  });
320
2087
  Object.defineProperty(exports, "FieldSelect", {
321
2088
  enumerable: true,
322
- get: function () { return chunkNBZDIMP3_cjs.FieldSelect; }
2089
+ get: function () { return chunkWHJR5S4L_cjs.FieldSelect; }
323
2090
  });
324
2091
  Object.defineProperty(exports, "FieldSlider", {
325
2092
  enumerable: true,
326
- get: function () { return chunkNBZDIMP3_cjs.FieldSlider; }
2093
+ get: function () { return chunkWHJR5S4L_cjs.FieldSlider; }
327
2094
  });
328
2095
  Object.defineProperty(exports, "FieldSwitch", {
329
2096
  enumerable: true,
330
- get: function () { return chunkNBZDIMP3_cjs.FieldSwitch; }
2097
+ get: function () { return chunkWHJR5S4L_cjs.FieldSwitch; }
331
2098
  });
332
2099
  Object.defineProperty(exports, "FieldText", {
333
2100
  enumerable: true,
334
- get: function () { return chunkNBZDIMP3_cjs.FieldText; }
2101
+ get: function () { return chunkWHJR5S4L_cjs.FieldText; }
335
2102
  });
336
2103
  Object.defineProperty(exports, "FieldTextArea", {
337
2104
  enumerable: true,
338
- get: function () { return chunkNBZDIMP3_cjs.FieldTextArea; }
2105
+ get: function () { return chunkWHJR5S4L_cjs.FieldTextArea; }
339
2106
  });
340
2107
  Object.defineProperty(exports, "HostProvider", {
341
2108
  enumerable: true,
342
- get: function () { return chunkNBZDIMP3_cjs.HostProvider; }
2109
+ get: function () { return chunkWHJR5S4L_cjs.HostProvider; }
343
2110
  });
344
2111
  Object.defineProperty(exports, "PageHeader", {
345
2112
  enumerable: true,
346
- get: function () { return chunkNBZDIMP3_cjs.PageHeader; }
347
- });
348
- Object.defineProperty(exports, "PostAgenda", {
349
- enumerable: true,
350
- get: function () { return chunkNBZDIMP3_cjs.PostAgenda; }
351
- });
352
- Object.defineProperty(exports, "PostCard", {
353
- enumerable: true,
354
- get: function () { return chunkNBZDIMP3_cjs.PostCard; }
355
- });
356
- Object.defineProperty(exports, "PostComposer", {
357
- enumerable: true,
358
- get: function () { return chunkNBZDIMP3_cjs.PostComposer; }
2113
+ get: function () { return chunkWHJR5S4L_cjs.PageHeader; }
359
2114
  });
360
2115
  Object.defineProperty(exports, "PrimaryButton", {
361
2116
  enumerable: true,
362
- get: function () { return chunkNBZDIMP3_cjs.PrimaryButton; }
363
- });
364
- Object.defineProperty(exports, "ProviderReadinessList", {
365
- enumerable: true,
366
- get: function () { return chunkNBZDIMP3_cjs.ProviderReadinessList; }
367
- });
368
- Object.defineProperty(exports, "SLIDEOVER_LG", {
369
- enumerable: true,
370
- get: function () { return chunkNBZDIMP3_cjs.LG; }
371
- });
372
- Object.defineProperty(exports, "SlideOver", {
373
- enumerable: true,
374
- get: function () { return chunkNBZDIMP3_cjs.SlideOver; }
375
- });
376
- Object.defineProperty(exports, "SocialResource", {
377
- enumerable: true,
378
- get: function () { return chunkNBZDIMP3_cjs.SocialResource; }
379
- });
380
- Object.defineProperty(exports, "SocialSummaryBar", {
381
- enumerable: true,
382
- get: function () { return chunkNBZDIMP3_cjs.SocialSummaryBar; }
383
- });
384
- Object.defineProperty(exports, "StatusTag", {
385
- enumerable: true,
386
- get: function () { return chunkNBZDIMP3_cjs.StatusTag; }
387
- });
388
- Object.defineProperty(exports, "ViewToggle", {
389
- enumerable: true,
390
- get: function () { return chunkNBZDIMP3_cjs.ViewToggle; }
2117
+ get: function () { return chunkWHJR5S4L_cjs.PrimaryButton; }
391
2118
  });
392
2119
  Object.defineProperty(exports, "accentFor", {
393
2120
  enumerable: true,
394
- get: function () { return chunkNBZDIMP3_cjs.accentFor; }
395
- });
396
- Object.defineProperty(exports, "asColor", {
397
- enumerable: true,
398
- get: function () { return chunkNBZDIMP3_cjs.asColor; }
2121
+ get: function () { return chunkWHJR5S4L_cjs.accentFor; }
399
2122
  });
400
2123
  Object.defineProperty(exports, "classifyBackend", {
401
2124
  enumerable: true,
402
- get: function () { return chunkNBZDIMP3_cjs.classifyBackend; }
2125
+ get: function () { return chunkWHJR5S4L_cjs.classifyBackend; }
403
2126
  });
404
2127
  Object.defineProperty(exports, "classifyRead", {
405
2128
  enumerable: true,
406
- get: function () { return chunkNBZDIMP3_cjs.classifyRead; }
2129
+ get: function () { return chunkWHJR5S4L_cjs.classifyRead; }
407
2130
  });
408
2131
  Object.defineProperty(exports, "contrastText", {
409
2132
  enumerable: true,
410
- get: function () { return chunkNBZDIMP3_cjs.contrastText; }
411
- });
412
- Object.defineProperty(exports, "formatPostTime", {
413
- enumerable: true,
414
- get: function () { return chunkNBZDIMP3_cjs.formatPostTime; }
2133
+ get: function () { return chunkWHJR5S4L_cjs.contrastText; }
415
2134
  });
416
2135
  Object.defineProperty(exports, "isHexColor", {
417
2136
  enumerable: true,
418
- get: function () { return chunkNBZDIMP3_cjs.isHexColor; }
419
- });
420
- Object.defineProperty(exports, "parsePostTime", {
421
- enumerable: true,
422
- get: function () { return chunkNBZDIMP3_cjs.parsePostTime; }
423
- });
424
- Object.defineProperty(exports, "postDayBucket", {
425
- enumerable: true,
426
- get: function () { return chunkNBZDIMP3_cjs.postDayBucket; }
427
- });
428
- Object.defineProperty(exports, "postPreview", {
429
- enumerable: true,
430
- get: function () { return chunkNBZDIMP3_cjs.postPreview; }
2137
+ get: function () { return chunkWHJR5S4L_cjs.isHexColor; }
431
2138
  });
432
2139
  Object.defineProperty(exports, "resolveAccent", {
433
2140
  enumerable: true,
434
- get: function () { return chunkNBZDIMP3_cjs.resolveAccent; }
2141
+ get: function () { return chunkWHJR5S4L_cjs.resolveAccent; }
435
2142
  });
436
2143
  Object.defineProperty(exports, "setOrgAccent", {
437
2144
  enumerable: true,
438
- get: function () { return chunkNBZDIMP3_cjs.setOrgAccent; }
2145
+ get: function () { return chunkWHJR5S4L_cjs.setOrgAccent; }
439
2146
  });
440
2147
  Object.defineProperty(exports, "useAccent", {
441
2148
  enumerable: true,
442
- get: function () { return chunkNBZDIMP3_cjs.useAccent; }
2149
+ get: function () { return chunkWHJR5S4L_cjs.useAccent; }
443
2150
  });
444
2151
  Object.defineProperty(exports, "useHost", {
445
2152
  enumerable: true,
446
- get: function () { return chunkNBZDIMP3_cjs.useHost; }
2153
+ get: function () { return chunkWHJR5S4L_cjs.useHost; }
447
2154
  });
448
2155
  Object.defineProperty(exports, "InstrumentSurface", {
449
2156
  enumerable: true,
@@ -469,49 +2176,66 @@ Object.defineProperty(exports, "useSurface", {
469
2176
  enumerable: true,
470
2177
  get: function () { return chunk7XDEUEWI_cjs.useSurface; }
471
2178
  });
472
- Object.defineProperty(exports, "ACCOUNT_STATUSES", {
473
- enumerable: true,
474
- get: function () { return chunkMWBFAV3D_cjs.ACCOUNT_STATUSES; }
475
- });
476
- Object.defineProperty(exports, "POST_STATUSES", {
477
- enumerable: true,
478
- get: function () { return chunkMWBFAV3D_cjs.POST_STATUSES; }
479
- });
480
- Object.defineProperty(exports, "PROVIDERS", {
481
- enumerable: true,
482
- get: function () { return chunkMWBFAV3D_cjs.PROVIDERS; }
483
- });
484
- Object.defineProperty(exports, "createSocialApi", {
485
- enumerable: true,
486
- get: function () { return chunkMWBFAV3D_cjs.createSocialApi; }
487
- });
488
- Object.defineProperty(exports, "normalizeAccount", {
489
- enumerable: true,
490
- get: function () { return chunkMWBFAV3D_cjs.normalizeAccount; }
491
- });
492
- Object.defineProperty(exports, "normalizeAccounts", {
493
- enumerable: true,
494
- get: function () { return chunkMWBFAV3D_cjs.normalizeAccounts; }
495
- });
496
- Object.defineProperty(exports, "normalizePost", {
497
- enumerable: true,
498
- get: function () { return chunkMWBFAV3D_cjs.normalizePost; }
499
- });
500
- Object.defineProperty(exports, "normalizePosts", {
501
- enumerable: true,
502
- get: function () { return chunkMWBFAV3D_cjs.normalizePosts; }
503
- });
504
- Object.defineProperty(exports, "normalizeProviderCapability", {
505
- enumerable: true,
506
- get: function () { return chunkMWBFAV3D_cjs.normalizeProviderCapability; }
507
- });
508
- Object.defineProperty(exports, "normalizeProviders", {
509
- enumerable: true,
510
- get: function () { return chunkMWBFAV3D_cjs.normalizeProviders; }
511
- });
512
- Object.defineProperty(exports, "normalizeSummary", {
2179
+ Object.defineProperty(exports, "CustomModelMark", {
513
2180
  enumerable: true,
514
- get: function () { return chunkMWBFAV3D_cjs.normalizeSummary; }
515
- });
2181
+ get: function () { return lucideIcons2.Boxes; }
2182
+ });
2183
+ exports.AnimatedLogo = AnimatedLogo;
2184
+ exports.AppHeader = AppHeader;
2185
+ exports.BRANDS = BRANDS;
2186
+ exports.BarChart = BarChart;
2187
+ exports.BarRows = BarRows;
2188
+ exports.BrandMark = BrandMark;
2189
+ exports.CHART_OTHER = CHART_OTHER;
2190
+ exports.CHART_PALETTE = CHART_PALETTE;
2191
+ exports.ComboBox = ComboBox;
2192
+ exports.CommerceResource = CommerceResource;
2193
+ exports.ConfirmDelete = ConfirmDelete;
2194
+ exports.ContextMenu = ContextMenu;
2195
+ exports.Donut = Donut;
2196
+ exports.DonutRing = Donut2;
2197
+ exports.FadeIn = FadeIn;
2198
+ exports.GenericLogo = GenericLogo;
2199
+ exports.HANZO = HANZO;
2200
+ exports.HANZO_MARK_CONTENT = HANZO_MARK_CONTENT;
2201
+ exports.HanzoMark = HanzoMark;
2202
+ exports.HintButton = HintButton;
2203
+ exports.LUX = LUX;
2204
+ exports.LegendDot = LegendDot;
2205
+ exports.LineChart = LineChart;
2206
+ exports.MetricCard = MetricCard;
2207
+ exports.MetricSparkline = Sparkline2;
2208
+ exports.MiniBars = MiniBars;
2209
+ exports.OrgMark = OrgMark;
2210
+ exports.OrgSwitcher = OrgSwitcher;
2211
+ exports.PARS = PARS;
2212
+ exports.Panel = Panel;
2213
+ exports.ProductIcon = ProductIcon;
2214
+ exports.ProviderLogo = ProviderLogo;
2215
+ exports.Reorder = Reorder;
2216
+ exports.SERIES = SERIES;
2217
+ exports.SURFACES = SURFACES;
2218
+ exports.SearchInput = SearchInput;
2219
+ exports.Segmented = Segmented;
2220
+ exports.SiteFooter = SiteFooter;
2221
+ exports.SiteNav = SiteNav;
2222
+ exports.Sparkline = Sparkline;
2223
+ exports.ToastProvider = ToastProvider;
2224
+ exports.UtilBar = UtilBar;
2225
+ exports.ZOO = ZOO;
2226
+ exports.colorForIndex = colorForIndex;
2227
+ exports.filterOptions = filterOptions;
2228
+ exports.filterOrgs = filterOrgs;
2229
+ exports.isKnownOption = isKnownOption;
2230
+ exports.monogram = monogram;
2231
+ exports.orgScope = orgScope;
2232
+ exports.otherSurfaces = otherSurfaces;
2233
+ exports.providerInitials = providerInitials;
2234
+ exports.resolveBrand = resolveBrand;
2235
+ exports.rowShift = rowShift;
2236
+ exports.targetIndex = targetIndex;
2237
+ exports.useContainerWidth = useContainerWidth;
2238
+ exports.useToast = useToast;
2239
+ exports.utilColor = utilColor;
516
2240
  //# sourceMappingURL=index.cjs.map
517
2241
  //# sourceMappingURL=index.cjs.map