@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.
Files changed (79) hide show
  1. package/dist/{Chip-BzuNgJIa.d.mts → Chip-Dw2g2t8D.d.mts} +18 -4
  2. package/dist/{Chip-BzuNgJIa.d.ts → Chip-Dw2g2t8D.d.ts} +18 -4
  3. package/dist/{chunk-6SVJAU5K.mjs → chunk-RIPGN6FG.mjs} +1333 -526
  4. package/dist/index.d.mts +3 -2
  5. package/dist/index.d.ts +3 -2
  6. package/dist/index.js +490 -119
  7. package/dist/index.mjs +11 -3
  8. package/dist/suite-analytics--Mf1RZbw.d.mts +29 -0
  9. package/dist/suite-analytics--Mf1RZbw.d.ts +29 -0
  10. package/dist/suite.d.mts +36 -4
  11. package/dist/suite.d.ts +36 -4
  12. package/dist/suite.js +4617 -4001
  13. package/dist/suite.mjs +1456 -868
  14. package/dist/tailwind-preset.js +10 -1
  15. package/dist/tailwind-preset.mjs +10 -1
  16. package/dist/ui.d.mts +33 -4
  17. package/dist/ui.d.ts +33 -4
  18. package/dist/ui.js +1364 -571
  19. package/dist/ui.mjs +15 -1
  20. package/docs/macos-identity-audit.md +279 -0
  21. package/package.json +1 -1
  22. package/src/app/globals.css +390 -44
  23. package/src/components/ui/Accordion.tsx +4 -7
  24. package/src/components/ui/Avatar.tsx +5 -5
  25. package/src/components/ui/BrandSpinner.tsx +256 -0
  26. package/src/components/ui/Calendar.tsx +7 -7
  27. package/src/components/ui/CodeBlock.tsx +14 -11
  28. package/src/components/ui/CollapsibleSection.tsx +4 -4
  29. package/src/components/ui/CommandPalette.tsx +7 -10
  30. package/src/components/ui/EmptyState.tsx +2 -2
  31. package/src/components/ui/Input.tsx +1 -1
  32. package/src/components/ui/Marketing.tsx +144 -0
  33. package/src/components/ui/MarketingIllustrations.tsx +287 -0
  34. package/src/components/ui/Panel.tsx +1 -1
  35. package/src/components/ui/SegmentedControl.tsx +59 -13
  36. package/src/components/ui/SettingsLayout.tsx +4 -0
  37. package/src/components/ui/ShowcaseWrapper.tsx +3 -3
  38. package/src/components/ui/Table.tsx +45 -10
  39. package/src/components/ui/Typography.tsx +4 -4
  40. package/src/components/ui/avatar-stat.test.tsx +14 -1
  41. package/src/components/ui/brand-spinner.test.tsx +62 -0
  42. package/src/components/ui/index.ts +19 -11
  43. package/src/components/ui/interaction-primitives.test.tsx +12 -6
  44. package/src/components/ui/marketing.test.tsx +39 -0
  45. package/src/components/ui/table.test.tsx +47 -0
  46. package/src/styles/suite-skin.css +471 -74
  47. package/src/styles/themes.css +45 -45
  48. package/src/styles/typography.css +25 -1
  49. package/src/suite/components/ai-draft-editor.tsx +184 -0
  50. package/src/suite/components/ai-panel-workflows.test.tsx +179 -0
  51. package/src/suite/components/ai-panel.tsx +201 -31
  52. package/src/suite/components/app-switcher.tsx +22 -9
  53. package/src/suite/components/command-palette-host.tsx +20 -2
  54. package/src/suite/components/suite-app-layout.tsx +7 -4
  55. package/src/suite/components/suite-bottom-nav.tsx +1 -1
  56. package/src/suite/components/suite-clients-projects-directory.tsx +6 -6
  57. package/src/suite/components/suite-integration-picker.tsx +7 -7
  58. package/src/suite/components/suite-integration-rules.tsx +5 -5
  59. package/src/suite/components/suite-layout.test.tsx +32 -3
  60. package/src/suite/components/suite-layout.tsx +4 -4
  61. package/src/suite/components/suite-mobile-drawer.tsx +2 -2
  62. package/src/suite/components/suite-mobile-header.tsx +1 -1
  63. package/src/suite/components/suite-notification-bell.tsx +27 -6
  64. package/src/suite/components/suite-notification-settings.tsx +182 -0
  65. package/src/suite/components/suite-palette-library.test.tsx +46 -0
  66. package/src/suite/components/suite-palette-library.tsx +82 -15
  67. package/src/suite/components/suite-settings-layout.tsx +2 -2
  68. package/src/suite/components/suite-settings-mobile-nav.tsx +10 -10
  69. package/src/suite/components/suite-sidebar.test.tsx +39 -0
  70. package/src/suite/components/suite-sidebar.tsx +41 -19
  71. package/src/suite/components/suite-skeleton.tsx +6 -6
  72. package/src/suite/components/suite-user-menu.tsx +2 -2
  73. package/src/suite/components/theme-provider.tsx +2 -0
  74. package/src/suite/components/today-calibrating.tsx +3 -3
  75. package/src/suite/components/today-ui.tsx +42 -37
  76. package/src/suite/components/workspace-switcher.tsx +3 -3
  77. package/src/suite/index.ts +14 -0
  78. package/src/suite/lib/suite-notifications.tsx +5 -0
  79. 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 import_react5 = require("react");
691
+ var import_react7 = require("react");
257
692
 
258
693
  // src/components/icons/IconBase.tsx
