@xenide-io/the-old-ui-theme 0.9.18 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Chip-BzuNgJIa.d.mts → Chip-Dw2g2t8D.d.mts} +18 -4
- package/dist/{Chip-BzuNgJIa.d.ts → Chip-Dw2g2t8D.d.ts} +18 -4
- package/dist/{chunk-6SVJAU5K.mjs → chunk-RIPGN6FG.mjs} +1333 -526
- package/dist/index.d.mts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +490 -119
- package/dist/index.mjs +11 -3
- package/dist/suite-analytics--Mf1RZbw.d.mts +29 -0
- package/dist/suite-analytics--Mf1RZbw.d.ts +29 -0
- package/dist/suite.d.mts +36 -4
- package/dist/suite.d.ts +36 -4
- package/dist/suite.js +4617 -4001
- package/dist/suite.mjs +1456 -868
- package/dist/tailwind-preset.js +10 -1
- package/dist/tailwind-preset.mjs +10 -1
- package/dist/ui.d.mts +33 -4
- package/dist/ui.d.ts +33 -4
- package/dist/ui.js +1364 -571
- package/dist/ui.mjs +15 -1
- package/docs/macos-identity-audit.md +279 -0
- package/package.json +1 -1
- package/src/app/globals.css +390 -44
- package/src/components/ui/Accordion.tsx +4 -7
- package/src/components/ui/Avatar.tsx +5 -5
- package/src/components/ui/BrandSpinner.tsx +256 -0
- package/src/components/ui/Calendar.tsx +7 -7
- package/src/components/ui/CodeBlock.tsx +14 -11
- package/src/components/ui/CollapsibleSection.tsx +4 -4
- package/src/components/ui/CommandPalette.tsx +7 -10
- package/src/components/ui/EmptyState.tsx +2 -2
- package/src/components/ui/Input.tsx +1 -1
- package/src/components/ui/Marketing.tsx +144 -0
- package/src/components/ui/MarketingIllustrations.tsx +287 -0
- package/src/components/ui/Panel.tsx +1 -1
- package/src/components/ui/SegmentedControl.tsx +59 -13
- package/src/components/ui/SettingsLayout.tsx +4 -0
- package/src/components/ui/ShowcaseWrapper.tsx +3 -3
- package/src/components/ui/Table.tsx +45 -10
- package/src/components/ui/Typography.tsx +4 -4
- package/src/components/ui/avatar-stat.test.tsx +14 -1
- package/src/components/ui/brand-spinner.test.tsx +62 -0
- package/src/components/ui/index.ts +19 -11
- package/src/components/ui/interaction-primitives.test.tsx +12 -6
- package/src/components/ui/marketing.test.tsx +39 -0
- package/src/components/ui/table.test.tsx +47 -0
- package/src/styles/suite-skin.css +471 -74
- package/src/styles/themes.css +45 -45
- package/src/styles/typography.css +25 -1
- package/src/suite/components/ai-draft-editor.tsx +184 -0
- package/src/suite/components/ai-panel-workflows.test.tsx +179 -0
- package/src/suite/components/ai-panel.tsx +201 -31
- package/src/suite/components/app-switcher.tsx +22 -9
- package/src/suite/components/command-palette-host.tsx +20 -2
- package/src/suite/components/suite-app-layout.tsx +7 -4
- package/src/suite/components/suite-bottom-nav.tsx +1 -1
- package/src/suite/components/suite-clients-projects-directory.tsx +6 -6
- package/src/suite/components/suite-integration-picker.tsx +7 -7
- package/src/suite/components/suite-integration-rules.tsx +5 -5
- package/src/suite/components/suite-layout.test.tsx +32 -3
- package/src/suite/components/suite-layout.tsx +4 -4
- package/src/suite/components/suite-mobile-drawer.tsx +2 -2
- package/src/suite/components/suite-mobile-header.tsx +1 -1
- package/src/suite/components/suite-notification-bell.tsx +27 -6
- package/src/suite/components/suite-notification-settings.tsx +182 -0
- package/src/suite/components/suite-palette-library.test.tsx +46 -0
- package/src/suite/components/suite-palette-library.tsx +82 -15
- package/src/suite/components/suite-settings-layout.tsx +2 -2
- package/src/suite/components/suite-settings-mobile-nav.tsx +10 -10
- package/src/suite/components/suite-sidebar.test.tsx +39 -0
- package/src/suite/components/suite-sidebar.tsx +41 -19
- package/src/suite/components/suite-skeleton.tsx +6 -6
- package/src/suite/components/suite-user-menu.tsx +2 -2
- package/src/suite/components/theme-provider.tsx +2 -0
- package/src/suite/components/today-calibrating.tsx +3 -3
- package/src/suite/components/today-ui.tsx +42 -37
- package/src/suite/components/workspace-switcher.tsx +3 -3
- package/src/suite/index.ts +14 -0
- package/src/suite/lib/suite-notifications.tsx +5 -0
- package/tailwind-preset.ts +9 -0
package/dist/ui.js
CHANGED
|
@@ -61,6 +61,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
61
61
|
var ui_exports = {};
|
|
62
62
|
__export(ui_exports, {
|
|
63
63
|
Accordion: () => Accordion,
|
|
64
|
+
AiWritingIllustration: () => AiWritingIllustration,
|
|
64
65
|
Alert: () => Alert,
|
|
65
66
|
AuthCard: () => AuthCard,
|
|
66
67
|
AuthDivider: () => AuthDivider,
|
|
@@ -69,6 +70,7 @@ __export(ui_exports, {
|
|
|
69
70
|
AvatarGroup: () => AvatarGroup,
|
|
70
71
|
Badge: () => Badge,
|
|
71
72
|
BarChart: () => BarChart,
|
|
73
|
+
BrandSpinner: () => BrandSpinner,
|
|
72
74
|
Button: () => Button,
|
|
73
75
|
ButtonChrome: () => ButtonChrome,
|
|
74
76
|
Calendar: () => Calendar,
|
|
@@ -103,12 +105,17 @@ __export(ui_exports, {
|
|
|
103
105
|
Icon: () => IconBase,
|
|
104
106
|
IconByName: () => IconByName,
|
|
105
107
|
Input: () => Input,
|
|
108
|
+
IntegrationBridgeIllustration: () => IntegrationBridgeIllustration,
|
|
106
109
|
Kbd: () => Kbd,
|
|
107
110
|
Label: () => Label,
|
|
108
111
|
Lead: () => Lead,
|
|
109
112
|
Link: () => Link,
|
|
110
113
|
Loader: () => Loader,
|
|
111
114
|
LoadingState: () => LoadingState,
|
|
115
|
+
MarketingHeader: () => MarketingHeader,
|
|
116
|
+
MarketingLink: () => MarketingLink,
|
|
117
|
+
MarketingMotionControl: () => MarketingMotionControl,
|
|
118
|
+
MarketingReveal: () => MarketingReveal,
|
|
112
119
|
Modal: () => Modal,
|
|
113
120
|
Mono: () => Mono,
|
|
114
121
|
Overline: () => Overline,
|
|
@@ -252,13 +259,441 @@ var Button = (0, import_react.forwardRef)(function Button2(_a, ref) {
|
|
|
252
259
|
});
|
|
253
260
|
Button.displayName = "Button";
|
|
254
261
|
|
|
262
|
+
// src/components/ui/Marketing.tsx
|
|
263
|
+
var import_react2 = require("react");
|
|
264
|
+
var import_iconoir_react = require("iconoir-react");
|
|
265
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
266
|
+
function MarketingHeader(_a) {
|
|
267
|
+
var _b = _a, {
|
|
268
|
+
brand,
|
|
269
|
+
navigation,
|
|
270
|
+
actions,
|
|
271
|
+
className
|
|
272
|
+
} = _b, props = __objRest(_b, [
|
|
273
|
+
"brand",
|
|
274
|
+
"navigation",
|
|
275
|
+
"actions",
|
|
276
|
+
"className"
|
|
277
|
+
]);
|
|
278
|
+
const [scrolled, setScrolled] = (0, import_react2.useState)(false);
|
|
279
|
+
(0, import_react2.useEffect)(() => {
|
|
280
|
+
const onScroll = () => setScrolled(window.scrollY > 4);
|
|
281
|
+
onScroll();
|
|
282
|
+
window.addEventListener("scroll", onScroll, { passive: true });
|
|
283
|
+
return () => window.removeEventListener("scroll", onScroll);
|
|
284
|
+
}, []);
|
|
285
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
286
|
+
"header",
|
|
287
|
+
__spreadProps(__spreadValues({}, props), {
|
|
288
|
+
"data-scrolled": scrolled ? "true" : "false",
|
|
289
|
+
className: cn("marketing-header", className),
|
|
290
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "marketing-header__inner", children: [
|
|
291
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "marketing-header__brand", children: brand }),
|
|
292
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
293
|
+
"nav",
|
|
294
|
+
{
|
|
295
|
+
className: "marketing-header__navigation",
|
|
296
|
+
"aria-label": "Product navigation",
|
|
297
|
+
children: navigation
|
|
298
|
+
}
|
|
299
|
+
),
|
|
300
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "marketing-header__actions", children: actions })
|
|
301
|
+
] })
|
|
302
|
+
})
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
function MarketingLink(_a) {
|
|
306
|
+
var _b = _a, {
|
|
307
|
+
variant = "secondary",
|
|
308
|
+
icon,
|
|
309
|
+
sideIcon,
|
|
310
|
+
children,
|
|
311
|
+
className
|
|
312
|
+
} = _b, props = __objRest(_b, [
|
|
313
|
+
"variant",
|
|
314
|
+
"icon",
|
|
315
|
+
"sideIcon",
|
|
316
|
+
"children",
|
|
317
|
+
"className"
|
|
318
|
+
]);
|
|
319
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
320
|
+
"a",
|
|
321
|
+
__spreadProps(__spreadValues({}, props), {
|
|
322
|
+
className: cn(
|
|
323
|
+
"ph-btn ph-btn-raised marketing-button",
|
|
324
|
+
`ph-btn-${variant}`,
|
|
325
|
+
className
|
|
326
|
+
),
|
|
327
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ButtonChrome, { label: children, icon, sideIcon })
|
|
328
|
+
})
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
function MarketingMotionControl() {
|
|
332
|
+
const [paused, setPaused] = (0, import_react2.useState)(false);
|
|
333
|
+
(0, import_react2.useEffect)(() => {
|
|
334
|
+
document.documentElement.toggleAttribute("data-marketing-paused", paused);
|
|
335
|
+
return () => document.documentElement.removeAttribute("data-marketing-paused");
|
|
336
|
+
}, [paused]);
|
|
337
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
338
|
+
"button",
|
|
339
|
+
{
|
|
340
|
+
type: "button",
|
|
341
|
+
className: "marketing-motion-control",
|
|
342
|
+
onClick: () => setPaused((value) => !value),
|
|
343
|
+
"aria-pressed": paused,
|
|
344
|
+
"aria-label": paused ? "Play landing animations" : "Pause landing animations",
|
|
345
|
+
children: [
|
|
346
|
+
paused ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_iconoir_react.Play, { className: "h-4 w-4", "aria-hidden": true }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_iconoir_react.Pause, { className: "h-4 w-4", "aria-hidden": true }),
|
|
347
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: paused ? "Play motion" : "Pause motion" })
|
|
348
|
+
]
|
|
349
|
+
}
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
function MarketingReveal(_a) {
|
|
353
|
+
var _b = _a, {
|
|
354
|
+
children,
|
|
355
|
+
className
|
|
356
|
+
} = _b, props = __objRest(_b, [
|
|
357
|
+
"children",
|
|
358
|
+
"className"
|
|
359
|
+
]);
|
|
360
|
+
const ref = (0, import_react2.useRef)(null);
|
|
361
|
+
(0, import_react2.useEffect)(() => {
|
|
362
|
+
const element = ref.current;
|
|
363
|
+
if (!element || !window.IntersectionObserver || window.matchMedia("(prefers-reduced-motion: reduce)").matches)
|
|
364
|
+
return;
|
|
365
|
+
const observer = new IntersectionObserver(
|
|
366
|
+
([entry]) => {
|
|
367
|
+
if (!entry.isIntersecting) return;
|
|
368
|
+
element.classList.add("marketing-reveal--entered");
|
|
369
|
+
observer.disconnect();
|
|
370
|
+
},
|
|
371
|
+
{ threshold: 0.1 }
|
|
372
|
+
);
|
|
373
|
+
observer.observe(element);
|
|
374
|
+
return () => observer.disconnect();
|
|
375
|
+
}, []);
|
|
376
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", __spreadProps(__spreadValues({}, props), { ref, className: cn("marketing-reveal", className), children }));
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// src/components/ui/MarketingIllustrations.tsx
|
|
380
|
+
var import_react3 = require("react");
|
|
381
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
382
|
+
function AiWritingIllustration({
|
|
383
|
+
title,
|
|
384
|
+
prompt,
|
|
385
|
+
before,
|
|
386
|
+
after
|
|
387
|
+
}) {
|
|
388
|
+
const id = (0, import_react3.useId)().replaceAll(":", "");
|
|
389
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
390
|
+
"svg",
|
|
391
|
+
{
|
|
392
|
+
viewBox: "0 0 560 370",
|
|
393
|
+
className: "h-auto w-full",
|
|
394
|
+
role: "img",
|
|
395
|
+
"aria-label": `${title}: use /ai and Shelly AI to draft and polish writing`,
|
|
396
|
+
"data-marketing-art": true,
|
|
397
|
+
children: [
|
|
398
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("defs", { children: [
|
|
399
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("radialGradient", { id: `${id}-glow`, children: [
|
|
400
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("stop", { stopColor: "var(--ph-accent)", stopOpacity: ".2" }),
|
|
401
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("stop", { offset: "1", stopColor: "var(--ph-accent)", stopOpacity: "0" })
|
|
402
|
+
] }),
|
|
403
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("linearGradient", { id: `${id}-paper`, x2: "1", y2: "1", children: [
|
|
404
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("stop", { stopColor: "var(--ph-surface)" }),
|
|
405
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("stop", { offset: "1", stopColor: "var(--ph-muted)" })
|
|
406
|
+
] })
|
|
407
|
+
] }),
|
|
408
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ellipse", { cx: "280", cy: "198", rx: "260", ry: "168", fill: `url(#${id}-glow)` }),
|
|
409
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("g", { className: "marketing-svg-float", children: [
|
|
410
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
411
|
+
"rect",
|
|
412
|
+
{
|
|
413
|
+
x: "18",
|
|
414
|
+
y: "28",
|
|
415
|
+
width: "524",
|
|
416
|
+
height: "300",
|
|
417
|
+
rx: "20",
|
|
418
|
+
fill: `url(#${id}-paper)`,
|
|
419
|
+
stroke: "var(--ph-border)"
|
|
420
|
+
}
|
|
421
|
+
),
|
|
422
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M18 76h524", stroke: "var(--ph-border)" }),
|
|
423
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("image", { href: "/shelly-icon.svg", x: "36", y: "40", width: "24", height: "24" }),
|
|
424
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
425
|
+
"text",
|
|
426
|
+
{
|
|
427
|
+
x: "70",
|
|
428
|
+
y: "57",
|
|
429
|
+
fontSize: "16",
|
|
430
|
+
fontWeight: "700",
|
|
431
|
+
fill: "var(--ph-text-primary)",
|
|
432
|
+
children: title
|
|
433
|
+
}
|
|
434
|
+
),
|
|
435
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("text", { x: "434", y: "57", fontSize: "12", fill: "var(--ph-text-secondary)", children: "Shelly AI" }),
|
|
436
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
437
|
+
"rect",
|
|
438
|
+
{
|
|
439
|
+
x: "38",
|
|
440
|
+
y: "94",
|
|
441
|
+
width: "484",
|
|
442
|
+
height: "42",
|
|
443
|
+
rx: "10",
|
|
444
|
+
fill: "var(--ph-canvas)",
|
|
445
|
+
stroke: "var(--ph-selected-border)"
|
|
446
|
+
}
|
|
447
|
+
),
|
|
448
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("text", { x: "54", y: "121", fontSize: "16", fill: "var(--ph-text-primary)", children: prompt }),
|
|
449
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("g", { className: "marketing-svg-draft", children: [
|
|
450
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
451
|
+
"text",
|
|
452
|
+
{
|
|
453
|
+
x: "46",
|
|
454
|
+
y: "171",
|
|
455
|
+
fontSize: "12",
|
|
456
|
+
fontWeight: "700",
|
|
457
|
+
fill: "var(--ph-text-secondary)",
|
|
458
|
+
children: "YOUR DRAFT"
|
|
459
|
+
}
|
|
460
|
+
),
|
|
461
|
+
before.map((line, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
462
|
+
"text",
|
|
463
|
+
{
|
|
464
|
+
x: "46",
|
|
465
|
+
y: 205 + index * 26,
|
|
466
|
+
fontSize: "16",
|
|
467
|
+
fill: "var(--ph-text-secondary)",
|
|
468
|
+
children: line
|
|
469
|
+
},
|
|
470
|
+
index
|
|
471
|
+
))
|
|
472
|
+
] }),
|
|
473
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
474
|
+
"path",
|
|
475
|
+
{
|
|
476
|
+
className: "marketing-svg-thread",
|
|
477
|
+
d: "M265 175v102",
|
|
478
|
+
stroke: "var(--ph-accent)",
|
|
479
|
+
strokeWidth: "2",
|
|
480
|
+
strokeDasharray: "4 7"
|
|
481
|
+
}
|
|
482
|
+
),
|
|
483
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("g", { className: "marketing-svg-polished", children: [
|
|
484
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
485
|
+
"text",
|
|
486
|
+
{
|
|
487
|
+
x: "294",
|
|
488
|
+
y: "171",
|
|
489
|
+
fontSize: "12",
|
|
490
|
+
fontWeight: "700",
|
|
491
|
+
fill: "var(--ph-accent)",
|
|
492
|
+
children: "POLISHED WITH SHELLY"
|
|
493
|
+
}
|
|
494
|
+
),
|
|
495
|
+
after.map((line, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
496
|
+
"text",
|
|
497
|
+
{
|
|
498
|
+
x: "294",
|
|
499
|
+
y: 205 + index * 26,
|
|
500
|
+
fontSize: "16",
|
|
501
|
+
fill: "var(--ph-text-primary)",
|
|
502
|
+
children: line
|
|
503
|
+
},
|
|
504
|
+
index
|
|
505
|
+
)),
|
|
506
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
507
|
+
"path",
|
|
508
|
+
{
|
|
509
|
+
d: "m302 294 5 5 10-11",
|
|
510
|
+
fill: "none",
|
|
511
|
+
stroke: "var(--ph-success)",
|
|
512
|
+
strokeWidth: "3",
|
|
513
|
+
strokeLinecap: "round"
|
|
514
|
+
}
|
|
515
|
+
),
|
|
516
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("text", { x: "328", y: "300", fontSize: "12", fill: "var(--ph-text-secondary)", children: "Ready to keep working" })
|
|
517
|
+
] })
|
|
518
|
+
] }),
|
|
519
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("g", { className: "marketing-svg-spark", fill: "var(--ph-accent)", children: [
|
|
520
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m520 12 3 10 10 3-10 3-3 10-3-10-10-3 10-3z" }),
|
|
521
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m25 310 2 7 7 2-7 2-2 7-2-7-7-2 7-2z" })
|
|
522
|
+
] })
|
|
523
|
+
]
|
|
524
|
+
}
|
|
525
|
+
);
|
|
526
|
+
}
|
|
527
|
+
function IntegrationBridgeIllustration({
|
|
528
|
+
appName,
|
|
529
|
+
appIcon,
|
|
530
|
+
recordLabel,
|
|
531
|
+
calendar = false
|
|
532
|
+
}) {
|
|
533
|
+
const id = (0, import_react3.useId)().replaceAll(":", "");
|
|
534
|
+
const rows = calendar ? ["Client catch-up", "10:00 \u2013 11:00", "Meeting notes"] : ["Client", "Project", recordLabel];
|
|
535
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
536
|
+
"svg",
|
|
537
|
+
{
|
|
538
|
+
viewBox: "0 0 600 350",
|
|
539
|
+
className: "h-auto w-full",
|
|
540
|
+
role: "img",
|
|
541
|
+
"aria-label": calendar ? "Choose a calendar event to prefill a TurtleTime entry" : `Shelly Bridge matches connected records with ${appName}`,
|
|
542
|
+
"data-marketing-art": true,
|
|
543
|
+
children: [
|
|
544
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("radialGradient", { id: `${id}-bridge`, children: [
|
|
545
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("stop", { stopColor: "var(--ph-blue)", stopOpacity: ".17" }),
|
|
546
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("stop", { offset: "1", stopColor: "var(--ph-blue)", stopOpacity: "0" })
|
|
547
|
+
] }) }),
|
|
548
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
549
|
+
"ellipse",
|
|
550
|
+
{
|
|
551
|
+
cx: "300",
|
|
552
|
+
cy: "185",
|
|
553
|
+
rx: "280",
|
|
554
|
+
ry: "160",
|
|
555
|
+
fill: `url(#${id}-bridge)`
|
|
556
|
+
}
|
|
557
|
+
),
|
|
558
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("g", { className: "marketing-svg-float", children: [
|
|
559
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
560
|
+
"rect",
|
|
561
|
+
{
|
|
562
|
+
x: "18",
|
|
563
|
+
y: "55",
|
|
564
|
+
width: "230",
|
|
565
|
+
height: "240",
|
|
566
|
+
rx: "18",
|
|
567
|
+
fill: "var(--ph-surface)",
|
|
568
|
+
stroke: "var(--ph-border)"
|
|
569
|
+
}
|
|
570
|
+
),
|
|
571
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
572
|
+
"rect",
|
|
573
|
+
{
|
|
574
|
+
x: "352",
|
|
575
|
+
y: "55",
|
|
576
|
+
width: "230",
|
|
577
|
+
height: "240",
|
|
578
|
+
rx: "18",
|
|
579
|
+
fill: "var(--ph-surface)",
|
|
580
|
+
stroke: "var(--ph-border)"
|
|
581
|
+
}
|
|
582
|
+
),
|
|
583
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
584
|
+
"text",
|
|
585
|
+
{
|
|
586
|
+
x: "38",
|
|
587
|
+
y: "92",
|
|
588
|
+
fontSize: "17",
|
|
589
|
+
fontWeight: "700",
|
|
590
|
+
fill: "var(--ph-text-primary)",
|
|
591
|
+
children: calendar ? "Calendar events" : "Connected tools"
|
|
592
|
+
}
|
|
593
|
+
),
|
|
594
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("image", { href: appIcon, x: "370", y: "72", width: "28", height: "28" }),
|
|
595
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
596
|
+
"text",
|
|
597
|
+
{
|
|
598
|
+
x: "410",
|
|
599
|
+
y: "93",
|
|
600
|
+
fontSize: "17",
|
|
601
|
+
fontWeight: "700",
|
|
602
|
+
fill: "var(--ph-text-primary)",
|
|
603
|
+
children: appName
|
|
604
|
+
}
|
|
605
|
+
),
|
|
606
|
+
rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("g", { children: [
|
|
607
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
608
|
+
"rect",
|
|
609
|
+
{
|
|
610
|
+
x: "36",
|
|
611
|
+
y: 119 + index * 48,
|
|
612
|
+
width: "194",
|
|
613
|
+
height: "36",
|
|
614
|
+
rx: "8",
|
|
615
|
+
fill: "var(--ph-muted)"
|
|
616
|
+
}
|
|
617
|
+
),
|
|
618
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
619
|
+
"text",
|
|
620
|
+
{
|
|
621
|
+
x: "50",
|
|
622
|
+
y: 142 + index * 48,
|
|
623
|
+
fontSize: "14",
|
|
624
|
+
fill: "var(--ph-text-secondary)",
|
|
625
|
+
children: row
|
|
626
|
+
}
|
|
627
|
+
),
|
|
628
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
629
|
+
"rect",
|
|
630
|
+
{
|
|
631
|
+
x: "370",
|
|
632
|
+
y: 119 + index * 48,
|
|
633
|
+
width: "194",
|
|
634
|
+
height: "36",
|
|
635
|
+
rx: "8",
|
|
636
|
+
fill: "var(--ph-muted)"
|
|
637
|
+
}
|
|
638
|
+
),
|
|
639
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
640
|
+
"text",
|
|
641
|
+
{
|
|
642
|
+
x: "384",
|
|
643
|
+
y: 142 + index * 48,
|
|
644
|
+
fontSize: "14",
|
|
645
|
+
fill: "var(--ph-text-primary)",
|
|
646
|
+
children: calendar && index === 1 ? "1 hour, ready to review" : row
|
|
647
|
+
}
|
|
648
|
+
),
|
|
649
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
650
|
+
"path",
|
|
651
|
+
{
|
|
652
|
+
className: "marketing-svg-thread",
|
|
653
|
+
d: `M248 ${137 + index * 48}h104`,
|
|
654
|
+
stroke: "var(--ph-accent)",
|
|
655
|
+
strokeWidth: "2",
|
|
656
|
+
strokeDasharray: "5 8"
|
|
657
|
+
}
|
|
658
|
+
)
|
|
659
|
+
] }, row))
|
|
660
|
+
] }),
|
|
661
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("g", { className: "marketing-svg-polished", children: [
|
|
662
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
663
|
+
"circle",
|
|
664
|
+
{
|
|
665
|
+
cx: "300",
|
|
666
|
+
cy: "185",
|
|
667
|
+
r: "27",
|
|
668
|
+
fill: "var(--ph-canvas)",
|
|
669
|
+
stroke: "var(--ph-selected-border)"
|
|
670
|
+
}
|
|
671
|
+
),
|
|
672
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("image", { href: "/shelly-icon.svg", x: "280", y: "165", width: "40", height: "40" }),
|
|
673
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
674
|
+
"text",
|
|
675
|
+
{
|
|
676
|
+
x: "300",
|
|
677
|
+
y: "331",
|
|
678
|
+
textAnchor: "middle",
|
|
679
|
+
fontSize: "13",
|
|
680
|
+
fill: "var(--ph-text-secondary)",
|
|
681
|
+
children: calendar ? "Prefill details \xB7 review \xB7 save the entry" : "Shelly Bridge \xB7 match the records you want to connect"
|
|
682
|
+
}
|
|
683
|
+
)
|
|
684
|
+
] })
|
|
685
|
+
]
|
|
686
|
+
}
|
|
687
|
+
);
|
|
688
|
+
}
|
|
689
|
+
|
|
255
690
|
// src/components/ui/Alert.tsx
|
|
256
|
-
var
|
|
691
|
+
var import_react7 = require("react");
|
|
257
692
|
|
|
258
693
|
// src/components/icons/IconBase.tsx
|
|
259
|
-
var
|
|
260
|
-
var
|
|
261
|
-
var IconBase = (0,
|
|
694
|
+
var import_react4 = require("react");
|
|
695
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
696
|
+
var IconBase = (0, import_react4.forwardRef)(function IconBase2(_a, ref) {
|
|
262
697
|
var _b = _a, {
|
|
263
698
|
className,
|
|
264
699
|
size,
|
|
@@ -287,7 +722,7 @@ var IconBase = (0, import_react2.forwardRef)(function IconBase2(_a, ref) {
|
|
|
287
722
|
"aria-labelledby"
|
|
288
723
|
]);
|
|
289
724
|
const hasAccessibleName = Boolean(ariaLabel || ariaLabelledBy);
|
|
290
|
-
return /* @__PURE__ */ (0,
|
|
725
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
291
726
|
"svg",
|
|
292
727
|
__spreadProps(__spreadValues({
|
|
293
728
|
ref,
|
|
@@ -309,11 +744,11 @@ var IconBase = (0, import_react2.forwardRef)(function IconBase2(_a, ref) {
|
|
|
309
744
|
IconBase.displayName = "IconBase";
|
|
310
745
|
|
|
311
746
|
// src/components/icons/createIconBase.tsx
|
|
312
|
-
var
|
|
313
|
-
var
|
|
747
|
+
var import_react5 = require("react");
|
|
748
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
314
749
|
function createIconBase({ name = "IconGlyph", viewBox = "0 0 24 24", paths }) {
|
|
315
|
-
const IconGlyph = (0,
|
|
316
|
-
return /* @__PURE__ */ (0,
|
|
750
|
+
const IconGlyph = (0, import_react5.forwardRef)(function IconGlyph2(props, ref) {
|
|
751
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(IconBase, __spreadProps(__spreadValues({ ref, viewBox }, props), { children: paths }));
|
|
317
752
|
});
|
|
318
753
|
IconGlyph.displayName = name;
|
|
319
754
|
return IconGlyph;
|
|
@@ -322,14 +757,14 @@ function createIconBasePath(d, viewBox = "0 0 24 24", name) {
|
|
|
322
757
|
return createIconBase({
|
|
323
758
|
name,
|
|
324
759
|
viewBox,
|
|
325
|
-
paths: /* @__PURE__ */ (0,
|
|
760
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { d, fill: "currentColor" })
|
|
326
761
|
});
|
|
327
762
|
}
|
|
328
763
|
|
|
329
764
|
// src/components/icons/icons.tsx
|
|
330
|
-
var
|
|
331
|
-
var
|
|
332
|
-
var fill = (d) => /* @__PURE__ */ (0,
|
|
765
|
+
var import_react6 = require("react");
|
|
766
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
767
|
+
var fill = (d) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d, fill: "currentColor" });
|
|
333
768
|
var IconAreaChart = createIconBase({
|
|
334
769
|
paths: fill("M3 20V7l4 3 5-7 5 4h4v13Zm5-3 4-5.5 7 5.45V9h-2.7l-3.9-3.125-4.95 6.95L5 11v3.6Z")
|
|
335
770
|
});
|
|
@@ -370,7 +805,7 @@ var IconFlare = createIconBase({
|
|
|
370
805
|
)
|
|
371
806
|
});
|
|
372
807
|
var IconSelectEvents = createIconBase({
|
|
373
|
-
paths: /* @__PURE__ */ (0,
|
|
808
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
|
|
374
809
|
fill("M17.5 9L16.56 6.94L14.5 6L16.56 5.06L17.5 3L18.44 5.06L20.5 6L18.44 6.94L17.5 9Z"),
|
|
375
810
|
fill("M6 12.5L6.94 14.56L9 15.5L6.94 16.44L6 18.5L5.06 16.44L3 15.5L5.06 14.56L6 12.5Z"),
|
|
376
811
|
fill("M6 9L5.06 6.94L3 6L5.06 5.06L6 3L6.94 5.06L9 6L6.94 6.94L6 9Z"),
|
|
@@ -428,9 +863,9 @@ var IconRobot = createIconBase({
|
|
|
428
863
|
)
|
|
429
864
|
});
|
|
430
865
|
var IconExclamation = createIconBase({
|
|
431
|
-
paths: /* @__PURE__ */ (0,
|
|
432
|
-
/* @__PURE__ */ (0,
|
|
433
|
-
/* @__PURE__ */ (0,
|
|
866
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("g", { fill: "currentColor", children: [
|
|
867
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "m12 21c1.1046 0 2-.8954 2-2s-.8954-2-2-2-2 .8954-2 2 .8954 2 2 2z" }),
|
|
868
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "m10 3h4v12h-4z" })
|
|
434
869
|
] })
|
|
435
870
|
});
|
|
436
871
|
var IconErrorOutline = createIconBase({
|
|
@@ -464,7 +899,7 @@ var IconChevronLeft = createIconBasePath("M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10
|
|
|
464
899
|
var IconChevronRight = createIconBasePath("M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z");
|
|
465
900
|
var IconChevronDown = createIconBasePath("M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z");
|
|
466
901
|
var IconSubArrowRight = createIconBase({
|
|
467
|
-
paths: /* @__PURE__ */ (0,
|
|
902
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("g", { transform: "translate(4 5.5)", children: fill("M2 0H0V10H12.01V13L16 9L12.01 5V8H2V0Z") })
|
|
468
903
|
});
|
|
469
904
|
var IconSearch = createIconBasePath(
|
|
470
905
|
"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"
|
|
@@ -543,7 +978,7 @@ var IconRocket = createIconBasePath(
|
|
|
543
978
|
);
|
|
544
979
|
var IconTerminal = createIconBase({
|
|
545
980
|
name: "IconTerminal",
|
|
546
|
-
paths: /* @__PURE__ */ (0,
|
|
981
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
547
982
|
"path",
|
|
548
983
|
{
|
|
549
984
|
d: "M3 4v16h18V4H3zm2 2h14v12H5V6zm2 2.2L10.8 12 7 15.8 8.4 17.2l5.2-5.2-5.2-5.2L7 8.2zM13 17h5v-2h-5v2z",
|
|
@@ -555,7 +990,7 @@ var IconTerminal = createIconBase({
|
|
|
555
990
|
});
|
|
556
991
|
var IconOldWindow = createIconBase({
|
|
557
992
|
name: "IconOldWindow",
|
|
558
|
-
paths: /* @__PURE__ */ (0,
|
|
993
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
559
994
|
"path",
|
|
560
995
|
{
|
|
561
996
|
d: "M3 3v18h18V3H3zm2 7v9h14v-9H5zm1-4h2v1H6V6zm3 0h2v1H9V6z",
|
|
@@ -567,7 +1002,7 @@ var IconOldWindow = createIconBase({
|
|
|
567
1002
|
});
|
|
568
1003
|
var IconCommandCursor = createIconBase({
|
|
569
1004
|
name: "IconCommandCursor",
|
|
570
|
-
paths: /* @__PURE__ */ (0,
|
|
1005
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
571
1006
|
"path",
|
|
572
1007
|
{
|
|
573
1008
|
d: "M4 3v18h16V3H4zm2 2h12v14H6V5zm1.5 3.5L11 12l-3.5 3.5L9 17l5-5-5-5-1.5 1.5zM13 17h4v-2h-4v2z",
|
|
@@ -579,7 +1014,7 @@ var IconCommandCursor = createIconBase({
|
|
|
579
1014
|
});
|
|
580
1015
|
var IconDataReel = createIconBase({
|
|
581
1016
|
name: "IconDataReel",
|
|
582
|
-
paths: /* @__PURE__ */ (0,
|
|
1017
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
583
1018
|
"path",
|
|
584
1019
|
{
|
|
585
1020
|
d: "M3 5v14h18V5H3zm2 2h14v10H5V7zm3 1a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm8 0a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM10 11h4v1.5h-4V11z",
|
|
@@ -591,7 +1026,7 @@ var IconDataReel = createIconBase({
|
|
|
591
1026
|
});
|
|
592
1027
|
var IconCodePreview = createIconBase({
|
|
593
1028
|
name: "IconCodePreview",
|
|
594
|
-
paths: /* @__PURE__ */ (0,
|
|
1029
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
595
1030
|
"path",
|
|
596
1031
|
{
|
|
597
1032
|
d: "M3 3v15h18V3H3zm2 2h14v11H5V5zm3.5 2L5 10.5 8.5 14l1.4-1.4-2.1-2.1 2.1-2.1L8.5 7zm7 0-1.4 1.4 2.1 2.1-2.1 2.1 1.4 1.4 3.5-3.5L15.5 7zM9 20h6v2H9v-2z",
|
|
@@ -603,7 +1038,7 @@ var IconCodePreview = createIconBase({
|
|
|
603
1038
|
});
|
|
604
1039
|
var IconInsightBoard = createIconBase({
|
|
605
1040
|
name: "IconInsightBoard",
|
|
606
|
-
paths: /* @__PURE__ */ (0,
|
|
1041
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
607
1042
|
"path",
|
|
608
1043
|
{
|
|
609
1044
|
d: "M3 3v18h18V3H3zm2 2h14v3H5V5zm0 5h6v9H5v-9zm8 0h6v4h-6v-4zm0 6h6v3h-6v-3zM6 6h2v1H6V6zm3 0h2v1H9V6z",
|
|
@@ -615,14 +1050,14 @@ var IconInsightBoard = createIconBase({
|
|
|
615
1050
|
});
|
|
616
1051
|
var IconEventStream = createIconBase({
|
|
617
1052
|
name: "IconEventStream",
|
|
618
|
-
paths: /* @__PURE__ */ (0,
|
|
619
|
-
/* @__PURE__ */ (0,
|
|
1053
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
|
|
1054
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M5 4h2v16H5V4z", fill: "currentColor", opacity: "0.45" }),
|
|
620
1055
|
fill("M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 8a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm5-6h10v2H11V5zm0 8h7v2h-7v-2zm0 5h10v2H11v-2z")
|
|
621
1056
|
] })
|
|
622
1057
|
});
|
|
623
1058
|
var IconFeatureGate = createIconBase({
|
|
624
1059
|
name: "IconFeatureGate",
|
|
625
|
-
paths: /* @__PURE__ */ (0,
|
|
1060
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
626
1061
|
"path",
|
|
627
1062
|
{
|
|
628
1063
|
d: "M4 3h2v18H4V3zm3 2h12l-3 4 3 4H7V5zm4 1-2.2 4H12l-1 4 4.2-5H12l1-3h-2z",
|
|
@@ -634,7 +1069,7 @@ var IconFeatureGate = createIconBase({
|
|
|
634
1069
|
});
|
|
635
1070
|
var IconReplayFrame = createIconBase({
|
|
636
1071
|
name: "IconReplayFrame",
|
|
637
|
-
paths: /* @__PURE__ */ (0,
|
|
1072
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
638
1073
|
"path",
|
|
639
1074
|
{
|
|
640
1075
|
d: "M3 3v18h18V3H3zm2 2h14v11H5V5zm5 2v7l6-3.5L10 7zm-5 11h9v1H5v-1zm11 0h3v1h-3v-1z",
|
|
@@ -658,7 +1093,7 @@ var IconExperimentSplit = createIconBase({
|
|
|
658
1093
|
});
|
|
659
1094
|
var IconSurveyCard = createIconBase({
|
|
660
1095
|
name: "IconSurveyCard",
|
|
661
|
-
paths: /* @__PURE__ */ (0,
|
|
1096
|
+
paths: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
662
1097
|
"path",
|
|
663
1098
|
{
|
|
664
1099
|
d: "M3 3v18h18V3H3zm2 2h14v14H5V5zm2 2h7v2H7V7zm0 4h4v2H7v-2zm7-.4-2.5 2.5-1-1-1.4 1.4 2.4 2.4 3.9-3.9-1.4-1.4zM7 16h10v1H7v-1z",
|
|
@@ -674,9 +1109,9 @@ var IconActivity = createIconBasePath(
|
|
|
674
1109
|
var IconFlask = createIconBasePath(
|
|
675
1110
|
"M19.8 18.4L14 10.67V6.5l1.35-1.35c.39-.39.39-1.02 0-1.41L14.65 2.7a.9959.9959 0 0 0-1.41 0L9.35 6.54c-.39.39-.39 1.02 0 1.41L10.7 9.3v4.17L4.2 18.4C3.53 19.07 4.04 20.25 5 20.25h14c.96 0 1.47-1.18.8-1.85zM6.91 18.25l5.09-5.09 5.09 5.09H6.91z"
|
|
676
1111
|
);
|
|
677
|
-
var IconSpinner = (0,
|
|
1112
|
+
var IconSpinner = (0, import_react6.forwardRef)(function IconSpinner2(_a, ref) {
|
|
678
1113
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
679
|
-
return /* @__PURE__ */ (0,
|
|
1114
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(IconSync, __spreadValues({ ref, className: cn("ph-icon-spin", className) }, props));
|
|
680
1115
|
});
|
|
681
1116
|
IconSpinner.displayName = "IconSpinner";
|
|
682
1117
|
var CANONICAL_ICONS = {
|
|
@@ -774,15 +1209,15 @@ for (const [name, Icon] of Object.entries(CANONICAL_ICONS)) {
|
|
|
774
1209
|
namedIcon.displayName = `Icon${name[0].toUpperCase()}${name.slice(1)}`;
|
|
775
1210
|
}
|
|
776
1211
|
}
|
|
777
|
-
var IconByName = (0,
|
|
1212
|
+
var IconByName = (0, import_react6.forwardRef)(function IconByName2(_a, ref) {
|
|
778
1213
|
var _b = _a, { name } = _b, props = __objRest(_b, ["name"]);
|
|
779
1214
|
const Icon = PH_ICONS[name];
|
|
780
|
-
return /* @__PURE__ */ (0,
|
|
1215
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Icon, __spreadValues({ ref }, props));
|
|
781
1216
|
});
|
|
782
1217
|
IconByName.displayName = "IconByName";
|
|
783
1218
|
|
|
784
1219
|
// src/components/ui/Alert.tsx
|
|
785
|
-
var
|
|
1220
|
+
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
786
1221
|
var statusConfig = {
|
|
787
1222
|
info: { icon: IconInfo },
|
|
788
1223
|
success: { icon: IconCheckCircle },
|
|
@@ -795,7 +1230,7 @@ var statusClassMap = {
|
|
|
795
1230
|
warning: "ph-alert-warning",
|
|
796
1231
|
danger: "ph-alert-danger"
|
|
797
1232
|
};
|
|
798
|
-
var Alert = (0,
|
|
1233
|
+
var Alert = (0, import_react7.forwardRef)(function Alert2(_a, ref) {
|
|
799
1234
|
var _b = _a, {
|
|
800
1235
|
status = "info",
|
|
801
1236
|
title,
|
|
@@ -821,7 +1256,7 @@ var Alert = (0, import_react5.forwardRef)(function Alert2(_a, ref) {
|
|
|
821
1256
|
]);
|
|
822
1257
|
const config = statusConfig[status];
|
|
823
1258
|
const Icon = config.icon;
|
|
824
|
-
return /* @__PURE__ */ (0,
|
|
1259
|
+
return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
|
|
825
1260
|
"div",
|
|
826
1261
|
__spreadProps(__spreadValues({
|
|
827
1262
|
ref,
|
|
@@ -830,20 +1265,20 @@ var Alert = (0, import_react5.forwardRef)(function Alert2(_a, ref) {
|
|
|
830
1265
|
className: cn("ph-alert", statusClassMap[status], className)
|
|
831
1266
|
}, props), {
|
|
832
1267
|
children: [
|
|
833
|
-
icon != null ? icon : /* @__PURE__ */ (0,
|
|
834
|
-
/* @__PURE__ */ (0,
|
|
835
|
-
title && /* @__PURE__ */ (0,
|
|
836
|
-
description && /* @__PURE__ */ (0,
|
|
1268
|
+
icon != null ? icon : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Icon, { className: "ph-alert-icon mt-0.5 h-5 w-5 shrink-0", "aria-hidden": true }),
|
|
1269
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "min-w-0 flex-1", children: [
|
|
1270
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "font-semibold", children: title }),
|
|
1271
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "mt-1 text-sm text-ph-subtle", children: description }),
|
|
837
1272
|
children
|
|
838
1273
|
] }),
|
|
839
|
-
onDismiss && /* @__PURE__ */ (0,
|
|
1274
|
+
onDismiss && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
840
1275
|
"button",
|
|
841
1276
|
{
|
|
842
1277
|
type: "button",
|
|
843
1278
|
onClick: onDismiss,
|
|
844
1279
|
className: "ph-alert-dismiss",
|
|
845
1280
|
"aria-label": dismissLabel,
|
|
846
|
-
children: /* @__PURE__ */ (0,
|
|
1281
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(IconClose, { className: "h-4 w-4", "aria-hidden": true })
|
|
847
1282
|
}
|
|
848
1283
|
)
|
|
849
1284
|
]
|
|
@@ -853,8 +1288,8 @@ var Alert = (0, import_react5.forwardRef)(function Alert2(_a, ref) {
|
|
|
853
1288
|
Alert.displayName = "Alert";
|
|
854
1289
|
|
|
855
1290
|
// src/components/ui/Badge.tsx
|
|
856
|
-
var
|
|
857
|
-
var
|
|
1291
|
+
var import_react8 = require("react");
|
|
1292
|
+
var import_jsx_runtime9 = require("react/jsx-runtime");
|
|
858
1293
|
var variantMap = {
|
|
859
1294
|
brand: "ph-badge-brand",
|
|
860
1295
|
neutral: "ph-badge-neutral",
|
|
@@ -868,7 +1303,7 @@ var sizeMap = {
|
|
|
868
1303
|
sm: "text-[10px] px-1.5 py-0.5",
|
|
869
1304
|
md: ""
|
|
870
1305
|
};
|
|
871
|
-
var Badge = (0,
|
|
1306
|
+
var Badge = (0, import_react8.forwardRef)(function Badge2(_a, ref) {
|
|
872
1307
|
var _b = _a, {
|
|
873
1308
|
variant = "neutral",
|
|
874
1309
|
size = "md",
|
|
@@ -880,7 +1315,7 @@ var Badge = (0, import_react6.forwardRef)(function Badge2(_a, ref) {
|
|
|
880
1315
|
"children",
|
|
881
1316
|
"className"
|
|
882
1317
|
]);
|
|
883
|
-
return /* @__PURE__ */ (0,
|
|
1318
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
|
|
884
1319
|
"span",
|
|
885
1320
|
__spreadProps(__spreadValues({
|
|
886
1321
|
ref,
|
|
@@ -898,15 +1333,15 @@ var Badge = (0, import_react6.forwardRef)(function Badge2(_a, ref) {
|
|
|
898
1333
|
Badge.displayName = "Badge";
|
|
899
1334
|
|
|
900
1335
|
// src/components/ui/Card.tsx
|
|
901
|
-
var
|
|
902
|
-
var
|
|
1336
|
+
var import_react9 = require("react");
|
|
1337
|
+
var import_jsx_runtime10 = require("react/jsx-runtime");
|
|
903
1338
|
var variantMap2 = {
|
|
904
1339
|
default: "",
|
|
905
1340
|
outlined: "border-2 border-ph-border",
|
|
906
1341
|
elevated: "ph-card-elevated",
|
|
907
1342
|
highlighted: "ph-card-highlighted"
|
|
908
1343
|
};
|
|
909
|
-
var Card = (0,
|
|
1344
|
+
var Card = (0, import_react9.forwardRef)(function Card2(_a, ref) {
|
|
910
1345
|
var _b = _a, {
|
|
911
1346
|
children,
|
|
912
1347
|
title,
|
|
@@ -950,18 +1385,18 @@ var Card = (0, import_react7.forwardRef)(function Card2(_a, ref) {
|
|
|
950
1385
|
(interactive || isLink || isButton) && "ph-card-interactive",
|
|
951
1386
|
className
|
|
952
1387
|
);
|
|
953
|
-
const cardContent = /* @__PURE__ */ (0,
|
|
954
|
-
media && /* @__PURE__ */ (0,
|
|
955
|
-
/* @__PURE__ */ (0,
|
|
956
|
-
title && /* @__PURE__ */ (0,
|
|
957
|
-
description && /* @__PURE__ */ (0,
|
|
1388
|
+
const cardContent = /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
|
|
1389
|
+
media && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ph-card-media", children: media }),
|
|
1390
|
+
/* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("ph-card-body", bodyClassName), children: [
|
|
1391
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Title3, { className: "ph-card-title", children: title }),
|
|
1392
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "text-sm text-ph-subtle", children: description }),
|
|
958
1393
|
children,
|
|
959
|
-
actions && /* @__PURE__ */ (0,
|
|
1394
|
+
actions && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ph-card-actions", children: actions })
|
|
960
1395
|
] }),
|
|
961
|
-
footer && /* @__PURE__ */ (0,
|
|
1396
|
+
footer && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "border-t border-ph-border px-6 py-4 text-xs text-ph-subtle", children: footer })
|
|
962
1397
|
] });
|
|
963
1398
|
if (isLink) {
|
|
964
|
-
return /* @__PURE__ */ (0,
|
|
1399
|
+
return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
965
1400
|
"a",
|
|
966
1401
|
__spreadProps(__spreadValues({
|
|
967
1402
|
ref,
|
|
@@ -976,7 +1411,7 @@ var Card = (0, import_react7.forwardRef)(function Card2(_a, ref) {
|
|
|
976
1411
|
);
|
|
977
1412
|
}
|
|
978
1413
|
if (isButton) {
|
|
979
|
-
return /* @__PURE__ */ (0,
|
|
1414
|
+
return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
|
|
980
1415
|
"button",
|
|
981
1416
|
__spreadProps(__spreadValues({
|
|
982
1417
|
ref,
|
|
@@ -988,12 +1423,12 @@ var Card = (0, import_react7.forwardRef)(function Card2(_a, ref) {
|
|
|
988
1423
|
})
|
|
989
1424
|
);
|
|
990
1425
|
}
|
|
991
|
-
return /* @__PURE__ */ (0,
|
|
1426
|
+
return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", __spreadProps(__spreadValues({ ref, className: cardClassName }, props), { children: cardContent }));
|
|
992
1427
|
});
|
|
993
1428
|
Card.displayName = "Card";
|
|
994
1429
|
|
|
995
1430
|
// src/components/ui/Kbd.tsx
|
|
996
|
-
var
|
|
1431
|
+
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
997
1432
|
var platformLabels = {
|
|
998
1433
|
text: {
|
|
999
1434
|
command: "Command",
|
|
@@ -1052,7 +1487,7 @@ function Kbd(_a) {
|
|
|
1052
1487
|
"aria-label"
|
|
1053
1488
|
]);
|
|
1054
1489
|
if (variant === "token") {
|
|
1055
|
-
return /* @__PURE__ */ (0,
|
|
1490
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
1056
1491
|
"code",
|
|
1057
1492
|
__spreadProps(__spreadValues({
|
|
1058
1493
|
className: cn("ph-code-token ph-kbd", className),
|
|
@@ -1067,7 +1502,7 @@ function Kbd(_a) {
|
|
|
1067
1502
|
const displayKeys = sourceKeys.map((key) => formatKey(key, platform));
|
|
1068
1503
|
const accessibleLabel = ariaLabel != null ? ariaLabel : getShortcutLabel(displayKeys);
|
|
1069
1504
|
if (variant === "key") {
|
|
1070
|
-
return /* @__PURE__ */ (0,
|
|
1505
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
1071
1506
|
"kbd",
|
|
1072
1507
|
__spreadProps(__spreadValues({
|
|
1073
1508
|
className: cn("ph-keycap", className),
|
|
@@ -1078,16 +1513,16 @@ function Kbd(_a) {
|
|
|
1078
1513
|
})
|
|
1079
1514
|
);
|
|
1080
1515
|
}
|
|
1081
|
-
return /* @__PURE__ */ (0,
|
|
1516
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
1082
1517
|
"kbd",
|
|
1083
1518
|
__spreadProps(__spreadValues({
|
|
1084
1519
|
className: cn("ph-shortcut-group ph-keycap", className),
|
|
1085
1520
|
role: accessibleLabel ? "img" : void 0,
|
|
1086
1521
|
"aria-label": accessibleLabel
|
|
1087
1522
|
}, props), {
|
|
1088
|
-
children: displayKeys.map((key, index) => /* @__PURE__ */ (0,
|
|
1089
|
-
index > 0 && separator != null ? /* @__PURE__ */ (0,
|
|
1090
|
-
/* @__PURE__ */ (0,
|
|
1523
|
+
children: displayKeys.map((key, index) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: "contents", children: [
|
|
1524
|
+
index > 0 && separator != null ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "ph-shortcut-separator", "aria-hidden": "true", children: separator }) : null,
|
|
1525
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "ph-shortcut-key", "aria-hidden": accessibleLabel ? true : void 0, children: key })
|
|
1091
1526
|
] }, index))
|
|
1092
1527
|
})
|
|
1093
1528
|
);
|
|
@@ -1108,7 +1543,7 @@ function getShortcutLabel(keys) {
|
|
|
1108
1543
|
}
|
|
1109
1544
|
|
|
1110
1545
|
// src/components/ui/Loader.tsx
|
|
1111
|
-
var
|
|
1546
|
+
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
1112
1547
|
var loaderSizeClass = {
|
|
1113
1548
|
sm: "ph-loader-sm",
|
|
1114
1549
|
md: "ph-loader-md",
|
|
@@ -1134,7 +1569,7 @@ function Loader(_a) {
|
|
|
1134
1569
|
"label",
|
|
1135
1570
|
"className"
|
|
1136
1571
|
]);
|
|
1137
|
-
return /* @__PURE__ */ (0,
|
|
1572
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
1138
1573
|
"span",
|
|
1139
1574
|
__spreadProps(__spreadValues({
|
|
1140
1575
|
role: "status",
|
|
@@ -1142,20 +1577,20 @@ function Loader(_a) {
|
|
|
1142
1577
|
className: cn("ph-loader", loaderSizeClass[size], className)
|
|
1143
1578
|
}, props), {
|
|
1144
1579
|
children: [
|
|
1145
|
-
variant === "spinner" ? /* @__PURE__ */ (0,
|
|
1146
|
-
variant === "dots" ? /* @__PURE__ */ (0,
|
|
1147
|
-
/* @__PURE__ */ (0,
|
|
1148
|
-
/* @__PURE__ */ (0,
|
|
1149
|
-
/* @__PURE__ */ (0,
|
|
1580
|
+
variant === "spinner" ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "ph-loading", "aria-hidden": true }) : null,
|
|
1581
|
+
variant === "dots" ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: "ph-loading-dots", "aria-hidden": true, children: [
|
|
1582
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", {}),
|
|
1583
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", {}),
|
|
1584
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", {})
|
|
1150
1585
|
] }) : null,
|
|
1151
|
-
variant === "pulse" ? /* @__PURE__ */ (0,
|
|
1586
|
+
variant === "pulse" ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "ph-loading-pulse", "aria-hidden": true }) : null
|
|
1152
1587
|
]
|
|
1153
1588
|
})
|
|
1154
1589
|
);
|
|
1155
1590
|
}
|
|
1156
1591
|
function Skeleton(_a) {
|
|
1157
1592
|
var _b = _a, { shape = "text", className } = _b, props = __objRest(_b, ["shape", "className"]);
|
|
1158
|
-
return /* @__PURE__ */ (0,
|
|
1593
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
1159
1594
|
"span",
|
|
1160
1595
|
__spreadValues({
|
|
1161
1596
|
className: cn("ph-skeleton", skeletonShapeClass[shape], className),
|
|
@@ -1179,53 +1614,67 @@ function LoadingState(_a) {
|
|
|
1179
1614
|
"size",
|
|
1180
1615
|
"className"
|
|
1181
1616
|
]);
|
|
1182
|
-
return /* @__PURE__ */ (0,
|
|
1183
|
-
/* @__PURE__ */ (0,
|
|
1184
|
-
/* @__PURE__ */ (0,
|
|
1185
|
-
/* @__PURE__ */ (0,
|
|
1186
|
-
description ? /* @__PURE__ */ (0,
|
|
1617
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-loading-state", className), role: "status", "aria-label": label }, props), { children: [
|
|
1618
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Loader, { variant, size, label, "aria-hidden": "true" }),
|
|
1619
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "ph-loading-state__copy", children: [
|
|
1620
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("strong", { children: title }),
|
|
1621
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: description }) : null
|
|
1187
1622
|
] })
|
|
1188
1623
|
] }));
|
|
1189
1624
|
}
|
|
1190
1625
|
|
|
1191
1626
|
// src/components/ui/AuthLayout.tsx
|
|
1192
|
-
var
|
|
1193
|
-
var
|
|
1627
|
+
var import_react10 = require("react");
|
|
1628
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
1194
1629
|
function AuthLayout(_a) {
|
|
1195
1630
|
var _b = _a, { brand, footer, aside, children, className } = _b, props = __objRest(_b, ["brand", "footer", "aside", "children", "className"]);
|
|
1196
|
-
return /* @__PURE__ */ (0,
|
|
1197
|
-
aside ? /* @__PURE__ */ (0,
|
|
1198
|
-
/* @__PURE__ */ (0,
|
|
1199
|
-
brand ? /* @__PURE__ */ (0,
|
|
1631
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-auth-layout", aside != null && "ph-auth-layout--split", className) }, props), { children: [
|
|
1632
|
+
aside ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("aside", { className: "ph-auth-layout__aside", children: aside }) : null,
|
|
1633
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ph-auth-layout__main", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ph-auth-layout__column", children: [
|
|
1634
|
+
brand ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ph-auth-layout__brand", children: brand }) : null,
|
|
1200
1635
|
children,
|
|
1201
|
-
footer ? /* @__PURE__ */ (0,
|
|
1636
|
+
footer ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("footer", { className: "ph-auth-layout__footer", children: footer }) : null
|
|
1202
1637
|
] }) })
|
|
1203
1638
|
] }));
|
|
1204
1639
|
}
|
|
1205
1640
|
function AuthCard(_a) {
|
|
1206
1641
|
var _b = _a, { title, description, footer, children, className } = _b, props = __objRest(_b, ["title", "description", "footer", "children", "className"]);
|
|
1207
|
-
const titleId = (0,
|
|
1208
|
-
return /* @__PURE__ */ (0,
|
|
1209
|
-
/* @__PURE__ */ (0,
|
|
1210
|
-
/* @__PURE__ */ (0,
|
|
1211
|
-
description ? /* @__PURE__ */ (0,
|
|
1642
|
+
const titleId = (0, import_react10.useId)();
|
|
1643
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("section", __spreadProps(__spreadValues({ className: cn("ph-auth-card", className), "aria-labelledby": titleId }, props), { children: [
|
|
1644
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("header", { className: "ph-auth-card__header", children: [
|
|
1645
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("h1", { id: titleId, children: title }),
|
|
1646
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { children: description }) : null
|
|
1212
1647
|
] }),
|
|
1213
|
-
/* @__PURE__ */ (0,
|
|
1214
|
-
footer ? /* @__PURE__ */ (0,
|
|
1648
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ph-auth-card__body", children }),
|
|
1649
|
+
footer ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("footer", { className: "ph-auth-card__footer", children: footer }) : null
|
|
1215
1650
|
] }));
|
|
1216
1651
|
}
|
|
1217
1652
|
function AuthDivider(_a) {
|
|
1218
1653
|
var _b = _a, { children = "or continue with", className } = _b, props = __objRest(_b, ["children", "className"]);
|
|
1219
|
-
return /* @__PURE__ */ (0,
|
|
1654
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", __spreadProps(__spreadValues({ className: cn("ph-auth-divider", className) }, props), { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children }) }));
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
// src/lib/suite-analytics.ts
|
|
1658
|
+
var SUITE_ANALYTICS_EVENT = "shellstack:analytics";
|
|
1659
|
+
function trackSuiteEvent(event, properties) {
|
|
1660
|
+
if (typeof window === "undefined" || !event) return;
|
|
1661
|
+
try {
|
|
1662
|
+
window.dispatchEvent(
|
|
1663
|
+
new CustomEvent(SUITE_ANALYTICS_EVENT, {
|
|
1664
|
+
detail: { event, properties }
|
|
1665
|
+
})
|
|
1666
|
+
);
|
|
1667
|
+
} catch (e) {
|
|
1668
|
+
}
|
|
1220
1669
|
}
|
|
1221
1670
|
|
|
1222
1671
|
// src/components/ui/SettingsLayout.tsx
|
|
1223
|
-
var
|
|
1672
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
1224
1673
|
function SettingsNav(_a) {
|
|
1225
1674
|
var _b = _a, { groups, className } = _b, props = __objRest(_b, ["groups", "className"]);
|
|
1226
|
-
return /* @__PURE__ */ (0,
|
|
1227
|
-
/* @__PURE__ */ (0,
|
|
1228
|
-
/* @__PURE__ */ (0,
|
|
1675
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", __spreadProps(__spreadValues({ className: cn("ph-settings-nav", className) }, props), { children: groups.map((group, index) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "ph-settings-nav__group", children: [
|
|
1676
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "ph-settings-nav__heading", children: group.label }),
|
|
1677
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "ph-settings-nav__items", children: group.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1229
1678
|
"a",
|
|
1230
1679
|
{
|
|
1231
1680
|
href: item.href,
|
|
@@ -1236,10 +1685,11 @@ function SettingsNav(_a) {
|
|
|
1236
1685
|
item.active && "ph-settings-nav__item--active"
|
|
1237
1686
|
),
|
|
1238
1687
|
"aria-current": item.active ? "page" : void 0,
|
|
1688
|
+
onClick: () => trackSuiteEvent("Tab Viewed", { tab: item.id }),
|
|
1239
1689
|
children: [
|
|
1240
|
-
item.icon ? /* @__PURE__ */ (0,
|
|
1241
|
-
/* @__PURE__ */ (0,
|
|
1242
|
-
item.badge ? /* @__PURE__ */ (0,
|
|
1690
|
+
item.icon ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ph-settings-nav__icon", children: item.icon }) : null,
|
|
1691
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: item.label }),
|
|
1692
|
+
item.badge ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "ph-settings-nav__badge", children: item.badge }) : null
|
|
1243
1693
|
]
|
|
1244
1694
|
},
|
|
1245
1695
|
item.id
|
|
@@ -1264,31 +1714,31 @@ function SettingsLayout(_a) {
|
|
|
1264
1714
|
"children",
|
|
1265
1715
|
"className"
|
|
1266
1716
|
]);
|
|
1267
|
-
return /* @__PURE__ */ (0,
|
|
1268
|
-
/* @__PURE__ */ (0,
|
|
1269
|
-
/* @__PURE__ */ (0,
|
|
1270
|
-
/* @__PURE__ */ (0,
|
|
1271
|
-
description ? /* @__PURE__ */ (0,
|
|
1717
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("section", __spreadProps(__spreadValues({ className: cn("ph-settings-layout", className) }, props), { children: [
|
|
1718
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("header", { className: "ph-settings-layout__header", children: [
|
|
1719
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
|
|
1720
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h2", { children: title }),
|
|
1721
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { children: description }) : null
|
|
1272
1722
|
] }),
|
|
1273
|
-
actions ? /* @__PURE__ */ (0,
|
|
1723
|
+
actions ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "ph-settings-layout__actions", children: actions }) : null
|
|
1274
1724
|
] }),
|
|
1275
|
-
/* @__PURE__ */ (0,
|
|
1276
|
-
/* @__PURE__ */ (0,
|
|
1277
|
-
/* @__PURE__ */ (0,
|
|
1725
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("details", { className: "ph-settings-layout__mobile-nav", children: [
|
|
1726
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("summary", { children: [
|
|
1727
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(IconTuning, { className: "h-4 w-4", "aria-hidden": true }),
|
|
1278
1728
|
"Settings menu"
|
|
1279
1729
|
] }),
|
|
1280
|
-
/* @__PURE__ */ (0,
|
|
1730
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("nav", { "aria-label": navigationLabel, children: navigation })
|
|
1281
1731
|
] }),
|
|
1282
|
-
/* @__PURE__ */ (0,
|
|
1283
|
-
/* @__PURE__ */ (0,
|
|
1284
|
-
/* @__PURE__ */ (0,
|
|
1732
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "ph-settings-layout__grid", children: [
|
|
1733
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("aside", { className: "ph-settings-layout__sidebar", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("nav", { "aria-label": navigationLabel, children: navigation }) }),
|
|
1734
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "ph-settings-layout__content", children })
|
|
1285
1735
|
] })
|
|
1286
1736
|
] }));
|
|
1287
1737
|
}
|
|
1288
1738
|
|
|
1289
1739
|
// src/components/ui/DropdownMenu.tsx
|
|
1290
1740
|
var DropdownPrimitive = __toESM(require("@radix-ui/react-dropdown-menu"));
|
|
1291
|
-
var
|
|
1741
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
1292
1742
|
var sizeClass2 = {
|
|
1293
1743
|
xs: "ph-btn-xs",
|
|
1294
1744
|
sm: "ph-btn-sm",
|
|
@@ -1310,7 +1760,7 @@ function DropdownContent({
|
|
|
1310
1760
|
avoidCollisions = true,
|
|
1311
1761
|
panelClassName
|
|
1312
1762
|
}) {
|
|
1313
|
-
return /* @__PURE__ */ (0,
|
|
1763
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
1314
1764
|
DropdownPrimitive.Content,
|
|
1315
1765
|
{
|
|
1316
1766
|
className: cn("ph-dropdown-panel", panelClassName),
|
|
@@ -1323,7 +1773,7 @@ function DropdownContent({
|
|
|
1323
1773
|
sticky: "partial",
|
|
1324
1774
|
children: [
|
|
1325
1775
|
children,
|
|
1326
|
-
/* @__PURE__ */ (0,
|
|
1776
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1327
1777
|
DropdownPrimitive.Arrow,
|
|
1328
1778
|
{
|
|
1329
1779
|
className: "ph-dropdown-arrow",
|
|
@@ -1375,7 +1825,7 @@ function DropdownMenu(_a) {
|
|
|
1375
1825
|
"modal",
|
|
1376
1826
|
"disabled"
|
|
1377
1827
|
]);
|
|
1378
|
-
return /* @__PURE__ */ (0,
|
|
1828
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", __spreadProps(__spreadValues({ className: cn("ph-dropdown", className) }, props), { children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
1379
1829
|
DropdownPrimitive.Root,
|
|
1380
1830
|
{
|
|
1381
1831
|
open,
|
|
@@ -1383,7 +1833,7 @@ function DropdownMenu(_a) {
|
|
|
1383
1833
|
onOpenChange,
|
|
1384
1834
|
modal,
|
|
1385
1835
|
children: [
|
|
1386
|
-
/* @__PURE__ */ (0,
|
|
1836
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1387
1837
|
"button",
|
|
1388
1838
|
{
|
|
1389
1839
|
type: "button",
|
|
@@ -1394,7 +1844,7 @@ function DropdownMenu(_a) {
|
|
|
1394
1844
|
children: trigger
|
|
1395
1845
|
}
|
|
1396
1846
|
) }),
|
|
1397
|
-
/* @__PURE__ */ (0,
|
|
1847
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1398
1848
|
DropdownContent,
|
|
1399
1849
|
{
|
|
1400
1850
|
align,
|
|
@@ -1459,8 +1909,8 @@ function DropdownButton(_a) {
|
|
|
1459
1909
|
"modal",
|
|
1460
1910
|
"disabled"
|
|
1461
1911
|
]);
|
|
1462
|
-
const trailing = sideIcon != null ? sideIcon : /* @__PURE__ */ (0,
|
|
1463
|
-
return /* @__PURE__ */ (0,
|
|
1912
|
+
const trailing = sideIcon != null ? sideIcon : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(IconChevronDown, { className: "h-4 w-4", "aria-hidden": true });
|
|
1913
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", __spreadProps(__spreadValues({ className: cn("ph-dropdown", className) }, props), { children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
1464
1914
|
DropdownPrimitive.Root,
|
|
1465
1915
|
{
|
|
1466
1916
|
open,
|
|
@@ -1468,7 +1918,7 @@ function DropdownButton(_a) {
|
|
|
1468
1918
|
onOpenChange,
|
|
1469
1919
|
modal,
|
|
1470
1920
|
children: [
|
|
1471
|
-
/* @__PURE__ */ (0,
|
|
1921
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1472
1922
|
"button",
|
|
1473
1923
|
{
|
|
1474
1924
|
type: "button",
|
|
@@ -1481,7 +1931,7 @@ function DropdownButton(_a) {
|
|
|
1481
1931
|
split && "ph-btn-split"
|
|
1482
1932
|
),
|
|
1483
1933
|
"aria-label": ariaLabel,
|
|
1484
|
-
children: /* @__PURE__ */ (0,
|
|
1934
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1485
1935
|
ButtonChrome,
|
|
1486
1936
|
{
|
|
1487
1937
|
label,
|
|
@@ -1492,7 +1942,7 @@ function DropdownButton(_a) {
|
|
|
1492
1942
|
)
|
|
1493
1943
|
}
|
|
1494
1944
|
) }),
|
|
1495
|
-
/* @__PURE__ */ (0,
|
|
1945
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1496
1946
|
DropdownContent,
|
|
1497
1947
|
{
|
|
1498
1948
|
align,
|
|
@@ -1519,7 +1969,7 @@ function DropdownItem(_a) {
|
|
|
1519
1969
|
"children",
|
|
1520
1970
|
"disabled"
|
|
1521
1971
|
]);
|
|
1522
|
-
return /* @__PURE__ */ (0,
|
|
1972
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownPrimitive.Item, { asChild: true, disabled, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1523
1973
|
"button",
|
|
1524
1974
|
__spreadProps(__spreadValues({
|
|
1525
1975
|
type: "button",
|
|
@@ -1531,7 +1981,7 @@ function DropdownItem(_a) {
|
|
|
1531
1981
|
) });
|
|
1532
1982
|
}
|
|
1533
1983
|
function DropdownRadioGroup(props) {
|
|
1534
|
-
return /* @__PURE__ */ (0,
|
|
1984
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownPrimitive.RadioGroup, __spreadValues({}, props));
|
|
1535
1985
|
}
|
|
1536
1986
|
function DropdownRadioItem(_a) {
|
|
1537
1987
|
var _b = _a, {
|
|
@@ -1541,26 +1991,26 @@ function DropdownRadioItem(_a) {
|
|
|
1541
1991
|
"className",
|
|
1542
1992
|
"children"
|
|
1543
1993
|
]);
|
|
1544
|
-
return /* @__PURE__ */ (0,
|
|
1994
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
1545
1995
|
DropdownPrimitive.RadioItem,
|
|
1546
1996
|
__spreadProps(__spreadValues({
|
|
1547
1997
|
className: cn("ph-dropdown-item ph-dropdown-radio-item", className)
|
|
1548
1998
|
}, props), {
|
|
1549
1999
|
children: [
|
|
1550
|
-
/* @__PURE__ */ (0,
|
|
1551
|
-
/* @__PURE__ */ (0,
|
|
2000
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ph-dropdown-item-indicator", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(DropdownPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(IconCheck, { className: "h-3.5 w-3.5" }) }) }),
|
|
2001
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children })
|
|
1552
2002
|
]
|
|
1553
2003
|
})
|
|
1554
2004
|
);
|
|
1555
2005
|
}
|
|
1556
2006
|
|
|
1557
2007
|
// src/components/ui/Input.tsx
|
|
1558
|
-
var
|
|
1559
|
-
var
|
|
2008
|
+
var import_react12 = require("react");
|
|
2009
|
+
var import_iconoir_react2 = require("iconoir-react");
|
|
1560
2010
|
|
|
1561
2011
|
// src/components/ui/FormField.tsx
|
|
1562
|
-
var
|
|
1563
|
-
var
|
|
2012
|
+
var import_react11 = require("react");
|
|
2013
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
1564
2014
|
function FormField(_a) {
|
|
1565
2015
|
var _b = _a, {
|
|
1566
2016
|
controlId,
|
|
@@ -1583,7 +2033,7 @@ function FormField(_a) {
|
|
|
1583
2033
|
"children",
|
|
1584
2034
|
"className"
|
|
1585
2035
|
]);
|
|
1586
|
-
const generatedId = (0,
|
|
2036
|
+
const generatedId = (0, import_react11.useId)();
|
|
1587
2037
|
const id = controlId != null ? controlId : generatedId;
|
|
1588
2038
|
const descriptionId = helperText && !error ? `${id}-description` : void 0;
|
|
1589
2039
|
const errorId = error ? `${id}-error` : void 0;
|
|
@@ -1593,26 +2043,26 @@ function FormField(_a) {
|
|
|
1593
2043
|
"aria-errormessage": errorId,
|
|
1594
2044
|
"aria-invalid": error ? true : void 0
|
|
1595
2045
|
};
|
|
1596
|
-
return /* @__PURE__ */ (0,
|
|
1597
|
-
label ? /* @__PURE__ */ (0,
|
|
2046
|
+
return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-field", className) }, props), { children: [
|
|
2047
|
+
label ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
1598
2048
|
"label",
|
|
1599
2049
|
{
|
|
1600
2050
|
htmlFor: id,
|
|
1601
2051
|
className: cn("ph-label", hideLabel && "sr-only", disabled && "opacity-50"),
|
|
1602
2052
|
children: [
|
|
1603
2053
|
label,
|
|
1604
|
-
required ? /* @__PURE__ */ (0,
|
|
2054
|
+
required ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { "aria-hidden": "true", children: " *" }) : null
|
|
1605
2055
|
]
|
|
1606
2056
|
}
|
|
1607
2057
|
) : null,
|
|
1608
2058
|
typeof children === "function" ? children(controlProps) : children,
|
|
1609
|
-
descriptionId ? /* @__PURE__ */ (0,
|
|
1610
|
-
errorId ? /* @__PURE__ */ (0,
|
|
2059
|
+
descriptionId ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { id: descriptionId, className: "mt-1 text-xs text-ph-subtle", children: helperText }) : null,
|
|
2060
|
+
errorId ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { id: errorId, className: "mt-1 text-xs font-medium text-ph-danger", children: error }) : null
|
|
1611
2061
|
] }));
|
|
1612
2062
|
}
|
|
1613
2063
|
|
|
1614
2064
|
// src/components/ui/Input.tsx
|
|
1615
|
-
var
|
|
2065
|
+
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
1616
2066
|
var sizeMap2 = {
|
|
1617
2067
|
sm: "ph-input-sm",
|
|
1618
2068
|
md: "",
|
|
@@ -1622,7 +2072,7 @@ function joinIds(...ids) {
|
|
|
1622
2072
|
const value = ids.filter(Boolean).join(" ");
|
|
1623
2073
|
return value || void 0;
|
|
1624
2074
|
}
|
|
1625
|
-
var Input = (0,
|
|
2075
|
+
var Input = (0, import_react12.forwardRef)(function Input2(_a, ref) {
|
|
1626
2076
|
var _b = _a, {
|
|
1627
2077
|
id: idProp,
|
|
1628
2078
|
label,
|
|
@@ -1652,12 +2102,12 @@ var Input = (0, import_react10.forwardRef)(function Input2(_a, ref) {
|
|
|
1652
2102
|
"required",
|
|
1653
2103
|
"aria-describedby"
|
|
1654
2104
|
]);
|
|
1655
|
-
const autoId = (0,
|
|
2105
|
+
const autoId = (0, import_react12.useId)();
|
|
1656
2106
|
const id = idProp != null ? idProp : autoId;
|
|
1657
2107
|
const hasError = Boolean(error);
|
|
1658
2108
|
const isPassword = type === "password";
|
|
1659
|
-
const [revealed, setRevealed] = (0,
|
|
1660
|
-
return /* @__PURE__ */ (0,
|
|
2109
|
+
const [revealed, setRevealed] = (0, import_react12.useState)(false);
|
|
2110
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1661
2111
|
FormField,
|
|
1662
2112
|
{
|
|
1663
2113
|
controlId: id,
|
|
@@ -1668,8 +2118,8 @@ var Input = (0, import_react10.forwardRef)(function Input2(_a, ref) {
|
|
|
1668
2118
|
required,
|
|
1669
2119
|
disabled,
|
|
1670
2120
|
className: wrapperClassName,
|
|
1671
|
-
children: (fieldProps) => /* @__PURE__ */ (0,
|
|
1672
|
-
/* @__PURE__ */ (0,
|
|
2121
|
+
children: (fieldProps) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "relative", children: [
|
|
2122
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1673
2123
|
"input",
|
|
1674
2124
|
__spreadValues(__spreadProps(__spreadValues({}, fieldProps), {
|
|
1675
2125
|
ref,
|
|
@@ -1688,7 +2138,7 @@ var Input = (0, import_react10.forwardRef)(function Input2(_a, ref) {
|
|
|
1688
2138
|
)
|
|
1689
2139
|
}), props)
|
|
1690
2140
|
),
|
|
1691
|
-
isPassword ? /* @__PURE__ */ (0,
|
|
2141
|
+
isPassword ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1692
2142
|
"button",
|
|
1693
2143
|
{
|
|
1694
2144
|
type: "button",
|
|
@@ -1696,8 +2146,8 @@ var Input = (0, import_react10.forwardRef)(function Input2(_a, ref) {
|
|
|
1696
2146
|
"aria-label": revealed ? "Hide password" : "Show password",
|
|
1697
2147
|
"aria-pressed": revealed,
|
|
1698
2148
|
disabled,
|
|
1699
|
-
className: "
|
|
1700
|
-
children: revealed ? /* @__PURE__ */ (0,
|
|
2149
|
+
className: "ph-field-icon-button",
|
|
2150
|
+
children: revealed ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_iconoir_react2.EyeClosed, { className: "h-4 w-4", "aria-hidden": true }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_iconoir_react2.Eye, { className: "h-4 w-4", "aria-hidden": true })
|
|
1701
2151
|
}
|
|
1702
2152
|
) : null
|
|
1703
2153
|
] })
|
|
@@ -1705,7 +2155,7 @@ var Input = (0, import_react10.forwardRef)(function Input2(_a, ref) {
|
|
|
1705
2155
|
);
|
|
1706
2156
|
});
|
|
1707
2157
|
Input.displayName = "Input";
|
|
1708
|
-
var Select = (0,
|
|
2158
|
+
var Select = (0, import_react12.forwardRef)(function Select2(_a, ref) {
|
|
1709
2159
|
var _b = _a, {
|
|
1710
2160
|
id: idProp,
|
|
1711
2161
|
label,
|
|
@@ -1733,10 +2183,10 @@ var Select = (0, import_react10.forwardRef)(function Select2(_a, ref) {
|
|
|
1733
2183
|
"required",
|
|
1734
2184
|
"aria-describedby"
|
|
1735
2185
|
]);
|
|
1736
|
-
const autoId = (0,
|
|
2186
|
+
const autoId = (0, import_react12.useId)();
|
|
1737
2187
|
const id = idProp != null ? idProp : autoId;
|
|
1738
2188
|
const hasError = Boolean(error);
|
|
1739
|
-
return /* @__PURE__ */ (0,
|
|
2189
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(FormField, { controlId: id, label, hideLabel, helperText, error, required, disabled, className: wrapperClassName, children: (fieldProps) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1740
2190
|
"select",
|
|
1741
2191
|
__spreadProps(__spreadValues(__spreadProps(__spreadValues({}, fieldProps), {
|
|
1742
2192
|
ref,
|
|
@@ -1756,7 +2206,7 @@ var Select = (0, import_react10.forwardRef)(function Select2(_a, ref) {
|
|
|
1756
2206
|
) });
|
|
1757
2207
|
});
|
|
1758
2208
|
Select.displayName = "Select";
|
|
1759
|
-
var Textarea = (0,
|
|
2209
|
+
var Textarea = (0, import_react12.forwardRef)(function Textarea2(_a, ref) {
|
|
1760
2210
|
var _b = _a, {
|
|
1761
2211
|
id: idProp,
|
|
1762
2212
|
label,
|
|
@@ -1782,10 +2232,10 @@ var Textarea = (0, import_react10.forwardRef)(function Textarea2(_a, ref) {
|
|
|
1782
2232
|
"required",
|
|
1783
2233
|
"aria-describedby"
|
|
1784
2234
|
]);
|
|
1785
|
-
const autoId = (0,
|
|
2235
|
+
const autoId = (0, import_react12.useId)();
|
|
1786
2236
|
const id = idProp != null ? idProp : autoId;
|
|
1787
2237
|
const hasError = Boolean(error);
|
|
1788
|
-
return /* @__PURE__ */ (0,
|
|
2238
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(FormField, { controlId: id, label, hideLabel, helperText, error, required, disabled, className: wrapperClassName, children: (fieldProps) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1789
2239
|
"textarea",
|
|
1790
2240
|
__spreadValues(__spreadProps(__spreadValues({}, fieldProps), {
|
|
1791
2241
|
ref,
|
|
@@ -1803,7 +2253,7 @@ var Textarea = (0, import_react10.forwardRef)(function Textarea2(_a, ref) {
|
|
|
1803
2253
|
) });
|
|
1804
2254
|
});
|
|
1805
2255
|
Textarea.displayName = "Textarea";
|
|
1806
|
-
var Checkbox = (0,
|
|
2256
|
+
var Checkbox = (0, import_react12.forwardRef)(function Checkbox2(_a, ref) {
|
|
1807
2257
|
var _b = _a, {
|
|
1808
2258
|
id: idProp,
|
|
1809
2259
|
label,
|
|
@@ -1823,14 +2273,14 @@ var Checkbox = (0, import_react10.forwardRef)(function Checkbox2(_a, ref) {
|
|
|
1823
2273
|
"disabled",
|
|
1824
2274
|
"aria-describedby"
|
|
1825
2275
|
]);
|
|
1826
|
-
const autoId = (0,
|
|
2276
|
+
const autoId = (0, import_react12.useId)();
|
|
1827
2277
|
const id = idProp != null ? idProp : autoId;
|
|
1828
2278
|
const hasError = Boolean(error);
|
|
1829
2279
|
const descriptionId = helperText && !hasError ? `${id}-description` : void 0;
|
|
1830
2280
|
const errorId = error ? `${id}-error` : void 0;
|
|
1831
|
-
return /* @__PURE__ */ (0,
|
|
1832
|
-
/* @__PURE__ */ (0,
|
|
1833
|
-
/* @__PURE__ */ (0,
|
|
2281
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: cn("ph-control-row", wrapperClassName), children: [
|
|
2282
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ph-checkbox-wrap", children: [
|
|
2283
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1834
2284
|
"input",
|
|
1835
2285
|
__spreadValues({
|
|
1836
2286
|
ref,
|
|
@@ -1848,17 +2298,17 @@ var Checkbox = (0, import_react10.forwardRef)(function Checkbox2(_a, ref) {
|
|
|
1848
2298
|
)
|
|
1849
2299
|
}, props)
|
|
1850
2300
|
),
|
|
1851
|
-
/* @__PURE__ */ (0,
|
|
2301
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IconCheck, { className: "ph-checkbox-icon", "aria-hidden": true })
|
|
1852
2302
|
] }),
|
|
1853
|
-
/* @__PURE__ */ (0,
|
|
1854
|
-
/* @__PURE__ */ (0,
|
|
1855
|
-
descriptionId ? /* @__PURE__ */ (0,
|
|
1856
|
-
errorId ? /* @__PURE__ */ (0,
|
|
2303
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ph-control-copy", children: [
|
|
2304
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label }),
|
|
2305
|
+
descriptionId ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { id: descriptionId, className: "text-xs text-ph-subtle", children: helperText }) : null,
|
|
2306
|
+
errorId ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { id: errorId, className: "text-xs font-medium text-ph-danger", children: error }) : null
|
|
1857
2307
|
] })
|
|
1858
2308
|
] });
|
|
1859
2309
|
});
|
|
1860
2310
|
Checkbox.displayName = "Checkbox";
|
|
1861
|
-
var Radio = (0,
|
|
2311
|
+
var Radio = (0, import_react12.forwardRef)(function Radio2(_a, ref) {
|
|
1862
2312
|
var _b = _a, {
|
|
1863
2313
|
id: idProp,
|
|
1864
2314
|
label,
|
|
@@ -1872,10 +2322,10 @@ var Radio = (0, import_react10.forwardRef)(function Radio2(_a, ref) {
|
|
|
1872
2322
|
"wrapperClassName",
|
|
1873
2323
|
"disabled"
|
|
1874
2324
|
]);
|
|
1875
|
-
const autoId = (0,
|
|
2325
|
+
const autoId = (0, import_react12.useId)();
|
|
1876
2326
|
const id = idProp != null ? idProp : autoId;
|
|
1877
|
-
return /* @__PURE__ */ (0,
|
|
1878
|
-
/* @__PURE__ */ (0,
|
|
2327
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: cn("ph-control-row", wrapperClassName, disabled && "opacity-60"), children: [
|
|
2328
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1879
2329
|
"input",
|
|
1880
2330
|
__spreadValues({
|
|
1881
2331
|
ref,
|
|
@@ -1885,11 +2335,11 @@ var Radio = (0, import_react10.forwardRef)(function Radio2(_a, ref) {
|
|
|
1885
2335
|
className: cn("ph-radio", disabled && "cursor-not-allowed", className)
|
|
1886
2336
|
}, props)
|
|
1887
2337
|
),
|
|
1888
|
-
/* @__PURE__ */ (0,
|
|
2338
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label })
|
|
1889
2339
|
] });
|
|
1890
2340
|
});
|
|
1891
2341
|
Radio.displayName = "Radio";
|
|
1892
|
-
var Toggle = (0,
|
|
2342
|
+
var Toggle = (0, import_react12.forwardRef)(function Toggle2(_a, ref) {
|
|
1893
2343
|
var _b = _a, {
|
|
1894
2344
|
id: idProp,
|
|
1895
2345
|
label,
|
|
@@ -1903,11 +2353,11 @@ var Toggle = (0, import_react10.forwardRef)(function Toggle2(_a, ref) {
|
|
|
1903
2353
|
"wrapperClassName",
|
|
1904
2354
|
"disabled"
|
|
1905
2355
|
]);
|
|
1906
|
-
const autoId = (0,
|
|
2356
|
+
const autoId = (0, import_react12.useId)();
|
|
1907
2357
|
const id = idProp != null ? idProp : autoId;
|
|
1908
|
-
return /* @__PURE__ */ (0,
|
|
1909
|
-
/* @__PURE__ */ (0,
|
|
1910
|
-
/* @__PURE__ */ (0,
|
|
2358
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { className: cn("ph-control-row-between", wrapperClassName, disabled && "opacity-60"), children: [
|
|
2359
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: disabled ? "opacity-60" : void 0, children: label }),
|
|
2360
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
1911
2361
|
"input",
|
|
1912
2362
|
__spreadValues({
|
|
1913
2363
|
ref,
|
|
@@ -1921,7 +2371,7 @@ var Toggle = (0, import_react10.forwardRef)(function Toggle2(_a, ref) {
|
|
|
1921
2371
|
] });
|
|
1922
2372
|
});
|
|
1923
2373
|
Toggle.displayName = "Toggle";
|
|
1924
|
-
var Range = (0,
|
|
2374
|
+
var Range = (0, import_react12.forwardRef)(function Range2(_a, ref) {
|
|
1925
2375
|
var _b = _a, {
|
|
1926
2376
|
id: idProp,
|
|
1927
2377
|
label,
|
|
@@ -1939,20 +2389,20 @@ var Range = (0, import_react10.forwardRef)(function Range2(_a, ref) {
|
|
|
1939
2389
|
"wrapperClassName",
|
|
1940
2390
|
"className"
|
|
1941
2391
|
]);
|
|
1942
|
-
const autoId = (0,
|
|
2392
|
+
const autoId = (0, import_react12.useId)();
|
|
1943
2393
|
const id = idProp != null ? idProp : autoId;
|
|
1944
|
-
return /* @__PURE__ */ (0,
|
|
1945
|
-
label && /* @__PURE__ */ (0,
|
|
1946
|
-
/* @__PURE__ */ (0,
|
|
1947
|
-
(minLabel || valueLabel || maxLabel) && /* @__PURE__ */ (0,
|
|
1948
|
-
/* @__PURE__ */ (0,
|
|
1949
|
-
/* @__PURE__ */ (0,
|
|
1950
|
-
/* @__PURE__ */ (0,
|
|
2394
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: cn("ph-field", wrapperClassName), children: [
|
|
2395
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("label", { htmlFor: id, className: "ph-label", children: label }),
|
|
2396
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("input", __spreadValues({ ref, id, type: "range", className: cn("ph-range", className) }, props)),
|
|
2397
|
+
(minLabel || valueLabel || maxLabel) && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex justify-between text-xs text-ph-mutedtext", children: [
|
|
2398
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: minLabel }),
|
|
2399
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: valueLabel }),
|
|
2400
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: maxLabel })
|
|
1951
2401
|
] })
|
|
1952
2402
|
] });
|
|
1953
2403
|
});
|
|
1954
2404
|
Range.displayName = "Range";
|
|
1955
|
-
var FileUpload = (0,
|
|
2405
|
+
var FileUpload = (0, import_react12.forwardRef)(function FileUpload2(_a, ref) {
|
|
1956
2406
|
var _b = _a, {
|
|
1957
2407
|
id: idProp,
|
|
1958
2408
|
label,
|
|
@@ -1966,12 +2416,12 @@ var FileUpload = (0, import_react10.forwardRef)(function FileUpload2(_a, ref) {
|
|
|
1966
2416
|
"wrapperClassName",
|
|
1967
2417
|
"className"
|
|
1968
2418
|
]);
|
|
1969
|
-
const autoId = (0,
|
|
2419
|
+
const autoId = (0, import_react12.useId)();
|
|
1970
2420
|
const id = idProp != null ? idProp : autoId;
|
|
1971
|
-
return /* @__PURE__ */ (0,
|
|
1972
|
-
label && /* @__PURE__ */ (0,
|
|
1973
|
-
/* @__PURE__ */ (0,
|
|
1974
|
-
/* @__PURE__ */ (0,
|
|
2421
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: cn("ph-field", wrapperClassName), children: [
|
|
2422
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("label", { htmlFor: id, className: "ph-label", children: label }),
|
|
2423
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("label", { htmlFor: id, className: "ph-file-upload", children: [
|
|
2424
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("input", __spreadValues({ ref, id, type: "file", className: cn("sr-only", className) }, props)),
|
|
1975
2425
|
prompt
|
|
1976
2426
|
] })
|
|
1977
2427
|
] });
|
|
@@ -1980,8 +2430,8 @@ FileUpload.displayName = "FileUpload";
|
|
|
1980
2430
|
|
|
1981
2431
|
// src/components/ui/Modal.tsx
|
|
1982
2432
|
var Dialog = __toESM(require("@radix-ui/react-dialog"));
|
|
1983
|
-
var
|
|
1984
|
-
var
|
|
2433
|
+
var import_react13 = require("react");
|
|
2434
|
+
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
1985
2435
|
var sizeMap3 = {
|
|
1986
2436
|
sm: "max-w-sm",
|
|
1987
2437
|
md: "max-w-lg",
|
|
@@ -2011,16 +2461,16 @@ function Modal({
|
|
|
2011
2461
|
"aria-labelledby": ariaLabelledBy
|
|
2012
2462
|
}) {
|
|
2013
2463
|
const canDismiss = Boolean(onClose);
|
|
2014
|
-
const restoreFocusRef = (0,
|
|
2015
|
-
return /* @__PURE__ */ (0,
|
|
2464
|
+
const restoreFocusRef = (0, import_react13.useRef)(null);
|
|
2465
|
+
return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
2016
2466
|
Dialog.Root,
|
|
2017
2467
|
{
|
|
2018
2468
|
open,
|
|
2019
2469
|
onOpenChange: (nextOpen) => {
|
|
2020
2470
|
if (!nextOpen) onClose == null ? void 0 : onClose();
|
|
2021
2471
|
},
|
|
2022
|
-
children: /* @__PURE__ */ (0,
|
|
2023
|
-
/* @__PURE__ */ (0,
|
|
2472
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(Dialog.Portal, { children: [
|
|
2473
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
2024
2474
|
Dialog.Overlay,
|
|
2025
2475
|
{
|
|
2026
2476
|
"data-test": dataTest,
|
|
@@ -2028,7 +2478,7 @@ function Modal({
|
|
|
2028
2478
|
style: zIndex ? { zIndex } : void 0
|
|
2029
2479
|
}
|
|
2030
2480
|
),
|
|
2031
|
-
/* @__PURE__ */ (0,
|
|
2481
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
2032
2482
|
Dialog.Content,
|
|
2033
2483
|
__spreadProps(__spreadValues(__spreadProps(__spreadValues(__spreadValues({
|
|
2034
2484
|
id,
|
|
@@ -2051,28 +2501,28 @@ function Modal({
|
|
|
2051
2501
|
onPointerDownOutside: (event) => {
|
|
2052
2502
|
if (!canDismiss || !closeOnOutsideClick) event.preventDefault();
|
|
2053
2503
|
},
|
|
2054
|
-
children: customLayout ? /* @__PURE__ */ (0,
|
|
2055
|
-
/* @__PURE__ */ (0,
|
|
2504
|
+
children: customLayout ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
|
|
2505
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Dialog.Title, { className: "sr-only", children: ariaLabel != null ? ariaLabel : "Dialog" }),
|
|
2056
2506
|
children
|
|
2057
|
-
] }) : /* @__PURE__ */ (0,
|
|
2058
|
-
title ? null : /* @__PURE__ */ (0,
|
|
2059
|
-
title || description || showCloseButton && canDismiss ? /* @__PURE__ */ (0,
|
|
2060
|
-
/* @__PURE__ */ (0,
|
|
2061
|
-
title ? /* @__PURE__ */ (0,
|
|
2062
|
-
description ? /* @__PURE__ */ (0,
|
|
2507
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
|
|
2508
|
+
title ? null : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Dialog.Title, { className: "sr-only", children: ariaLabel != null ? ariaLabel : "Dialog" }),
|
|
2509
|
+
title || description || showCloseButton && canDismiss ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("header", { className: "ph-modal-header", children: [
|
|
2510
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "min-w-0", children: [
|
|
2511
|
+
title ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Dialog.Title, { className: "text-lg font-bold text-ph-ink", children: title }) : null,
|
|
2512
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Dialog.Description, { className: "mt-1 text-sm text-ph-subtle", children: description }) : null
|
|
2063
2513
|
] }),
|
|
2064
|
-
showCloseButton && canDismiss ? /* @__PURE__ */ (0,
|
|
2514
|
+
showCloseButton && canDismiss ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Dialog.Close, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
|
|
2065
2515
|
"button",
|
|
2066
2516
|
{
|
|
2067
2517
|
type: "button",
|
|
2068
2518
|
className: "ph-modal-close",
|
|
2069
2519
|
"aria-label": "Close dialog",
|
|
2070
|
-
children: /* @__PURE__ */ (0,
|
|
2520
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconClose, { className: "h-5 w-5", "aria-hidden": true })
|
|
2071
2521
|
}
|
|
2072
2522
|
) }) : null
|
|
2073
2523
|
] }) : null,
|
|
2074
|
-
/* @__PURE__ */ (0,
|
|
2075
|
-
footer ? /* @__PURE__ */ (0,
|
|
2524
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: cn("ph-modal-body", bodyClassName), children }),
|
|
2525
|
+
footer ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ph-modal-footer", children: footer }) : null
|
|
2076
2526
|
] })
|
|
2077
2527
|
})
|
|
2078
2528
|
)
|
|
@@ -2082,19 +2532,19 @@ function Modal({
|
|
|
2082
2532
|
}
|
|
2083
2533
|
|
|
2084
2534
|
// src/components/ui/Panel.tsx
|
|
2085
|
-
var
|
|
2535
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
2086
2536
|
function Panel(_a) {
|
|
2087
2537
|
var _b = _a, { title, description, children, className } = _b, props = __objRest(_b, ["title", "description", "children", "className"]);
|
|
2088
|
-
return /* @__PURE__ */ (0,
|
|
2089
|
-
title && /* @__PURE__ */ (0,
|
|
2090
|
-
description && /* @__PURE__ */ (0,
|
|
2538
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-panel", className) }, props), { children: [
|
|
2539
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h3", { className: "text-lg font-semibold tracking-tight text-ph-ink", children: title }),
|
|
2540
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-sm text-ph-subtle", children: description }),
|
|
2091
2541
|
children
|
|
2092
2542
|
] }));
|
|
2093
2543
|
}
|
|
2094
2544
|
|
|
2095
2545
|
// src/components/ui/SearchInput.tsx
|
|
2096
|
-
var
|
|
2097
|
-
var
|
|
2546
|
+
var import_react14 = require("react");
|
|
2547
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
2098
2548
|
function SearchInput(_a) {
|
|
2099
2549
|
var _b = _a, {
|
|
2100
2550
|
id: idProp,
|
|
@@ -2115,12 +2565,12 @@ function SearchInput(_a) {
|
|
|
2115
2565
|
"wrapperClassName",
|
|
2116
2566
|
"placeholder"
|
|
2117
2567
|
]);
|
|
2118
|
-
const autoId = (0,
|
|
2568
|
+
const autoId = (0, import_react14.useId)();
|
|
2119
2569
|
const id = idProp != null ? idProp : autoId;
|
|
2120
|
-
return /* @__PURE__ */ (0,
|
|
2121
|
-
/* @__PURE__ */ (0,
|
|
2122
|
-
/* @__PURE__ */ (0,
|
|
2123
|
-
shortcut != null ? /* @__PURE__ */ (0,
|
|
2570
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: cn("relative", wrapperClassName), children: [
|
|
2571
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: id, className: hideLabel ? "sr-only" : "ph-label mb-1.5 block", children: label }),
|
|
2572
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "relative", children: [
|
|
2573
|
+
shortcut != null ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
2124
2574
|
"span",
|
|
2125
2575
|
{
|
|
2126
2576
|
className: "ph-shortcut pointer-events-none absolute left-3 top-1/2 z-10 -translate-y-1/2 text-xs",
|
|
@@ -2128,7 +2578,7 @@ function SearchInput(_a) {
|
|
|
2128
2578
|
children: shortcut
|
|
2129
2579
|
}
|
|
2130
2580
|
) : null,
|
|
2131
|
-
/* @__PURE__ */ (0,
|
|
2581
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
2132
2582
|
"input",
|
|
2133
2583
|
__spreadValues({
|
|
2134
2584
|
id,
|
|
@@ -2162,12 +2612,12 @@ function SearchGroup(_a) {
|
|
|
2162
2612
|
"wrapperClassName",
|
|
2163
2613
|
"className"
|
|
2164
2614
|
]);
|
|
2165
|
-
const autoId = (0,
|
|
2615
|
+
const autoId = (0, import_react14.useId)();
|
|
2166
2616
|
const id = idProp != null ? idProp : autoId;
|
|
2167
|
-
return /* @__PURE__ */ (0,
|
|
2168
|
-
/* @__PURE__ */ (0,
|
|
2169
|
-
/* @__PURE__ */ (0,
|
|
2170
|
-
/* @__PURE__ */ (0,
|
|
2617
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: cn("ph-field", wrapperClassName), children: [
|
|
2618
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: id, className: "ph-label", children: label }),
|
|
2619
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "ph-search-group flex w-full max-w-lg min-h-[2.3125rem] items-stretch divide-x divide-ph-border", children: [
|
|
2620
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
2171
2621
|
"input",
|
|
2172
2622
|
__spreadValues({
|
|
2173
2623
|
id,
|
|
@@ -2176,12 +2626,12 @@ function SearchGroup(_a) {
|
|
|
2176
2626
|
className: cn("ph-input ph-input-group-field min-w-0 flex-1", className)
|
|
2177
2627
|
}, props)
|
|
2178
2628
|
),
|
|
2179
|
-
/* @__PURE__ */ (0,
|
|
2629
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
2180
2630
|
Button,
|
|
2181
2631
|
{
|
|
2182
2632
|
type: "submit",
|
|
2183
2633
|
variant: "primary",
|
|
2184
|
-
icon: /* @__PURE__ */ (0,
|
|
2634
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(IconSearch, { className: "h-4 w-4", "aria-hidden": true }),
|
|
2185
2635
|
className: "ph-search-group__submit",
|
|
2186
2636
|
"aria-label": submitLabel
|
|
2187
2637
|
}
|
|
@@ -2191,7 +2641,7 @@ function SearchGroup(_a) {
|
|
|
2191
2641
|
}
|
|
2192
2642
|
|
|
2193
2643
|
// src/components/ui/Table.tsx
|
|
2194
|
-
var
|
|
2644
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
2195
2645
|
function Table({
|
|
2196
2646
|
data,
|
|
2197
2647
|
columns,
|
|
@@ -2201,27 +2651,47 @@ function Table({
|
|
|
2201
2651
|
getRowStyle,
|
|
2202
2652
|
getRowKey,
|
|
2203
2653
|
className,
|
|
2204
|
-
|
|
2654
|
+
tableClassName,
|
|
2655
|
+
variant = "default",
|
|
2656
|
+
caption,
|
|
2657
|
+
emptyState = "No data available."
|
|
2205
2658
|
}) {
|
|
2206
|
-
return /* @__PURE__ */ (0,
|
|
2659
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
2207
2660
|
"div",
|
|
2208
2661
|
{
|
|
2209
|
-
className: cn(
|
|
2662
|
+
className: cn(
|
|
2663
|
+
variant === "report" ? "ph-table-report-wrap" : "ph-table-wrap",
|
|
2664
|
+
compact && "ph-table-compact",
|
|
2665
|
+
className
|
|
2666
|
+
),
|
|
2667
|
+
role: "region",
|
|
2668
|
+
"aria-label": caption != null ? caption : "Data table",
|
|
2210
2669
|
tabIndex: 0,
|
|
2211
|
-
children: /* @__PURE__ */ (0,
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2670
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
2671
|
+
"table",
|
|
2672
|
+
{
|
|
2673
|
+
className: cn(
|
|
2674
|
+
variant === "report" ? "ph-table-report" : "ph-table",
|
|
2675
|
+
zebra && "ph-table-zebra",
|
|
2676
|
+
ribbon && "ph-table--ribbon",
|
|
2677
|
+
tableClassName
|
|
2678
|
+
),
|
|
2679
|
+
children: [
|
|
2680
|
+
caption && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("caption", { className: "sr-only", children: caption }),
|
|
2681
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("tr", { children: columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("th", { scope: "col", className: col.className, children: col.header }, col.key)) }) }),
|
|
2682
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)("tbody", { children: data.length === 0 ? emptyState === null ? null : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("td", { colSpan: columns.length, className: "ph-table-empty", children: emptyState }) }) : data.map((row, i) => {
|
|
2683
|
+
var _a;
|
|
2684
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("tr", { style: getRowStyle == null ? void 0 : getRowStyle(row), children: columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("td", { className: col.className, children: col.cell(row) }, col.key)) }, (_a = getRowKey == null ? void 0 : getRowKey(row, i)) != null ? _a : i);
|
|
2685
|
+
}) })
|
|
2686
|
+
]
|
|
2687
|
+
}
|
|
2688
|
+
)
|
|
2219
2689
|
}
|
|
2220
2690
|
);
|
|
2221
2691
|
}
|
|
2222
2692
|
|
|
2223
2693
|
// src/components/ui/Stat.tsx
|
|
2224
|
-
var
|
|
2694
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
2225
2695
|
var toneMap = {
|
|
2226
2696
|
default: "text-ph-ink",
|
|
2227
2697
|
brand: "text-ph-brand",
|
|
@@ -2238,16 +2708,16 @@ var statMap = {
|
|
|
2238
2708
|
};
|
|
2239
2709
|
function Stat(_a) {
|
|
2240
2710
|
var _b = _a, { icon, label, value, footer, tone = "default", className } = _b, props = __objRest(_b, ["icon", "label", "value", "footer", "tone", "className"]);
|
|
2241
|
-
return /* @__PURE__ */ (0,
|
|
2242
|
-
icon && /* @__PURE__ */ (0,
|
|
2243
|
-
/* @__PURE__ */ (0,
|
|
2244
|
-
/* @__PURE__ */ (0,
|
|
2245
|
-
footer && /* @__PURE__ */ (0,
|
|
2711
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("article", __spreadProps(__spreadValues({ className: cn("ph-stat", statMap[tone], className) }, props), { children: [
|
|
2712
|
+
icon && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: cn("mb-2 h-7 w-7", toneMap[tone]), children: icon }),
|
|
2713
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: cn("ph-stat-label", tone === "warning" && toneMap[tone]), children: label }),
|
|
2714
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: cn("ph-stat-val", toneMap[tone]), children: value }),
|
|
2715
|
+
footer && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-xs text-ph-subtle", children: footer })
|
|
2246
2716
|
] }));
|
|
2247
2717
|
}
|
|
2248
2718
|
|
|
2249
2719
|
// src/components/ui/ThemeDomSync.tsx
|
|
2250
|
-
var
|
|
2720
|
+
var import_react15 = require("react");
|
|
2251
2721
|
|
|
2252
2722
|
// src/themes/registry.ts
|
|
2253
2723
|
var DEFAULT_THEME_ID = "hedgehog-light";
|
|
@@ -2396,25 +2866,25 @@ function readStoredTheme() {
|
|
|
2396
2866
|
|
|
2397
2867
|
// src/components/ui/ThemeDomSync.tsx
|
|
2398
2868
|
function ThemeDomSync() {
|
|
2399
|
-
(0,
|
|
2869
|
+
(0, import_react15.useLayoutEffect)(() => {
|
|
2400
2870
|
persistTheme(readStoredTheme());
|
|
2401
2871
|
}, []);
|
|
2402
2872
|
return null;
|
|
2403
2873
|
}
|
|
2404
2874
|
|
|
2405
2875
|
// src/components/ui/ThemeSwitcher.tsx
|
|
2406
|
-
var
|
|
2407
|
-
var
|
|
2876
|
+
var import_react16 = require("react");
|
|
2877
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
2408
2878
|
function ThemeSwitcher({ className }) {
|
|
2409
|
-
const [themeId, setThemeId] = (0,
|
|
2410
|
-
(0,
|
|
2879
|
+
const [themeId, setThemeId] = (0, import_react16.useState)(DEFAULT_THEME_ID);
|
|
2880
|
+
(0, import_react16.useEffect)(() => {
|
|
2411
2881
|
const id = readStoredTheme();
|
|
2412
2882
|
persistTheme(id);
|
|
2413
2883
|
setThemeId(id);
|
|
2414
2884
|
}, []);
|
|
2415
|
-
return /* @__PURE__ */ (0,
|
|
2416
|
-
/* @__PURE__ */ (0,
|
|
2417
|
-
/* @__PURE__ */ (0,
|
|
2885
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("label", { className: cn("flex min-w-0 items-center gap-2", className), children: [
|
|
2886
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "shrink-0 text-xs font-medium text-ph-mutedtext sm:text-sm", children: "Theme" }),
|
|
2887
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
2418
2888
|
"select",
|
|
2419
2889
|
{
|
|
2420
2890
|
className: "ph-select max-w-[11rem] !min-h-[2rem] py-1 pl-2.5 pr-8 text-xs sm:max-w-[14rem] sm:text-sm",
|
|
@@ -2425,23 +2895,23 @@ function ThemeSwitcher({ className }) {
|
|
|
2425
2895
|
persistTheme(next);
|
|
2426
2896
|
setThemeId(next);
|
|
2427
2897
|
},
|
|
2428
|
-
children: THEME_GROUPS.map((group) => /* @__PURE__ */ (0,
|
|
2898
|
+
children: THEME_GROUPS.map((group) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("optgroup", { label: group, children: THEMES.filter((theme) => theme.group === group).map((theme) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("option", { value: theme.id, children: theme.name }, theme.id)) }, group))
|
|
2429
2899
|
}
|
|
2430
2900
|
)
|
|
2431
2901
|
] });
|
|
2432
2902
|
}
|
|
2433
2903
|
|
|
2434
2904
|
// src/components/ui/Accordion.tsx
|
|
2435
|
-
var
|
|
2436
|
-
var
|
|
2905
|
+
var import_react17 = require("react");
|
|
2906
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
2437
2907
|
function Accordion({
|
|
2438
2908
|
items,
|
|
2439
2909
|
allowMultiple = false,
|
|
2440
2910
|
defaultOpen = [],
|
|
2441
2911
|
className
|
|
2442
2912
|
}) {
|
|
2443
|
-
const [openItems, setOpenItems] = (0,
|
|
2444
|
-
const idPrefix = (0,
|
|
2913
|
+
const [openItems, setOpenItems] = (0, import_react17.useState)(new Set(defaultOpen));
|
|
2914
|
+
const idPrefix = (0, import_react17.useId)();
|
|
2445
2915
|
const toggleItem = (id) => {
|
|
2446
2916
|
setOpenItems((prev) => {
|
|
2447
2917
|
const next = new Set(prev);
|
|
@@ -2456,28 +2926,25 @@ function Accordion({
|
|
|
2456
2926
|
return next;
|
|
2457
2927
|
});
|
|
2458
2928
|
};
|
|
2459
|
-
return /* @__PURE__ */ (0,
|
|
2929
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
2460
2930
|
"div",
|
|
2461
2931
|
{
|
|
2462
|
-
className: cn(
|
|
2463
|
-
"divide-y divide-ph-border rounded-xl border border-ph-border bg-ph-surface",
|
|
2464
|
-
className
|
|
2465
|
-
),
|
|
2932
|
+
className: cn("ph-accordion", className),
|
|
2466
2933
|
children: items.map((item) => {
|
|
2467
2934
|
const isOpen = openItems.has(item.id);
|
|
2468
2935
|
const contentId = `accordion-${idPrefix}-${item.id}-content`;
|
|
2469
|
-
return /* @__PURE__ */ (0,
|
|
2470
|
-
/* @__PURE__ */ (0,
|
|
2936
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "ph-accordion__item", children: [
|
|
2937
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
|
|
2471
2938
|
"button",
|
|
2472
2939
|
{
|
|
2473
2940
|
type: "button",
|
|
2474
2941
|
onClick: () => toggleItem(item.id),
|
|
2475
2942
|
"aria-expanded": isOpen,
|
|
2476
2943
|
"aria-controls": contentId,
|
|
2477
|
-
className: "
|
|
2944
|
+
className: "ph-accordion__trigger",
|
|
2478
2945
|
children: [
|
|
2479
|
-
/* @__PURE__ */ (0,
|
|
2480
|
-
/* @__PURE__ */ (0,
|
|
2946
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "font-semibold text-ph-ink", children: item.title }),
|
|
2947
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
2481
2948
|
IconChevronDown,
|
|
2482
2949
|
{
|
|
2483
2950
|
className: cn(
|
|
@@ -2489,7 +2956,7 @@ function Accordion({
|
|
|
2489
2956
|
]
|
|
2490
2957
|
}
|
|
2491
2958
|
),
|
|
2492
|
-
/* @__PURE__ */ (0,
|
|
2959
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
2493
2960
|
"div",
|
|
2494
2961
|
{
|
|
2495
2962
|
id: contentId,
|
|
@@ -2498,10 +2965,10 @@ function Accordion({
|
|
|
2498
2965
|
if (node) node.toggleAttribute("inert", !isOpen);
|
|
2499
2966
|
},
|
|
2500
2967
|
className: cn(
|
|
2501
|
-
"grid transition-
|
|
2968
|
+
"grid transition-[grid-template-rows] duration-200",
|
|
2502
2969
|
isOpen ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
|
|
2503
2970
|
),
|
|
2504
|
-
children: /* @__PURE__ */ (0,
|
|
2971
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "px-5 pb-4 text-ph-subtle", children: item.content }) })
|
|
2505
2972
|
}
|
|
2506
2973
|
)
|
|
2507
2974
|
] }, item.id);
|
|
@@ -2511,27 +2978,68 @@ function Accordion({
|
|
|
2511
2978
|
}
|
|
2512
2979
|
|
|
2513
2980
|
// src/components/ui/SegmentedControl.tsx
|
|
2514
|
-
var
|
|
2515
|
-
|
|
2516
|
-
|
|
2981
|
+
var import_react18 = require("react");
|
|
2982
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
2983
|
+
function SegmentedControl({
|
|
2984
|
+
options,
|
|
2985
|
+
value,
|
|
2986
|
+
onChange,
|
|
2987
|
+
className,
|
|
2988
|
+
"aria-label": ariaLabel
|
|
2989
|
+
}) {
|
|
2990
|
+
const itemRefs = (0, import_react18.useRef)([]);
|
|
2991
|
+
const selectedIndex = options.findIndex((option) => option.value === value);
|
|
2992
|
+
const handleKeyDown = (event, index) => {
|
|
2993
|
+
var _a;
|
|
2994
|
+
let nextIndex;
|
|
2995
|
+
switch (event.key) {
|
|
2996
|
+
case "ArrowLeft":
|
|
2997
|
+
case "ArrowUp":
|
|
2998
|
+
nextIndex = (index - 1 + options.length) % options.length;
|
|
2999
|
+
break;
|
|
3000
|
+
case "ArrowRight":
|
|
3001
|
+
case "ArrowDown":
|
|
3002
|
+
nextIndex = (index + 1) % options.length;
|
|
3003
|
+
break;
|
|
3004
|
+
case "Home":
|
|
3005
|
+
nextIndex = 0;
|
|
3006
|
+
break;
|
|
3007
|
+
case "End":
|
|
3008
|
+
nextIndex = options.length - 1;
|
|
3009
|
+
break;
|
|
3010
|
+
default:
|
|
3011
|
+
return;
|
|
3012
|
+
}
|
|
3013
|
+
event.preventDefault();
|
|
3014
|
+
const nextOption = options[nextIndex];
|
|
3015
|
+
if (!nextOption) return;
|
|
3016
|
+
onChange(nextOption.value);
|
|
3017
|
+
(_a = itemRefs.current[nextIndex]) == null ? void 0 : _a.focus();
|
|
3018
|
+
};
|
|
3019
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
2517
3020
|
"div",
|
|
2518
3021
|
{
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
),
|
|
2523
|
-
children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
3022
|
+
role: "radiogroup",
|
|
3023
|
+
"aria-label": ariaLabel,
|
|
3024
|
+
className: cn("ph-segmented-control", className),
|
|
3025
|
+
children: options.map((option, index) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
|
|
2524
3026
|
"button",
|
|
2525
3027
|
{
|
|
3028
|
+
ref: (node) => {
|
|
3029
|
+
itemRefs.current[index] = node;
|
|
3030
|
+
},
|
|
2526
3031
|
type: "button",
|
|
2527
|
-
"
|
|
3032
|
+
role: "radio",
|
|
3033
|
+
"aria-checked": value === option.value,
|
|
3034
|
+
tabIndex: selectedIndex === index || selectedIndex < 0 && index === 0 ? 0 : -1,
|
|
2528
3035
|
onClick: () => onChange(option.value),
|
|
3036
|
+
onKeyDown: (event) => handleKeyDown(event, index),
|
|
2529
3037
|
className: cn(
|
|
2530
|
-
"
|
|
2531
|
-
value === option.value
|
|
3038
|
+
"ph-segmented-control__item",
|
|
3039
|
+
value === option.value && "ph-segmented-control__item--selected"
|
|
2532
3040
|
),
|
|
2533
3041
|
children: [
|
|
2534
|
-
option.icon && /* @__PURE__ */ (0,
|
|
3042
|
+
option.icon && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "h-4 w-4", "aria-hidden": true, children: option.icon }),
|
|
2535
3043
|
option.label
|
|
2536
3044
|
]
|
|
2537
3045
|
},
|
|
@@ -2542,9 +3050,9 @@ function SegmentedControl({ options, value, onChange, className }) {
|
|
|
2542
3050
|
}
|
|
2543
3051
|
|
|
2544
3052
|
// src/components/ui/CommandPalette.tsx
|
|
2545
|
-
var
|
|
3053
|
+
var import_react19 = require("react");
|
|
2546
3054
|
var Dialog2 = __toESM(require("@radix-ui/react-dialog"));
|
|
2547
|
-
var
|
|
3055
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
2548
3056
|
function CommandPalette({
|
|
2549
3057
|
items,
|
|
2550
3058
|
isOpen,
|
|
@@ -2556,27 +3064,27 @@ function CommandPalette({
|
|
|
2556
3064
|
inputId,
|
|
2557
3065
|
inputDataTest
|
|
2558
3066
|
}) {
|
|
2559
|
-
const [query, setQuery] = (0,
|
|
2560
|
-
const [selectedIndex, setSelectedIndex] = (0,
|
|
2561
|
-
const inputRef = (0,
|
|
2562
|
-
const listboxRef = (0,
|
|
2563
|
-
const restoreFocusRef = (0,
|
|
2564
|
-
const generatedId = (0,
|
|
3067
|
+
const [query, setQuery] = (0, import_react19.useState)("");
|
|
3068
|
+
const [selectedIndex, setSelectedIndex] = (0, import_react19.useState)(0);
|
|
3069
|
+
const inputRef = (0, import_react19.useRef)(null);
|
|
3070
|
+
const listboxRef = (0, import_react19.useRef)(null);
|
|
3071
|
+
const restoreFocusRef = (0, import_react19.useRef)(null);
|
|
3072
|
+
const generatedId = (0, import_react19.useId)();
|
|
2565
3073
|
const listboxId = `${id != null ? id : `command-palette-${generatedId}`}-listbox`;
|
|
2566
3074
|
const filtered = items.filter(
|
|
2567
3075
|
(item) => item.label.toLowerCase().includes(query.toLowerCase())
|
|
2568
3076
|
);
|
|
2569
3077
|
const activeIndex = filtered.length ? Math.min(selectedIndex, filtered.length - 1) : 0;
|
|
2570
3078
|
const activeItem = filtered[activeIndex];
|
|
2571
|
-
(0,
|
|
3079
|
+
(0, import_react19.useEffect)(() => {
|
|
2572
3080
|
if (!isOpen) return;
|
|
2573
3081
|
setQuery("");
|
|
2574
3082
|
setSelectedIndex(0);
|
|
2575
3083
|
}, [isOpen]);
|
|
2576
|
-
(0,
|
|
3084
|
+
(0, import_react19.useEffect)(() => {
|
|
2577
3085
|
setSelectedIndex((current) => Math.min(current, Math.max(filtered.length - 1, 0)));
|
|
2578
3086
|
}, [filtered.length]);
|
|
2579
|
-
(0,
|
|
3087
|
+
(0, import_react19.useEffect)(() => {
|
|
2580
3088
|
var _a, _b;
|
|
2581
3089
|
if (!isOpen || !activeItem) return;
|
|
2582
3090
|
(_b = (_a = listboxRef.current) == null ? void 0 : _a.querySelectorAll('[role="option"]')[activeIndex]) == null ? void 0 : _b.scrollIntoView({ block: "nearest" });
|
|
@@ -2605,29 +3113,26 @@ function CommandPalette({
|
|
|
2605
3113
|
return;
|
|
2606
3114
|
}
|
|
2607
3115
|
};
|
|
2608
|
-
return /* @__PURE__ */ (0,
|
|
3116
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
2609
3117
|
Dialog2.Root,
|
|
2610
3118
|
{
|
|
2611
3119
|
open: isOpen,
|
|
2612
3120
|
onOpenChange: (nextOpen) => {
|
|
2613
3121
|
if (!nextOpen) onClose();
|
|
2614
3122
|
},
|
|
2615
|
-
children: /* @__PURE__ */ (0,
|
|
2616
|
-
/* @__PURE__ */ (0,
|
|
3123
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Dialog2.Portal, { children: [
|
|
3124
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
2617
3125
|
Dialog2.Overlay,
|
|
2618
3126
|
{
|
|
2619
3127
|
id,
|
|
2620
3128
|
"data-test": dataTest,
|
|
2621
|
-
className: "
|
|
3129
|
+
className: "ph-command-palette__overlay"
|
|
2622
3130
|
}
|
|
2623
3131
|
),
|
|
2624
|
-
/* @__PURE__ */ (0,
|
|
3132
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
|
|
2625
3133
|
Dialog2.Content,
|
|
2626
3134
|
{
|
|
2627
|
-
className: cn(
|
|
2628
|
-
"fixed left-1/2 top-[20vh] z-50 w-full max-w-xl -translate-x-1/2 overflow-hidden rounded-xl border border-ph-border bg-ph-surface shadow-ph-md",
|
|
2629
|
-
className
|
|
2630
|
-
),
|
|
3135
|
+
className: cn("ph-command-palette", className),
|
|
2631
3136
|
onOpenAutoFocus: (event) => {
|
|
2632
3137
|
var _a;
|
|
2633
3138
|
restoreFocusRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
@@ -2640,10 +3145,10 @@ function CommandPalette({
|
|
|
2640
3145
|
(_a = restoreFocusRef.current) == null ? void 0 : _a.focus();
|
|
2641
3146
|
},
|
|
2642
3147
|
children: [
|
|
2643
|
-
/* @__PURE__ */ (0,
|
|
2644
|
-
/* @__PURE__ */ (0,
|
|
2645
|
-
/* @__PURE__ */ (0,
|
|
2646
|
-
/* @__PURE__ */ (0,
|
|
3148
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Dialog2.Title, { className: "sr-only", children: "Command palette" }),
|
|
3149
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "ph-command-palette__search", children: [
|
|
3150
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(IconSearch, { className: "h-5 w-5 text-ph-mutedtext" }),
|
|
3151
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
2647
3152
|
"input",
|
|
2648
3153
|
{
|
|
2649
3154
|
ref: inputRef,
|
|
@@ -2666,9 +3171,9 @@ function CommandPalette({
|
|
|
2666
3171
|
className: "flex-1 bg-transparent text-ph-ink outline-none placeholder:text-ph-mutedtext"
|
|
2667
3172
|
}
|
|
2668
3173
|
),
|
|
2669
|
-
/* @__PURE__ */ (0,
|
|
3174
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("kbd", { "aria-hidden": "true", className: "ph-keycap", children: "ESC" })
|
|
2670
3175
|
] }),
|
|
2671
|
-
/* @__PURE__ */ (0,
|
|
3176
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { ref: listboxRef, id: listboxId, role: "listbox", "aria-label": "Commands", className: "max-h-[50vh] overflow-y-auto py-2", children: filtered.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { role: "status", className: "px-4 py-8 text-center text-sm text-ph-mutedtext", children: "No results found." }) : filtered.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
|
|
2672
3177
|
"div",
|
|
2673
3178
|
{
|
|
2674
3179
|
id: `command-${item.id}`,
|
|
@@ -2681,13 +3186,13 @@ function CommandPalette({
|
|
|
2681
3186
|
},
|
|
2682
3187
|
onMouseEnter: () => setSelectedIndex(index),
|
|
2683
3188
|
className: cn(
|
|
2684
|
-
"
|
|
2685
|
-
index === activeIndex ? "
|
|
3189
|
+
"ph-command-palette__option",
|
|
3190
|
+
index === activeIndex ? "ph-command-palette__option--selected" : "text-ph-subtle"
|
|
2686
3191
|
),
|
|
2687
3192
|
children: [
|
|
2688
|
-
item.icon && /* @__PURE__ */ (0,
|
|
2689
|
-
/* @__PURE__ */ (0,
|
|
2690
|
-
item.shortcut && /* @__PURE__ */ (0,
|
|
3193
|
+
item.icon && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { "aria-hidden": "true", className: "h-5 w-5", children: item.icon }),
|
|
3194
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "flex-1", children: item.label }),
|
|
3195
|
+
item.shortcut && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("kbd", { "aria-hidden": "true", className: "ph-keycap text-ph-mutedtext", children: item.shortcut })
|
|
2691
3196
|
]
|
|
2692
3197
|
},
|
|
2693
3198
|
item.id
|
|
@@ -2701,8 +3206,8 @@ function CommandPalette({
|
|
|
2701
3206
|
}
|
|
2702
3207
|
|
|
2703
3208
|
// src/components/ui/Calendar.tsx
|
|
2704
|
-
var
|
|
2705
|
-
var
|
|
3209
|
+
var import_react20 = require("react");
|
|
3210
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
2706
3211
|
var monthNames = [
|
|
2707
3212
|
"January",
|
|
2708
3213
|
"February",
|
|
@@ -2759,19 +3264,19 @@ function dateLabel(date) {
|
|
|
2759
3264
|
return `${fullWeekDays[date.getDay()]}, ${date.getDate()} ${monthNames[date.getMonth()]} ${date.getFullYear()}`;
|
|
2760
3265
|
}
|
|
2761
3266
|
function Calendar({ value, onChange, className }) {
|
|
2762
|
-
const [currentMonth, setCurrentMonth] = (0,
|
|
2763
|
-
const [focusedDate, setFocusedDate] = (0,
|
|
2764
|
-
const gridRef = (0,
|
|
2765
|
-
const shouldFocusDateRef = (0,
|
|
2766
|
-
const monthLabelId = (0,
|
|
3267
|
+
const [currentMonth, setCurrentMonth] = (0, import_react20.useState)(() => startOfMonth(value != null ? value : /* @__PURE__ */ new Date()));
|
|
3268
|
+
const [focusedDate, setFocusedDate] = (0, import_react20.useState)(() => startOfDay(value != null ? value : /* @__PURE__ */ new Date()));
|
|
3269
|
+
const gridRef = (0, import_react20.useRef)(null);
|
|
3270
|
+
const shouldFocusDateRef = (0, import_react20.useRef)(false);
|
|
3271
|
+
const monthLabelId = (0, import_react20.useId)();
|
|
2767
3272
|
const today = startOfDay(/* @__PURE__ */ new Date());
|
|
2768
|
-
(0,
|
|
3273
|
+
(0, import_react20.useEffect)(() => {
|
|
2769
3274
|
if (!value) return;
|
|
2770
3275
|
const nextDate = startOfDay(value);
|
|
2771
3276
|
setCurrentMonth(startOfMonth(nextDate));
|
|
2772
3277
|
setFocusedDate(nextDate);
|
|
2773
3278
|
}, [value]);
|
|
2774
|
-
(0,
|
|
3279
|
+
(0, import_react20.useEffect)(() => {
|
|
2775
3280
|
var _a, _b;
|
|
2776
3281
|
if (!shouldFocusDateRef.current) return;
|
|
2777
3282
|
(_b = (_a = gridRef.current) == null ? void 0 : _a.querySelector(`[data-date="${dateKey(focusedDate)}"]`)) == null ? void 0 : _b.focus();
|
|
@@ -2840,36 +3345,36 @@ function Calendar({ value, onChange, className }) {
|
|
|
2840
3345
|
while (days.length < 42) {
|
|
2841
3346
|
days.push(null);
|
|
2842
3347
|
}
|
|
2843
|
-
return /* @__PURE__ */ (0,
|
|
2844
|
-
/* @__PURE__ */ (0,
|
|
2845
|
-
/* @__PURE__ */ (0,
|
|
3348
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: cn("ph-calendar w-[280px] p-4", className), children: [
|
|
3349
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "mb-4 flex items-center justify-between", children: [
|
|
3350
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2846
3351
|
"button",
|
|
2847
3352
|
{
|
|
2848
3353
|
type: "button",
|
|
2849
3354
|
onClick: () => changeMonth(-1),
|
|
2850
3355
|
"aria-label": "Previous month",
|
|
2851
|
-
className: "
|
|
2852
|
-
children: /* @__PURE__ */ (0,
|
|
3356
|
+
className: "ph-calendar__nav",
|
|
3357
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(IconChevronLeft, { className: "h-5 w-5", "aria-hidden": true })
|
|
2853
3358
|
}
|
|
2854
3359
|
),
|
|
2855
|
-
/* @__PURE__ */ (0,
|
|
3360
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("span", { id: monthLabelId, "aria-live": "polite", className: "text-sm font-semibold text-ph-ink", children: [
|
|
2856
3361
|
monthNames[month],
|
|
2857
3362
|
" ",
|
|
2858
3363
|
year
|
|
2859
3364
|
] }),
|
|
2860
|
-
/* @__PURE__ */ (0,
|
|
3365
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2861
3366
|
"button",
|
|
2862
3367
|
{
|
|
2863
3368
|
type: "button",
|
|
2864
3369
|
onClick: () => changeMonth(1),
|
|
2865
3370
|
"aria-label": "Next month",
|
|
2866
|
-
className: "
|
|
2867
|
-
children: /* @__PURE__ */ (0,
|
|
3371
|
+
className: "ph-calendar__nav",
|
|
3372
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(IconChevronRight, { className: "h-5 w-5", "aria-hidden": true })
|
|
2868
3373
|
}
|
|
2869
3374
|
)
|
|
2870
3375
|
] }),
|
|
2871
|
-
/* @__PURE__ */ (0,
|
|
2872
|
-
/* @__PURE__ */ (0,
|
|
3376
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { ref: gridRef, role: "grid", "aria-labelledby": monthLabelId, children: [
|
|
3377
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { role: "row", className: "grid grid-cols-7 gap-1", children: weekDays.map((day, index) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2873
3378
|
"div",
|
|
2874
3379
|
{
|
|
2875
3380
|
role: "columnheader",
|
|
@@ -2882,14 +3387,14 @@ function Calendar({ value, onChange, className }) {
|
|
|
2882
3387
|
Array.from({ length: 6 }, (_, week) => {
|
|
2883
3388
|
const weekDates = days.slice(week * 7, week * 7 + 7);
|
|
2884
3389
|
if (weekDates.length === 0 || weekDates.every((date) => !date)) return null;
|
|
2885
|
-
return /* @__PURE__ */ (0,
|
|
2886
|
-
(date, day) => date ? /* @__PURE__ */ (0,
|
|
3390
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { role: "row", className: "grid grid-cols-7 gap-1", children: weekDates.map(
|
|
3391
|
+
(date, day) => date ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2887
3392
|
"div",
|
|
2888
3393
|
{
|
|
2889
3394
|
role: "gridcell",
|
|
2890
3395
|
"aria-selected": value ? isSameDay(value, date) : false,
|
|
2891
3396
|
className: "aspect-square",
|
|
2892
|
-
children: /* @__PURE__ */ (0,
|
|
3397
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2893
3398
|
"button",
|
|
2894
3399
|
{
|
|
2895
3400
|
type: "button",
|
|
@@ -2900,15 +3405,15 @@ function Calendar({ value, onChange, className }) {
|
|
|
2900
3405
|
onClick: () => handleSelect(date),
|
|
2901
3406
|
onKeyDown: (event) => handleDayKeyDown(event, date),
|
|
2902
3407
|
className: cn(
|
|
2903
|
-
"
|
|
2904
|
-
value && isSameDay(value, date) ? "
|
|
3408
|
+
"ph-calendar__day",
|
|
3409
|
+
value && isSameDay(value, date) ? "ph-calendar__day--selected" : isSameDay(today, date) ? "ph-calendar__day--today" : void 0
|
|
2905
3410
|
),
|
|
2906
3411
|
children: date.getDate()
|
|
2907
3412
|
}
|
|
2908
3413
|
)
|
|
2909
3414
|
},
|
|
2910
3415
|
dateKey(date)
|
|
2911
|
-
) : /* @__PURE__ */ (0,
|
|
3416
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { role: "gridcell", "aria-hidden": "true", className: "aspect-square" }, `empty-${week}-${day}`)
|
|
2912
3417
|
) }, week);
|
|
2913
3418
|
})
|
|
2914
3419
|
] })
|
|
@@ -2916,15 +3421,15 @@ function Calendar({ value, onChange, className }) {
|
|
|
2916
3421
|
}
|
|
2917
3422
|
|
|
2918
3423
|
// src/components/ui/Tooltip.tsx
|
|
2919
|
-
var
|
|
3424
|
+
var import_react21 = require("react");
|
|
2920
3425
|
var import_react_dom = require("react-dom");
|
|
2921
|
-
var
|
|
2922
|
-
var TooltipDelayContext = (0,
|
|
3426
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
3427
|
+
var TooltipDelayContext = (0, import_react21.createContext)(0);
|
|
2923
3428
|
function TooltipProvider({
|
|
2924
3429
|
children,
|
|
2925
3430
|
delayDuration = 0
|
|
2926
3431
|
}) {
|
|
2927
|
-
return /* @__PURE__ */ (0,
|
|
3432
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(TooltipDelayContext.Provider, { value: delayDuration, children });
|
|
2928
3433
|
}
|
|
2929
3434
|
function tooltipPosition(trigger, content, side, align, offset, collisionPadding) {
|
|
2930
3435
|
const horizontal = align === "start" ? trigger.left : align === "end" ? trigger.right : trigger.left + trigger.width / 2;
|
|
@@ -2951,13 +3456,13 @@ function Tooltip({
|
|
|
2951
3456
|
delayDuration,
|
|
2952
3457
|
disableHoverableContent = false
|
|
2953
3458
|
}) {
|
|
2954
|
-
const providerDelay = (0,
|
|
2955
|
-
const generatedId = (0,
|
|
2956
|
-
const triggerRef = (0,
|
|
2957
|
-
const contentRef = (0,
|
|
2958
|
-
const timerRef = (0,
|
|
2959
|
-
const [internalOpen, setInternalOpen] = (0,
|
|
2960
|
-
const [position, setPosition] = (0,
|
|
3459
|
+
const providerDelay = (0, import_react21.useContext)(TooltipDelayContext);
|
|
3460
|
+
const generatedId = (0, import_react21.useId)().replace(/:/g, "");
|
|
3461
|
+
const triggerRef = (0, import_react21.useRef)(null);
|
|
3462
|
+
const contentRef = (0, import_react21.useRef)(null);
|
|
3463
|
+
const timerRef = (0, import_react21.useRef)(null);
|
|
3464
|
+
const [internalOpen, setInternalOpen] = (0, import_react21.useState)(defaultOpen);
|
|
3465
|
+
const [position, setPosition] = (0, import_react21.useState)(null);
|
|
2961
3466
|
const isOpen = open != null ? open : internalOpen;
|
|
2962
3467
|
const triggerId = children.props.id;
|
|
2963
3468
|
const tooltipId = triggerId ? `${triggerId}-tooltip` : `ph-tooltip-${generatedId}`;
|
|
@@ -2969,7 +3474,7 @@ function Tooltip({
|
|
|
2969
3474
|
if (timerRef.current) clearTimeout(timerRef.current);
|
|
2970
3475
|
timerRef.current = null;
|
|
2971
3476
|
}
|
|
2972
|
-
const updatePosition = (0,
|
|
3477
|
+
const updatePosition = (0, import_react21.useCallback)(() => {
|
|
2973
3478
|
if (!triggerRef.current || !contentRef.current) return;
|
|
2974
3479
|
setPosition(
|
|
2975
3480
|
tooltipPosition(
|
|
@@ -3001,10 +3506,10 @@ function Tooltip({
|
|
|
3001
3506
|
clearTimer();
|
|
3002
3507
|
timerRef.current = setTimeout(() => setOpen(false), 100);
|
|
3003
3508
|
}
|
|
3004
|
-
(0,
|
|
3509
|
+
(0, import_react21.useLayoutEffect)(() => {
|
|
3005
3510
|
if (isOpen) updatePosition();
|
|
3006
3511
|
}, [isOpen, updatePosition]);
|
|
3007
|
-
(0,
|
|
3512
|
+
(0, import_react21.useEffect)(() => {
|
|
3008
3513
|
if (!isOpen) return;
|
|
3009
3514
|
const reposition = () => updatePosition();
|
|
3010
3515
|
window.addEventListener("resize", reposition);
|
|
@@ -3014,11 +3519,11 @@ function Tooltip({
|
|
|
3014
3519
|
window.removeEventListener("scroll", reposition, true);
|
|
3015
3520
|
};
|
|
3016
3521
|
}, [isOpen, updatePosition]);
|
|
3017
|
-
(0,
|
|
3522
|
+
(0, import_react21.useEffect)(() => () => clearTimer(), []);
|
|
3018
3523
|
const describedBy = [children.props["aria-describedby"], tooltipId].filter(Boolean).join(" ");
|
|
3019
|
-
const trigger = (0,
|
|
3020
|
-
return /* @__PURE__ */ (0,
|
|
3021
|
-
/* @__PURE__ */ (0,
|
|
3524
|
+
const trigger = (0, import_react21.cloneElement)(children, { "aria-describedby": describedBy });
|
|
3525
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [
|
|
3526
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
3022
3527
|
"span",
|
|
3023
3528
|
{
|
|
3024
3529
|
ref: triggerRef,
|
|
@@ -3034,12 +3539,12 @@ function Tooltip({
|
|
|
3034
3539
|
}
|
|
3035
3540
|
),
|
|
3036
3541
|
isOpen && typeof document !== "undefined" ? (0, import_react_dom.createPortal)(
|
|
3037
|
-
/* @__PURE__ */ (0,
|
|
3542
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
3038
3543
|
"span",
|
|
3039
3544
|
{
|
|
3040
3545
|
style: __spreadProps(__spreadValues({ position: "fixed" }, position), { visibility: position ? void 0 : "hidden" }),
|
|
3041
3546
|
className: "pointer-events-none z-[200]",
|
|
3042
|
-
children: /* @__PURE__ */ (0,
|
|
3547
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
3043
3548
|
"span",
|
|
3044
3549
|
{
|
|
3045
3550
|
ref: contentRef,
|
|
@@ -3064,27 +3569,27 @@ function Tooltip({
|
|
|
3064
3569
|
}
|
|
3065
3570
|
|
|
3066
3571
|
// src/components/ui/EmptyState.tsx
|
|
3067
|
-
var
|
|
3572
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
3068
3573
|
function EmptyState({ icon, title, description, action, className }) {
|
|
3069
|
-
return /* @__PURE__ */ (0,
|
|
3574
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
3070
3575
|
"div",
|
|
3071
3576
|
{
|
|
3072
3577
|
className: cn(
|
|
3073
|
-
"
|
|
3578
|
+
"ph-empty-state",
|
|
3074
3579
|
className
|
|
3075
3580
|
),
|
|
3076
3581
|
children: [
|
|
3077
|
-
icon && /* @__PURE__ */ (0,
|
|
3078
|
-
/* @__PURE__ */ (0,
|
|
3079
|
-
description && /* @__PURE__ */ (0,
|
|
3080
|
-
action && /* @__PURE__ */ (0,
|
|
3582
|
+
icon && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "ph-empty-state__icon", children: icon }),
|
|
3583
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("h2", { className: "text-base font-semibold text-ph-ink", children: title }),
|
|
3584
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "mt-1 max-w-sm text-sm text-ph-subtle", children: description }),
|
|
3585
|
+
action && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "mt-4", children: action })
|
|
3081
3586
|
]
|
|
3082
3587
|
}
|
|
3083
3588
|
);
|
|
3084
3589
|
}
|
|
3085
3590
|
|
|
3086
3591
|
// src/components/ui/FilterChips.tsx
|
|
3087
|
-
var
|
|
3592
|
+
var import_jsx_runtime30 = require("react/jsx-runtime");
|
|
3088
3593
|
function FilterChips({
|
|
3089
3594
|
chips,
|
|
3090
3595
|
onToggle,
|
|
@@ -3092,20 +3597,20 @@ function FilterChips({
|
|
|
3092
3597
|
className,
|
|
3093
3598
|
"aria-label": ariaLabel = "Applied filters"
|
|
3094
3599
|
}) {
|
|
3095
|
-
return /* @__PURE__ */ (0,
|
|
3600
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: cn("ph-filter-chips", className), role: "group", "aria-label": ariaLabel, children: chips.map((chip) => {
|
|
3096
3601
|
var _a;
|
|
3097
3602
|
const label = (_a = chip.removeLabel) != null ? _a : getChipText(chip);
|
|
3098
|
-
const content = /* @__PURE__ */ (0,
|
|
3099
|
-
/* @__PURE__ */ (0,
|
|
3100
|
-
chip.value != null ? /* @__PURE__ */ (0,
|
|
3603
|
+
const content = /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
|
|
3604
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "ph-filter-chip__label", children: chip.label }),
|
|
3605
|
+
chip.value != null ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "ph-filter-chip__value", children: chip.value }) : null
|
|
3101
3606
|
] });
|
|
3102
|
-
return /* @__PURE__ */ (0,
|
|
3607
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
|
|
3103
3608
|
"span",
|
|
3104
3609
|
{
|
|
3105
3610
|
className: cn("ph-filter-chip", chip.active && "ph-filter-chip--active"),
|
|
3106
3611
|
"data-state": chip.active ? "on" : "off",
|
|
3107
3612
|
children: [
|
|
3108
|
-
onToggle ? /* @__PURE__ */ (0,
|
|
3613
|
+
onToggle ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
3109
3614
|
"button",
|
|
3110
3615
|
{
|
|
3111
3616
|
type: "button",
|
|
@@ -3114,15 +3619,15 @@ function FilterChips({
|
|
|
3114
3619
|
onClick: () => onToggle(chip.id),
|
|
3115
3620
|
children: content
|
|
3116
3621
|
}
|
|
3117
|
-
) : /* @__PURE__ */ (0,
|
|
3118
|
-
chip.active && onRemove ? /* @__PURE__ */ (0,
|
|
3622
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "ph-filter-chip__main", children: content }),
|
|
3623
|
+
chip.active && onRemove ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
3119
3624
|
"button",
|
|
3120
3625
|
{
|
|
3121
3626
|
type: "button",
|
|
3122
3627
|
className: "ph-filter-chip__remove",
|
|
3123
3628
|
"aria-label": `Remove ${label} filter`,
|
|
3124
3629
|
onClick: () => onRemove(chip.id),
|
|
3125
|
-
children: /* @__PURE__ */ (0,
|
|
3630
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(IconClose, { className: "h-3 w-3", "aria-hidden": true })
|
|
3126
3631
|
}
|
|
3127
3632
|
) : null
|
|
3128
3633
|
]
|
|
@@ -3138,7 +3643,7 @@ function getChipText(chip) {
|
|
|
3138
3643
|
}
|
|
3139
3644
|
|
|
3140
3645
|
// src/components/ui/FilterBar.tsx
|
|
3141
|
-
var
|
|
3646
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
3142
3647
|
function FilterBar(_a) {
|
|
3143
3648
|
var _b = _a, {
|
|
3144
3649
|
children,
|
|
@@ -3155,12 +3660,12 @@ function FilterBar(_a) {
|
|
|
3155
3660
|
"resultCount",
|
|
3156
3661
|
"className"
|
|
3157
3662
|
]);
|
|
3158
|
-
return /* @__PURE__ */ (0,
|
|
3159
|
-
/* @__PURE__ */ (0,
|
|
3663
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-filter-bar", className) }, props), { children: [
|
|
3664
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "ph-filter-bar__controls", role: "group", "aria-label": label, children: [
|
|
3160
3665
|
children,
|
|
3161
|
-
onClear ? /* @__PURE__ */ (0,
|
|
3666
|
+
onClear ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("button", { type: "button", className: "ph-filter-bar__clear", onClick: onClear, children: clearLabel }) : null
|
|
3162
3667
|
] }),
|
|
3163
|
-
resultCount != null ? /* @__PURE__ */ (0,
|
|
3668
|
+
resultCount != null ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("output", { className: "ph-filter-bar__results", "aria-live": "polite", children: resultCount }) : null
|
|
3164
3669
|
] }));
|
|
3165
3670
|
}
|
|
3166
3671
|
function FilterMenu({
|
|
@@ -3177,19 +3682,19 @@ function FilterMenu({
|
|
|
3177
3682
|
const selected = options.find((option) => option.value === value);
|
|
3178
3683
|
const displayValue = (_a = selected == null ? void 0 : selected.label) != null ? _a : placeholder;
|
|
3179
3684
|
const accessibleValue = selected ? getOptionText(selected) : String(placeholder);
|
|
3180
|
-
return /* @__PURE__ */ (0,
|
|
3685
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
3181
3686
|
DropdownMenu,
|
|
3182
3687
|
{
|
|
3183
3688
|
"aria-label": `${label}: ${accessibleValue}`,
|
|
3184
3689
|
align,
|
|
3185
3690
|
disabled,
|
|
3186
3691
|
className,
|
|
3187
|
-
trigger: /* @__PURE__ */ (0,
|
|
3188
|
-
/* @__PURE__ */ (0,
|
|
3189
|
-
/* @__PURE__ */ (0,
|
|
3190
|
-
/* @__PURE__ */ (0,
|
|
3692
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("span", { className: cn("ph-filter-menu-trigger", selected && "ph-filter-menu-trigger--active"), children: [
|
|
3693
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(IconTuning, { className: "h-3.5 w-3.5", "aria-hidden": true }),
|
|
3694
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "ph-filter-menu-trigger__label", children: label }),
|
|
3695
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "ph-filter-menu-trigger__value", children: displayValue })
|
|
3191
3696
|
] }),
|
|
3192
|
-
children: /* @__PURE__ */ (0,
|
|
3697
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(DropdownRadioGroup, { value, onValueChange, children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
3193
3698
|
DropdownRadioItem,
|
|
3194
3699
|
{
|
|
3195
3700
|
value: option.value,
|
|
@@ -3213,25 +3718,25 @@ function SortMenu({
|
|
|
3213
3718
|
className
|
|
3214
3719
|
}) {
|
|
3215
3720
|
const selected = options.find((option) => option.value === value);
|
|
3216
|
-
return /* @__PURE__ */ (0,
|
|
3721
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
3217
3722
|
DropdownMenu,
|
|
3218
3723
|
{
|
|
3219
3724
|
"aria-label": `${label}: ${selected ? getOptionText(selected) : "Choose sort order"}`,
|
|
3220
3725
|
align,
|
|
3221
3726
|
disabled,
|
|
3222
3727
|
className,
|
|
3223
|
-
trigger: /* @__PURE__ */ (0,
|
|
3224
|
-
/* @__PURE__ */ (0,
|
|
3728
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("span", { className: "ph-filter-menu-trigger ph-sort-menu-trigger", children: [
|
|
3729
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
3225
3730
|
IconArrowDown,
|
|
3226
3731
|
{
|
|
3227
3732
|
className: cn("h-3.5 w-3.5", direction === "ascending" && "rotate-180"),
|
|
3228
3733
|
"aria-hidden": true
|
|
3229
3734
|
}
|
|
3230
3735
|
),
|
|
3231
|
-
/* @__PURE__ */ (0,
|
|
3232
|
-
selected ? /* @__PURE__ */ (0,
|
|
3736
|
+
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "ph-filter-menu-trigger__label", children: label }),
|
|
3737
|
+
selected ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "ph-filter-menu-trigger__value", children: selected.label }) : null
|
|
3233
3738
|
] }),
|
|
3234
|
-
children: /* @__PURE__ */ (0,
|
|
3739
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(DropdownRadioGroup, { value, onValueChange, children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
3235
3740
|
DropdownRadioItem,
|
|
3236
3741
|
{
|
|
3237
3742
|
value: option.value,
|
|
@@ -3251,7 +3756,7 @@ function getOptionText(option) {
|
|
|
3251
3756
|
}
|
|
3252
3757
|
|
|
3253
3758
|
// src/components/ui/FilterControls.tsx
|
|
3254
|
-
var
|
|
3759
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
3255
3760
|
function FilterControls(_a) {
|
|
3256
3761
|
var _b = _a, {
|
|
3257
3762
|
children,
|
|
@@ -3267,71 +3772,73 @@ function FilterControls(_a) {
|
|
|
3267
3772
|
"className"
|
|
3268
3773
|
]);
|
|
3269
3774
|
const hasChips = Boolean(chipsProps == null ? void 0 : chipsProps.chips.length);
|
|
3270
|
-
return /* @__PURE__ */ (0,
|
|
3271
|
-
/* @__PURE__ */ (0,
|
|
3272
|
-
hasChips && chipsProps ? /* @__PURE__ */ (0,
|
|
3775
|
+
return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-filter-controls", className) }, props), { children: [
|
|
3776
|
+
/* @__PURE__ */ (0, import_jsx_runtime32.jsx)(FilterBar, __spreadProps(__spreadValues({}, barProps), { children })),
|
|
3777
|
+
hasChips && chipsProps ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(FilterChips, __spreadValues({}, chipsProps)) : emptyState != null ? emptyState : null
|
|
3273
3778
|
] }));
|
|
3274
3779
|
}
|
|
3275
3780
|
|
|
3276
3781
|
// src/components/ui/CodeBlock.tsx
|
|
3277
|
-
var
|
|
3278
|
-
var
|
|
3782
|
+
var import_react22 = require("react");
|
|
3783
|
+
var import_jsx_runtime33 = require("react/jsx-runtime");
|
|
3279
3784
|
function CodeBlock({ code, language = "tsx", filename, className }) {
|
|
3280
|
-
const [copied, setCopied] = (0,
|
|
3785
|
+
const [copied, setCopied] = (0, import_react22.useState)(false);
|
|
3281
3786
|
const handleCopy = async () => {
|
|
3282
|
-
|
|
3787
|
+
try {
|
|
3788
|
+
await navigator.clipboard.writeText(code);
|
|
3789
|
+
} catch (e) {
|
|
3790
|
+
return;
|
|
3791
|
+
}
|
|
3792
|
+
trackSuiteEvent("Link Copied", {
|
|
3793
|
+
kind: "code",
|
|
3794
|
+
copy_kind: "code_block",
|
|
3795
|
+
label: filename != null ? filename : language
|
|
3796
|
+
});
|
|
3283
3797
|
setCopied(true);
|
|
3284
3798
|
setTimeout(() => setCopied(false), 2e3);
|
|
3285
3799
|
};
|
|
3286
|
-
return /* @__PURE__ */ (0,
|
|
3287
|
-
(filename || language) && /* @__PURE__ */ (0,
|
|
3288
|
-
/* @__PURE__ */ (0,
|
|
3289
|
-
|
|
3290
|
-
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "h-3 w-3 rounded-full bg-red-400" }),
|
|
3291
|
-
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "h-3 w-3 rounded-full bg-amber-400" }),
|
|
3292
|
-
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "h-3 w-3 rounded-full bg-emerald-400" })
|
|
3293
|
-
] }),
|
|
3294
|
-
filename && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "ml-2 text-xs text-white/60", children: filename })
|
|
3295
|
-
] }),
|
|
3296
|
-
/* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
3800
|
+
return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: cn("ph-code-block", className), children: [
|
|
3801
|
+
(filename || language) && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center justify-between border-b border-white/10 px-4 py-2", children: [
|
|
3802
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-xs text-white/60", children: filename != null ? filename : language }),
|
|
3803
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
3297
3804
|
"button",
|
|
3298
3805
|
{
|
|
3299
3806
|
type: "button",
|
|
3300
3807
|
onClick: handleCopy,
|
|
3301
|
-
className: "
|
|
3808
|
+
className: "ph-code-block__copy",
|
|
3302
3809
|
children: copied ? "Copied!" : "Copy"
|
|
3303
3810
|
}
|
|
3304
3811
|
)
|
|
3305
3812
|
] }),
|
|
3306
|
-
/* @__PURE__ */ (0,
|
|
3813
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("pre", { className: "overflow-x-auto p-4 text-sm leading-relaxed", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("code", { className: "font-mono text-[#e4e4e7]", children: code }) })
|
|
3307
3814
|
] });
|
|
3308
3815
|
}
|
|
3309
3816
|
|
|
3310
3817
|
// src/components/ui/ComponentDocs.tsx
|
|
3311
|
-
var
|
|
3818
|
+
var import_jsx_runtime34 = require("react/jsx-runtime");
|
|
3312
3819
|
function ComponentDocs({ title = "Props & variants", rows, defaultOpen = false, className }) {
|
|
3313
|
-
return /* @__PURE__ */ (0,
|
|
3314
|
-
/* @__PURE__ */ (0,
|
|
3315
|
-
/* @__PURE__ */ (0,
|
|
3316
|
-
/* @__PURE__ */ (0,
|
|
3317
|
-
/* @__PURE__ */ (0,
|
|
3318
|
-
/* @__PURE__ */ (0,
|
|
3820
|
+
return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("details", { className: cn("ph-panel group overflow-hidden p-0", className), open: defaultOpen, children: [
|
|
3821
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-4 border-b border-ph-border px-4 py-3 transition hover:bg-ph-muted/60 [&::-webkit-details-marker]:hidden", children: [
|
|
3822
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("h3", { className: "text-xs font-semibold uppercase tracking-wider text-ph-mutedtext", children: title }),
|
|
3823
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: "rounded-full border border-ph-border bg-ph-surface px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-ph-mutedtext transition group-open:bg-ph-brand group-open:text-white", children: [
|
|
3824
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "group-open:hidden", children: "Show" }),
|
|
3825
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "hidden group-open:inline", children: "Hide" })
|
|
3319
3826
|
] })
|
|
3320
3827
|
] }),
|
|
3321
|
-
/* @__PURE__ */ (0,
|
|
3322
|
-
/* @__PURE__ */ (0,
|
|
3323
|
-
/* @__PURE__ */ (0,
|
|
3324
|
-
/* @__PURE__ */ (0,
|
|
3325
|
-
/* @__PURE__ */ (0,
|
|
3326
|
-
/* @__PURE__ */ (0,
|
|
3828
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "overflow-x-auto border-t border-ph-border", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("table", { className: "w-full text-left text-sm", children: [
|
|
3829
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("thead", { className: "bg-ph-muted text-xs uppercase tracking-wider text-ph-mutedtext", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("tr", { children: [
|
|
3830
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("th", { className: "px-4 py-2 font-semibold", children: "Prop" }),
|
|
3831
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("th", { className: "px-4 py-2 font-semibold", children: "Type" }),
|
|
3832
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("th", { className: "px-4 py-2 font-semibold", children: "Default" }),
|
|
3833
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("th", { className: "px-4 py-2 font-semibold", children: "Use" })
|
|
3327
3834
|
] }) }),
|
|
3328
|
-
/* @__PURE__ */ (0,
|
|
3835
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("tbody", { className: "divide-y divide-ph-border", children: rows.map((row) => {
|
|
3329
3836
|
var _a, _b;
|
|
3330
|
-
return /* @__PURE__ */ (0,
|
|
3331
|
-
/* @__PURE__ */ (0,
|
|
3332
|
-
/* @__PURE__ */ (0,
|
|
3333
|
-
/* @__PURE__ */ (0,
|
|
3334
|
-
/* @__PURE__ */ (0,
|
|
3837
|
+
return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("tr", { children: [
|
|
3838
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-ink", children: row.name }),
|
|
3839
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: row.type }),
|
|
3840
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: (_a = row.defaultValue) != null ? _a : "-" }),
|
|
3841
|
+
/* @__PURE__ */ (0, import_jsx_runtime34.jsx)("td", { className: "px-4 py-3 align-top text-ph-subtle", children: (_b = row.description) != null ? _b : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "text-ph-mutedtext", children: "\u2014" }) })
|
|
3335
3842
|
] }, row.name);
|
|
3336
3843
|
}) })
|
|
3337
3844
|
] }) })
|
|
@@ -3339,8 +3846,8 @@ function ComponentDocs({ title = "Props & variants", rows, defaultOpen = false,
|
|
|
3339
3846
|
}
|
|
3340
3847
|
|
|
3341
3848
|
// src/components/ui/ShowcaseWrapper.tsx
|
|
3342
|
-
var
|
|
3343
|
-
var
|
|
3849
|
+
var import_react23 = require("react");
|
|
3850
|
+
var import_jsx_runtime35 = require("react/jsx-runtime");
|
|
3344
3851
|
function ShowcaseWrapper({
|
|
3345
3852
|
id,
|
|
3346
3853
|
title,
|
|
@@ -3352,32 +3859,32 @@ function ShowcaseWrapper({
|
|
|
3352
3859
|
className
|
|
3353
3860
|
}) {
|
|
3354
3861
|
var _a;
|
|
3355
|
-
const [showCode, setShowCode] = (0,
|
|
3862
|
+
const [showCode, setShowCode] = (0, import_react23.useState)(false);
|
|
3356
3863
|
const fallbackId = (_a = titleIdMap[title]) != null ? _a : title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
3357
|
-
return /* @__PURE__ */ (0,
|
|
3358
|
-
/* @__PURE__ */ (0,
|
|
3359
|
-
/* @__PURE__ */ (0,
|
|
3360
|
-
/* @__PURE__ */ (0,
|
|
3361
|
-
/* @__PURE__ */ (0,
|
|
3864
|
+
return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("section", { id: id != null ? id : fallbackId, className: cn("scroll-mt-20", className), children: [
|
|
3865
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "ph-h2-rule mb-8", children: [
|
|
3866
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "flex items-center gap-1.5", children: [
|
|
3867
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("h2", { children: title }),
|
|
3868
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
3362
3869
|
"button",
|
|
3363
3870
|
{
|
|
3364
3871
|
type: "button",
|
|
3365
3872
|
onClick: () => setShowCode(!showCode),
|
|
3366
3873
|
className: cn(
|
|
3367
|
-
"flex h-10 w-10 items-center justify-center rounded-full border transition-
|
|
3368
|
-
showCode ? "border-ph-brand bg-ph-brand text-[var(--ph-on-accent)] shadow-
|
|
3874
|
+
"ph-showcase-toggle flex h-10 w-10 items-center justify-center rounded-full border transition-colors",
|
|
3875
|
+
showCode ? "border-ph-brand bg-ph-brand text-[var(--ph-on-accent)] shadow-[var(--ph-shadow-control)]" : "border-ph-border bg-ph-surface text-ph-subtle hover:border-ph-brand hover:text-ph-brand"
|
|
3369
3876
|
),
|
|
3370
3877
|
title: showCode ? "Hide code" : "Show code",
|
|
3371
3878
|
"aria-label": showCode ? "Hide code" : "Show code",
|
|
3372
|
-
children: /* @__PURE__ */ (0,
|
|
3879
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(IconCodePreview, { className: "h-5 w-5", "aria-hidden": true })
|
|
3373
3880
|
}
|
|
3374
3881
|
)
|
|
3375
3882
|
] }),
|
|
3376
|
-
/* @__PURE__ */ (0,
|
|
3883
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("hr", {})
|
|
3377
3884
|
] }),
|
|
3378
|
-
description && /* @__PURE__ */ (0,
|
|
3379
|
-
docs && /* @__PURE__ */ (0,
|
|
3380
|
-
/* @__PURE__ */ (0,
|
|
3885
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("p", { className: "mb-6 text-sm text-ph-subtle", children: description }),
|
|
3886
|
+
docs && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "mb-6", children: docs }),
|
|
3887
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
|
|
3381
3888
|
"div",
|
|
3382
3889
|
{
|
|
3383
3890
|
className: cn(
|
|
@@ -3385,15 +3892,15 @@ function ShowcaseWrapper({
|
|
|
3385
3892
|
showCode ? "lg:grid lg:grid-cols-[1fr,minmax(360px,420px)]" : "block"
|
|
3386
3893
|
),
|
|
3387
3894
|
children: [
|
|
3388
|
-
/* @__PURE__ */ (0,
|
|
3389
|
-
/* @__PURE__ */ (0,
|
|
3895
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: cn("min-w-0", showCode && "lg:pr-2"), children }),
|
|
3896
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
3390
3897
|
"div",
|
|
3391
3898
|
{
|
|
3392
3899
|
className: cn(
|
|
3393
|
-
"transition-
|
|
3900
|
+
"transition-opacity duration-200",
|
|
3394
3901
|
showCode ? "block opacity-100" : "hidden opacity-0 lg:hidden"
|
|
3395
3902
|
),
|
|
3396
|
-
children: /* @__PURE__ */ (0,
|
|
3903
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "sticky top-20", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(CodeBlock, { code, filename }) })
|
|
3397
3904
|
}
|
|
3398
3905
|
)
|
|
3399
3906
|
]
|
|
@@ -3442,29 +3949,29 @@ var titleIdMap = {
|
|
|
3442
3949
|
};
|
|
3443
3950
|
|
|
3444
3951
|
// src/components/ui/CollapsibleSection.tsx
|
|
3445
|
-
var
|
|
3446
|
-
var
|
|
3952
|
+
var import_react24 = require("react");
|
|
3953
|
+
var import_jsx_runtime36 = require("react/jsx-runtime");
|
|
3447
3954
|
function CollapsibleSection({
|
|
3448
3955
|
title,
|
|
3449
3956
|
children,
|
|
3450
3957
|
defaultOpen = true,
|
|
3451
3958
|
id
|
|
3452
3959
|
}) {
|
|
3453
|
-
const [isOpen, setIsOpen] = (0,
|
|
3454
|
-
const generatedId = (0,
|
|
3960
|
+
const [isOpen, setIsOpen] = (0, import_react24.useState)(defaultOpen);
|
|
3961
|
+
const generatedId = (0, import_react24.useId)();
|
|
3455
3962
|
const contentId = `${id != null ? id : generatedId}-content`;
|
|
3456
|
-
return /* @__PURE__ */ (0,
|
|
3457
|
-
/* @__PURE__ */ (0,
|
|
3963
|
+
return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("section", { id, className: "scroll-mt-20", children: [
|
|
3964
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
|
|
3458
3965
|
"button",
|
|
3459
3966
|
{
|
|
3460
3967
|
type: "button",
|
|
3461
3968
|
onClick: () => setIsOpen(!isOpen),
|
|
3462
3969
|
"aria-expanded": isOpen,
|
|
3463
3970
|
"aria-controls": contentId,
|
|
3464
|
-
className: "
|
|
3971
|
+
className: "ph-collapsible-trigger mb-6",
|
|
3465
3972
|
children: [
|
|
3466
|
-
/* @__PURE__ */ (0,
|
|
3467
|
-
/* @__PURE__ */ (0,
|
|
3973
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "text-lg font-bold text-ph-ink", children: title }),
|
|
3974
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
3468
3975
|
IconChevronDown,
|
|
3469
3976
|
{
|
|
3470
3977
|
className: cn(
|
|
@@ -3477,7 +3984,7 @@ function CollapsibleSection({
|
|
|
3477
3984
|
]
|
|
3478
3985
|
}
|
|
3479
3986
|
),
|
|
3480
|
-
/* @__PURE__ */ (0,
|
|
3987
|
+
/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
|
|
3481
3988
|
"div",
|
|
3482
3989
|
{
|
|
3483
3990
|
id: contentId,
|
|
@@ -3486,18 +3993,18 @@ function CollapsibleSection({
|
|
|
3486
3993
|
if (node) node.toggleAttribute("inert", !isOpen);
|
|
3487
3994
|
},
|
|
3488
3995
|
className: cn(
|
|
3489
|
-
"
|
|
3490
|
-
isOpen ? "
|
|
3996
|
+
"grid transition-[grid-template-rows,opacity] duration-200",
|
|
3997
|
+
isOpen ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0"
|
|
3491
3998
|
),
|
|
3492
|
-
children
|
|
3999
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "overflow-hidden", children })
|
|
3493
4000
|
}
|
|
3494
4001
|
)
|
|
3495
4002
|
] });
|
|
3496
4003
|
}
|
|
3497
4004
|
|
|
3498
4005
|
// src/components/ui/Typography.tsx
|
|
3499
|
-
var
|
|
3500
|
-
var
|
|
4006
|
+
var import_react25 = require("react");
|
|
4007
|
+
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
3501
4008
|
var toneMap2 = {
|
|
3502
4009
|
default: "text-ph-ink",
|
|
3503
4010
|
muted: "text-ph-mutedtext",
|
|
@@ -3519,65 +4026,66 @@ var weightMap = {
|
|
|
3519
4026
|
function textClass(base, tone, weight, truncate, className) {
|
|
3520
4027
|
return cn(base, toneMap2[tone], weight && weightMap[weight], truncate && "truncate", className);
|
|
3521
4028
|
}
|
|
3522
|
-
var Display = (0,
|
|
4029
|
+
var Display = (0, import_react25.forwardRef)(function Display2(_a, ref) {
|
|
3523
4030
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3524
|
-
return /* @__PURE__ */ (0,
|
|
4031
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("h1", __spreadProps(__spreadValues({ ref }, props), { className: textClass("ph-hero-title", tone, weight, truncate, className), children }));
|
|
3525
4032
|
});
|
|
3526
|
-
var SectionTitle = (0,
|
|
4033
|
+
var SectionTitle = (0, import_react25.forwardRef)(function SectionTitle2(_a, ref) {
|
|
3527
4034
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3528
|
-
return /* @__PURE__ */ (0,
|
|
4035
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("h2", __spreadProps(__spreadValues({ ref }, props), { className: textClass("ph-section-title", tone, weight, truncate, className), children }));
|
|
3529
4036
|
});
|
|
3530
|
-
var H1 = (0,
|
|
4037
|
+
var H1 = (0, import_react25.forwardRef)(function H12(_a, ref) {
|
|
3531
4038
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3532
|
-
return /* @__PURE__ */ (0,
|
|
4039
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("h1", __spreadProps(__spreadValues({ ref }, props), { className: textClass("ph-page-title font-bold", tone, weight, truncate, className), children }));
|
|
3533
4040
|
});
|
|
3534
|
-
var H2 = (0,
|
|
4041
|
+
var H2 = (0, import_react25.forwardRef)(function H22(_a, ref) {
|
|
3535
4042
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3536
|
-
return /* @__PURE__ */ (0,
|
|
4043
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("h2", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-2xl font-semibold tracking-tight", tone, weight, truncate, className), children }));
|
|
3537
4044
|
});
|
|
3538
|
-
var H3 = (0,
|
|
4045
|
+
var H3 = (0, import_react25.forwardRef)(function H32(_a, ref) {
|
|
3539
4046
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3540
|
-
return /* @__PURE__ */ (0,
|
|
4047
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("h3", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-xl font-semibold", tone, weight, truncate, className), children }));
|
|
3541
4048
|
});
|
|
3542
|
-
var H4 = (0,
|
|
4049
|
+
var H4 = (0, import_react25.forwardRef)(function H42(_a, ref) {
|
|
3543
4050
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3544
|
-
return /* @__PURE__ */ (0,
|
|
4051
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("h4", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-lg font-semibold", tone, weight, truncate, className), children }));
|
|
3545
4052
|
});
|
|
3546
|
-
var H5 = (0,
|
|
4053
|
+
var H5 = (0, import_react25.forwardRef)(function H52(_a, ref) {
|
|
3547
4054
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3548
|
-
return /* @__PURE__ */ (0,
|
|
4055
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("h5", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-base font-semibold", tone, weight, truncate, className), children }));
|
|
3549
4056
|
});
|
|
3550
|
-
var P = (0,
|
|
4057
|
+
var P = (0, import_react25.forwardRef)(function P2(_a, ref) {
|
|
3551
4058
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3552
|
-
return /* @__PURE__ */ (0,
|
|
4059
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-base leading-relaxed", tone, weight, truncate, className), children }));
|
|
3553
4060
|
});
|
|
3554
|
-
var Small = (0,
|
|
4061
|
+
var Small = (0, import_react25.forwardRef)(function Small2(_a, ref) {
|
|
3555
4062
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3556
|
-
return /* @__PURE__ */ (0,
|
|
4063
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-sm leading-relaxed", tone, weight, truncate, className), children }));
|
|
3557
4064
|
});
|
|
3558
|
-
var Caption = (0,
|
|
4065
|
+
var Caption = (0, import_react25.forwardRef)(function Caption2(_a, ref) {
|
|
3559
4066
|
var _b = _a, { children, tone = "muted", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3560
|
-
return /* @__PURE__ */ (0,
|
|
4067
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-xs font-medium", tone, weight, truncate, className), children }));
|
|
3561
4068
|
});
|
|
3562
|
-
var Overline = (0,
|
|
4069
|
+
var Overline = (0, import_react25.forwardRef)(function Overline2(_a, ref) {
|
|
3563
4070
|
var _b = _a, { children, tone = "muted", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3564
|
-
return /* @__PURE__ */ (0,
|
|
4071
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-[length:var(--ph-type-overline)] font-semibold uppercase tracking-[0.08em]", tone, weight, truncate, className), children }));
|
|
3565
4072
|
});
|
|
3566
|
-
var Lead = (0,
|
|
4073
|
+
var Lead = (0, import_react25.forwardRef)(function Lead2(_a, ref) {
|
|
3567
4074
|
var _b = _a, { children, tone = "subtle", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3568
|
-
return /* @__PURE__ */ (0,
|
|
4075
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("p", __spreadProps(__spreadValues({ ref }, props), { className: textClass("ph-lead", tone, weight, truncate, className), children }));
|
|
3569
4076
|
});
|
|
3570
|
-
var Mono = (0,
|
|
4077
|
+
var Mono = (0, import_react25.forwardRef)(function Mono2(_a, ref) {
|
|
3571
4078
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3572
|
-
return /* @__PURE__ */ (0,
|
|
4079
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("code", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-sm font-mono leading-relaxed", tone, weight, truncate, className), children }));
|
|
3573
4080
|
});
|
|
3574
|
-
var Label = (0,
|
|
4081
|
+
var Label = (0, import_react25.forwardRef)(function Label2(_a, ref) {
|
|
3575
4082
|
var _b = _a, { children, tone = "default", weight, truncate, className } = _b, props = __objRest(_b, ["children", "tone", "weight", "truncate", "className"]);
|
|
3576
|
-
return /* @__PURE__ */ (0,
|
|
4083
|
+
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("label", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-sm font-medium", tone, weight, truncate, className), children }));
|
|
3577
4084
|
});
|
|
3578
4085
|
|
|
3579
4086
|
// src/components/ui/Avatar.tsx
|
|
3580
|
-
var
|
|
4087
|
+
var import_react26 = require("react");
|
|
4088
|
+
var import_jsx_runtime38 = require("react/jsx-runtime");
|
|
3581
4089
|
var sizeMap4 = {
|
|
3582
4090
|
xs: "h-8 w-8 text-[10px]",
|
|
3583
4091
|
sm: "h-10 w-10 text-xs",
|
|
@@ -3596,7 +4104,7 @@ function Avatar(_a) {
|
|
|
3596
4104
|
label,
|
|
3597
4105
|
icon,
|
|
3598
4106
|
size = "md",
|
|
3599
|
-
color = "bg-ph-brand text-
|
|
4107
|
+
color = "bg-ph-brand text-[var(--ph-on-accent)]",
|
|
3600
4108
|
status,
|
|
3601
4109
|
badge,
|
|
3602
4110
|
className
|
|
@@ -3609,19 +4117,19 @@ function Avatar(_a) {
|
|
|
3609
4117
|
"badge",
|
|
3610
4118
|
"className"
|
|
3611
4119
|
]);
|
|
3612
|
-
return /* @__PURE__ */ (0,
|
|
3613
|
-
/* @__PURE__ */ (0,
|
|
4120
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", __spreadProps(__spreadValues({ className: cn("relative inline-flex shrink-0", className) }, props), { children: [
|
|
4121
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
3614
4122
|
"div",
|
|
3615
4123
|
{
|
|
3616
4124
|
className: cn(
|
|
3617
|
-
"flex items-center justify-center rounded-full border border-ph-border font-bold
|
|
4125
|
+
"ph-avatar flex items-center justify-center rounded-full border border-ph-border font-bold",
|
|
3618
4126
|
sizeMap4[size],
|
|
3619
4127
|
color
|
|
3620
4128
|
),
|
|
3621
4129
|
children: icon || label
|
|
3622
4130
|
}
|
|
3623
4131
|
),
|
|
3624
|
-
status && /* @__PURE__ */ (0,
|
|
4132
|
+
status && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
3625
4133
|
"span",
|
|
3626
4134
|
{
|
|
3627
4135
|
role: "img",
|
|
@@ -3632,17 +4140,17 @@ function Avatar(_a) {
|
|
|
3632
4140
|
)
|
|
3633
4141
|
}
|
|
3634
4142
|
),
|
|
3635
|
-
badge && /* @__PURE__ */ (0,
|
|
4143
|
+
badge && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "absolute -bottom-1 -right-1 flex min-w-[22px] items-center justify-center rounded-full bg-ph-brand px-1.5 py-px text-[10px] font-bold text-[var(--ph-on-accent)]", children: badge })
|
|
3636
4144
|
] }));
|
|
3637
4145
|
}
|
|
3638
4146
|
function AvatarGroup(_a) {
|
|
3639
4147
|
var _b = _a, { children, max, className } = _b, props = __objRest(_b, ["children", "max", "className"]);
|
|
3640
|
-
const items =
|
|
4148
|
+
const items = import_react26.Children.toArray(children);
|
|
3641
4149
|
const visible = max ? items.slice(0, max) : items;
|
|
3642
4150
|
const remaining = max ? items.length - max : 0;
|
|
3643
|
-
return /* @__PURE__ */ (0,
|
|
4151
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", __spreadProps(__spreadValues({ className: cn("-space-x-3 flex rtl:space-x-reverse", className) }, props), { children: [
|
|
3644
4152
|
visible,
|
|
3645
|
-
remaining > 0 && /* @__PURE__ */ (0,
|
|
4153
|
+
remaining > 0 && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
3646
4154
|
Avatar,
|
|
3647
4155
|
{
|
|
3648
4156
|
label: `+${remaining}`,
|
|
@@ -3654,8 +4162,8 @@ function AvatarGroup(_a) {
|
|
|
3654
4162
|
}
|
|
3655
4163
|
|
|
3656
4164
|
// src/components/ui/Progress.tsx
|
|
3657
|
-
var
|
|
3658
|
-
var
|
|
4165
|
+
var import_react27 = require("react");
|
|
4166
|
+
var import_jsx_runtime39 = require("react/jsx-runtime");
|
|
3659
4167
|
var sizeMap5 = {
|
|
3660
4168
|
sm: "h-1",
|
|
3661
4169
|
md: "h-2",
|
|
@@ -3683,19 +4191,19 @@ function Progress(_a) {
|
|
|
3683
4191
|
"aria-label",
|
|
3684
4192
|
"aria-labelledby"
|
|
3685
4193
|
]);
|
|
3686
|
-
const labelId = (0,
|
|
4194
|
+
const labelId = (0, import_react27.useId)();
|
|
3687
4195
|
const safeMax = Number.isFinite(max) && max > 0 ? max : 100;
|
|
3688
4196
|
const safeValue = Number.isFinite(value) ? Math.min(safeMax, Math.max(0, value)) : 0;
|
|
3689
4197
|
const percentage = safeValue / safeMax * 100;
|
|
3690
|
-
return /* @__PURE__ */ (0,
|
|
3691
|
-
(label || showPercentage) && /* @__PURE__ */ (0,
|
|
3692
|
-
label && /* @__PURE__ */ (0,
|
|
3693
|
-
showPercentage && /* @__PURE__ */ (0,
|
|
4198
|
+
return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", __spreadProps(__spreadValues({ className: cn("w-full", className) }, props), { children: [
|
|
4199
|
+
(label || showPercentage) && /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "mb-1.5 flex justify-between text-sm text-ph-subtle", children: [
|
|
4200
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { id: labelId, children: label }),
|
|
4201
|
+
showPercentage && /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("span", { className: "tabular-nums", children: [
|
|
3694
4202
|
Math.round(percentage),
|
|
3695
4203
|
"%"
|
|
3696
4204
|
] })
|
|
3697
4205
|
] }),
|
|
3698
|
-
/* @__PURE__ */ (0,
|
|
4206
|
+
/* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: cn("ph-progress", sizeMap5[size]), children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
|
|
3699
4207
|
"div",
|
|
3700
4208
|
{
|
|
3701
4209
|
className: cn("ph-progress-bar", color),
|
|
@@ -3712,9 +4220,9 @@ function Progress(_a) {
|
|
|
3712
4220
|
}
|
|
3713
4221
|
|
|
3714
4222
|
// src/components/ui/Link.tsx
|
|
3715
|
-
var
|
|
3716
|
-
var
|
|
3717
|
-
var Link = (0,
|
|
4223
|
+
var import_react28 = require("react");
|
|
4224
|
+
var import_jsx_runtime40 = require("react/jsx-runtime");
|
|
4225
|
+
var Link = (0, import_react28.forwardRef)(function Link2(_a, ref) {
|
|
3718
4226
|
var _b = _a, {
|
|
3719
4227
|
className,
|
|
3720
4228
|
disabled = false,
|
|
@@ -3724,7 +4232,7 @@ var Link = (0, import_react24.forwardRef)(function Link2(_a, ref) {
|
|
|
3724
4232
|
"disabled",
|
|
3725
4233
|
"children"
|
|
3726
4234
|
]);
|
|
3727
|
-
return /* @__PURE__ */ (0,
|
|
4235
|
+
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
|
|
3728
4236
|
"a",
|
|
3729
4237
|
__spreadProps(__spreadValues({
|
|
3730
4238
|
ref,
|
|
@@ -3743,10 +4251,10 @@ var Link = (0, import_react24.forwardRef)(function Link2(_a, ref) {
|
|
|
3743
4251
|
Link.displayName = "Link";
|
|
3744
4252
|
|
|
3745
4253
|
// src/components/ui/Spinner.tsx
|
|
3746
|
-
var
|
|
4254
|
+
var import_jsx_runtime41 = require("react/jsx-runtime");
|
|
3747
4255
|
function Spinner(_a) {
|
|
3748
4256
|
var _b = _a, { size = "sm", textColored = false, className } = _b, props = __objRest(_b, ["size", "textColored", "className"]);
|
|
3749
|
-
return /* @__PURE__ */ (0,
|
|
4257
|
+
return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
3750
4258
|
"span",
|
|
3751
4259
|
__spreadProps(__spreadValues({
|
|
3752
4260
|
className: cn(
|
|
@@ -3758,17 +4266,295 @@ function Spinner(_a) {
|
|
|
3758
4266
|
role: "status",
|
|
3759
4267
|
"aria-label": "Loading"
|
|
3760
4268
|
}, props), {
|
|
3761
|
-
children: /* @__PURE__ */ (0,
|
|
3762
|
-
/* @__PURE__ */ (0,
|
|
3763
|
-
/* @__PURE__ */ (0,
|
|
4269
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "ph-spinner__svg", children: [
|
|
4270
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("circle", { cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "3", opacity: 0.2 }),
|
|
4271
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { d: "M12 2a10 10 0 0 1 10 10", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round" })
|
|
3764
4272
|
] })
|
|
3765
4273
|
})
|
|
3766
4274
|
);
|
|
3767
4275
|
}
|
|
3768
4276
|
Spinner.displayName = "Spinner";
|
|
3769
4277
|
|
|
4278
|
+
// src/components/ui/BrandSpinner.tsx
|
|
4279
|
+
var import_react29 = require("react");
|
|
4280
|
+
var import_jsx_runtime42 = require("react/jsx-runtime");
|
|
4281
|
+
var sizes = { sm: 20, md: 40, lg: 56 };
|
|
4282
|
+
var reducedMotionQuery = "(prefers-reduced-motion: reduce)";
|
|
4283
|
+
function subscribeMotion(onChange) {
|
|
4284
|
+
var _a;
|
|
4285
|
+
const media = (_a = window.matchMedia) == null ? void 0 : _a.call(window, reducedMotionQuery);
|
|
4286
|
+
media == null ? void 0 : media.addEventListener("change", onChange);
|
|
4287
|
+
return () => media == null ? void 0 : media.removeEventListener("change", onChange);
|
|
4288
|
+
}
|
|
4289
|
+
function readReducedMotion() {
|
|
4290
|
+
var _a, _b;
|
|
4291
|
+
return (_b = (_a = window.matchMedia) == null ? void 0 : _a.call(window, reducedMotionQuery).matches) != null ? _b : false;
|
|
4292
|
+
}
|
|
4293
|
+
function BrandSpinner(_a) {
|
|
4294
|
+
var _b = _a, {
|
|
4295
|
+
variant = "ring",
|
|
4296
|
+
size = "md",
|
|
4297
|
+
label = "Loading",
|
|
4298
|
+
className
|
|
4299
|
+
} = _b, props = __objRest(_b, [
|
|
4300
|
+
"variant",
|
|
4301
|
+
"size",
|
|
4302
|
+
"label",
|
|
4303
|
+
"className"
|
|
4304
|
+
]);
|
|
4305
|
+
const gradientId = `ph-spinner-${(0, import_react29.useId)().replace(/:/g, "")}`;
|
|
4306
|
+
const reducedMotion = (0, import_react29.useSyncExternalStore)(
|
|
4307
|
+
subscribeMotion,
|
|
4308
|
+
readReducedMotion,
|
|
4309
|
+
() => true
|
|
4310
|
+
);
|
|
4311
|
+
const dimension = sizes[size];
|
|
4312
|
+
return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4313
|
+
"div",
|
|
4314
|
+
__spreadProps(__spreadValues({
|
|
4315
|
+
role: "status",
|
|
4316
|
+
"aria-label": label,
|
|
4317
|
+
"data-test": "app-spinner",
|
|
4318
|
+
className: cn(
|
|
4319
|
+
"inline-flex shrink-0",
|
|
4320
|
+
variant !== "orbit" && "text-ph-brand",
|
|
4321
|
+
className
|
|
4322
|
+
)
|
|
4323
|
+
}, props), {
|
|
4324
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4325
|
+
"svg",
|
|
4326
|
+
{
|
|
4327
|
+
width: dimension,
|
|
4328
|
+
height: dimension,
|
|
4329
|
+
viewBox: variant === "ring" ? "0 0 24 24" : "0 0 40 40",
|
|
4330
|
+
"aria-hidden": true,
|
|
4331
|
+
className: variant === "timer" || variant === "ring" ? "animate-spin motion-reduce:animate-none" : void 0,
|
|
4332
|
+
children: variant === "ring" ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
|
|
4333
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4334
|
+
"circle",
|
|
4335
|
+
{
|
|
4336
|
+
cx: "12",
|
|
4337
|
+
cy: "12",
|
|
4338
|
+
r: "10",
|
|
4339
|
+
fill: "none",
|
|
4340
|
+
stroke: "currentColor",
|
|
4341
|
+
strokeWidth: "3",
|
|
4342
|
+
opacity: "0.2"
|
|
4343
|
+
}
|
|
4344
|
+
),
|
|
4345
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4346
|
+
"path",
|
|
4347
|
+
{
|
|
4348
|
+
d: "M12 2a10 10 0 0 1 10 10",
|
|
4349
|
+
fill: "none",
|
|
4350
|
+
stroke: "currentColor",
|
|
4351
|
+
strokeWidth: "3",
|
|
4352
|
+
strokeLinecap: "round"
|
|
4353
|
+
}
|
|
4354
|
+
)
|
|
4355
|
+
] }) : variant === "timer" ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
|
|
4356
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4357
|
+
"circle",
|
|
4358
|
+
{
|
|
4359
|
+
cx: "20",
|
|
4360
|
+
cy: "20",
|
|
4361
|
+
r: "15",
|
|
4362
|
+
fill: "none",
|
|
4363
|
+
stroke: "currentColor",
|
|
4364
|
+
strokeOpacity: "0.18",
|
|
4365
|
+
strokeWidth: "2.5"
|
|
4366
|
+
}
|
|
4367
|
+
),
|
|
4368
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4369
|
+
"circle",
|
|
4370
|
+
{
|
|
4371
|
+
cx: "20",
|
|
4372
|
+
cy: "20",
|
|
4373
|
+
r: "15",
|
|
4374
|
+
fill: "none",
|
|
4375
|
+
stroke: "currentColor",
|
|
4376
|
+
strokeWidth: "2.5",
|
|
4377
|
+
strokeLinecap: "round",
|
|
4378
|
+
strokeDasharray: "24 70"
|
|
4379
|
+
}
|
|
4380
|
+
),
|
|
4381
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("circle", { cx: "20", cy: "5", r: "2.25", fill: "currentColor" })
|
|
4382
|
+
] }) : variant === "columns" ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
|
|
4383
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4384
|
+
"rect",
|
|
4385
|
+
{
|
|
4386
|
+
x: "9",
|
|
4387
|
+
y: "16",
|
|
4388
|
+
width: "6",
|
|
4389
|
+
height: "14",
|
|
4390
|
+
rx: "2",
|
|
4391
|
+
fill: "currentColor",
|
|
4392
|
+
fillOpacity: "0.35",
|
|
4393
|
+
className: "ph-brand-spinner__column"
|
|
4394
|
+
}
|
|
4395
|
+
),
|
|
4396
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4397
|
+
"rect",
|
|
4398
|
+
{
|
|
4399
|
+
x: "17",
|
|
4400
|
+
y: "11",
|
|
4401
|
+
width: "6",
|
|
4402
|
+
height: "19",
|
|
4403
|
+
rx: "2",
|
|
4404
|
+
fill: "currentColor",
|
|
4405
|
+
className: "ph-brand-spinner__column",
|
|
4406
|
+
style: { animationDelay: "0.14s" }
|
|
4407
|
+
}
|
|
4408
|
+
),
|
|
4409
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4410
|
+
"rect",
|
|
4411
|
+
{
|
|
4412
|
+
x: "25",
|
|
4413
|
+
y: "14",
|
|
4414
|
+
width: "6",
|
|
4415
|
+
height: "16",
|
|
4416
|
+
rx: "2",
|
|
4417
|
+
fill: "currentColor",
|
|
4418
|
+
fillOpacity: "0.55",
|
|
4419
|
+
className: "ph-brand-spinner__column",
|
|
4420
|
+
style: { animationDelay: "0.28s" }
|
|
4421
|
+
}
|
|
4422
|
+
)
|
|
4423
|
+
] }) : variant === "orbit" ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
|
|
4424
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
|
|
4425
|
+
"linearGradient",
|
|
4426
|
+
{
|
|
4427
|
+
id: gradientId,
|
|
4428
|
+
x1: "0%",
|
|
4429
|
+
y1: "0%",
|
|
4430
|
+
x2: "100%",
|
|
4431
|
+
y2: "100%",
|
|
4432
|
+
children: [
|
|
4433
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("stop", { offset: "0%", stopColor: "#1877f2" }),
|
|
4434
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("stop", { offset: "100%", stopColor: "#ebbcba" })
|
|
4435
|
+
]
|
|
4436
|
+
}
|
|
4437
|
+
) }),
|
|
4438
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4439
|
+
"circle",
|
|
4440
|
+
{
|
|
4441
|
+
cx: "20",
|
|
4442
|
+
cy: "20",
|
|
4443
|
+
r: "15",
|
|
4444
|
+
fill: "none",
|
|
4445
|
+
stroke: `url(#${gradientId})`,
|
|
4446
|
+
strokeOpacity: "0.25",
|
|
4447
|
+
strokeWidth: "2"
|
|
4448
|
+
}
|
|
4449
|
+
),
|
|
4450
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("g", { className: "origin-[20px_20px] animate-spin motion-reduce:animate-none", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4451
|
+
"circle",
|
|
4452
|
+
{
|
|
4453
|
+
cx: "20",
|
|
4454
|
+
cy: "20",
|
|
4455
|
+
r: "15",
|
|
4456
|
+
fill: "none",
|
|
4457
|
+
stroke: `url(#${gradientId})`,
|
|
4458
|
+
strokeWidth: "2.5",
|
|
4459
|
+
strokeLinecap: "round",
|
|
4460
|
+
strokeDasharray: "22 72"
|
|
4461
|
+
}
|
|
4462
|
+
) }),
|
|
4463
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("g", { className: "origin-[20px_20px] animate-[spin_1.6s_linear_infinite_reverse] motion-reduce:animate-none", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4464
|
+
"circle",
|
|
4465
|
+
{
|
|
4466
|
+
cx: "20",
|
|
4467
|
+
cy: "20",
|
|
4468
|
+
r: "9",
|
|
4469
|
+
fill: "none",
|
|
4470
|
+
stroke: "#ebbcba",
|
|
4471
|
+
strokeWidth: "2",
|
|
4472
|
+
strokeLinecap: "round",
|
|
4473
|
+
strokeDasharray: "12 45",
|
|
4474
|
+
strokeOpacity: "0.9"
|
|
4475
|
+
}
|
|
4476
|
+
) }),
|
|
4477
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4478
|
+
"circle",
|
|
4479
|
+
{
|
|
4480
|
+
cx: "20",
|
|
4481
|
+
cy: "20",
|
|
4482
|
+
r: "2.5",
|
|
4483
|
+
fill: "#1877f2",
|
|
4484
|
+
className: "animate-pulse motion-reduce:animate-none"
|
|
4485
|
+
}
|
|
4486
|
+
)
|
|
4487
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
|
|
4488
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("g", { children: [
|
|
4489
|
+
!reducedMotion ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4490
|
+
"animateTransform",
|
|
4491
|
+
{
|
|
4492
|
+
attributeName: "transform",
|
|
4493
|
+
type: "rotate",
|
|
4494
|
+
from: "0 20 20",
|
|
4495
|
+
to: "360 20 20",
|
|
4496
|
+
dur: "2.4s",
|
|
4497
|
+
repeatCount: "indefinite"
|
|
4498
|
+
}
|
|
4499
|
+
) : null,
|
|
4500
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4501
|
+
"circle",
|
|
4502
|
+
{
|
|
4503
|
+
cx: "20",
|
|
4504
|
+
cy: "20",
|
|
4505
|
+
r: "16",
|
|
4506
|
+
fill: "none",
|
|
4507
|
+
stroke: "currentColor",
|
|
4508
|
+
strokeOpacity: "0.2",
|
|
4509
|
+
strokeWidth: "1.5",
|
|
4510
|
+
strokeDasharray: "3 5"
|
|
4511
|
+
}
|
|
4512
|
+
)
|
|
4513
|
+
] }),
|
|
4514
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("g", { children: [
|
|
4515
|
+
!reducedMotion ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4516
|
+
"animateTransform",
|
|
4517
|
+
{
|
|
4518
|
+
attributeName: "transform",
|
|
4519
|
+
type: "rotate",
|
|
4520
|
+
from: "360 20 20",
|
|
4521
|
+
to: "0 20 20",
|
|
4522
|
+
dur: "1.1s",
|
|
4523
|
+
repeatCount: "indefinite"
|
|
4524
|
+
}
|
|
4525
|
+
) : null,
|
|
4526
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4527
|
+
"circle",
|
|
4528
|
+
{
|
|
4529
|
+
cx: "20",
|
|
4530
|
+
cy: "20",
|
|
4531
|
+
r: "11",
|
|
4532
|
+
fill: "none",
|
|
4533
|
+
stroke: "currentColor",
|
|
4534
|
+
strokeWidth: "2",
|
|
4535
|
+
strokeLinecap: "round",
|
|
4536
|
+
strokeDasharray: "18 52"
|
|
4537
|
+
}
|
|
4538
|
+
)
|
|
4539
|
+
] }),
|
|
4540
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
4541
|
+
"path",
|
|
4542
|
+
{
|
|
4543
|
+
d: "M16 14h8v12a1 1 0 0 1-1.4.9L20 25.5l-2.6 1.4A1 1 0 0 1 16 26V14z",
|
|
4544
|
+
fill: "currentColor",
|
|
4545
|
+
fillOpacity: "0.85",
|
|
4546
|
+
className: "animate-pulse motion-reduce:animate-none"
|
|
4547
|
+
}
|
|
4548
|
+
)
|
|
4549
|
+
] })
|
|
4550
|
+
}
|
|
4551
|
+
)
|
|
4552
|
+
})
|
|
4553
|
+
);
|
|
4554
|
+
}
|
|
4555
|
+
|
|
3770
4556
|
// src/components/ui/Dot.tsx
|
|
3771
|
-
var
|
|
4557
|
+
var import_jsx_runtime43 = require("react/jsx-runtime");
|
|
3772
4558
|
var colorMap = {
|
|
3773
4559
|
green: "bg-ph-success",
|
|
3774
4560
|
yellow: "bg-ph-warning",
|
|
@@ -3778,7 +4564,7 @@ var colorMap = {
|
|
|
3778
4564
|
};
|
|
3779
4565
|
function Dot(_a) {
|
|
3780
4566
|
var _b = _a, { color = "gray", size = "md", className } = _b, props = __objRest(_b, ["color", "size", "className"]);
|
|
3781
|
-
return /* @__PURE__ */ (0,
|
|
4567
|
+
return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
|
|
3782
4568
|
"span",
|
|
3783
4569
|
__spreadValues({
|
|
3784
4570
|
className: cn(
|
|
@@ -3794,9 +4580,9 @@ function Dot(_a) {
|
|
|
3794
4580
|
Dot.displayName = "Dot";
|
|
3795
4581
|
|
|
3796
4582
|
// src/components/ui/Chip.tsx
|
|
3797
|
-
var
|
|
3798
|
-
var
|
|
3799
|
-
var Chip = (0,
|
|
4583
|
+
var import_react30 = require("react");
|
|
4584
|
+
var import_jsx_runtime44 = require("react/jsx-runtime");
|
|
4585
|
+
var Chip = (0, import_react30.forwardRef)(function Chip2(_a, ref) {
|
|
3800
4586
|
var _b = _a, {
|
|
3801
4587
|
selected = false,
|
|
3802
4588
|
onRemove,
|
|
@@ -3815,18 +4601,18 @@ var Chip = (0, import_react25.forwardRef)(function Chip2(_a, ref) {
|
|
|
3815
4601
|
);
|
|
3816
4602
|
if (onRemove) {
|
|
3817
4603
|
const removeLabel = typeof children === "string" ? `Remove ${children}` : "Remove";
|
|
3818
|
-
return /* @__PURE__ */ (0,
|
|
3819
|
-
/* @__PURE__ */ (0,
|
|
4604
|
+
return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("span", { className: chipClassName, children: [
|
|
4605
|
+
/* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
3820
4606
|
"button",
|
|
3821
4607
|
__spreadProps(__spreadValues({
|
|
3822
4608
|
ref,
|
|
3823
4609
|
type: "button",
|
|
3824
4610
|
className: "min-w-0 bg-transparent p-0 text-inherit"
|
|
3825
4611
|
}, props), {
|
|
3826
|
-
children: /* @__PURE__ */ (0,
|
|
4612
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "ph-chip__text", children })
|
|
3827
4613
|
})
|
|
3828
4614
|
),
|
|
3829
|
-
/* @__PURE__ */ (0,
|
|
4615
|
+
/* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
3830
4616
|
"button",
|
|
3831
4617
|
{
|
|
3832
4618
|
type: "button",
|
|
@@ -3834,26 +4620,26 @@ var Chip = (0, import_react25.forwardRef)(function Chip2(_a, ref) {
|
|
|
3834
4620
|
disabled: props.disabled,
|
|
3835
4621
|
className: "ph-chip__remove",
|
|
3836
4622
|
"aria-label": removeLabel,
|
|
3837
|
-
children: /* @__PURE__ */ (0,
|
|
4623
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("path", { d: "M2 2l6 6M8 2l-6 6" }) })
|
|
3838
4624
|
}
|
|
3839
4625
|
)
|
|
3840
4626
|
] });
|
|
3841
4627
|
}
|
|
3842
|
-
return /* @__PURE__ */ (0,
|
|
4628
|
+
return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
3843
4629
|
"button",
|
|
3844
4630
|
__spreadProps(__spreadValues({
|
|
3845
4631
|
ref,
|
|
3846
4632
|
type: "button",
|
|
3847
4633
|
className: chipClassName
|
|
3848
4634
|
}, props), {
|
|
3849
|
-
children: /* @__PURE__ */ (0,
|
|
4635
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "ph-chip__text", children })
|
|
3850
4636
|
})
|
|
3851
4637
|
);
|
|
3852
4638
|
});
|
|
3853
4639
|
Chip.displayName = "Chip";
|
|
3854
4640
|
|
|
3855
4641
|
// src/lib/chart/use-ph-chart-tokens.ts
|
|
3856
|
-
var
|
|
4642
|
+
var import_react31 = require("react");
|
|
3857
4643
|
var DEFAULT_TOKENS = {
|
|
3858
4644
|
series: ["#1d4aff", "#621da6", "#42827e", "#ce0e74", "#f14f58", "#529a0a", "#fe729e"],
|
|
3859
4645
|
muted: "hsl(220 9% 90%)",
|
|
@@ -3884,20 +4670,20 @@ function readTokens() {
|
|
|
3884
4670
|
};
|
|
3885
4671
|
}
|
|
3886
4672
|
function useChartTokens() {
|
|
3887
|
-
const [tokens, setTokens] = (0,
|
|
3888
|
-
(0,
|
|
4673
|
+
const [tokens, setTokens] = (0, import_react31.useState)(DEFAULT_TOKENS);
|
|
4674
|
+
(0, import_react31.useEffect)(() => {
|
|
3889
4675
|
setTokens(readTokens());
|
|
3890
4676
|
}, []);
|
|
3891
4677
|
return tokens;
|
|
3892
4678
|
}
|
|
3893
4679
|
|
|
3894
4680
|
// src/components/ui/Charts.tsx
|
|
3895
|
-
var
|
|
4681
|
+
var import_jsx_runtime45 = require("react/jsx-runtime");
|
|
3896
4682
|
function percent(value, total) {
|
|
3897
4683
|
return total > 0 ? Math.round(value / total * 100) : 0;
|
|
3898
4684
|
}
|
|
3899
4685
|
function EmptyChart() {
|
|
3900
|
-
return /* @__PURE__ */ (0,
|
|
4686
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "text-sm text-ph-subtle", children: "No data for this period." });
|
|
3901
4687
|
}
|
|
3902
4688
|
function sliceColour(slice, index, series) {
|
|
3903
4689
|
var _a;
|
|
@@ -3907,7 +4693,7 @@ function DonutChart({ slices, label, formatValue, className }) {
|
|
|
3907
4693
|
const { series } = useChartTokens();
|
|
3908
4694
|
const visible = slices.filter((slice) => slice.value > 0);
|
|
3909
4695
|
const total = visible.reduce((sum, slice) => sum + slice.value, 0);
|
|
3910
|
-
if (total <= 0) return /* @__PURE__ */ (0,
|
|
4696
|
+
if (total <= 0) return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(EmptyChart, {});
|
|
3911
4697
|
const stops = visible.map((slice, index) => {
|
|
3912
4698
|
const colour = sliceColour(slice, index, series);
|
|
3913
4699
|
const before = visible.slice(0, index).reduce((sum, item) => sum + item.value, 0);
|
|
@@ -3915,15 +4701,15 @@ function DonutChart({ slices, label, formatValue, className }) {
|
|
|
3915
4701
|
const end = (before + slice.value) / total * 360;
|
|
3916
4702
|
return `${colour} ${start}deg ${end}deg`;
|
|
3917
4703
|
}).join(", ");
|
|
3918
|
-
return /* @__PURE__ */ (0,
|
|
3919
|
-
/* @__PURE__ */ (0,
|
|
4704
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: cn("flex flex-col items-center gap-4 sm:flex-row sm:items-center", className), children: [
|
|
4705
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
3920
4706
|
"div",
|
|
3921
4707
|
{
|
|
3922
4708
|
role: "img",
|
|
3923
4709
|
"aria-label": label,
|
|
3924
4710
|
className: "relative h-36 w-36 shrink-0 rounded-full",
|
|
3925
4711
|
style: { background: `conic-gradient(${stops})` },
|
|
3926
|
-
children: /* @__PURE__ */ (0,
|
|
4712
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
3927
4713
|
"span",
|
|
3928
4714
|
{
|
|
3929
4715
|
className: "absolute inset-[22%] rounded-full bg-ph-surface ring-1 ring-ph-border",
|
|
@@ -3932,14 +4718,14 @@ function DonutChart({ slices, label, formatValue, className }) {
|
|
|
3932
4718
|
)
|
|
3933
4719
|
}
|
|
3934
4720
|
),
|
|
3935
|
-
/* @__PURE__ */ (0,
|
|
4721
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("ul", { className: "min-w-0 w-full flex-1 space-y-2", children: visible.map((slice, index) => {
|
|
3936
4722
|
const colour = sliceColour(slice, index, series);
|
|
3937
|
-
return /* @__PURE__ */ (0,
|
|
3938
|
-
/* @__PURE__ */ (0,
|
|
3939
|
-
/* @__PURE__ */ (0,
|
|
3940
|
-
/* @__PURE__ */ (0,
|
|
4723
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("li", { className: "flex items-center justify-between gap-3 text-sm", children: [
|
|
4724
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("span", { className: "flex min-w-0 items-center gap-2 text-ph-subtle", children: [
|
|
4725
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: { background: colour } }),
|
|
4726
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "truncate", children: slice.label })
|
|
3941
4727
|
] }),
|
|
3942
|
-
/* @__PURE__ */ (0,
|
|
4728
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "shrink-0 tabular-nums text-ph-ink", children: formatValue ? formatValue(slice.value) : `${percent(slice.value, total)}%` })
|
|
3943
4729
|
] }, slice.label);
|
|
3944
4730
|
}) })
|
|
3945
4731
|
] });
|
|
@@ -3948,15 +4734,15 @@ function BarChart({ items, formatValue, className }) {
|
|
|
3948
4734
|
const { series } = useChartTokens();
|
|
3949
4735
|
const visible = items.filter((item) => item.value > 0);
|
|
3950
4736
|
const max = Math.max(...visible.map((item) => item.value), 1);
|
|
3951
|
-
if (!visible.length) return /* @__PURE__ */ (0,
|
|
3952
|
-
return /* @__PURE__ */ (0,
|
|
4737
|
+
if (!visible.length) return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(EmptyChart, {});
|
|
4738
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("ul", { className: cn("space-y-3", className), children: visible.map((item, index) => {
|
|
3953
4739
|
const colour = sliceColour(item, index, series);
|
|
3954
|
-
return /* @__PURE__ */ (0,
|
|
3955
|
-
/* @__PURE__ */ (0,
|
|
3956
|
-
/* @__PURE__ */ (0,
|
|
3957
|
-
/* @__PURE__ */ (0,
|
|
4740
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("li", { children: [
|
|
4741
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
|
|
4742
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "truncate text-ph-subtle", children: item.label }),
|
|
4743
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "shrink-0 tabular-nums text-ph-ink", children: formatValue ? formatValue(item.value) : item.value.toLocaleString("en-AU") })
|
|
3958
4744
|
] }),
|
|
3959
|
-
/* @__PURE__ */ (0,
|
|
4745
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "h-2.5 rounded-full bg-ph-muted ring-1 ring-ph-border", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
3960
4746
|
"div",
|
|
3961
4747
|
{
|
|
3962
4748
|
className: "h-full rounded-full transition-[width] duration-300 ease-out motion-reduce:transition-none",
|
|
@@ -3978,15 +4764,15 @@ function StackedBarChart({
|
|
|
3978
4764
|
const { series } = useChartTokens();
|
|
3979
4765
|
const visible = slices.filter((slice) => slice.value > 0);
|
|
3980
4766
|
const total = visible.reduce((sum, slice) => sum + slice.value, 0);
|
|
3981
|
-
if (total <= 0) return /* @__PURE__ */ (0,
|
|
3982
|
-
return /* @__PURE__ */ (0,
|
|
3983
|
-
/* @__PURE__ */ (0,
|
|
4767
|
+
if (total <= 0) return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(EmptyChart, {});
|
|
4768
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: cn("space-y-3", className), children: [
|
|
4769
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
3984
4770
|
"div",
|
|
3985
4771
|
{
|
|
3986
4772
|
role: "img",
|
|
3987
4773
|
"aria-label": label,
|
|
3988
4774
|
className: "flex h-3 overflow-hidden rounded-full bg-ph-muted ring-1 ring-ph-border",
|
|
3989
|
-
children: visible.map((slice, index) => /* @__PURE__ */ (0,
|
|
4775
|
+
children: visible.map((slice, index) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
3990
4776
|
"span",
|
|
3991
4777
|
{
|
|
3992
4778
|
className: "h-full",
|
|
@@ -3999,14 +4785,14 @@ function StackedBarChart({
|
|
|
3999
4785
|
))
|
|
4000
4786
|
}
|
|
4001
4787
|
),
|
|
4002
|
-
/* @__PURE__ */ (0,
|
|
4788
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("ul", { className: "space-y-2", children: visible.map((slice, index) => {
|
|
4003
4789
|
const colour = sliceColour(slice, index, series);
|
|
4004
|
-
return /* @__PURE__ */ (0,
|
|
4005
|
-
/* @__PURE__ */ (0,
|
|
4006
|
-
/* @__PURE__ */ (0,
|
|
4007
|
-
/* @__PURE__ */ (0,
|
|
4790
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("li", { className: "flex items-center justify-between gap-3 text-sm", children: [
|
|
4791
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("span", { className: "flex min-w-0 items-center gap-2 text-ph-subtle", children: [
|
|
4792
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: { background: colour } }),
|
|
4793
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "truncate", children: slice.label })
|
|
4008
4794
|
] }),
|
|
4009
|
-
/* @__PURE__ */ (0,
|
|
4795
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "shrink-0 tabular-nums text-ph-ink", children: formatValue ? formatValue(slice.value) : `${percent(slice.value, total)}%` })
|
|
4010
4796
|
] }, slice.label);
|
|
4011
4797
|
}) })
|
|
4012
4798
|
] });
|
|
@@ -4014,6 +4800,7 @@ function StackedBarChart({
|
|
|
4014
4800
|
// Annotate the CommonJS export names for ESM import in node:
|
|
4015
4801
|
0 && (module.exports = {
|
|
4016
4802
|
Accordion,
|
|
4803
|
+
AiWritingIllustration,
|
|
4017
4804
|
Alert,
|
|
4018
4805
|
AuthCard,
|
|
4019
4806
|
AuthDivider,
|
|
@@ -4022,6 +4809,7 @@ function StackedBarChart({
|
|
|
4022
4809
|
AvatarGroup,
|
|
4023
4810
|
Badge,
|
|
4024
4811
|
BarChart,
|
|
4812
|
+
BrandSpinner,
|
|
4025
4813
|
Button,
|
|
4026
4814
|
ButtonChrome,
|
|
4027
4815
|
Calendar,
|
|
@@ -4056,12 +4844,17 @@ function StackedBarChart({
|
|
|
4056
4844
|
Icon,
|
|
4057
4845
|
IconByName,
|
|
4058
4846
|
Input,
|
|
4847
|
+
IntegrationBridgeIllustration,
|
|
4059
4848
|
Kbd,
|
|
4060
4849
|
Label,
|
|
4061
4850
|
Lead,
|
|
4062
4851
|
Link,
|
|
4063
4852
|
Loader,
|
|
4064
4853
|
LoadingState,
|
|
4854
|
+
MarketingHeader,
|
|
4855
|
+
MarketingLink,
|
|
4856
|
+
MarketingMotionControl,
|
|
4857
|
+
MarketingReveal,
|
|
4065
4858
|
Modal,
|
|
4066
4859
|
Mono,
|
|
4067
4860
|
Overline,
|