259
- var import_react2 = require("react");
260
- var import_jsx_runtime3 = require("react/jsx-runtime");
261
- var IconBase = (0, import_react2.forwardRef)(function IconBase2(_a, ref) {
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, import_jsx_runtime3.jsx)(
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 import_react3 = require("react");
313
- var import_jsx_runtime4 = require("react/jsx-runtime");
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, import_react3.forwardRef)(function IconGlyph2(props, ref) {
316
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(IconBase, __spreadProps(__spreadValues({ ref, viewBox }, props), { children: paths }));
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, import_jsx_runtime4.jsx)("path", { d, fill: "currentColor" })
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 import_react4 = require("react");
331
- var import_jsx_runtime5 = require("react/jsx-runtime");
332
- var fill = (d) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { d, fill: "currentColor" });
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, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
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, import_jsx_runtime5.jsxs)("g", { fill: "currentColor", children: [
432
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { d: "m12 21c1.1046 0 2-.8954 2-2s-.8954-2-2-2-2 .8954-2 2 .8954 2 2 2z" }),
433
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { d: "m10 3h4v12h-4z" })
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, import_jsx_runtime5.jsx)("g", { transform: "translate(4 5.5)", children: fill("M2 0H0V10H12.01V13L16 9L12.01 5V8H2V0Z") })
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, import_jsx_runtime5.jsx)(
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, import_jsx_runtime5.jsx)(
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, import_jsx_runtime5.jsx)(
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, import_jsx_runtime5.jsx)(
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, import_jsx_runtime5.jsx)(
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, import_jsx_runtime5.jsx)(
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, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
619
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { d: "M5 4h2v16H5V4z", fill: "currentColor", opacity: "0.45" }),
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, import_jsx_runtime5.jsx)(
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, import_jsx_runtime5.jsx)(
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, import_jsx_runtime5.jsx)(
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, import_react4.forwardRef)(function IconSpinner2(_a, ref) {
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, import_jsx_runtime5.jsx)(IconSync, __spreadValues({ ref, className: cn("ph-icon-spin", className) }, props));
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, import_react4.forwardRef)(function IconByName2(_a, ref) {
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, import_jsx_runtime5.jsx)(Icon, __spreadValues({ ref }, props));
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 import_jsx_runtime6 = require("react/jsx-runtime");
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, import_react5.forwardRef)(function Alert2(_a, ref) {
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, import_jsx_runtime6.jsxs)(
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, import_jsx_runtime6.jsx)(Icon, { className: "ph-alert-icon mt-0.5 h-5 w-5 shrink-0", "aria-hidden": true }),
834
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "min-w-0 flex-1", children: [
835
- title && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "font-semibold", children: title }),
836
- description && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-1 text-sm text-ph-subtle", children: description }),
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, import_jsx_runtime6.jsx)(
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, import_jsx_runtime6.jsx)(IconClose, { className: "h-4 w-4", "aria-hidden": true })
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 import_react6 = require("react");
857
- var import_jsx_runtime7 = require("react/jsx-runtime");
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, import_react6.forwardRef)(function Badge2(_a, ref) {
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, import_jsx_runtime7.jsx)(
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 import_react7 = require("react");
902
- var import_jsx_runtime8 = require("react/jsx-runtime");
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, import_react7.forwardRef)(function Card2(_a, ref) {
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, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
954
- media && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "ph-card-media", children: media }),
955
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: cn("ph-card-body", bodyClassName), children: [
956
- title && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Title3, { className: "ph-card-title", children: title }),
957
- description && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-sm text-ph-subtle", children: description }),
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, import_jsx_runtime8.jsx)("div", { className: "ph-card-actions", children: actions })
1394
+ actions && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "ph-card-actions", children: actions })
960
1395
  ] }),
961
- footer && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "border-t border-ph-border px-6 py-4 text-xs text-ph-subtle", children: footer })
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, import_jsx_runtime8.jsx)(
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, import_jsx_runtime8.jsx)(
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, import_jsx_runtime8.jsx)("div", __spreadProps(__spreadValues({ ref, className: cardClassName }, props), { children: cardContent }));
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 import_jsx_runtime9 = require("react/jsx-runtime");
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, import_jsx_runtime9.jsx)(
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, import_jsx_runtime9.jsx)(
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, import_jsx_runtime9.jsx)(
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, import_jsx_runtime9.jsxs)("span", { className: "contents", children: [
1089
- index > 0 && separator != null ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "ph-shortcut-separator", "aria-hidden": "true", children: separator }) : null,
1090
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "ph-shortcut-key", "aria-hidden": accessibleLabel ? true : void 0, children: key })
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 import_jsx_runtime10 = require("react/jsx-runtime");
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, import_jsx_runtime10.jsxs)(
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, import_jsx_runtime10.jsx)("span", { className: "ph-loading", "aria-hidden": true }) : null,
1146
- variant === "dots" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: "ph-loading-dots", "aria-hidden": true, children: [
1147
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", {}),
1148
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", {}),
1149
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", {})
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, import_jsx_runtime10.jsx)("span", { className: "ph-loading-pulse", "aria-hidden": true }) : null
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, import_jsx_runtime10.jsx)(
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, import_jsx_runtime10.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-loading-state", className), role: "status", "aria-label": label }, props), { children: [
1183
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Loader, { variant, size, label, "aria-hidden": "true" }),
1184
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "ph-loading-state__copy", children: [
1185
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("strong", { children: title }),
1186
- description ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: description }) : null
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 import_react8 = require("react");
1193
- var import_jsx_runtime11 = require("react/jsx-runtime");
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, import_jsx_runtime11.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-auth-layout", aside != null && "ph-auth-layout--split", className) }, props), { children: [
1197
- aside ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("aside", { className: "ph-auth-layout__aside", children: aside }) : null,
1198
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "ph-auth-layout__main", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "ph-auth-layout__column", children: [
1199
- brand ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "ph-auth-layout__brand", children: brand }) : null,
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, import_jsx_runtime11.jsx)("footer", { className: "ph-auth-layout__footer", children: footer }) : null
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, import_react8.useId)();
1208
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("section", __spreadProps(__spreadValues({ className: cn("ph-auth-card", className), "aria-labelledby": titleId }, props), { children: [
1209
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("header", { className: "ph-auth-card__header", children: [
1210
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("h1", { id: titleId, children: title }),
1211
- description ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { children: description }) : null
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, import_jsx_runtime11.jsx)("div", { className: "ph-auth-card__body", children }),
1214
- footer ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("footer", { className: "ph-auth-card__footer", children: footer }) : null
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, import_jsx_runtime11.jsx)("div", __spreadProps(__spreadValues({ className: cn("ph-auth-divider", className) }, props), { children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children }) }));
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 import_jsx_runtime12 = require("react/jsx-runtime");
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, import_jsx_runtime12.jsx)("div", __spreadProps(__spreadValues({ className: cn("ph-settings-nav", className) }, props), { children: groups.map((group, index) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "ph-settings-nav__group", children: [
1227
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "ph-settings-nav__heading", children: group.label }),
1228
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "ph-settings-nav__items", children: group.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
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, import_jsx_runtime12.jsx)("span", { className: "ph-settings-nav__icon", children: item.icon }) : null,
1241
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: item.label }),
1242
- item.badge ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "ph-settings-nav__badge", children: item.badge }) : null
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, import_jsx_runtime12.jsxs)("section", __spreadProps(__spreadValues({ className: cn("ph-settings-layout", className) }, props), { children: [
1268
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("header", { className: "ph-settings-layout__header", children: [
1269
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { children: [
1270
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("h2", { children: title }),
1271
- description ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { children: description }) : null
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, import_jsx_runtime12.jsx)("div", { className: "ph-settings-layout__actions", children: actions }) : null
1723
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "ph-settings-layout__actions", children: actions }) : null
1274
1724
  ] }),
1275
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("details", { className: "ph-settings-layout__mobile-nav", children: [
1276
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("summary", { children: [
1277
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(IconTuning, { className: "h-4 w-4", "aria-hidden": true }),
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, import_jsx_runtime12.jsx)("nav", { "aria-label": navigationLabel, children: navigation })
1730
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("nav", { "aria-label": navigationLabel, children: navigation })
1281
1731
  ] }),
1282
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "ph-settings-layout__grid", children: [
1283
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("aside", { className: "ph-settings-layout__sidebar", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("nav", { "aria-label": navigationLabel, children: navigation }) }),
1284
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "ph-settings-layout__content", children })
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 import_jsx_runtime13 = require("react/jsx-runtime");
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, import_jsx_runtime13.jsx)(DropdownPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
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, import_jsx_runtime13.jsx)(
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, import_jsx_runtime13.jsx)("div", __spreadProps(__spreadValues({ className: cn("ph-dropdown", className) }, props), { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
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, import_jsx_runtime13.jsx)(DropdownPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
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, import_jsx_runtime13.jsx)(
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, import_jsx_runtime13.jsx)(IconChevronDown, { className: "h-4 w-4", "aria-hidden": true });
1463
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", __spreadProps(__spreadValues({ className: cn("ph-dropdown", className) }, props), { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
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, import_jsx_runtime13.jsx)(DropdownPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
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, import_jsx_runtime13.jsx)(
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, import_jsx_runtime13.jsx)(
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, import_jsx_runtime13.jsx)(DropdownPrimitive.Item, { asChild: true, disabled, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
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, import_jsx_runtime13.jsx)(DropdownPrimitive.RadioGroup, __spreadValues({}, props));
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, import_jsx_runtime13.jsxs)(
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, import_jsx_runtime13.jsx)("span", { className: "ph-dropdown-item-indicator", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(IconCheck, { className: "h-3.5 w-3.5" }) }) }),
1551
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children })
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 import_react10 = require("react");
1559
- var import_iconoir_react = require("iconoir-react");
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 import_react9 = require("react");
1563
- var import_jsx_runtime14 = require("react/jsx-runtime");
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, import_react9.useId)();
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, import_jsx_runtime14.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-field", className) }, props), { children: [
1597
- label ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
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, import_jsx_runtime14.jsx)("span", { "aria-hidden": "true", children: " *" }) : null
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, import_jsx_runtime14.jsx)("p", { id: descriptionId, className: "mt-1 text-xs text-ph-subtle", children: helperText }) : null,
1610
- errorId ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { id: errorId, className: "mt-1 text-xs font-medium text-ph-danger", children: error }) : null
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 import_jsx_runtime15 = require("react/jsx-runtime");
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, import_react10.forwardRef)(function Input2(_a, ref) {
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, import_react10.useId)();
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, import_react10.useState)(false);
1660
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
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, import_jsx_runtime15.jsxs)("div", { className: "relative", children: [
1672
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
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, import_jsx_runtime15.jsx)(
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: "absolute inset-y-0 right-0 flex w-10 items-center justify-center rounded-r-[var(--ph-radius-control)] text-ph-mutedtext transition-colors hover:text-ph-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ph-focus disabled:opacity-40",
1700
- children: revealed ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_iconoir_react.EyeClosed, { className: "h-4 w-4", "aria-hidden": true }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_iconoir_react.Eye, { className: "h-4 w-4", "aria-hidden": true })
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, import_react10.forwardRef)(function Select2(_a, ref) {
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, import_react10.useId)();
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, import_jsx_runtime15.jsx)(FormField, { controlId: id, label, hideLabel, helperText, error, required, disabled, className: wrapperClassName, children: (fieldProps) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
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, import_react10.forwardRef)(function Textarea2(_a, ref) {
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, import_react10.useId)();
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, import_jsx_runtime15.jsx)(FormField, { controlId: id, label, hideLabel, helperText, error, required, disabled, className: wrapperClassName, children: (fieldProps) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
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, import_react10.forwardRef)(function Checkbox2(_a, ref) {
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, import_react10.useId)();
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, import_jsx_runtime15.jsxs)("div", { className: cn("ph-control-row", wrapperClassName), children: [
1832
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "ph-checkbox-wrap", children: [
1833
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
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, import_jsx_runtime15.jsx)(IconCheck, { className: "ph-checkbox-icon", "aria-hidden": true })
2301
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(IconCheck, { className: "ph-checkbox-icon", "aria-hidden": true })
1852
2302
  ] }),
1853
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ph-control-copy", children: [
1854
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label }),
1855
- descriptionId ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { id: descriptionId, className: "text-xs text-ph-subtle", children: helperText }) : null,
1856
- errorId ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { id: errorId, className: "text-xs font-medium text-ph-danger", children: error }) : null
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, import_react10.forwardRef)(function Radio2(_a, ref) {
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, import_react10.useId)();
2325
+ const autoId = (0, import_react12.useId)();
1876
2326
  const id = idProp != null ? idProp : autoId;
1877
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: cn("ph-control-row", wrapperClassName, disabled && "opacity-60"), children: [
1878
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
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, import_jsx_runtime15.jsx)("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label })
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, import_react10.forwardRef)(function Toggle2(_a, ref) {
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, import_react10.useId)();
2356
+ const autoId = (0, import_react12.useId)();
1907
2357
  const id = idProp != null ? idProp : autoId;
1908
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { className: cn("ph-control-row-between", wrapperClassName, disabled && "opacity-60"), children: [
1909
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: disabled ? "opacity-60" : void 0, children: label }),
1910
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
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, import_react10.forwardRef)(function Range2(_a, ref) {
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, import_react10.useId)();
2392
+ const autoId = (0, import_react12.useId)();
1943
2393
  const id = idProp != null ? idProp : autoId;
1944
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: cn("ph-field", wrapperClassName), children: [
1945
- label && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { htmlFor: id, className: "ph-label", children: label }),
1946
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("input", __spreadValues({ ref, id, type: "range", className: cn("ph-range", className) }, props)),
1947
- (minLabel || valueLabel || maxLabel) && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex justify-between text-xs text-ph-mutedtext", children: [
1948
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: minLabel }),
1949
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: valueLabel }),
1950
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: maxLabel })
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, import_react10.forwardRef)(function FileUpload2(_a, ref) {
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, import_react10.useId)();
2419
+ const autoId = (0, import_react12.useId)();
1970
2420
  const id = idProp != null ? idProp : autoId;
1971
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: cn("ph-field", wrapperClassName), children: [
1972
- label && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { htmlFor: id, className: "ph-label", children: label }),
1973
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { htmlFor: id, className: "ph-file-upload", children: [
1974
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("input", __spreadValues({ ref, id, type: "file", className: cn("sr-only", className) }, props)),
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 import_react11 = require("react");
1984
- var import_jsx_runtime16 = require("react/jsx-runtime");
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, import_react11.useRef)(null);
2015
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
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, import_jsx_runtime16.jsxs)(Dialog.Portal, { children: [
2023
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
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, import_jsx_runtime16.jsx)(
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, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
2055
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Dialog.Title, { className: "sr-only", children: ariaLabel != null ? ariaLabel : "Dialog" }),
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, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
2058
- title ? null : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Dialog.Title, { className: "sr-only", children: ariaLabel != null ? ariaLabel : "Dialog" }),
2059
- title || description || showCloseButton && canDismiss ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("header", { className: "ph-modal-header", children: [
2060
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "min-w-0", children: [
2061
- title ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Dialog.Title, { className: "text-lg font-bold text-ph-ink", children: title }) : null,
2062
- description ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Dialog.Description, { className: "mt-1 text-sm text-ph-subtle", children: description }) : null
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, import_jsx_runtime16.jsx)(Dialog.Close, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
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, import_jsx_runtime16.jsx)(IconClose, { className: "h-5 w-5", "aria-hidden": true })
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, import_jsx_runtime16.jsx)("div", { className: cn("ph-modal-body", bodyClassName), children }),
2075
- footer ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "ph-modal-footer", children: footer }) : null
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 import_jsx_runtime17 = require("react/jsx-runtime");
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, import_jsx_runtime17.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-panel", className) }, props), { children: [
2089
- title && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h3", { className: "text-sm font-semibold uppercase tracking-wider text-ph-mutedtext", children: title }),
2090
- description && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-sm text-ph-subtle", children: description }),
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 import_react12 = require("react");
2097
- var import_jsx_runtime18 = require("react/jsx-runtime");
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, import_react12.useId)();
2568
+ const autoId = (0, import_react14.useId)();
2119
2569
  const id = idProp != null ? idProp : autoId;
2120
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: cn("relative", wrapperClassName), children: [
2121
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { htmlFor: id, className: hideLabel ? "sr-only" : "ph-label mb-1.5 block", children: label }),
2122
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "relative", children: [
2123
- shortcut != null ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
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, import_jsx_runtime18.jsx)(
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, import_react12.useId)();
2615
+ const autoId = (0, import_react14.useId)();
2166
2616
  const id = idProp != null ? idProp : autoId;
2167
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: cn("ph-field", wrapperClassName), children: [
2168
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { htmlFor: id, className: "ph-label", children: label }),
2169
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "ph-search-group flex w-full max-w-lg min-h-[2.3125rem] items-stretch divide-x divide-ph-border", children: [
2170
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
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, import_jsx_runtime18.jsx)(
2629
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2180
2630
  Button,
2181
2631
  {
2182
2632
  type: "submit",
2183
2633
  variant: "primary",
2184
- icon: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(IconSearch, { className: "h-4 w-4", "aria-hidden": true }),
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 import_jsx_runtime19 = require("react/jsx-runtime");
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
- caption
2654
+ tableClassName,
2655
+ variant = "default",
2656
+ caption,
2657
+ emptyState = "No data available."
2205
2658
  }) {
2206
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2659
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2207
2660
  "div",
2208
2661
  {
2209
- className: cn("ph-table-wrap", compact && "ph-table-compact", className),
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, import_jsx_runtime19.jsxs)("table", { className: cn("ph-table", zebra && "ph-table-zebra", ribbon && "ph-table--ribbon"), children: [
2212
- caption && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("caption", { className: "sr-only", children: caption }),
2213
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("tr", { children: columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("th", { className: col.className, children: col.header }, col.key)) }) }),
2214
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("tbody", { children: data.map((row, i) => {
2215
- var _a;
2216
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("tr", { style: getRowStyle == null ? void 0 : getRowStyle(row), children: columns.map((col) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("td", { className: col.className, children: col.cell(row) }, col.key)) }, (_a = getRowKey == null ? void 0 : getRowKey(row, i)) != null ? _a : i);
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 import_jsx_runtime20 = require("react/jsx-runtime");
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, import_jsx_runtime20.jsxs)("article", __spreadProps(__spreadValues({ className: cn("ph-stat", statMap[tone], className) }, props), { children: [
2242
- icon && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: cn("mb-2 h-7 w-7", toneMap[tone]), children: icon }),
2243
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: cn("ph-stat-label", tone === "warning" && toneMap[tone]), children: label }),
2244
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: cn("ph-stat-val", toneMap[tone]), children: value }),
2245
- footer && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-xs text-ph-subtle", children: footer })
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 import_react13 = require("react");
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, import_react13.useLayoutEffect)(() => {
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 import_react14 = require("react");
2407
- var import_jsx_runtime21 = require("react/jsx-runtime");
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, import_react14.useState)(DEFAULT_THEME_ID);
2410
- (0, import_react14.useEffect)(() => {
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, import_jsx_runtime21.jsxs)("label", { className: cn("flex min-w-0 items-center gap-2", className), children: [
2416
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "shrink-0 text-xs font-medium text-ph-mutedtext sm:text-sm", children: "Theme" }),
2417
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
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, import_jsx_runtime21.jsx)("optgroup", { label: group, children: THEMES.filter((theme) => theme.group === group).map((theme) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("option", { value: theme.id, children: theme.name }, theme.id)) }, group))
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 import_react15 = require("react");
2436
- var import_jsx_runtime22 = require("react/jsx-runtime");
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, import_react15.useState)(new Set(defaultOpen));
2444
- const idPrefix = (0, import_react15.useId)();
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, import_jsx_runtime22.jsx)(
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, import_jsx_runtime22.jsxs)("div", { className: "first:rounded-t-xl last:rounded-b-xl", children: [
2470
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
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: "flex w-full items-center justify-between px-5 py-4 text-left transition hover:bg-ph-muted",
2944
+ className: "ph-accordion__trigger",
2478
2945
  children: [
2479
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "font-semibold text-ph-ink", children: item.title }),
2480
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
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, import_jsx_runtime22.jsx)(
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-all duration-200",
2968
+ "grid transition-[grid-template-rows] duration-200",
2502
2969
  isOpen ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
2503
2970
  ),
2504
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "px-5 pb-4 text-ph-subtle", children: item.content }) })
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 import_jsx_runtime23 = require("react/jsx-runtime");
2515
- function SegmentedControl({ options, value, onChange, className }) {
2516
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
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
- className: cn(
2520
- "inline-flex rounded-lg bg-ph-muted p-1",
2521
- className
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
- "aria-pressed": value === option.value,
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
- "relative flex min-h-11 items-center gap-1.5 rounded-md px-3.5 py-1.5 text-sm font-medium transition-all sm:min-h-9",
2531
- value === option.value ? "bg-ph-surface text-ph-ink shadow-ph" : "text-ph-subtle hover:text-ph-ink"
3038
+ "ph-segmented-control__item",
3039
+ value === option.value && "ph-segmented-control__item--selected"
2532
3040
  ),
2533
3041
  children: [
2534
- option.icon && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "h-4 w-4", children: option.icon }),
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 import_react16 = require("react");
3053
+ var import_react19 = require("react");
2546
3054
  var Dialog2 = __toESM(require("@radix-ui/react-dialog"));
2547
- var import_jsx_runtime24 = require("react/jsx-runtime");
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, import_react16.useState)("");
2560
- const [selectedIndex, setSelectedIndex] = (0, import_react16.useState)(0);
2561
- const inputRef = (0, import_react16.useRef)(null);
2562
- const listboxRef = (0, import_react16.useRef)(null);
2563
- const restoreFocusRef = (0, import_react16.useRef)(null);
2564
- const generatedId = (0, import_react16.useId)();
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, import_react16.useEffect)(() => {
3079
+ (0, import_react19.useEffect)(() => {
2572
3080
  if (!isOpen) return;
2573
3081
  setQuery("");
2574
3082
  setSelectedIndex(0);
2575
3083
  }, [isOpen]);
2576
- (0, import_react16.useEffect)(() => {
3084
+ (0, import_react19.useEffect)(() => {
2577
3085
  setSelectedIndex((current) => Math.min(current, Math.max(filtered.length - 1, 0)));
2578
3086
  }, [filtered.length]);
2579
- (0, import_react16.useEffect)(() => {
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, import_jsx_runtime24.jsx)(
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, import_jsx_runtime24.jsxs)(Dialog2.Portal, { children: [
2616
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
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: "fixed inset-0 z-50 bg-black/40 backdrop-blur-sm"
3129
+ className: "ph-command-palette__overlay"
2622
3130
  }
2623
3131
  ),
2624
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
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, import_jsx_runtime24.jsx)(Dialog2.Title, { className: "sr-only", children: "Command palette" }),
2644
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-center gap-3 border-b border-ph-border px-4 py-3", children: [
2645
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(IconSearch, { className: "h-5 w-5 text-ph-mutedtext" }),
2646
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
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, import_jsx_runtime24.jsx)("kbd", { "aria-hidden": "true", className: "rounded border border-ph-border bg-ph-muted px-1.5 py-0.5 text-xs text-ph-mutedtext", children: "ESC" })
3174
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("kbd", { "aria-hidden": "true", className: "ph-keycap", children: "ESC" })
2670
3175
  ] }),
2671
- /* @__PURE__ */ (0, import_jsx_runtime24.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_runtime24.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_runtime24.jsxs)(
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
- "flex w-full cursor-pointer items-center gap-3 px-4 py-2.5 text-left text-sm transition-colors",
2685
- index === activeIndex ? "bg-ph-muted text-ph-ink" : "text-ph-subtle"
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, import_jsx_runtime24.jsx)("span", { "aria-hidden": "true", className: "h-5 w-5", children: item.icon }),
2689
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "flex-1", children: item.label }),
2690
- item.shortcut && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("kbd", { "aria-hidden": "true", className: "rounded border border-ph-border bg-ph-surface px-1.5 py-0.5 text-xs text-ph-mutedtext", children: item.shortcut })
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 import_react17 = require("react");
2705
- var import_jsx_runtime25 = require("react/jsx-runtime");
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, import_react17.useState)(() => startOfMonth(value != null ? value : /* @__PURE__ */ new Date()));
2763
- const [focusedDate, setFocusedDate] = (0, import_react17.useState)(() => startOfDay(value != null ? value : /* @__PURE__ */ new Date()));
2764
- const gridRef = (0, import_react17.useRef)(null);
2765
- const shouldFocusDateRef = (0, import_react17.useRef)(false);
2766
- const monthLabelId = (0, import_react17.useId)();
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, import_react17.useEffect)(() => {
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, import_react17.useEffect)(() => {
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, import_jsx_runtime25.jsxs)("div", { className: cn("w-[280px] rounded-xl border border-ph-border bg-ph-surface p-4 shadow-ph", className), children: [
2844
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "mb-4 flex items-center justify-between", children: [
2845
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
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: "rounded-lg p-1 text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink",
2852
- children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(IconChevronLeft, { className: "h-5 w-5", "aria-hidden": true })
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, import_jsx_runtime25.jsxs)("span", { id: monthLabelId, "aria-live": "polite", className: "text-sm font-semibold text-ph-ink", children: [
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, import_jsx_runtime25.jsx)(
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: "rounded-lg p-1 text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink",
2867
- children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(IconChevronRight, { className: "h-5 w-5", "aria-hidden": true })
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, import_jsx_runtime25.jsxs)("div", { ref: gridRef, role: "grid", "aria-labelledby": monthLabelId, children: [
2872
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { role: "row", className: "grid grid-cols-7 gap-1", children: weekDays.map((day, index) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
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, import_jsx_runtime25.jsx)("div", { role: "row", className: "grid grid-cols-7 gap-1", children: weekDates.map(
2886
- (date, day) => date ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
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, import_jsx_runtime25.jsx)(
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
- "flex h-full w-full items-center justify-center rounded-lg text-sm transition-colors",
2904
- value && isSameDay(value, date) ? "bg-ph-brand font-semibold text-[var(--ph-on-accent)] shadow-ph" : isSameDay(today, date) ? "bg-ph-muted font-semibold text-ph-brand ring-1 ring-ph-brand/30" : "text-ph-ink hover:bg-ph-muted"
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, import_jsx_runtime25.jsx)("div", { role: "gridcell", "aria-hidden": "true", className: "aspect-square" }, `empty-${week}-${day}`)
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 import_react18 = require("react");
3424
+ var import_react21 = require("react");
2920
3425
  var import_react_dom = require("react-dom");
2921
- var import_jsx_runtime26 = require("react/jsx-runtime");
2922
- var TooltipDelayContext = (0, import_react18.createContext)(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, import_jsx_runtime26.jsx)(TooltipDelayContext.Provider, { value: delayDuration, children });
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, import_react18.useContext)(TooltipDelayContext);
2955
- const generatedId = (0, import_react18.useId)().replace(/:/g, "");
2956
- const triggerRef = (0, import_react18.useRef)(null);
2957
- const contentRef = (0, import_react18.useRef)(null);
2958
- const timerRef = (0, import_react18.useRef)(null);
2959
- const [internalOpen, setInternalOpen] = (0, import_react18.useState)(defaultOpen);
2960
- const [position, setPosition] = (0, import_react18.useState)(null);
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, import_react18.useCallback)(() => {
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, import_react18.useLayoutEffect)(() => {
3509
+ (0, import_react21.useLayoutEffect)(() => {
3005
3510
  if (isOpen) updatePosition();
3006
3511
  }, [isOpen, updatePosition]);
3007
- (0, import_react18.useEffect)(() => {
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, import_react18.useEffect)(() => () => clearTimer(), []);
3522
+ (0, import_react21.useEffect)(() => () => clearTimer(), []);
3018
3523
  const describedBy = [children.props["aria-describedby"], tooltipId].filter(Boolean).join(" ");
3019
- const trigger = (0, import_react18.cloneElement)(children, { "aria-describedby": describedBy });
3020
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
3021
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
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, import_jsx_runtime26.jsx)(
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, import_jsx_runtime26.jsx)(
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 import_jsx_runtime27 = require("react/jsx-runtime");
3572
+ var import_jsx_runtime29 = require("react/jsx-runtime");
3068
3573
  function EmptyState({ icon, title, description, action, className }) {
3069
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
3574
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
3070
3575
  "div",
3071
3576
  {
3072
3577
  className: cn(
3073
- "flex flex-col items-center justify-center rounded-xl border border-dashed border-ph-border bg-ph-muted/50 px-8 py-16 text-center",
3578
+ "ph-empty-state",
3074
3579
  className
3075
3580
  ),
3076
3581
  children: [
3077
- icon && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-ph-muted text-ph-mutedtext", children: icon }),
3078
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h2", { className: "text-base font-semibold text-ph-ink", children: title }),
3079
- description && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { className: "mt-1 max-w-sm text-sm text-ph-subtle", children: description }),
3080
- action && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "mt-4", children: action })
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 import_jsx_runtime28 = require("react/jsx-runtime");
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, import_jsx_runtime28.jsx)("div", { className: cn("ph-filter-chips", className), role: "group", "aria-label": ariaLabel, children: chips.map((chip) => {
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, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [
3099
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "ph-filter-chip__label", children: chip.label }),
3100
- chip.value != null ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "ph-filter-chip__value", children: chip.value }) : null
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, import_jsx_runtime28.jsxs)(
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, import_jsx_runtime28.jsx)(
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, import_jsx_runtime28.jsx)("span", { className: "ph-filter-chip__main", children: content }),
3118
- chip.active && onRemove ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
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, import_jsx_runtime28.jsx)(IconClose, { className: "h-3 w-3", "aria-hidden": true })
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 import_jsx_runtime29 = require("react/jsx-runtime");
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, import_jsx_runtime29.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-filter-bar", className) }, props), { children: [
3159
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "ph-filter-bar__controls", role: "group", "aria-label": label, children: [
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, import_jsx_runtime29.jsx)("button", { type: "button", className: "ph-filter-bar__clear", onClick: onClear, children: clearLabel }) : null
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, import_jsx_runtime29.jsx)("output", { className: "ph-filter-bar__results", "aria-live": "polite", children: resultCount }) : null
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, import_jsx_runtime29.jsx)(
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, import_jsx_runtime29.jsxs)("span", { className: cn("ph-filter-menu-trigger", selected && "ph-filter-menu-trigger--active"), children: [
3188
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(IconTuning, { className: "h-3.5 w-3.5", "aria-hidden": true }),
3189
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ph-filter-menu-trigger__label", children: label }),
3190
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ph-filter-menu-trigger__value", children: displayValue })
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, import_jsx_runtime29.jsx)(DropdownRadioGroup, { value, onValueChange, children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
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, import_jsx_runtime29.jsx)(
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, import_jsx_runtime29.jsxs)("span", { className: "ph-filter-menu-trigger ph-sort-menu-trigger", children: [
3224
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
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, import_jsx_runtime29.jsx)("span", { className: "ph-filter-menu-trigger__label", children: label }),
3232
- selected ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "ph-filter-menu-trigger__value", children: selected.label }) : null
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, import_jsx_runtime29.jsx)(DropdownRadioGroup, { value, onValueChange, children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
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 import_jsx_runtime30 = require("react/jsx-runtime");
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, import_jsx_runtime30.jsxs)("div", __spreadProps(__spreadValues({ className: cn("ph-filter-controls", className) }, props), { children: [
3271
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FilterBar, __spreadProps(__spreadValues({}, barProps), { children })),
3272
- hasChips && chipsProps ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FilterChips, __spreadValues({}, chipsProps)) : emptyState != null ? emptyState : null
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 import_react19 = require("react");
3278
- var import_jsx_runtime31 = require("react/jsx-runtime");
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, import_react19.useState)(false);
3785
+ const [copied, setCopied] = (0, import_react22.useState)(false);
3281
3786
  const handleCopy = async () => {
3282
- await navigator.clipboard.writeText(code);
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, import_jsx_runtime31.jsxs)("div", { className: cn("overflow-hidden rounded-lg border border-ph-border bg-[#1a1a2e]", className), children: [
3287
- (filename || language) && /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex items-center justify-between border-b border-white/10 px-4 py-2", children: [
3288
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex items-center gap-2", children: [
3289
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "flex gap-1.5", children: [
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: "text-xs text-white/60 transition hover:text-white",
3808
+ className: "ph-code-block__copy",
3302
3809
  children: copied ? "Copied!" : "Copy"
3303
3810
  }
3304
3811
  )
3305
3812
  ] }),
3306
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("pre", { className: "overflow-x-auto p-4 text-sm leading-relaxed", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("code", { className: "font-mono text-[#e4e4e7]", children: code }) })
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 import_jsx_runtime32 = require("react/jsx-runtime");
3818
+ var import_jsx_runtime34 = require("react/jsx-runtime");
3312
3819
  function ComponentDocs({ title = "Props & variants", rows, defaultOpen = false, className }) {
3313
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("details", { className: cn("ph-panel group overflow-hidden p-0", className), open: defaultOpen, children: [
3314
- /* @__PURE__ */ (0, import_jsx_runtime32.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: [
3315
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("h3", { className: "text-xs font-semibold uppercase tracking-wider text-ph-mutedtext", children: title }),
3316
- /* @__PURE__ */ (0, import_jsx_runtime32.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: [
3317
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "group-open:hidden", children: "Show" }),
3318
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "hidden group-open:inline", children: "Hide" })
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, import_jsx_runtime32.jsx)("div", { className: "overflow-x-auto border-t border-ph-border", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("table", { className: "w-full text-left text-sm", children: [
3322
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("thead", { className: "bg-ph-muted text-xs uppercase tracking-wider text-ph-mutedtext", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("tr", { children: [
3323
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("th", { className: "px-4 py-2 font-semibold", children: "Prop" }),
3324
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("th", { className: "px-4 py-2 font-semibold", children: "Type" }),
3325
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("th", { className: "px-4 py-2 font-semibold", children: "Default" }),
3326
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("th", { className: "px-4 py-2 font-semibold", children: "Use" })
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, import_jsx_runtime32.jsx)("tbody", { className: "divide-y divide-ph-border", children: rows.map((row) => {
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, import_jsx_runtime32.jsxs)("tr", { children: [
3331
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-ink", children: row.name }),
3332
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: row.type }),
3333
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: (_a = row.defaultValue) != null ? _a : "-" }),
3334
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("td", { className: "px-4 py-3 align-top text-ph-subtle", children: (_b = row.description) != null ? _b : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "text-ph-mutedtext", children: "\u2014" }) })
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 import_react20 = require("react");
3343
- var import_jsx_runtime33 = require("react/jsx-runtime");
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, import_react20.useState)(false);
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, import_jsx_runtime33.jsxs)("section", { id: id != null ? id : fallbackId, className: cn("scroll-mt-20", className), children: [
3358
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "ph-h2-rule mb-8", children: [
3359
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-1.5", children: [
3360
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("h2", { children: title }),
3361
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
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-all",
3368
- showCode ? "border-ph-brand bg-ph-brand text-[var(--ph-on-accent)] shadow-lg shadow-ph-brand/25" : "border-ph-border bg-ph-surface text-ph-subtle hover:border-ph-brand hover:text-ph-brand"
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, import_jsx_runtime33.jsx)(IconCodePreview, { className: "h-5 w-5", "aria-hidden": true })
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, import_jsx_runtime33.jsx)("hr", {})
3883
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("hr", {})
3377
3884
  ] }),
3378
- description && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("p", { className: "mb-6 text-sm text-ph-subtle", children: description }),
3379
- docs && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "mb-6", children: docs }),
3380
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
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, import_jsx_runtime33.jsx)("div", { className: cn("min-w-0", showCode && "lg:pr-2"), children }),
3389
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
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-all duration-300",
3900
+ "transition-opacity duration-200",
3394
3901
  showCode ? "block opacity-100" : "hidden opacity-0 lg:hidden"
3395
3902
  ),
3396
- children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "sticky top-20", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(CodeBlock, { code, filename }) })
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 import_react21 = require("react");
3446
- var import_jsx_runtime34 = require("react/jsx-runtime");
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, import_react21.useState)(defaultOpen);
3454
- const generatedId = (0, import_react21.useId)();
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, import_jsx_runtime34.jsxs)("section", { id, className: "scroll-mt-20", children: [
3457
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
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: "mb-6 flex w-full items-center justify-between rounded-lg border border-ph-border bg-ph-muted px-5 py-4 text-left transition hover:bg-ph-muted/80",
3971
+ className: "ph-collapsible-trigger mb-6",
3465
3972
  children: [
3466
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "text-lg font-bold text-ph-ink", children: title }),
3467
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
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, import_jsx_runtime34.jsx)(
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
- "overflow-hidden transition-all duration-300",
3490
- isOpen ? "max-h-[50000px] opacity-100" : "max-h-0 opacity-0"
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 import_react22 = require("react");
3500
- var import_jsx_runtime35 = require("react/jsx-runtime");
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, import_react22.forwardRef)(function Display2(_a, ref) {
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, import_jsx_runtime35.jsx)("h1", __spreadProps(__spreadValues({ ref }, props), { className: textClass("ph-hero-title", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function SectionTitle2(_a, ref) {
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, import_jsx_runtime35.jsx)("h2", __spreadProps(__spreadValues({ ref }, props), { className: textClass("ph-section-title", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function H12(_a, ref) {
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, import_jsx_runtime35.jsx)("h1", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-3xl font-bold tracking-tight md:text-4xl", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function H22(_a, ref) {
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, import_jsx_runtime35.jsx)("h2", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-2xl font-bold tracking-tight", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function H32(_a, ref) {
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, import_jsx_runtime35.jsx)("h3", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-xl font-semibold", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function H42(_a, ref) {
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, import_jsx_runtime35.jsx)("h4", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-lg font-semibold", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function H52(_a, ref) {
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, import_jsx_runtime35.jsx)("h5", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-base font-semibold", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function P2(_a, ref) {
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, import_jsx_runtime35.jsx)("p", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-base leading-relaxed", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function Small2(_a, ref) {
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, import_jsx_runtime35.jsx)("span", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-sm leading-relaxed", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function Caption2(_a, ref) {
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, import_jsx_runtime35.jsx)("span", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-[11px] font-medium uppercase tracking-wider", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function Overline2(_a, ref) {
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, import_jsx_runtime35.jsx)("span", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-[10px] font-bold uppercase tracking-[0.15em]", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function Lead2(_a, ref) {
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, import_jsx_runtime35.jsx)("p", __spreadProps(__spreadValues({ ref }, props), { className: textClass("ph-lead", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function Mono2(_a, ref) {
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, import_jsx_runtime35.jsx)("code", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-sm font-mono leading-relaxed", tone, weight, truncate, className), children }));
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, import_react22.forwardRef)(function Label2(_a, ref) {
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, import_jsx_runtime35.jsx)("label", __spreadProps(__spreadValues({ ref }, props), { className: textClass("text-sm font-medium", tone, weight, truncate, className), children }));
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 import_jsx_runtime36 = require("react/jsx-runtime");
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-white",
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, import_jsx_runtime36.jsxs)("div", __spreadProps(__spreadValues({ className: cn("relative inline-flex shrink-0", className) }, props), { children: [
3613
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
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 shadow-ph",
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, import_jsx_runtime36.jsx)(
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, import_jsx_runtime36.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-white", children: badge })
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 = Array.isArray(children) ? children : [children];
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, import_jsx_runtime36.jsxs)("div", __spreadProps(__spreadValues({ className: cn("-space-x-3 flex rtl:space-x-reverse", className) }, props), { children: [
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, import_jsx_runtime36.jsx)(
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 import_react23 = require("react");
3658
- var import_jsx_runtime37 = require("react/jsx-runtime");
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, import_react23.useId)();
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, import_jsx_runtime37.jsxs)("div", __spreadProps(__spreadValues({ className: cn("w-full", className) }, props), { children: [
3691
- (label || showPercentage) && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "mb-1.5 flex justify-between text-sm text-ph-subtle", children: [
3692
- label && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { id: labelId, children: label }),
3693
- showPercentage && /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: "tabular-nums", children: [
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, import_jsx_runtime37.jsx)("div", { className: cn("ph-progress", sizeMap5[size]), children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
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 import_react24 = require("react");
3716
- var import_jsx_runtime38 = require("react/jsx-runtime");
3717
- var Link = (0, import_react24.forwardRef)(function Link2(_a, ref) {
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, import_jsx_runtime38.jsx)(
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 import_jsx_runtime39 = require("react/jsx-runtime");
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, import_jsx_runtime39.jsx)(
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, import_jsx_runtime39.jsxs)("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "ph-spinner__svg", children: [
3762
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("circle", { cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "3", opacity: 0.2 }),
3763
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("path", { d: "M12 2a10 10 0 0 1 10 10", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round" })
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 import_jsx_runtime40 = require("react/jsx-runtime");
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, import_jsx_runtime40.jsx)(
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 import_react25 = require("react");
3798
- var import_jsx_runtime41 = require("react/jsx-runtime");
3799
- var Chip = (0, import_react25.forwardRef)(function Chip2(_a, ref) {
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, import_jsx_runtime41.jsxs)("span", { className: chipClassName, children: [
3819
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
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, import_jsx_runtime41.jsx)("span", { className: "ph-chip__text", children })
4612
+ children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "ph-chip__text", children })
3827
4613
  })
3828
4614
  ),
3829
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
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, import_jsx_runtime41.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_runtime41.jsx)("path", { d: "M2 2l6 6M8 2l-6 6" }) })
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, import_jsx_runtime41.jsx)(
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, import_jsx_runtime41.jsx)("span", { className: "ph-chip__text", children })
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 import_react26 = require("react");
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, import_react26.useState)(DEFAULT_TOKENS);
3888
- (0, import_react26.useEffect)(() => {
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 import_jsx_runtime42 = require("react/jsx-runtime");
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, import_jsx_runtime42.jsx)("p", { className: "text-sm text-ph-subtle", children: "No data for this period." });
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, import_jsx_runtime42.jsx)(EmptyChart, {});
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, import_jsx_runtime42.jsxs)("div", { className: cn("flex flex-col items-center gap-4 sm:flex-row sm:items-center", className), children: [
3919
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
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, import_jsx_runtime42.jsx)(
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, import_jsx_runtime42.jsx)("ul", { className: "min-w-0 w-full flex-1 space-y-2", children: visible.map((slice, index) => {
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, import_jsx_runtime42.jsxs)("li", { className: "flex items-center justify-between gap-3 text-sm", children: [
3938
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("span", { className: "flex min-w-0 items-center gap-2 text-ph-subtle", children: [
3939
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: { background: colour } }),
3940
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "truncate", children: slice.label })
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, import_jsx_runtime42.jsx)("span", { className: "shrink-0 tabular-nums text-ph-ink", children: formatValue ? formatValue(slice.value) : `${percent(slice.value, total)}%` })
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, import_jsx_runtime42.jsx)(EmptyChart, {});
3952
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("ul", { className: cn("space-y-3", className), children: visible.map((item, index) => {
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, import_jsx_runtime42.jsxs)("li", { children: [
3955
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
3956
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "truncate text-ph-subtle", children: item.label }),
3957
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "shrink-0 tabular-nums text-ph-ink", children: formatValue ? formatValue(item.value) : item.value.toLocaleString("en-AU") })
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, import_jsx_runtime42.jsx)("div", { className: "h-2.5 rounded-full bg-ph-muted ring-1 ring-ph-border", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
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, import_jsx_runtime42.jsx)(EmptyChart, {});
3982
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: cn("space-y-3", className), children: [
3983
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
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, import_jsx_runtime42.jsx)(
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, import_jsx_runtime42.jsx)("ul", { className: "space-y-2", children: visible.map((slice, index) => {
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, import_jsx_runtime42.jsxs)("li", { className: "flex items-center justify-between gap-3 text-sm", children: [
4005
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("span", { className: "flex min-w-0 items-center gap-2 text-ph-subtle", children: [
4006
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: { background: colour } }),
4007
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "truncate", children: slice.label })
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, import_jsx_runtime42.jsx)("span", { className: "shrink-0 tabular-nums text-ph-ink", children: formatValue ? formatValue(slice.value) : `${percent(slice.value, total)}%` })
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,