@xenide-io/the-old-ui-theme 0.2.9 → 0.3.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 (61) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-SHF57J7U.mjs → chunk-FDMD3IIN.mjs} +1573 -652
  3. package/dist/index-D1RTT2Ap.d.mts +1044 -0
  4. package/dist/index-D1RTT2Ap.d.ts +1044 -0
  5. package/dist/index.d.mts +10 -7
  6. package/dist/index.d.ts +10 -7
  7. package/dist/index.js +1705 -744
  8. package/dist/index.mjs +61 -1
  9. package/dist/tailwind-preset.js +7 -0
  10. package/dist/tailwind-preset.mjs +7 -0
  11. package/dist/ui.d.mts +3 -2
  12. package/dist/ui.d.ts +3 -2
  13. package/dist/ui.js +1584 -666
  14. package/dist/ui.mjs +31 -1
  15. package/package.json +18 -4
  16. package/src/app/globals.css +1005 -227
  17. package/src/components/icons/IconBase.tsx +20 -12
  18. package/src/components/icons/createIconBase.tsx +12 -7
  19. package/src/components/icons/icons.tsx +208 -18
  20. package/src/components/sections/AlertShowcase.tsx +2 -1
  21. package/src/components/sections/BadgeShowcase.tsx +1 -1
  22. package/src/components/sections/ButtonShowcase.tsx +6 -10
  23. package/src/components/sections/CardShowcase.tsx +22 -6
  24. package/src/components/sections/DropdownShowcase.tsx +4 -6
  25. package/src/components/sections/FilterChipsShowcase.tsx +74 -26
  26. package/src/components/sections/FormShowcase.tsx +2 -1
  27. package/src/components/sections/IconShowcase.tsx +86 -206
  28. package/src/components/sections/KbdShowcase.tsx +47 -21
  29. package/src/components/sections/ModalShowcase.tsx +7 -6
  30. package/src/components/sections/ProductLayoutsShowcase.tsx +138 -0
  31. package/src/components/sections/ProgressShowcase.tsx +50 -53
  32. package/src/components/sections/SwapShowcase.tsx +13 -5
  33. package/src/components/ui/Alert.tsx +28 -19
  34. package/src/components/ui/AuthLayout.tsx +58 -0
  35. package/src/components/ui/Badge.tsx +10 -5
  36. package/src/components/ui/Button.tsx +22 -12
  37. package/src/components/ui/ButtonChrome.tsx +1 -1
  38. package/src/components/ui/Calendar.tsx +6 -7
  39. package/src/components/ui/Card.tsx +21 -11
  40. package/src/components/ui/CollapsibleSection.tsx +11 -11
  41. package/src/components/ui/DropdownMenu.tsx +189 -65
  42. package/src/components/ui/FilterBar.tsx +165 -0
  43. package/src/components/ui/FilterChips.tsx +65 -35
  44. package/src/components/ui/FilterControls.tsx +30 -0
  45. package/src/components/ui/FormField.tsx +69 -0
  46. package/src/components/ui/Input.tsx +166 -140
  47. package/src/components/ui/Kbd.tsx +88 -13
  48. package/src/components/ui/Loader.tsx +96 -0
  49. package/src/components/ui/Modal.tsx +66 -36
  50. package/src/components/ui/SettingsLayout.tsx +94 -0
  51. package/src/components/ui/ShowcaseWrapper.tsx +4 -16
  52. package/src/components/ui/Stepper.tsx +5 -6
  53. package/src/components/ui/first-slice.test.tsx +98 -0
  54. package/src/components/ui/index.ts +62 -3
  55. package/src/components/ui/interaction-primitives.test.tsx +77 -0
  56. package/src/components/ui/kbd-icons.test.tsx +90 -0
  57. package/src/components/ui/product-patterns.test.tsx +77 -0
  58. package/src/styles/themes.css +411 -1
  59. package/tailwind-preset.ts +7 -0
  60. package/dist/index-CmS6hcUk.d.mts +0 -753
  61. package/dist/index-CmS6hcUk.d.ts +0 -753
@@ -4,6 +4,9 @@ import {
4
4
  __spreadValues
5
5
  } from "./chunk-FWCSY2DS.mjs";
6
6
 
7
+ // src/components/ui/Button.tsx
8
+ import { forwardRef } from "react";
9
+
7
10
  // src/components/ui/ButtonChrome.tsx
8
11
  import { jsx, jsxs } from "react/jsx-runtime";
9
12
  function ButtonChrome({ label, icon, sideIcon, split }) {
@@ -48,7 +51,7 @@ var shapeClass = {
48
51
  square: "ph-btn-square",
49
52
  wide: "ph-btn-wide"
50
53
  };
51
- function Button(_a) {
54
+ var Button = forwardRef(function Button2(_a, ref) {
52
55
  var _b = _a, {
53
56
  variant = "secondary",
54
57
  size = "md",
@@ -57,9 +60,12 @@ function Button(_a) {
57
60
  split = false,
58
61
  icon,
59
62
  sideIcon,
63
+ loading = false,
64
+ loadingLabel,
60
65
  className,
61
66
  children,
62
- type = "button"
67
+ type = "button",
68
+ disabled
63
69
  } = _b, props = __objRest(_b, [
64
70
  "variant",
65
71
  "size",
@@ -68,23 +74,32 @@ function Button(_a) {
68
74
  "split",
69
75
  "icon",
70
76
  "sideIcon",
77
+ "loading",
78
+ "loadingLabel",
71
79
  "className",
72
80
  "children",
73
- "type"
81
+ "type",
82
+ "disabled"
74
83
  ]);
75
- const usesLemonChrome = variant === "primary" || variant === "secondary";
76
- const content = usesLemonChrome ? /* @__PURE__ */ jsx2(ButtonChrome, { label: children, icon, sideIcon, split }) : /* @__PURE__ */ jsxs2(Fragment, { children: [
77
- icon != null ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-icon", children: icon }) : null,
78
- children != null ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-label", children }) : null,
84
+ const usesLemonChrome = !["tertiary", "ghost", "link"].includes(variant);
85
+ const label = loadingLabel != null ? loadingLabel : children;
86
+ const leadingIcon = loading ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-spinner", "aria-hidden": true }) : icon;
87
+ const content = usesLemonChrome ? /* @__PURE__ */ jsx2(ButtonChrome, { label, icon: leadingIcon, sideIcon, split }) : /* @__PURE__ */ jsxs2(Fragment, { children: [
88
+ leadingIcon != null ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-icon", children: leadingIcon }) : null,
89
+ label != null ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-label", children: label }) : null,
79
90
  split ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-split-divider", "aria-hidden": true }) : null,
80
91
  sideIcon != null ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-side-icon", children: sideIcon }) : null
81
92
  ] });
82
93
  return /* @__PURE__ */ jsx2(
83
94
  "button",
84
95
  __spreadProps(__spreadValues({
96
+ ref,
85
97
  type,
98
+ disabled: disabled || loading,
99
+ "aria-busy": loading || void 0,
86
100
  className: cn(
87
101
  "ph-btn",
102
+ usesLemonChrome && "ph-btn-raised",
88
103
  outline && "ph-btn-outline",
89
104
  variantClass[variant],
90
105
  sizeClass[size],
@@ -96,11 +111,16 @@ function Button(_a) {
96
111
  children: content
97
112
  })
98
113
  );
99
- }
114
+ });
115
+ Button.displayName = "Button";
116
+
117
+ // src/components/ui/Alert.tsx
118
+ import { forwardRef as forwardRef5 } from "react";
100
119
 
101
120
  // src/components/icons/IconBase.tsx
121
+ import { forwardRef as forwardRef2 } from "react";
102
122
  import { jsx as jsx3 } from "react/jsx-runtime";
103
- function IconBase(_a) {
123
+ var IconBase = forwardRef2(function IconBase2(_a, ref) {
104
124
  var _b = _a, {
105
125
  className,
106
126
  size,
@@ -108,7 +128,12 @@ function IconBase(_a) {
108
128
  viewBox = "0 0 24 24",
109
129
  fill: fill2 = "none",
110
130
  xmlns = "http://www.w3.org/2000/svg",
111
- focusable = "false"
131
+ focusable = "false",
132
+ style,
133
+ role,
134
+ "aria-hidden": ariaHidden,
135
+ "aria-label": ariaLabel,
136
+ "aria-labelledby": ariaLabelledBy
112
137
  } = _b, props = __objRest(_b, [
113
138
  "className",
114
139
  "size",
@@ -116,41 +141,55 @@ function IconBase(_a) {
116
141
  "viewBox",
117
142
  "fill",
118
143
  "xmlns",
119
- "focusable"
144
+ "focusable",
145
+ "style",
146
+ "role",
147
+ "aria-hidden",
148
+ "aria-label",
149
+ "aria-labelledby"
120
150
  ]);
121
- var _a2;
122
- const dimensionProps = size != null ? { width: size, height: size } : {};
151
+ const hasAccessibleName = Boolean(ariaLabel || ariaLabelledBy);
123
152
  return /* @__PURE__ */ jsx3(
124
153
  "svg",
125
- __spreadProps(__spreadValues(__spreadProps(__spreadValues({
126
- className: cn("ph-icon", className)
127
- }, dimensionProps), {
154
+ __spreadProps(__spreadValues({
155
+ ref,
156
+ className: cn("ph-icon", className),
128
157
  viewBox,
129
158
  fill: fill2,
130
159
  xmlns,
131
160
  focusable,
132
- "aria-hidden": (_a2 = props["aria-hidden"]) != null ? _a2 : true
133
- }), props), {
161
+ role: role != null ? role : hasAccessibleName ? "img" : void 0,
162
+ "aria-hidden": ariaHidden != null ? ariaHidden : hasAccessibleName ? void 0 : true,
163
+ "aria-label": ariaLabel,
164
+ "aria-labelledby": ariaLabelledBy,
165
+ style: __spreadValues({ width: size, height: size }, style)
166
+ }, props), {
134
167
  children
135
168
  })
136
169
  );
137
- }
170
+ });
171
+ IconBase.displayName = "IconBase";
138
172
 
139
173
  // src/components/icons/createIconBase.tsx
174
+ import { forwardRef as forwardRef3 } from "react";
140
175
  import { jsx as jsx4 } from "react/jsx-runtime";
141
- function createIconBase({ viewBox = "0 0 24 24", paths }) {
142
- return function IconGlyph(props) {
143
- return /* @__PURE__ */ jsx4(IconBase, __spreadProps(__spreadValues({ viewBox }, props), { children: paths }));
144
- };
176
+ function createIconBase({ name = "IconGlyph", viewBox = "0 0 24 24", paths }) {
177
+ const IconGlyph = forwardRef3(function IconGlyph2(props, ref) {
178
+ return /* @__PURE__ */ jsx4(IconBase, __spreadProps(__spreadValues({ ref, viewBox }, props), { children: paths }));
179
+ });
180
+ IconGlyph.displayName = name;
181
+ return IconGlyph;
145
182
  }
146
- function createIconBasePath(d, viewBox = "0 0 24 24") {
183
+ function createIconBasePath(d, viewBox = "0 0 24 24", name) {
147
184
  return createIconBase({
185
+ name,
148
186
  viewBox,
149
187
  paths: /* @__PURE__ */ jsx4("path", { d, fill: "currentColor" })
150
188
  });
151
189
  }
152
190
 
153
191
  // src/components/icons/icons.tsx
192
+ import { forwardRef as forwardRef4 } from "react";
154
193
  import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
155
194
  var fill = (d) => /* @__PURE__ */ jsx5("path", { d, fill: "currentColor" });
156
195
  var IconAreaChart = createIconBase({
@@ -259,6 +298,12 @@ var IconErrorOutline = createIconBase({
259
298
  "m11 15h2v2h-2zm0-8h2v6h-2zm.99-5c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"
260
299
  )
261
300
  });
301
+ var IconInfo = createIconBase({
302
+ name: "IconInfo",
303
+ paths: fill(
304
+ "M11 10h2v7h-2v-7zm0-3h2v2h-2V7zm1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"
305
+ )
306
+ });
262
307
  var IconCancel = createIconBase({
263
308
  paths: fill(
264
309
  "m12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3.59-13-3.59 3.59-3.59-3.59-1.41 1.41 3.59 3.59-3.59 3.59 1.41 1.41 3.59-3.59 3.59 3.59 1.41-1.41-3.59-3.59 3.59-3.59z"
@@ -356,18 +401,158 @@ var IconToggle = createIconBasePath(
356
401
  var IconRocket = createIconBasePath(
357
402
  "M9.19 6.35c-2.04 2.29-3.44 5.58-3.57 5.89L2 10.69l4.05-4.05c.47-.47 1.15-.68 1.81-.55l1.33 1.26zm5.45 8.67l-1.33-1.26c-.66-.13-1.34.08-1.81.55L2 18.31l3.62 3.57c.31-.13 3.6-1.53 5.89-3.57 1.53-1.72 2.52-3.76 2.87-5.02zM12 2c-1.1 0-2 .9-2 2v1.09c2.84.48 5 2.94 5 5.91 0 2.97-2.16 5.43-5 5.91V20c0 1.1.9 2 2 2s2-.9 2-2v-1.09c-2.84-.48-5-2.94-5-5.91 0-2.97 2.16-5.43 5-5.91V4c0-1.1-.9-2-2-2z"
358
403
  );
359
- var IconTerminal = createIconBasePath("M20 4H4c-1.11 0-2 .89-2 2v12c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4V8l8 5 8-5v10zm-8-7L4 6h16l-8 5z");
404
+ var IconTerminal = createIconBase({
405
+ name: "IconTerminal",
406
+ paths: /* @__PURE__ */ jsx5(
407
+ "path",
408
+ {
409
+ 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",
410
+ fill: "currentColor",
411
+ fillRule: "evenodd",
412
+ clipRule: "evenodd"
413
+ }
414
+ )
415
+ });
416
+ var IconOldWindow = createIconBase({
417
+ name: "IconOldWindow",
418
+ paths: /* @__PURE__ */ jsx5(
419
+ "path",
420
+ {
421
+ d: "M3 3v18h18V3H3zm2 7v9h14v-9H5zm1-4h2v1H6V6zm3 0h2v1H9V6z",
422
+ fill: "currentColor",
423
+ fillRule: "evenodd",
424
+ clipRule: "evenodd"
425
+ }
426
+ )
427
+ });
428
+ var IconCommandCursor = createIconBase({
429
+ name: "IconCommandCursor",
430
+ paths: /* @__PURE__ */ jsx5(
431
+ "path",
432
+ {
433
+ d: "M4 3v18h16V3H4zm2 2h12v14H6V5zm1.5 3.5L11 12l-3.5 3.5L9 17l5-5-5-5-1.5 1.5zM13 17h4v-2h-4v2z",
434
+ fill: "currentColor",
435
+ fillRule: "evenodd",
436
+ clipRule: "evenodd"
437
+ }
438
+ )
439
+ });
440
+ var IconDataReel = createIconBase({
441
+ name: "IconDataReel",
442
+ paths: /* @__PURE__ */ jsx5(
443
+ "path",
444
+ {
445
+ 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",
446
+ fill: "currentColor",
447
+ fillRule: "evenodd",
448
+ clipRule: "evenodd"
449
+ }
450
+ )
451
+ });
452
+ var IconCodePreview = createIconBase({
453
+ name: "IconCodePreview",
454
+ paths: /* @__PURE__ */ jsx5(
455
+ "path",
456
+ {
457
+ 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",
458
+ fill: "currentColor",
459
+ fillRule: "evenodd",
460
+ clipRule: "evenodd"
461
+ }
462
+ )
463
+ });
464
+ var IconInsightBoard = createIconBase({
465
+ name: "IconInsightBoard",
466
+ paths: /* @__PURE__ */ jsx5(
467
+ "path",
468
+ {
469
+ d: "M3 3v18h18V3H3zm2 2h14v3H5V5zm0 5h6v9H5v-9zm8 0h6v4h-6v-4zm0 6h6v3h-6v-3zM6 6h2v1H6V6zm3 0h2v1H9V6z",
470
+ fill: "currentColor",
471
+ fillRule: "evenodd",
472
+ clipRule: "evenodd"
473
+ }
474
+ )
475
+ });
476
+ var IconEventStream = createIconBase({
477
+ name: "IconEventStream",
478
+ paths: /* @__PURE__ */ jsxs3(Fragment2, { children: [
479
+ /* @__PURE__ */ jsx5("path", { d: "M5 4h2v16H5V4z", fill: "currentColor", opacity: "0.45" }),
480
+ 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")
481
+ ] })
482
+ });
483
+ var IconFeatureGate = createIconBase({
484
+ name: "IconFeatureGate",
485
+ paths: /* @__PURE__ */ jsx5(
486
+ "path",
487
+ {
488
+ d: "M4 3h2v18H4V3zm3 2h12l-3 4 3 4H7V5zm4 1-2.2 4H12l-1 4 4.2-5H12l1-3h-2z",
489
+ fill: "currentColor",
490
+ fillRule: "evenodd",
491
+ clipRule: "evenodd"
492
+ }
493
+ )
494
+ });
495
+ var IconReplayFrame = createIconBase({
496
+ name: "IconReplayFrame",
497
+ paths: /* @__PURE__ */ jsx5(
498
+ "path",
499
+ {
500
+ d: "M3 3v18h18V3H3zm2 2h14v11H5V5zm5 2v7l6-3.5L10 7zm-5 11h9v1H5v-1zm11 0h3v1h-3v-1z",
501
+ fill: "currentColor",
502
+ fillRule: "evenodd",
503
+ clipRule: "evenodd"
504
+ }
505
+ )
506
+ });
507
+ var IconQueryStack = createIconBase({
508
+ name: "IconQueryStack",
509
+ paths: fill(
510
+ "M4 5c0-1.66 3.58-3 8-3s8 1.34 8 3-3.58 3-8 3-8-1.34-8-3zm0 3v3c0 1.66 3.58 3 8 3 .7 0 1.38-.04 2-.12V11.8c-.64.13-1.31.2-2 .2-4.42 0-8-1.34-8-3zm0 6v3c0 1.66 3.58 3 8 3 .7 0 1.38-.04 2-.12v-2.08c-.64.13-1.31.2-2 .2-4.42 0-8-1.34-8-3zm12-1 5 4-5 4v-3h-4v-2h4v-3z"
511
+ )
512
+ });
513
+ var IconExperimentSplit = createIconBase({
514
+ name: "IconExperimentSplit",
515
+ paths: fill(
516
+ "M5 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm14 0a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM5 15a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm1-6h2c0 2.2 1.8 4 4 4h2.17A3 3 0 0 1 19 11v2a3 3 0 0 1-4.83-2H12a6 6 0 0 1-6-6v4zm0 4a6 6 0 0 0 6-6h2a8 8 0 0 1-8 8v-2z"
517
+ )
518
+ });
519
+ var IconSurveyCard = createIconBase({
520
+ name: "IconSurveyCard",
521
+ paths: /* @__PURE__ */ jsx5(
522
+ "path",
523
+ {
524
+ 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",
525
+ fill: "currentColor",
526
+ fillRule: "evenodd",
527
+ clipRule: "evenodd"
528
+ }
529
+ )
530
+ });
531
+ var OLD_UI_ICONS = {
532
+ oldWindow: IconOldWindow,
533
+ commandCursor: IconCommandCursor,
534
+ dataReel: IconDataReel,
535
+ codePreview: IconCodePreview,
536
+ insightBoard: IconInsightBoard,
537
+ eventStream: IconEventStream,
538
+ featureGate: IconFeatureGate,
539
+ replayFrame: IconReplayFrame,
540
+ queryStack: IconQueryStack,
541
+ experimentSplit: IconExperimentSplit,
542
+ surveyCard: IconSurveyCard
543
+ };
360
544
  var IconActivity = createIconBasePath(
361
545
  "M22 12h-4l-3 9L9 3l-3 9H2v2h6.76l2.24-6.72L15 15l2.24-6.72L19 14h3v-2z"
362
546
  );
363
547
  var IconFlask = createIconBasePath(
364
548
  "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"
365
549
  );
366
- function IconSpinner(_a) {
550
+ var IconSpinner = forwardRef4(function IconSpinner2(_a, ref) {
367
551
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
368
- return /* @__PURE__ */ jsx5(IconSync, __spreadValues({ className: cn("ph-icon-spin", className) }, props));
369
- }
370
- var PH_ICONS = {
552
+ return /* @__PURE__ */ jsx5(IconSync, __spreadValues({ ref, className: cn("ph-icon-spin", className) }, props));
553
+ });
554
+ IconSpinner.displayName = "IconSpinner";
555
+ var CANONICAL_ICONS = {
371
556
  activity: IconActivity,
372
557
  areaChart: IconAreaChart,
373
558
  arrowDown: IconArrowDown,
@@ -382,74 +567,100 @@ var PH_ICONS = {
382
567
  chevronDown: IconChevronDown,
383
568
  chevronLeft: IconChevronLeft,
384
569
  chevronRight: IconChevronRight,
385
- clipboard: IconClipboardEdit,
570
+ clipboardEdit: IconClipboardEdit,
386
571
  close: IconClose,
572
+ codePreview: IconCodePreview,
387
573
  cohort: IconCohort,
574
+ commandCursor: IconCommandCursor,
388
575
  copy: IconCopy,
389
576
  cumulativeChart: IconCumulativeChart,
577
+ dataReel: IconDataReel,
390
578
  database: IconDatabase,
391
579
  download: IconDownload,
392
580
  edit: IconEdit,
393
581
  errorOutline: IconErrorOutline,
582
+ eventStream: IconEventStream,
394
583
  exclamation: IconExclamation,
584
+ experimentSplit: IconExperimentSplit,
585
+ featureGate: IconFeatureGate,
395
586
  flag: IconFlag,
396
587
  flare: IconFlare,
397
588
  flask: IconFlask,
398
589
  gift: IconGift,
399
- grid: IconGridView,
590
+ gridView: IconGridView,
400
591
  handClick: IconHandClick,
401
592
  home: IconHome,
402
- info: IconErrorOutline,
593
+ info: IconInfo,
594
+ insightBoard: IconInsightBoard,
403
595
  layers: IconLayers,
404
- list: IconListView,
596
+ listView: IconListView,
405
597
  logout: IconLogout,
406
598
  mail: IconMail,
407
599
  moon: IconMoon,
600
+ oldWindow: IconOldWindow,
408
601
  panelRight: IconPanelRight,
409
602
  person: IconPerson,
410
- play: IconPlayCircle,
603
+ playCircle: IconPlayCircle,
411
604
  plus: IconPlus,
412
605
  premium: IconPremium,
413
606
  queryEditor: IconQueryEditor,
607
+ queryStack: IconQueryStack,
414
608
  radar: IconRadar,
415
609
  recording: IconRecording,
610
+ replayFrame: IconReplayFrame,
416
611
  robot: IconRobot,
417
612
  rocket: IconRocket,
418
613
  save: IconSave,
419
614
  search: IconSearch,
420
615
  selectEvents: IconSelectEvents,
421
- settings: IconTuning,
422
616
  shoppingCart: IconShoppingCart,
423
617
  spinner: IconSpinner,
424
618
  star: IconStar,
425
619
  subArrowRight: IconSubArrowRight,
426
620
  sun: IconSun,
621
+ surveyCard: IconSurveyCard,
427
622
  surveys: IconSurveys,
428
623
  sync: IconSync,
429
624
  tableChart: IconTableChart,
430
625
  terminal: IconTerminal,
431
626
  toggle: IconToggle,
432
627
  trash: IconTrash,
433
- trendingUp: IconArrowUp,
628
+ tuning: IconTuning,
434
629
  upload: IconUpload,
435
630
  volume: IconVolume,
436
- volumeOff: IconVolumeOff,
631
+ volumeOff: IconVolumeOff
632
+ };
633
+ var PH_ICON_ALIASES = {
634
+ clipboard: IconClipboardEdit,
635
+ grid: IconGridView,
636
+ list: IconListView,
637
+ play: IconPlayCircle,
638
+ settings: IconTuning,
639
+ trendingUp: IconArrowUp,
437
640
  warning: IconExclamation,
438
641
  xCircle: IconCancel
439
642
  };
440
- function IconByName(_a) {
643
+ var PH_ICONS = __spreadValues(__spreadValues({}, CANONICAL_ICONS), PH_ICON_ALIASES);
644
+ for (const [name, Icon] of Object.entries(CANONICAL_ICONS)) {
645
+ const namedIcon = Icon;
646
+ if (!namedIcon.displayName || namedIcon.displayName === "IconGlyph") {
647
+ namedIcon.displayName = `Icon${name[0].toUpperCase()}${name.slice(1)}`;
648
+ }
649
+ }
650
+ var IconByName = forwardRef4(function IconByName2(_a, ref) {
441
651
  var _b = _a, { name } = _b, props = __objRest(_b, ["name"]);
442
652
  const Icon = PH_ICONS[name];
443
- return /* @__PURE__ */ jsx5(Icon, __spreadValues({}, props));
444
- }
653
+ return /* @__PURE__ */ jsx5(Icon, __spreadValues({ ref }, props));
654
+ });
655
+ IconByName.displayName = "IconByName";
445
656
 
446
657
  // src/components/ui/Alert.tsx
447
658
  import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
448
659
  var statusConfig = {
449
- info: { icon: IconErrorOutline, color: "text-ph-info" },
450
- success: { icon: IconCheckCircle, color: "text-ph-success" },
451
- warning: { icon: IconExclamation, color: "text-ph-warning" },
452
- danger: { icon: IconCancel, color: "text-ph-danger" }
660
+ info: { icon: IconInfo },
661
+ success: { icon: IconCheckCircle },
662
+ warning: { icon: IconExclamation },
663
+ danger: { icon: IconCancel }
453
664
  };
454
665
  var statusClassMap = {
455
666
  info: "ph-alert-info",
@@ -457,25 +668,43 @@ var statusClassMap = {
457
668
  warning: "ph-alert-warning",
458
669
  danger: "ph-alert-danger"
459
670
  };
460
- function Alert({
461
- status = "info",
462
- title,
463
- description,
464
- icon,
465
- children,
466
- className,
467
- onDismiss
468
- }) {
671
+ var Alert = forwardRef5(function Alert2(_a, ref) {
672
+ var _b = _a, {
673
+ status = "info",
674
+ title,
675
+ description,
676
+ icon,
677
+ children,
678
+ className,
679
+ onDismiss,
680
+ live,
681
+ dismissLabel = "Dismiss notification",
682
+ role
683
+ } = _b, props = __objRest(_b, [
684
+ "status",
685
+ "title",
686
+ "description",
687
+ "icon",
688
+ "children",
689
+ "className",
690
+ "onDismiss",
691
+ "live",
692
+ "dismissLabel",
693
+ "role"
694
+ ]);
469
695
  const config = statusConfig[status];
470
696
  const Icon = config.icon;
471
697
  return /* @__PURE__ */ jsxs4(
472
698
  "div",
473
- {
474
- role: "alert",
475
- className: cn("ph-alert", statusClassMap[status], className),
699
+ __spreadProps(__spreadValues({
700
+ ref,
701
+ role: role != null ? role : live === "assertive" ? "alert" : live === "polite" ? "status" : void 0,
702
+ "aria-live": live,
703
+ className: cn("ph-alert", statusClassMap[status], className)
704
+ }, props), {
476
705
  children: [
477
- icon != null ? icon : /* @__PURE__ */ jsx6(Icon, { className: cn("mt-0.5 h-5 w-5 shrink-0", config.color) }),
478
- /* @__PURE__ */ jsxs4("div", { className: "flex-1", children: [
706
+ icon != null ? icon : /* @__PURE__ */ jsx6(Icon, { className: "ph-alert-icon mt-0.5 h-5 w-5 shrink-0", "aria-hidden": true }),
707
+ /* @__PURE__ */ jsxs4("div", { className: "min-w-0 flex-1", children: [
479
708
  title && /* @__PURE__ */ jsx6("p", { className: "font-semibold", children: title }),
480
709
  description && /* @__PURE__ */ jsx6("p", { className: "mt-1 text-sm text-ph-subtle", children: description }),
481
710
  children
@@ -485,17 +714,19 @@ function Alert({
485
714
  {
486
715
  type: "button",
487
716
  onClick: onDismiss,
488
- className: "shrink-0 rounded-md p-1 text-ph-subtle hover:bg-black/5 hover:text-ph-ink",
489
- "aria-label": "Dismiss",
490
- children: /* @__PURE__ */ jsx6("svg", { className: "h-4 w-4", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", children: /* @__PURE__ */ jsx6("path", { d: "M18 6L6 18M6 6l12 12" }) })
717
+ className: "ph-alert-dismiss",
718
+ "aria-label": dismissLabel,
719
+ children: /* @__PURE__ */ jsx6(IconClose, { className: "h-4 w-4", "aria-hidden": true })
491
720
  }
492
721
  )
493
722
  ]
494
- }
723
+ })
495
724
  );
496
- }
725
+ });
726
+ Alert.displayName = "Alert";
497
727
 
498
728
  // src/components/ui/Badge.tsx
729
+ import { forwardRef as forwardRef6 } from "react";
499
730
  import { jsx as jsx7 } from "react/jsx-runtime";
500
731
  var variantMap = {
501
732
  brand: "ph-badge-brand",
@@ -510,66 +741,95 @@ var sizeMap = {
510
741
  sm: "text-[10px] px-1.5 py-0.5",
511
742
  md: ""
512
743
  };
513
- function Badge({
514
- variant = "neutral",
515
- size = "md",
516
- children,
517
- className
518
- }) {
744
+ var Badge = forwardRef6(function Badge2(_a, ref) {
745
+ var _b = _a, {
746
+ variant = "neutral",
747
+ size = "md",
748
+ children,
749
+ className
750
+ } = _b, props = __objRest(_b, [
751
+ "variant",
752
+ "size",
753
+ "children",
754
+ "className"
755
+ ]);
519
756
  return /* @__PURE__ */ jsx7(
520
757
  "span",
521
- {
758
+ __spreadProps(__spreadValues({
759
+ ref,
522
760
  className: cn(
523
761
  "ph-badge",
524
762
  variantMap[variant],
525
763
  sizeMap[size],
526
764
  className
527
- ),
765
+ )
766
+ }, props), {
528
767
  children
529
- }
768
+ })
530
769
  );
531
- }
770
+ });
771
+ Badge.displayName = "Badge";
532
772
 
533
773
  // src/components/ui/Card.tsx
774
+ import { forwardRef as forwardRef7 } from "react";
534
775
  import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
535
776
  var variantMap2 = {
536
- default: "bg-ph-surface",
537
- outlined: "border-2 border-ph-border bg-ph-surface",
538
- elevated: "bg-ph-surface shadow-ph-md",
539
- highlighted: "border border-ph-brand/35 bg-orange-50/40 shadow-ph"
777
+ default: "",
778
+ outlined: "border-2 border-ph-border",
779
+ elevated: "ph-card-elevated",
780
+ highlighted: "ph-card-highlighted"
540
781
  };
541
- function Card({
542
- children,
543
- title,
544
- description,
545
- actions,
546
- footer,
547
- media,
548
- variant = "default",
549
- className,
550
- bodyClassName
551
- }) {
782
+ var Card = forwardRef7(function Card2(_a, ref) {
783
+ var _b = _a, {
784
+ children,
785
+ title,
786
+ description,
787
+ actions,
788
+ footer,
789
+ media,
790
+ variant = "default",
791
+ className,
792
+ bodyClassName,
793
+ interactive = false,
794
+ titleAs: Title2 = "h3"
795
+ } = _b, props = __objRest(_b, [
796
+ "children",
797
+ "title",
798
+ "description",
799
+ "actions",
800
+ "footer",
801
+ "media",
802
+ "variant",
803
+ "className",
804
+ "bodyClassName",
805
+ "interactive",
806
+ "titleAs"
807
+ ]);
552
808
  return /* @__PURE__ */ jsxs5(
553
809
  "div",
554
- {
810
+ __spreadProps(__spreadValues({
811
+ ref,
555
812
  className: cn(
556
813
  "ph-card",
557
814
  variantMap2[variant],
815
+ interactive && "ph-card-interactive",
558
816
  className
559
- ),
817
+ )
818
+ }, props), {
560
819
  children: [
561
- media && /* @__PURE__ */ jsx8("div", { className: "-mx-6 -mt-6 mb-4", children: media }),
820
+ media && /* @__PURE__ */ jsx8("div", { className: "ph-card-media", children: media }),
562
821
  /* @__PURE__ */ jsxs5("div", { className: cn("ph-card-body", bodyClassName), children: [
563
- title && /* @__PURE__ */ jsx8("h3", { className: "ph-card-title", children: title }),
822
+ title && /* @__PURE__ */ jsx8(Title2, { className: "ph-card-title", children: title }),
564
823
  description && /* @__PURE__ */ jsx8("p", { className: "text-sm text-ph-subtle", children: description }),
565
824
  children,
566
825
  actions && /* @__PURE__ */ jsx8("div", { className: "ph-card-actions", children: actions })
567
826
  ] }),
568
827
  footer && /* @__PURE__ */ jsx8("div", { className: "border-t border-ph-border px-6 py-4 text-xs text-ph-subtle", children: footer })
569
828
  ]
570
- }
829
+ })
571
830
  );
572
- }
831
+ });
832
+ Card.displayName = "Card";
573
833
 
574
834
  // src/components/ui/Drawer.tsx
575
835
  import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
@@ -619,22 +879,270 @@ function Drawer({
619
879
  }
620
880
 
621
881
  // src/components/ui/Kbd.tsx
622
- import { jsx as jsx10 } from "react/jsx-runtime";
882
+ import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
883
+ var platformLabels = {
884
+ text: {
885
+ command: "Command",
886
+ cmd: "Command",
887
+ option: "Option",
888
+ alt: "Alt",
889
+ control: "Control",
890
+ ctrl: "Control",
891
+ shift: "Shift"
892
+ },
893
+ mac: {
894
+ command: "\u2318",
895
+ cmd: "\u2318",
896
+ option: "\u2325",
897
+ alt: "\u2325",
898
+ control: "\u2303",
899
+ ctrl: "\u2303",
900
+ shift: "\u21E7"
901
+ },
902
+ windows: {
903
+ command: "Win",
904
+ cmd: "Win",
905
+ option: "Alt",
906
+ alt: "Alt",
907
+ control: "Ctrl",
908
+ ctrl: "Ctrl",
909
+ shift: "Shift"
910
+ }
911
+ };
912
+ var spokenLabels = {
913
+ "\u2318": "Command",
914
+ "\u2325": "Option",
915
+ "\u2303": "Control",
916
+ "\u21E7": "Shift",
917
+ "\u21B5": "Enter",
918
+ "\u23CE": "Enter",
919
+ "\u232B": "Backspace",
920
+ "\u238B": "Escape"
921
+ };
623
922
  function Kbd(_a) {
624
- var _b = _a, { variant = "shortcut", keys, children, className } = _b, props = __objRest(_b, ["variant", "keys", "children", "className"]);
923
+ var _b = _a, {
924
+ variant = "shortcut",
925
+ keys,
926
+ platform = "text",
927
+ separator,
928
+ children,
929
+ className,
930
+ "aria-label": ariaLabel
931
+ } = _b, props = __objRest(_b, [
932
+ "variant",
933
+ "keys",
934
+ "platform",
935
+ "separator",
936
+ "children",
937
+ "className",
938
+ "aria-label"
939
+ ]);
625
940
  if (variant === "token") {
626
- return /* @__PURE__ */ jsx10("code", __spreadProps(__spreadValues({ className: cn("ph-kbd text-ph-ink", className) }, props), { children }));
941
+ return /* @__PURE__ */ jsx10("code", __spreadProps(__spreadValues({ className: cn("ph-code-token ph-kbd", className), "aria-label": ariaLabel }, props), { children }));
942
+ }
943
+ const sourceKeys = (keys == null ? void 0 : keys.length) ? keys : children != null ? [children] : [];
944
+ const displayKeys = sourceKeys.map((key) => formatKey(key, platform));
945
+ const accessibleLabel = ariaLabel != null ? ariaLabel : getShortcutLabel(displayKeys);
946
+ if (variant === "key") {
947
+ return /* @__PURE__ */ jsx10("kbd", __spreadProps(__spreadValues({ className: cn("ph-keycap", className), "aria-label": accessibleLabel }, props), { children: displayKeys[0] }));
627
948
  }
628
- const content = (keys == null ? void 0 : keys.length) ? keys.join(" ") : normalizeShortcut(children);
629
- return /* @__PURE__ */ jsx10("kbd", __spreadProps(__spreadValues({ className: cn("ph-shortcut", className) }, props), { children: content }));
949
+ return /* @__PURE__ */ jsx10("kbd", __spreadProps(__spreadValues({ className: cn("ph-shortcut-group ph-keycap", className), "aria-label": accessibleLabel }, props), { children: displayKeys.map((key, index) => /* @__PURE__ */ jsxs7("span", { className: "contents", children: [
950
+ index > 0 && separator != null ? /* @__PURE__ */ jsx10("span", { className: "ph-shortcut-separator", "aria-hidden": "true", children: separator }) : null,
951
+ /* @__PURE__ */ jsx10("span", { className: "ph-shortcut-key", "aria-hidden": accessibleLabel ? true : void 0, children: key })
952
+ ] }, index)) }));
953
+ }
954
+ function formatKey(key, platform) {
955
+ var _a;
956
+ if (typeof key !== "string") return key;
957
+ return (_a = platformLabels[platform][key.toLowerCase()]) != null ? _a : key;
958
+ }
959
+ function getShortcutLabel(keys) {
960
+ const labels = keys.map((key) => {
961
+ var _a;
962
+ if (typeof key !== "string" && typeof key !== "number") return null;
963
+ const value = String(key);
964
+ return (_a = spokenLabels[value]) != null ? _a : value;
965
+ });
966
+ return labels.every((label) => label != null) ? labels.join(" + ") : void 0;
967
+ }
968
+
969
+ // src/components/ui/Loader.tsx
970
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
971
+ var loaderSizeClass = {
972
+ sm: "ph-loader-sm",
973
+ md: "ph-loader-md",
974
+ lg: "ph-loader-lg"
975
+ };
976
+ var skeletonShapeClass = {
977
+ title: "ph-skeleton-title",
978
+ text: "ph-skeleton-text",
979
+ "short-text": "ph-skeleton-text-short",
980
+ avatar: "ph-skeleton-avatar",
981
+ button: "ph-skeleton-button",
982
+ block: "ph-skeleton-block"
983
+ };
984
+ function Loader(_a) {
985
+ var _b = _a, {
986
+ variant = "spinner",
987
+ size = "md",
988
+ label = "Loading",
989
+ className
990
+ } = _b, props = __objRest(_b, [
991
+ "variant",
992
+ "size",
993
+ "label",
994
+ "className"
995
+ ]);
996
+ return /* @__PURE__ */ jsxs8(
997
+ "span",
998
+ __spreadProps(__spreadValues({
999
+ role: "status",
1000
+ "aria-label": label,
1001
+ className: cn("ph-loader", loaderSizeClass[size], className)
1002
+ }, props), {
1003
+ children: [
1004
+ variant === "spinner" ? /* @__PURE__ */ jsx11("span", { className: "ph-loading", "aria-hidden": true }) : null,
1005
+ variant === "dots" ? /* @__PURE__ */ jsxs8("span", { className: "ph-loading-dots", "aria-hidden": true, children: [
1006
+ /* @__PURE__ */ jsx11("span", {}),
1007
+ /* @__PURE__ */ jsx11("span", {}),
1008
+ /* @__PURE__ */ jsx11("span", {})
1009
+ ] }) : null,
1010
+ variant === "pulse" ? /* @__PURE__ */ jsx11("span", { className: "ph-loading-pulse", "aria-hidden": true }) : null
1011
+ ]
1012
+ })
1013
+ );
1014
+ }
1015
+ function Skeleton(_a) {
1016
+ var _b = _a, { shape = "text", className } = _b, props = __objRest(_b, ["shape", "className"]);
1017
+ return /* @__PURE__ */ jsx11(
1018
+ "span",
1019
+ __spreadValues({
1020
+ className: cn("ph-skeleton", skeletonShapeClass[shape], className),
1021
+ "aria-hidden": "true"
1022
+ }, props)
1023
+ );
1024
+ }
1025
+ function LoadingState(_a) {
1026
+ var _b = _a, {
1027
+ label = "Loading",
1028
+ title = "Loading",
1029
+ description,
1030
+ variant = "spinner",
1031
+ size = "lg",
1032
+ className
1033
+ } = _b, props = __objRest(_b, [
1034
+ "label",
1035
+ "title",
1036
+ "description",
1037
+ "variant",
1038
+ "size",
1039
+ "className"
1040
+ ]);
1041
+ return /* @__PURE__ */ jsxs8("div", __spreadProps(__spreadValues({ className: cn("ph-loading-state", className), role: "status", "aria-label": label }, props), { children: [
1042
+ /* @__PURE__ */ jsx11(Loader, { variant, size, label, "aria-hidden": "true" }),
1043
+ /* @__PURE__ */ jsxs8("div", { className: "ph-loading-state__copy", children: [
1044
+ /* @__PURE__ */ jsx11("strong", { children: title }),
1045
+ description ? /* @__PURE__ */ jsx11("span", { children: description }) : null
1046
+ ] })
1047
+ ] }));
1048
+ }
1049
+
1050
+ // src/components/ui/AuthLayout.tsx
1051
+ import { useId } from "react";
1052
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
1053
+ function AuthLayout(_a) {
1054
+ var _b = _a, { brand, footer, aside, children, className } = _b, props = __objRest(_b, ["brand", "footer", "aside", "children", "className"]);
1055
+ return /* @__PURE__ */ jsxs9("div", __spreadProps(__spreadValues({ className: cn("ph-auth-layout", aside != null && "ph-auth-layout--split", className) }, props), { children: [
1056
+ aside ? /* @__PURE__ */ jsx12("aside", { className: "ph-auth-layout__aside", children: aside }) : null,
1057
+ /* @__PURE__ */ jsx12("div", { className: "ph-auth-layout__main", children: /* @__PURE__ */ jsxs9("div", { className: "ph-auth-layout__column", children: [
1058
+ brand ? /* @__PURE__ */ jsx12("div", { className: "ph-auth-layout__brand", children: brand }) : null,
1059
+ children,
1060
+ footer ? /* @__PURE__ */ jsx12("footer", { className: "ph-auth-layout__footer", children: footer }) : null
1061
+ ] }) })
1062
+ ] }));
1063
+ }
1064
+ function AuthCard(_a) {
1065
+ var _b = _a, { title, description, footer, children, className } = _b, props = __objRest(_b, ["title", "description", "footer", "children", "className"]);
1066
+ const titleId = useId();
1067
+ return /* @__PURE__ */ jsxs9("section", __spreadProps(__spreadValues({ className: cn("ph-auth-card", className), "aria-labelledby": titleId }, props), { children: [
1068
+ /* @__PURE__ */ jsxs9("header", { className: "ph-auth-card__header", children: [
1069
+ /* @__PURE__ */ jsx12("h1", { id: titleId, children: title }),
1070
+ description ? /* @__PURE__ */ jsx12("p", { children: description }) : null
1071
+ ] }),
1072
+ /* @__PURE__ */ jsx12("div", { className: "ph-auth-card__body", children }),
1073
+ footer ? /* @__PURE__ */ jsx12("footer", { className: "ph-auth-card__footer", children: footer }) : null
1074
+ ] }));
1075
+ }
1076
+ function AuthDivider(_a) {
1077
+ var _b = _a, { children = "or continue with", className } = _b, props = __objRest(_b, ["children", "className"]);
1078
+ return /* @__PURE__ */ jsx12("div", __spreadProps(__spreadValues({ className: cn("ph-auth-divider", className) }, props), { children: /* @__PURE__ */ jsx12("span", { children }) }));
1079
+ }
1080
+
1081
+ // src/components/ui/SettingsLayout.tsx
1082
+ import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
1083
+ function SettingsNav(_a) {
1084
+ var _b = _a, { groups, className } = _b, props = __objRest(_b, ["groups", "className"]);
1085
+ return /* @__PURE__ */ jsx13("div", __spreadProps(__spreadValues({ className: cn("ph-settings-nav", className) }, props), { children: groups.map((group, index) => /* @__PURE__ */ jsxs10("div", { className: "ph-settings-nav__group", children: [
1086
+ /* @__PURE__ */ jsx13("h3", { children: group.label }),
1087
+ /* @__PURE__ */ jsx13("div", { className: "ph-settings-nav__items", children: group.items.map((item) => /* @__PURE__ */ jsxs10(
1088
+ "a",
1089
+ {
1090
+ href: item.href,
1091
+ className: cn("ph-settings-nav__item", item.active && "ph-settings-nav__item--active"),
1092
+ "aria-current": item.active ? "page" : void 0,
1093
+ children: [
1094
+ item.icon ? /* @__PURE__ */ jsx13("span", { className: "ph-settings-nav__icon", children: item.icon }) : null,
1095
+ /* @__PURE__ */ jsx13("span", { children: item.label }),
1096
+ item.badge ? /* @__PURE__ */ jsx13("span", { className: "ph-settings-nav__badge", children: item.badge }) : null
1097
+ ]
1098
+ },
1099
+ item.id
1100
+ )) })
1101
+ ] }, index)) }));
630
1102
  }
631
- function normalizeShortcut(children) {
632
- if (typeof children !== "string") return children;
633
- return children.replace(/\bCommand\b|\bCmd\b/g, "\u2318").replace(/\bOption\b|\bAlt\b/g, "\u2325").replace(/\bShift\b/g, "\u21E7").replace(/\bControl\b|\bCtrl\b/g, "\u2303");
1103
+ function SettingsLayout(_a) {
1104
+ var _b = _a, {
1105
+ title,
1106
+ description,
1107
+ actions,
1108
+ navigation,
1109
+ navigationLabel = "Settings",
1110
+ children,
1111
+ className
1112
+ } = _b, props = __objRest(_b, [
1113
+ "title",
1114
+ "description",
1115
+ "actions",
1116
+ "navigation",
1117
+ "navigationLabel",
1118
+ "children",
1119
+ "className"
1120
+ ]);
1121
+ return /* @__PURE__ */ jsxs10("section", __spreadProps(__spreadValues({ className: cn("ph-settings-layout", className) }, props), { children: [
1122
+ /* @__PURE__ */ jsxs10("header", { className: "ph-settings-layout__header", children: [
1123
+ /* @__PURE__ */ jsxs10("div", { children: [
1124
+ /* @__PURE__ */ jsx13("h2", { children: title }),
1125
+ description ? /* @__PURE__ */ jsx13("p", { children: description }) : null
1126
+ ] }),
1127
+ actions ? /* @__PURE__ */ jsx13("div", { className: "ph-settings-layout__actions", children: actions }) : null
1128
+ ] }),
1129
+ /* @__PURE__ */ jsxs10("details", { className: "ph-settings-layout__mobile-nav", children: [
1130
+ /* @__PURE__ */ jsxs10("summary", { children: [
1131
+ /* @__PURE__ */ jsx13(IconTuning, { className: "h-4 w-4", "aria-hidden": true }),
1132
+ "Settings menu"
1133
+ ] }),
1134
+ /* @__PURE__ */ jsx13("nav", { "aria-label": navigationLabel, children: navigation })
1135
+ ] }),
1136
+ /* @__PURE__ */ jsxs10("div", { className: "ph-settings-layout__grid", children: [
1137
+ /* @__PURE__ */ jsx13("aside", { className: "ph-settings-layout__sidebar", children: /* @__PURE__ */ jsx13("nav", { "aria-label": navigationLabel, children: navigation }) }),
1138
+ /* @__PURE__ */ jsx13("div", { className: "ph-settings-layout__content", children })
1139
+ ] })
1140
+ ] }));
634
1141
  }
635
1142
 
636
1143
  // src/components/ui/DropdownMenu.tsx
637
- import { Fragment as Fragment4, jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
1144
+ import * as DropdownPrimitive from "@radix-ui/react-dropdown-menu";
1145
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
638
1146
  var sizeClass2 = {
639
1147
  xs: "ph-btn-xs",
640
1148
  sm: "ph-btn-sm",
@@ -646,40 +1154,95 @@ var variantClass2 = {
646
1154
  secondary: "ph-btn-secondary",
647
1155
  accent: "ph-btn-accent"
648
1156
  };
649
- function dropdownPanelClass(align, panelClassName) {
650
- return cn(
651
- "ph-dropdown-panel absolute top-full z-50 mt-0",
652
- align === "end" ? "right-0" : "left-0",
653
- panelClassName
654
- );
1157
+ function DropdownContent({
1158
+ children,
1159
+ align = "start",
1160
+ side = "bottom",
1161
+ sideOffset = 7,
1162
+ alignOffset = 0,
1163
+ collisionPadding = 8,
1164
+ avoidCollisions = true,
1165
+ panelClassName
1166
+ }) {
1167
+ return /* @__PURE__ */ jsx14(DropdownPrimitive.Portal, { children: /* @__PURE__ */ jsxs11(
1168
+ DropdownPrimitive.Content,
1169
+ {
1170
+ className: cn("ph-dropdown-panel", panelClassName),
1171
+ align,
1172
+ side,
1173
+ sideOffset,
1174
+ alignOffset,
1175
+ collisionPadding,
1176
+ avoidCollisions,
1177
+ sticky: "partial",
1178
+ children: [
1179
+ children,
1180
+ /* @__PURE__ */ jsx14(DropdownPrimitive.Arrow, { className: "ph-dropdown-arrow", width: 12, height: 6 })
1181
+ ]
1182
+ }
1183
+ ) });
655
1184
  }
656
1185
  function DropdownMenu(_a) {
657
1186
  var _b = _a, {
658
1187
  trigger,
659
1188
  children,
660
- align = "start",
1189
+ align,
1190
+ side,
1191
+ sideOffset,
1192
+ alignOffset,
1193
+ collisionPadding,
1194
+ avoidCollisions,
661
1195
  className,
662
1196
  panelClassName,
663
- "aria-label": ariaLabel
1197
+ "aria-label": ariaLabel,
1198
+ open,
1199
+ defaultOpen,
1200
+ onOpenChange,
1201
+ modal = false,
1202
+ disabled
664
1203
  } = _b, props = __objRest(_b, [
665
1204
  "trigger",
666
1205
  "children",
667
1206
  "align",
1207
+ "side",
1208
+ "sideOffset",
1209
+ "alignOffset",
1210
+ "collisionPadding",
1211
+ "avoidCollisions",
668
1212
  "className",
669
1213
  "panelClassName",
670
- "aria-label"
1214
+ "aria-label",
1215
+ "open",
1216
+ "defaultOpen",
1217
+ "onOpenChange",
1218
+ "modal",
1219
+ "disabled"
671
1220
  ]);
672
- return /* @__PURE__ */ jsxs7("details", __spreadProps(__spreadValues({ className: cn("relative", className) }, props), { children: [
673
- /* @__PURE__ */ jsx11(
674
- "summary",
675
- {
676
- className: "cursor-pointer list-none [&::-webkit-details-marker]:hidden",
677
- "aria-label": ariaLabel,
678
- children: trigger
679
- }
680
- ),
681
- /* @__PURE__ */ jsx11("div", { className: dropdownPanelClass(align, panelClassName), children })
682
- ] }));
1221
+ return /* @__PURE__ */ jsx14("div", __spreadProps(__spreadValues({ className: cn("ph-dropdown", className) }, props), { children: /* @__PURE__ */ jsxs11(
1222
+ DropdownPrimitive.Root,
1223
+ {
1224
+ open,
1225
+ defaultOpen,
1226
+ onOpenChange,
1227
+ modal,
1228
+ children: [
1229
+ /* @__PURE__ */ jsx14(DropdownPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx14("button", { type: "button", className: "ph-dropdown-trigger", "aria-label": ariaLabel, children: trigger }) }),
1230
+ /* @__PURE__ */ jsx14(
1231
+ DropdownContent,
1232
+ {
1233
+ align,
1234
+ side,
1235
+ sideOffset,
1236
+ alignOffset,
1237
+ collisionPadding,
1238
+ avoidCollisions,
1239
+ panelClassName,
1240
+ children
1241
+ }
1242
+ )
1243
+ ]
1244
+ }
1245
+ ) }));
683
1246
  }
684
1247
  function DropdownButton(_a) {
685
1248
  var _b = _a, {
@@ -691,10 +1254,20 @@ function DropdownButton(_a) {
691
1254
  icon,
692
1255
  sideIcon,
693
1256
  children,
694
- align = "start",
1257
+ align,
1258
+ side,
1259
+ sideOffset,
1260
+ alignOffset,
1261
+ collisionPadding,
1262
+ avoidCollisions,
695
1263
  className,
696
1264
  panelClassName,
697
- "aria-label": ariaLabel
1265
+ "aria-label": ariaLabel,
1266
+ open,
1267
+ defaultOpen,
1268
+ onOpenChange,
1269
+ modal = false,
1270
+ disabled
698
1271
  } = _b, props = __objRest(_b, [
699
1272
  "label",
700
1273
  "variant",
@@ -705,55 +1278,154 @@ function DropdownButton(_a) {
705
1278
  "sideIcon",
706
1279
  "children",
707
1280
  "align",
1281
+ "side",
1282
+ "sideOffset",
1283
+ "alignOffset",
1284
+ "collisionPadding",
1285
+ "avoidCollisions",
708
1286
  "className",
709
1287
  "panelClassName",
710
- "aria-label"
1288
+ "aria-label",
1289
+ "open",
1290
+ "defaultOpen",
1291
+ "onOpenChange",
1292
+ "modal",
1293
+ "disabled"
711
1294
  ]);
712
- const usesLemonChrome = variant === "primary" || variant === "secondary";
713
- const chevron = /* @__PURE__ */ jsx11(IconChevronDown, { className: "h-4 w-4", "aria-hidden": true });
714
- const trailing = sideIcon != null ? sideIcon : chevron;
715
- return /* @__PURE__ */ jsxs7("details", __spreadProps(__spreadValues({ className: cn("relative", className) }, props), { children: [
716
- /* @__PURE__ */ jsx11(
717
- "summary",
718
- {
719
- className: cn(
720
- "ph-btn cursor-pointer list-none [&::-webkit-details-marker]:hidden",
721
- variantClass2[variant],
722
- outline && "ph-btn-outline",
723
- sizeClass2[size],
724
- split && "ph-btn-split"
725
- ),
726
- "aria-label": ariaLabel != null ? ariaLabel : label,
727
- children: usesLemonChrome ? /* @__PURE__ */ jsx11(ButtonChrome, { label, icon, sideIcon: trailing, split }) : /* @__PURE__ */ jsxs7(Fragment4, { children: [
728
- icon != null ? /* @__PURE__ */ jsx11("span", { className: "ph-btn-icon", children: icon }) : null,
729
- /* @__PURE__ */ jsx11("span", { className: "ph-btn-label", children: label }),
730
- /* @__PURE__ */ jsx11("span", { className: "ph-btn-side-icon", children: trailing })
731
- ] })
732
- }
733
- ),
734
- /* @__PURE__ */ jsx11("div", { className: dropdownPanelClass(align, panelClassName), children })
735
- ] }));
1295
+ const trailing = sideIcon != null ? sideIcon : /* @__PURE__ */ jsx14(IconChevronDown, { className: "h-4 w-4", "aria-hidden": true });
1296
+ return /* @__PURE__ */ jsx14("div", __spreadProps(__spreadValues({ className: cn("ph-dropdown", className) }, props), { children: /* @__PURE__ */ jsxs11(
1297
+ DropdownPrimitive.Root,
1298
+ {
1299
+ open,
1300
+ defaultOpen,
1301
+ onOpenChange,
1302
+ modal,
1303
+ children: [
1304
+ /* @__PURE__ */ jsx14(DropdownPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx14(
1305
+ "button",
1306
+ {
1307
+ type: "button",
1308
+ disabled,
1309
+ className: cn(
1310
+ "ph-btn ph-btn-raised ph-dropdown-button",
1311
+ variantClass2[variant],
1312
+ outline && "ph-btn-outline",
1313
+ sizeClass2[size],
1314
+ split && "ph-btn-split"
1315
+ ),
1316
+ "aria-label": ariaLabel,
1317
+ children: /* @__PURE__ */ jsx14(ButtonChrome, { label, icon, sideIcon: trailing, split })
1318
+ }
1319
+ ) }),
1320
+ /* @__PURE__ */ jsx14(
1321
+ DropdownContent,
1322
+ {
1323
+ align,
1324
+ side,
1325
+ sideOffset,
1326
+ alignOffset,
1327
+ collisionPadding,
1328
+ avoidCollisions,
1329
+ panelClassName,
1330
+ children
1331
+ }
1332
+ )
1333
+ ]
1334
+ }
1335
+ ) }));
736
1336
  }
737
1337
  function DropdownItem(_a) {
1338
+ var _b = _a, { className, children, disabled } = _b, props = __objRest(_b, ["className", "children", "disabled"]);
1339
+ return /* @__PURE__ */ jsx14(DropdownPrimitive.Item, { asChild: true, disabled, children: /* @__PURE__ */ jsx14(
1340
+ "button",
1341
+ __spreadProps(__spreadValues({
1342
+ type: "button",
1343
+ disabled,
1344
+ className: cn("ph-dropdown-item w-full text-left", className)
1345
+ }, props), {
1346
+ children
1347
+ })
1348
+ ) });
1349
+ }
1350
+ function DropdownRadioGroup(props) {
1351
+ return /* @__PURE__ */ jsx14(DropdownPrimitive.RadioGroup, __spreadValues({}, props));
1352
+ }
1353
+ function DropdownRadioItem(_a) {
1354
+ var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
1355
+ return /* @__PURE__ */ jsxs11(DropdownPrimitive.RadioItem, __spreadProps(__spreadValues({ className: cn("ph-dropdown-item ph-dropdown-radio-item", className) }, props), { children: [
1356
+ /* @__PURE__ */ jsx14("span", { className: "ph-dropdown-item-indicator", "aria-hidden": true, children: /* @__PURE__ */ jsx14(DropdownPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx14(IconCheck, { className: "h-3.5 w-3.5" }) }) }),
1357
+ /* @__PURE__ */ jsx14("span", { children })
1358
+ ] }));
1359
+ }
1360
+
1361
+ // src/components/ui/Input.tsx
1362
+ import { forwardRef as forwardRef8, useId as useId3 } from "react";
1363
+
1364
+ // src/components/ui/FormField.tsx
1365
+ import { useId as useId2 } from "react";
1366
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
1367
+ function FormField(_a) {
738
1368
  var _b = _a, {
739
- className,
740
- children
1369
+ controlId,
1370
+ label,
1371
+ hideLabel = false,
1372
+ helperText,
1373
+ error,
1374
+ required = false,
1375
+ disabled = false,
1376
+ children,
1377
+ className
741
1378
  } = _b, props = __objRest(_b, [
742
- "className",
743
- "children"
1379
+ "controlId",
1380
+ "label",
1381
+ "hideLabel",
1382
+ "helperText",
1383
+ "error",
1384
+ "required",
1385
+ "disabled",
1386
+ "children",
1387
+ "className"
744
1388
  ]);
745
- return /* @__PURE__ */ jsx11("button", __spreadProps(__spreadValues({ type: "button", className: cn("ph-dropdown-item w-full text-left", className) }, props), { children }));
1389
+ const generatedId = useId2();
1390
+ const id = controlId != null ? controlId : generatedId;
1391
+ const descriptionId = helperText && !error ? `${id}-description` : void 0;
1392
+ const errorId = error ? `${id}-error` : void 0;
1393
+ const controlProps = {
1394
+ id,
1395
+ "aria-describedby": descriptionId,
1396
+ "aria-errormessage": errorId,
1397
+ "aria-invalid": error ? true : void 0
1398
+ };
1399
+ return /* @__PURE__ */ jsxs12("div", __spreadProps(__spreadValues({ className: cn("ph-field", className) }, props), { children: [
1400
+ label ? /* @__PURE__ */ jsxs12(
1401
+ "label",
1402
+ {
1403
+ htmlFor: id,
1404
+ className: cn("ph-label", hideLabel && "sr-only", disabled && "opacity-50"),
1405
+ children: [
1406
+ label,
1407
+ required ? /* @__PURE__ */ jsx15("span", { "aria-hidden": "true", children: " *" }) : null
1408
+ ]
1409
+ }
1410
+ ) : null,
1411
+ typeof children === "function" ? children(controlProps) : children,
1412
+ descriptionId ? /* @__PURE__ */ jsx15("p", { id: descriptionId, className: "mt-1 text-xs text-ph-subtle", children: helperText }) : null,
1413
+ errorId ? /* @__PURE__ */ jsx15("p", { id: errorId, className: "mt-1 text-xs font-medium text-ph-danger", children: error }) : null
1414
+ ] }));
746
1415
  }
747
1416
 
748
1417
  // src/components/ui/Input.tsx
749
- import { useId } from "react";
750
- import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
1418
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
751
1419
  var sizeMap3 = {
752
1420
  sm: "ph-input-sm",
753
1421
  md: "",
754
1422
  lg: "ph-input-lg"
755
1423
  };
756
- function Input(_a) {
1424
+ function joinIds(...ids) {
1425
+ const value = ids.filter(Boolean).join(" ");
1426
+ return value || void 0;
1427
+ }
1428
+ var Input = forwardRef8(function Input2(_a, ref) {
757
1429
  var _b = _a, {
758
1430
  id: idProp,
759
1431
  label,
@@ -763,57 +1435,60 @@ function Input(_a) {
763
1435
  size = "md",
764
1436
  variant = "default",
765
1437
  className,
766
- wrapperClassName,
767
- disabled
768
- } = _b, props = __objRest(_b, [
769
- "id",
770
- "label",
771
- "hideLabel",
772
- "error",
773
- "helperText",
774
- "size",
775
- "variant",
776
- "className",
777
- "wrapperClassName",
778
- "disabled"
779
- ]);
780
- const autoId = useId();
781
- const id = idProp != null ? idProp : autoId;
782
- const hasError = Boolean(error);
783
- return /* @__PURE__ */ jsxs8("div", { className: cn("ph-field", wrapperClassName), children: [
784
- label && /* @__PURE__ */ jsx12(
785
- "label",
786
- {
787
- htmlFor: id,
788
- className: cn(
789
- "ph-label",
790
- hideLabel && "sr-only",
791
- disabled && "opacity-50"
792
- ),
793
- children: label
794
- }
795
- ),
796
- /* @__PURE__ */ jsx12(
797
- "input",
798
- __spreadValues({
799
- id,
800
- disabled,
801
- "aria-invalid": hasError || void 0,
802
- className: cn(
803
- "ph-input w-full",
804
- sizeMap3[size],
805
- variant === "ghost" && "ph-input-ghost",
806
- hasError && "ph-input-error",
807
- disabled && "cursor-not-allowed opacity-60",
808
- className
809
- )
810
- }, props)
811
- ),
812
- helperText && !hasError && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs text-ph-subtle", children: helperText }),
813
- error && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs font-medium text-ph-danger", children: error })
814
- ] });
815
- }
816
- function Select(_a) {
1438
+ wrapperClassName,
1439
+ disabled,
1440
+ required,
1441
+ "aria-describedby": ariaDescribedBy
1442
+ } = _b, props = __objRest(_b, [
1443
+ "id",
1444
+ "label",
1445
+ "hideLabel",
1446
+ "error",
1447
+ "helperText",
1448
+ "size",
1449
+ "variant",
1450
+ "className",
1451
+ "wrapperClassName",
1452
+ "disabled",
1453
+ "required",
1454
+ "aria-describedby"
1455
+ ]);
1456
+ const autoId = useId3();
1457
+ const id = idProp != null ? idProp : autoId;
1458
+ const hasError = Boolean(error);
1459
+ return /* @__PURE__ */ jsx16(
1460
+ FormField,
1461
+ {
1462
+ controlId: id,
1463
+ label,
1464
+ hideLabel,
1465
+ helperText,
1466
+ error,
1467
+ required,
1468
+ disabled,
1469
+ className: wrapperClassName,
1470
+ children: (fieldProps) => /* @__PURE__ */ jsx16(
1471
+ "input",
1472
+ __spreadValues(__spreadProps(__spreadValues({}, fieldProps), {
1473
+ ref,
1474
+ disabled,
1475
+ required,
1476
+ "aria-describedby": joinIds(ariaDescribedBy, fieldProps["aria-describedby"]),
1477
+ className: cn(
1478
+ "ph-input w-full",
1479
+ sizeMap3[size],
1480
+ variant === "ghost" && "ph-input-ghost",
1481
+ hasError && "ph-input-error",
1482
+ disabled && "cursor-not-allowed opacity-60",
1483
+ className
1484
+ )
1485
+ }), props)
1486
+ )
1487
+ }
1488
+ );
1489
+ });
1490
+ Input.displayName = "Input";
1491
+ var Select = forwardRef8(function Select2(_a, ref) {
817
1492
  var _b = _a, {
818
1493
  id: idProp,
819
1494
  label,
@@ -824,7 +1499,9 @@ function Select(_a) {
824
1499
  className,
825
1500
  wrapperClassName,
826
1501
  disabled,
827
- children
1502
+ children,
1503
+ required,
1504
+ "aria-describedby": ariaDescribedBy
828
1505
  } = _b, props = __objRest(_b, [
829
1506
  "id",
830
1507
  "label",
@@ -835,42 +1512,34 @@ function Select(_a) {
835
1512
  "className",
836
1513
  "wrapperClassName",
837
1514
  "disabled",
838
- "children"
1515
+ "children",
1516
+ "required",
1517
+ "aria-describedby"
839
1518
  ]);
840
- const autoId = useId();
1519
+ const autoId = useId3();
841
1520
  const id = idProp != null ? idProp : autoId;
842
1521
  const hasError = Boolean(error);
843
- return /* @__PURE__ */ jsxs8("div", { className: cn("ph-field", wrapperClassName), children: [
844
- label && /* @__PURE__ */ jsx12(
845
- "label",
846
- {
847
- htmlFor: id,
848
- className: cn("ph-label", hideLabel && "sr-only", disabled && "opacity-50"),
849
- children: label
850
- }
851
- ),
852
- /* @__PURE__ */ jsx12(
853
- "select",
854
- __spreadProps(__spreadValues({
855
- id,
856
- disabled,
857
- "aria-invalid": hasError || void 0,
858
- className: cn(
859
- "ph-select w-full",
860
- sizeMap3[size],
861
- hasError && "border-ph-danger focus:border-ph-danger focus:ring-ph-danger/20",
862
- disabled && "cursor-not-allowed opacity-60",
863
- className
864
- )
865
- }, props), {
866
- children
867
- })
868
- ),
869
- helperText && !hasError && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs text-ph-subtle", children: helperText }),
870
- error && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs font-medium text-ph-danger", children: error })
871
- ] });
872
- }
873
- function Textarea(_a) {
1522
+ return /* @__PURE__ */ jsx16(FormField, { controlId: id, label, hideLabel, helperText, error, required, disabled, className: wrapperClassName, children: (fieldProps) => /* @__PURE__ */ jsx16(
1523
+ "select",
1524
+ __spreadProps(__spreadValues(__spreadProps(__spreadValues({}, fieldProps), {
1525
+ ref,
1526
+ disabled,
1527
+ required,
1528
+ "aria-describedby": joinIds(ariaDescribedBy, fieldProps["aria-describedby"]),
1529
+ className: cn(
1530
+ "ph-select w-full",
1531
+ sizeMap3[size],
1532
+ hasError && "ph-input-error",
1533
+ disabled && "cursor-not-allowed opacity-60",
1534
+ className
1535
+ )
1536
+ }), props), {
1537
+ children
1538
+ })
1539
+ ) });
1540
+ });
1541
+ Select.displayName = "Select";
1542
+ var Textarea = forwardRef8(function Textarea2(_a, ref) {
874
1543
  var _b = _a, {
875
1544
  id: idProp,
876
1545
  label,
@@ -880,7 +1549,9 @@ function Textarea(_a) {
880
1549
  size = "md",
881
1550
  className,
882
1551
  wrapperClassName,
883
- disabled
1552
+ disabled,
1553
+ required,
1554
+ "aria-describedby": ariaDescribedBy
884
1555
  } = _b, props = __objRest(_b, [
885
1556
  "id",
886
1557
  "label",
@@ -890,40 +1561,32 @@ function Textarea(_a) {
890
1561
  "size",
891
1562
  "className",
892
1563
  "wrapperClassName",
893
- "disabled"
1564
+ "disabled",
1565
+ "required",
1566
+ "aria-describedby"
894
1567
  ]);
895
- const autoId = useId();
1568
+ const autoId = useId3();
896
1569
  const id = idProp != null ? idProp : autoId;
897
1570
  const hasError = Boolean(error);
898
- return /* @__PURE__ */ jsxs8("div", { className: cn("ph-field", wrapperClassName), children: [
899
- label && /* @__PURE__ */ jsx12(
900
- "label",
901
- {
902
- htmlFor: id,
903
- className: cn("ph-label", hideLabel && "sr-only", disabled && "opacity-50"),
904
- children: label
905
- }
906
- ),
907
- /* @__PURE__ */ jsx12(
908
- "textarea",
909
- __spreadValues({
910
- id,
911
- disabled,
912
- "aria-invalid": hasError || void 0,
913
- className: cn(
914
- "ph-textarea w-full",
915
- sizeMap3[size],
916
- hasError && "border-ph-danger focus:border-ph-danger focus:ring-ph-danger/20",
917
- disabled && "cursor-not-allowed opacity-60",
918
- className
919
- )
920
- }, props)
921
- ),
922
- helperText && !hasError && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs text-ph-subtle", children: helperText }),
923
- error && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs font-medium text-ph-danger", children: error })
924
- ] });
925
- }
926
- function Checkbox(_a) {
1571
+ return /* @__PURE__ */ jsx16(FormField, { controlId: id, label, hideLabel, helperText, error, required, disabled, className: wrapperClassName, children: (fieldProps) => /* @__PURE__ */ jsx16(
1572
+ "textarea",
1573
+ __spreadValues(__spreadProps(__spreadValues({}, fieldProps), {
1574
+ ref,
1575
+ disabled,
1576
+ required,
1577
+ "aria-describedby": joinIds(ariaDescribedBy, fieldProps["aria-describedby"]),
1578
+ className: cn(
1579
+ "ph-textarea w-full",
1580
+ sizeMap3[size],
1581
+ hasError && "ph-input-error",
1582
+ disabled && "cursor-not-allowed opacity-60",
1583
+ className
1584
+ )
1585
+ }), props)
1586
+ ) });
1587
+ });
1588
+ Textarea.displayName = "Textarea";
1589
+ var Checkbox = forwardRef8(function Checkbox2(_a, ref) {
927
1590
  var _b = _a, {
928
1591
  id: idProp,
929
1592
  label,
@@ -931,7 +1594,8 @@ function Checkbox(_a) {
931
1594
  helperText,
932
1595
  className,
933
1596
  wrapperClassName,
934
- disabled
1597
+ disabled,
1598
+ "aria-describedby": ariaDescribedBy
935
1599
  } = _b, props = __objRest(_b, [
936
1600
  "id",
937
1601
  "label",
@@ -939,33 +1603,45 @@ function Checkbox(_a) {
939
1603
  "helperText",
940
1604
  "className",
941
1605
  "wrapperClassName",
942
- "disabled"
1606
+ "disabled",
1607
+ "aria-describedby"
943
1608
  ]);
944
- const autoId = useId();
1609
+ const autoId = useId3();
945
1610
  const id = idProp != null ? idProp : autoId;
946
1611
  const hasError = Boolean(error);
947
- return /* @__PURE__ */ jsxs8("div", { className: cn("ph-control-row", wrapperClassName), children: [
948
- /* @__PURE__ */ jsx12(
949
- "input",
950
- __spreadValues({
951
- id,
952
- type: "checkbox",
953
- disabled,
954
- "aria-invalid": hasError || void 0,
955
- className: cn(
956
- "ph-checkbox",
957
- hasError && "border-ph-danger",
958
- disabled && "cursor-not-allowed opacity-60",
959
- className
960
- )
961
- }, props)
962
- ),
963
- /* @__PURE__ */ jsx12("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label }),
964
- helperText && !hasError && /* @__PURE__ */ jsx12("p", { className: "mt-0.5 text-xs text-ph-subtle", children: helperText }),
965
- error && /* @__PURE__ */ jsx12("p", { className: "mt-0.5 text-xs font-medium text-ph-danger", children: error })
1612
+ const descriptionId = helperText && !hasError ? `${id}-description` : void 0;
1613
+ const errorId = error ? `${id}-error` : void 0;
1614
+ return /* @__PURE__ */ jsxs13("div", { className: cn("ph-control-row", wrapperClassName), children: [
1615
+ /* @__PURE__ */ jsxs13("span", { className: "ph-checkbox-wrap", children: [
1616
+ /* @__PURE__ */ jsx16(
1617
+ "input",
1618
+ __spreadValues({
1619
+ ref,
1620
+ id,
1621
+ type: "checkbox",
1622
+ disabled,
1623
+ "aria-invalid": hasError || void 0,
1624
+ "aria-describedby": joinIds(ariaDescribedBy, descriptionId),
1625
+ "aria-errormessage": errorId,
1626
+ className: cn(
1627
+ "ph-checkbox",
1628
+ hasError && "border-ph-danger",
1629
+ disabled && "cursor-not-allowed opacity-60",
1630
+ className
1631
+ )
1632
+ }, props)
1633
+ ),
1634
+ /* @__PURE__ */ jsx16(IconCheck, { className: "ph-checkbox-icon", "aria-hidden": true })
1635
+ ] }),
1636
+ /* @__PURE__ */ jsxs13("div", { className: "ph-control-copy", children: [
1637
+ /* @__PURE__ */ jsx16("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label }),
1638
+ descriptionId ? /* @__PURE__ */ jsx16("p", { id: descriptionId, className: "text-xs text-ph-subtle", children: helperText }) : null,
1639
+ errorId ? /* @__PURE__ */ jsx16("p", { id: errorId, className: "text-xs font-medium text-ph-danger", children: error }) : null
1640
+ ] })
966
1641
  ] });
967
- }
968
- function Radio(_a) {
1642
+ });
1643
+ Checkbox.displayName = "Checkbox";
1644
+ var Radio = forwardRef8(function Radio2(_a, ref) {
969
1645
  var _b = _a, {
970
1646
  id: idProp,
971
1647
  label,
@@ -979,22 +1655,24 @@ function Radio(_a) {
979
1655
  "wrapperClassName",
980
1656
  "disabled"
981
1657
  ]);
982
- const autoId = useId();
1658
+ const autoId = useId3();
983
1659
  const id = idProp != null ? idProp : autoId;
984
- return /* @__PURE__ */ jsxs8("div", { className: cn("ph-control-row", wrapperClassName, disabled && "opacity-60"), children: [
985
- /* @__PURE__ */ jsx12(
1660
+ return /* @__PURE__ */ jsxs13("div", { className: cn("ph-control-row", wrapperClassName, disabled && "opacity-60"), children: [
1661
+ /* @__PURE__ */ jsx16(
986
1662
  "input",
987
1663
  __spreadValues({
1664
+ ref,
988
1665
  id,
989
1666
  type: "radio",
990
1667
  disabled,
991
1668
  className: cn("ph-radio", disabled && "cursor-not-allowed", className)
992
1669
  }, props)
993
1670
  ),
994
- /* @__PURE__ */ jsx12("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label })
1671
+ /* @__PURE__ */ jsx16("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label })
995
1672
  ] });
996
- }
997
- function Toggle(_a) {
1673
+ });
1674
+ Radio.displayName = "Radio";
1675
+ var Toggle = forwardRef8(function Toggle2(_a, ref) {
998
1676
  var _b = _a, {
999
1677
  id: idProp,
1000
1678
  label,
@@ -1008,13 +1686,14 @@ function Toggle(_a) {
1008
1686
  "wrapperClassName",
1009
1687
  "disabled"
1010
1688
  ]);
1011
- const autoId = useId();
1689
+ const autoId = useId3();
1012
1690
  const id = idProp != null ? idProp : autoId;
1013
- return /* @__PURE__ */ jsxs8("label", { className: cn("ph-control-row-between", wrapperClassName, disabled && "opacity-60"), children: [
1014
- /* @__PURE__ */ jsx12("span", { className: disabled ? "opacity-60" : void 0, children: label }),
1015
- /* @__PURE__ */ jsx12(
1691
+ return /* @__PURE__ */ jsxs13("label", { className: cn("ph-control-row-between", wrapperClassName, disabled && "opacity-60"), children: [
1692
+ /* @__PURE__ */ jsx16("span", { className: disabled ? "opacity-60" : void 0, children: label }),
1693
+ /* @__PURE__ */ jsx16(
1016
1694
  "input",
1017
1695
  __spreadValues({
1696
+ ref,
1018
1697
  id,
1019
1698
  type: "checkbox",
1020
1699
  role: "switch",
@@ -1023,9 +1702,11 @@ function Toggle(_a) {
1023
1702
  }, props)
1024
1703
  )
1025
1704
  ] });
1026
- }
1027
- function Range(_a) {
1705
+ });
1706
+ Toggle.displayName = "Toggle";
1707
+ var Range = forwardRef8(function Range2(_a, ref) {
1028
1708
  var _b = _a, {
1709
+ id: idProp,
1029
1710
  label,
1030
1711
  minLabel,
1031
1712
  maxLabel,
@@ -1033,6 +1714,7 @@ function Range(_a) {
1033
1714
  wrapperClassName,
1034
1715
  className
1035
1716
  } = _b, props = __objRest(_b, [
1717
+ "id",
1036
1718
  "label",
1037
1719
  "minLabel",
1038
1720
  "maxLabel",
@@ -1040,35 +1722,55 @@ function Range(_a) {
1040
1722
  "wrapperClassName",
1041
1723
  "className"
1042
1724
  ]);
1043
- return /* @__PURE__ */ jsxs8("div", { className: cn("ph-field", wrapperClassName), children: [
1044
- label && /* @__PURE__ */ jsx12("label", { className: "ph-label", children: label }),
1045
- /* @__PURE__ */ jsx12("input", __spreadValues({ type: "range", className: cn("ph-range", className) }, props)),
1046
- (minLabel || valueLabel || maxLabel) && /* @__PURE__ */ jsxs8("div", { className: "flex justify-between text-xs text-ph-mutedtext", children: [
1047
- /* @__PURE__ */ jsx12("span", { children: minLabel }),
1048
- /* @__PURE__ */ jsx12("span", { children: valueLabel }),
1049
- /* @__PURE__ */ jsx12("span", { children: maxLabel })
1725
+ const autoId = useId3();
1726
+ const id = idProp != null ? idProp : autoId;
1727
+ return /* @__PURE__ */ jsxs13("div", { className: cn("ph-field", wrapperClassName), children: [
1728
+ label && /* @__PURE__ */ jsx16("label", { htmlFor: id, className: "ph-label", children: label }),
1729
+ /* @__PURE__ */ jsx16("input", __spreadValues({ ref, id, type: "range", className: cn("ph-range", className) }, props)),
1730
+ (minLabel || valueLabel || maxLabel) && /* @__PURE__ */ jsxs13("div", { className: "flex justify-between text-xs text-ph-mutedtext", children: [
1731
+ /* @__PURE__ */ jsx16("span", { children: minLabel }),
1732
+ /* @__PURE__ */ jsx16("span", { children: valueLabel }),
1733
+ /* @__PURE__ */ jsx16("span", { children: maxLabel })
1050
1734
  ] })
1051
1735
  ] });
1052
- }
1053
- function FileUpload(_a) {
1054
- var _b = _a, { label, prompt = "Drop file or browse", wrapperClassName, className } = _b, props = __objRest(_b, ["label", "prompt", "wrapperClassName", "className"]);
1055
- return /* @__PURE__ */ jsxs8("div", { className: cn("ph-field", wrapperClassName), children: [
1056
- label && /* @__PURE__ */ jsx12("label", { className: "ph-label", children: label }),
1057
- /* @__PURE__ */ jsxs8("label", { className: "flex cursor-pointer items-center gap-3 rounded-lg border border-dashed border-ph-border bg-ph-surface px-4 py-6 text-sm text-ph-subtle transition hover:bg-ph-muted/60", children: [
1058
- /* @__PURE__ */ jsx12("input", __spreadValues({ type: "file", className: cn("sr-only", className) }, props)),
1736
+ });
1737
+ Range.displayName = "Range";
1738
+ var FileUpload = forwardRef8(function FileUpload2(_a, ref) {
1739
+ var _b = _a, {
1740
+ id: idProp,
1741
+ label,
1742
+ prompt = "Drop file or browse",
1743
+ wrapperClassName,
1744
+ className
1745
+ } = _b, props = __objRest(_b, [
1746
+ "id",
1747
+ "label",
1748
+ "prompt",
1749
+ "wrapperClassName",
1750
+ "className"
1751
+ ]);
1752
+ const autoId = useId3();
1753
+ const id = idProp != null ? idProp : autoId;
1754
+ return /* @__PURE__ */ jsxs13("div", { className: cn("ph-field", wrapperClassName), children: [
1755
+ label && /* @__PURE__ */ jsx16("label", { htmlFor: id, className: "ph-label", children: label }),
1756
+ /* @__PURE__ */ jsxs13("label", { htmlFor: id, className: "ph-file-upload", children: [
1757
+ /* @__PURE__ */ jsx16("input", __spreadValues({ ref, id, type: "file", className: cn("sr-only", className) }, props)),
1059
1758
  prompt
1060
1759
  ] })
1061
1760
  ] });
1062
- }
1761
+ });
1762
+ FileUpload.displayName = "FileUpload";
1063
1763
 
1064
1764
  // src/components/ui/Modal.tsx
1065
- import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
1765
+ import * as Dialog from "@radix-ui/react-dialog";
1766
+ import { useRef } from "react";
1767
+ import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
1066
1768
  var sizeMap4 = {
1067
1769
  sm: "max-w-sm",
1068
1770
  md: "max-w-lg",
1069
1771
  lg: "max-w-2xl",
1070
1772
  xl: "max-w-4xl",
1071
- full: "max-w-[calc(100%-2rem)]"
1773
+ full: "max-w-none"
1072
1774
  };
1073
1775
  function Modal({
1074
1776
  open = false,
@@ -1079,50 +1781,67 @@ function Modal({
1079
1781
  footer,
1080
1782
  size = "md",
1081
1783
  className,
1082
- showCloseButton = true
1784
+ showCloseButton = true,
1785
+ closeOnOutsideClick = true,
1786
+ closeOnEscape = true,
1787
+ "aria-label": ariaLabel
1083
1788
  }) {
1084
- if (!open) return null;
1085
- return /* @__PURE__ */ jsx13("div", { className: "ph-modal-overlay", role: "presentation", onClick: onClose, children: /* @__PURE__ */ jsxs9(
1086
- "div",
1789
+ const canDismiss = Boolean(onClose);
1790
+ const restoreFocusRef = useRef(null);
1791
+ return /* @__PURE__ */ jsx17(
1792
+ Dialog.Root,
1087
1793
  {
1088
- role: "dialog",
1089
- "aria-modal": true,
1090
- className: cn(
1091
- "ph-modal-panel",
1092
- sizeMap4[size],
1093
- className
1094
- ),
1095
- onClick: (e) => e.stopPropagation(),
1096
- children: [
1097
- (title || showCloseButton) && /* @__PURE__ */ jsxs9("header", { className: "flex items-start justify-between gap-4", children: [
1098
- /* @__PURE__ */ jsxs9("div", { children: [
1099
- title && /* @__PURE__ */ jsx13("h3", { className: "text-lg font-bold text-ph-ink", children: title }),
1100
- description && /* @__PURE__ */ jsx13("p", { className: "mt-1 text-sm text-ph-subtle", children: description })
1101
- ] }),
1102
- showCloseButton && onClose && /* @__PURE__ */ jsx13(
1103
- "button",
1104
- {
1105
- type: "button",
1106
- onClick: onClose,
1107
- className: "shrink-0 rounded-md p-1 text-ph-subtle hover:bg-black/5 hover:text-ph-ink",
1108
- "aria-label": "Close",
1109
- children: /* @__PURE__ */ jsx13(IconClose, { className: "h-5 w-5" })
1110
- }
1111
- )
1112
- ] }),
1113
- /* @__PURE__ */ jsx13("div", { className: "mt-4", children }),
1114
- footer && /* @__PURE__ */ jsx13("div", { className: "mt-6 flex justify-end gap-2 border-t border-ph-border pt-5", children: footer })
1115
- ]
1794
+ open,
1795
+ onOpenChange: (nextOpen) => {
1796
+ if (!nextOpen) onClose == null ? void 0 : onClose();
1797
+ },
1798
+ children: /* @__PURE__ */ jsxs14(Dialog.Portal, { children: [
1799
+ /* @__PURE__ */ jsx17(Dialog.Overlay, { className: "ph-modal-overlay" }),
1800
+ /* @__PURE__ */ jsxs14(
1801
+ Dialog.Content,
1802
+ __spreadProps(__spreadValues({
1803
+ className: cn("ph-modal-panel", sizeMap4[size], className),
1804
+ "aria-label": ariaLabel
1805
+ }, description ? {} : { "aria-describedby": void 0 }), {
1806
+ onOpenAutoFocus: () => {
1807
+ restoreFocusRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
1808
+ },
1809
+ onCloseAutoFocus: (event) => {
1810
+ var _a;
1811
+ event.preventDefault();
1812
+ (_a = restoreFocusRef.current) == null ? void 0 : _a.focus();
1813
+ },
1814
+ onEscapeKeyDown: (event) => {
1815
+ if (!canDismiss || !closeOnEscape) event.preventDefault();
1816
+ },
1817
+ onPointerDownOutside: (event) => {
1818
+ if (!canDismiss || !closeOnOutsideClick) event.preventDefault();
1819
+ },
1820
+ children: [
1821
+ title ? null : /* @__PURE__ */ jsx17(Dialog.Title, { className: "sr-only", children: ariaLabel != null ? ariaLabel : "Dialog" }),
1822
+ title || description || showCloseButton && canDismiss ? /* @__PURE__ */ jsxs14("header", { className: "ph-modal-header", children: [
1823
+ /* @__PURE__ */ jsxs14("div", { className: "min-w-0", children: [
1824
+ title ? /* @__PURE__ */ jsx17(Dialog.Title, { className: "text-lg font-bold text-ph-ink", children: title }) : null,
1825
+ description ? /* @__PURE__ */ jsx17(Dialog.Description, { className: "mt-1 text-sm text-ph-subtle", children: description }) : null
1826
+ ] }),
1827
+ showCloseButton && canDismiss ? /* @__PURE__ */ jsx17(Dialog.Close, { asChild: true, children: /* @__PURE__ */ jsx17("button", { type: "button", className: "ph-modal-close", "aria-label": "Close dialog", children: /* @__PURE__ */ jsx17(IconClose, { className: "h-5 w-5", "aria-hidden": true }) }) }) : null
1828
+ ] }) : null,
1829
+ /* @__PURE__ */ jsx17("div", { className: "ph-modal-body", children }),
1830
+ footer ? /* @__PURE__ */ jsx17("div", { className: "ph-modal-footer", children: footer }) : null
1831
+ ]
1832
+ })
1833
+ )
1834
+ ] })
1116
1835
  }
1117
- ) });
1836
+ );
1118
1837
  }
1119
1838
 
1120
1839
  // src/components/ui/Navigation.tsx
1121
- import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
1840
+ import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
1122
1841
  function Breadcrumbs({ items, label = "Breadcrumb", className }) {
1123
- return /* @__PURE__ */ jsx14("nav", { "aria-label": label, className: cn("ph-breadcrumbs", className), children: items.map((item, index) => /* @__PURE__ */ jsxs10("span", { className: "contents", children: [
1124
- index > 0 ? /* @__PURE__ */ jsx14("span", { className: "ph-breadcrumb-sep", "aria-hidden": "true", children: "/" }) : null,
1125
- item.current || !item.href ? /* @__PURE__ */ jsx14("span", { className: "ph-breadcrumb-current", "aria-current": item.current ? "page" : void 0, children: item.label }) : /* @__PURE__ */ jsx14("a", { href: item.href, className: "ph-breadcrumb-link", children: item.label })
1842
+ return /* @__PURE__ */ jsx18("nav", { "aria-label": label, className: cn("ph-breadcrumbs", className), children: items.map((item, index) => /* @__PURE__ */ jsxs15("span", { className: "contents", children: [
1843
+ index > 0 ? /* @__PURE__ */ jsx18("span", { className: "ph-breadcrumb-sep", "aria-hidden": "true", children: "/" }) : null,
1844
+ item.current || !item.href ? /* @__PURE__ */ jsx18("span", { className: "ph-breadcrumb-current", "aria-current": item.current ? "page" : void 0, children: item.label }) : /* @__PURE__ */ jsx18("a", { href: item.href, className: "ph-breadcrumb-link", children: item.label })
1126
1845
  ] }, `${item.label}-${index}`)) });
1127
1846
  }
1128
1847
  function Pagination({
@@ -1135,8 +1854,8 @@ function Pagination({
1135
1854
  }) {
1136
1855
  const pages = compact ? [Math.max(1, page - 1), page, Math.min(totalPages, page + 1)] : [1, 2, 3, totalPages];
1137
1856
  const uniquePages = Array.from(new Set(pages)).filter((n) => n >= 1 && n <= totalPages);
1138
- return /* @__PURE__ */ jsxs10("nav", { "aria-label": label, className: cn("ph-pagination", className), children: [
1139
- /* @__PURE__ */ jsx14(
1857
+ return /* @__PURE__ */ jsxs15("nav", { "aria-label": label, className: cn("ph-pagination", className), children: [
1858
+ /* @__PURE__ */ jsx18(
1140
1859
  "button",
1141
1860
  {
1142
1861
  type: "button",
@@ -1144,12 +1863,12 @@ function Pagination({
1144
1863
  disabled: page <= 1,
1145
1864
  "aria-label": "Previous page",
1146
1865
  onClick: () => onPageChange == null ? void 0 : onPageChange(page - 1),
1147
- children: /* @__PURE__ */ jsx14(IconChevronLeft, { className: "mx-auto h-4 w-4", "aria-hidden": true })
1866
+ children: /* @__PURE__ */ jsx18(IconChevronLeft, { className: "mx-auto h-4 w-4", "aria-hidden": true })
1148
1867
  }
1149
1868
  ),
1150
- uniquePages.map((pageNumber, index) => /* @__PURE__ */ jsxs10("span", { className: "contents", children: [
1151
- !compact && index === uniquePages.length - 1 && pageNumber > 4 ? /* @__PURE__ */ jsx14("span", { className: "ph-pagination-ellipsis", "aria-hidden": "true", children: "..." }) : null,
1152
- /* @__PURE__ */ jsx14(
1869
+ uniquePages.map((pageNumber, index) => /* @__PURE__ */ jsxs15("span", { className: "contents", children: [
1870
+ !compact && index === uniquePages.length - 1 && pageNumber > 4 ? /* @__PURE__ */ jsx18("span", { className: "ph-pagination-ellipsis", "aria-hidden": "true", children: "..." }) : null,
1871
+ /* @__PURE__ */ jsx18(
1153
1872
  "button",
1154
1873
  {
1155
1874
  type: "button",
@@ -1160,7 +1879,7 @@ function Pagination({
1160
1879
  }
1161
1880
  )
1162
1881
  ] }, pageNumber)),
1163
- /* @__PURE__ */ jsx14(
1882
+ /* @__PURE__ */ jsx18(
1164
1883
  "button",
1165
1884
  {
1166
1885
  type: "button",
@@ -1168,25 +1887,25 @@ function Pagination({
1168
1887
  disabled: page >= totalPages,
1169
1888
  "aria-label": "Next page",
1170
1889
  onClick: () => onPageChange == null ? void 0 : onPageChange(page + 1),
1171
- children: /* @__PURE__ */ jsx14(IconChevronRight, { className: "mx-auto h-4 w-4", "aria-hidden": true })
1890
+ children: /* @__PURE__ */ jsx18(IconChevronRight, { className: "mx-auto h-4 w-4", "aria-hidden": true })
1172
1891
  }
1173
1892
  )
1174
1893
  ] });
1175
1894
  }
1176
1895
 
1177
1896
  // src/components/ui/Panel.tsx
1178
- import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
1897
+ import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
1179
1898
  function Panel(_a) {
1180
1899
  var _b = _a, { title, description, children, className } = _b, props = __objRest(_b, ["title", "description", "children", "className"]);
1181
- return /* @__PURE__ */ jsxs11("div", __spreadProps(__spreadValues({ className: cn("ph-panel", className) }, props), { children: [
1182
- title && /* @__PURE__ */ jsx15("h3", { className: "text-sm font-semibold uppercase tracking-wider text-ph-mutedtext", children: title }),
1183
- description && /* @__PURE__ */ jsx15("p", { className: "text-sm text-ph-subtle", children: description }),
1900
+ return /* @__PURE__ */ jsxs16("div", __spreadProps(__spreadValues({ className: cn("ph-panel", className) }, props), { children: [
1901
+ title && /* @__PURE__ */ jsx19("h3", { className: "text-sm font-semibold uppercase tracking-wider text-ph-mutedtext", children: title }),
1902
+ description && /* @__PURE__ */ jsx19("p", { className: "text-sm text-ph-subtle", children: description }),
1184
1903
  children
1185
1904
  ] }));
1186
1905
  }
1187
1906
 
1188
1907
  // src/components/ui/Rating.tsx
1189
- import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
1908
+ import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
1190
1909
  function Rating(_a) {
1191
1910
  var _b = _a, {
1192
1911
  label,
@@ -1206,9 +1925,9 @@ function Rating(_a) {
1206
1925
  "wrapperClassName"
1207
1926
  ]);
1208
1927
  const stars = Array.from({ length: max }, (_, index) => index + 1);
1209
- return /* @__PURE__ */ jsxs12("div", { className: cn("ph-field", wrapperClassName), children: [
1210
- label && /* @__PURE__ */ jsx16("span", { className: "ph-label", children: label }),
1211
- /* @__PURE__ */ jsx16(
1928
+ return /* @__PURE__ */ jsxs17("div", { className: cn("ph-field", wrapperClassName), children: [
1929
+ label && /* @__PURE__ */ jsx20("span", { className: "ph-label", children: label }),
1930
+ /* @__PURE__ */ jsx20(
1212
1931
  "div",
1213
1932
  __spreadProps(__spreadValues({
1214
1933
  className: cn("ph-rating flex", className),
@@ -1218,7 +1937,7 @@ function Rating(_a) {
1218
1937
  children: stars.map((star) => {
1219
1938
  const active = star <= value;
1220
1939
  if (readOnly) {
1221
- return /* @__PURE__ */ jsx16(
1940
+ return /* @__PURE__ */ jsx20(
1222
1941
  IconStar,
1223
1942
  {
1224
1943
  className: cn("h-6 w-6", active ? "text-amber-500" : "text-ph-border"),
@@ -1227,7 +1946,7 @@ function Rating(_a) {
1227
1946
  star
1228
1947
  );
1229
1948
  }
1230
- return /* @__PURE__ */ jsx16(
1949
+ return /* @__PURE__ */ jsx20(
1231
1950
  "button",
1232
1951
  {
1233
1952
  type: "button",
@@ -1236,7 +1955,7 @@ function Rating(_a) {
1236
1955
  "aria-checked": active,
1237
1956
  "aria-label": `${star} out of ${max}`,
1238
1957
  onClick: () => onChange == null ? void 0 : onChange(star),
1239
- children: /* @__PURE__ */ jsx16(IconStar, { className: cn("h-6 w-6", active ? "text-amber-500" : "text-ph-border") })
1958
+ children: /* @__PURE__ */ jsx20(IconStar, { className: cn("h-6 w-6", active ? "text-amber-500" : "text-ph-border") })
1240
1959
  },
1241
1960
  star
1242
1961
  );
@@ -1247,8 +1966,8 @@ function Rating(_a) {
1247
1966
  }
1248
1967
 
1249
1968
  // src/components/ui/SearchInput.tsx
1250
- import { useId as useId2 } from "react";
1251
- import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
1969
+ import { useId as useId4 } from "react";
1970
+ import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
1252
1971
  function SearchInput(_a) {
1253
1972
  var _b = _a, {
1254
1973
  id: idProp,
@@ -1269,12 +1988,12 @@ function SearchInput(_a) {
1269
1988
  "wrapperClassName",
1270
1989
  "placeholder"
1271
1990
  ]);
1272
- const autoId = useId2();
1991
+ const autoId = useId4();
1273
1992
  const id = idProp != null ? idProp : autoId;
1274
- return /* @__PURE__ */ jsxs13("div", { className: cn("relative", wrapperClassName), children: [
1275
- /* @__PURE__ */ jsx17("label", { htmlFor: id, className: hideLabel ? "sr-only" : "ph-label mb-1.5 block", children: label }),
1276
- /* @__PURE__ */ jsxs13("div", { className: "relative", children: [
1277
- shortcut != null ? /* @__PURE__ */ jsx17(
1993
+ return /* @__PURE__ */ jsxs18("div", { className: cn("relative", wrapperClassName), children: [
1994
+ /* @__PURE__ */ jsx21("label", { htmlFor: id, className: hideLabel ? "sr-only" : "ph-label mb-1.5 block", children: label }),
1995
+ /* @__PURE__ */ jsxs18("div", { className: "relative", children: [
1996
+ shortcut != null ? /* @__PURE__ */ jsx21(
1278
1997
  "span",
1279
1998
  {
1280
1999
  className: "ph-shortcut pointer-events-none absolute left-3 top-1/2 z-10 -translate-y-1/2 text-xs",
@@ -1282,7 +2001,7 @@ function SearchInput(_a) {
1282
2001
  children: shortcut
1283
2002
  }
1284
2003
  ) : null,
1285
- /* @__PURE__ */ jsx17(
2004
+ /* @__PURE__ */ jsx21(
1286
2005
  "input",
1287
2006
  __spreadValues({
1288
2007
  id,
@@ -1316,12 +2035,12 @@ function SearchGroup(_a) {
1316
2035
  "wrapperClassName",
1317
2036
  "className"
1318
2037
  ]);
1319
- const autoId = useId2();
2038
+ const autoId = useId4();
1320
2039
  const id = idProp != null ? idProp : autoId;
1321
- return /* @__PURE__ */ jsxs13("div", { className: cn("ph-field", wrapperClassName), children: [
1322
- /* @__PURE__ */ jsx17("label", { htmlFor: id, className: "ph-label", children: label }),
1323
- /* @__PURE__ */ jsxs13("div", { className: "ph-search-group flex w-full max-w-lg min-h-[2.3125rem] items-stretch divide-x divide-ph-border", children: [
1324
- /* @__PURE__ */ jsx17(
2040
+ return /* @__PURE__ */ jsxs18("div", { className: cn("ph-field", wrapperClassName), children: [
2041
+ /* @__PURE__ */ jsx21("label", { htmlFor: id, className: "ph-label", children: label }),
2042
+ /* @__PURE__ */ jsxs18("div", { className: "ph-search-group flex w-full max-w-lg min-h-[2.3125rem] items-stretch divide-x divide-ph-border", children: [
2043
+ /* @__PURE__ */ jsx21(
1325
2044
  "input",
1326
2045
  __spreadValues({
1327
2046
  id,
@@ -1330,12 +2049,12 @@ function SearchGroup(_a) {
1330
2049
  className: cn("ph-input ph-input-group-field min-w-0 flex-1", className)
1331
2050
  }, props)
1332
2051
  ),
1333
- /* @__PURE__ */ jsx17(
2052
+ /* @__PURE__ */ jsx21(
1334
2053
  Button,
1335
2054
  {
1336
2055
  type: "submit",
1337
2056
  variant: "primary",
1338
- icon: /* @__PURE__ */ jsx17(IconSearch, { className: "h-4 w-4", "aria-hidden": true }),
2057
+ icon: /* @__PURE__ */ jsx21(IconSearch, { className: "h-4 w-4", "aria-hidden": true }),
1339
2058
  className: "ph-search-group__submit",
1340
2059
  "aria-label": submitLabel
1341
2060
  }
@@ -1345,7 +2064,7 @@ function SearchGroup(_a) {
1345
2064
  }
1346
2065
 
1347
2066
  // src/components/ui/Table.tsx
1348
- import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
2067
+ import { jsx as jsx22, jsxs as jsxs19 } from "react/jsx-runtime";
1349
2068
  function Table({
1350
2069
  data,
1351
2070
  columns,
@@ -1356,15 +2075,15 @@ function Table({
1356
2075
  className,
1357
2076
  caption
1358
2077
  }) {
1359
- return /* @__PURE__ */ jsx18("div", { className: cn("ph-table-wrap", compact && "ph-table-compact", className), children: /* @__PURE__ */ jsxs14("table", { className: cn("ph-table", zebra && "ph-table-zebra", ribbon && "ph-table--ribbon"), children: [
1360
- caption && /* @__PURE__ */ jsx18("caption", { className: "sr-only", children: caption }),
1361
- /* @__PURE__ */ jsx18("thead", { children: /* @__PURE__ */ jsx18("tr", { children: columns.map((col) => /* @__PURE__ */ jsx18("th", { className: col.className, children: col.header }, col.key)) }) }),
1362
- /* @__PURE__ */ jsx18("tbody", { children: data.map((row, i) => /* @__PURE__ */ jsx18("tr", { style: getRowStyle == null ? void 0 : getRowStyle(row), children: columns.map((col) => /* @__PURE__ */ jsx18("td", { className: col.className, children: col.cell(row) }, col.key)) }, i)) })
2078
+ return /* @__PURE__ */ jsx22("div", { className: cn("ph-table-wrap", compact && "ph-table-compact", className), children: /* @__PURE__ */ jsxs19("table", { className: cn("ph-table", zebra && "ph-table-zebra", ribbon && "ph-table--ribbon"), children: [
2079
+ caption && /* @__PURE__ */ jsx22("caption", { className: "sr-only", children: caption }),
2080
+ /* @__PURE__ */ jsx22("thead", { children: /* @__PURE__ */ jsx22("tr", { children: columns.map((col) => /* @__PURE__ */ jsx22("th", { className: col.className, children: col.header }, col.key)) }) }),
2081
+ /* @__PURE__ */ jsx22("tbody", { children: data.map((row, i) => /* @__PURE__ */ jsx22("tr", { style: getRowStyle == null ? void 0 : getRowStyle(row), children: columns.map((col) => /* @__PURE__ */ jsx22("td", { className: col.className, children: col.cell(row) }, col.key)) }, i)) })
1363
2082
  ] }) });
1364
2083
  }
1365
2084
 
1366
2085
  // src/components/ui/Stat.tsx
1367
- import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
2086
+ import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
1368
2087
  var toneMap = {
1369
2088
  default: "text-ph-ink",
1370
2089
  brand: "text-ph-brand",
@@ -1381,16 +2100,16 @@ var statMap = {
1381
2100
  };
1382
2101
  function Stat(_a) {
1383
2102
  var _b = _a, { icon, label, value, footer, tone = "default", className } = _b, props = __objRest(_b, ["icon", "label", "value", "footer", "tone", "className"]);
1384
- return /* @__PURE__ */ jsxs15("article", __spreadProps(__spreadValues({ className: cn("ph-stat", statMap[tone], className) }, props), { children: [
1385
- icon && /* @__PURE__ */ jsx19("div", { className: cn("mb-2 h-7 w-7", toneMap[tone]), children: icon }),
1386
- /* @__PURE__ */ jsx19("div", { className: cn("ph-stat-label", tone === "warning" && toneMap[tone]), children: label }),
1387
- /* @__PURE__ */ jsx19("div", { className: cn("ph-stat-val", toneMap[tone]), children: value }),
1388
- footer && /* @__PURE__ */ jsx19("p", { className: "text-xs text-ph-subtle", children: footer })
2103
+ return /* @__PURE__ */ jsxs20("article", __spreadProps(__spreadValues({ className: cn("ph-stat", statMap[tone], className) }, props), { children: [
2104
+ icon && /* @__PURE__ */ jsx23("div", { className: cn("mb-2 h-7 w-7", toneMap[tone]), children: icon }),
2105
+ /* @__PURE__ */ jsx23("div", { className: cn("ph-stat-label", tone === "warning" && toneMap[tone]), children: label }),
2106
+ /* @__PURE__ */ jsx23("div", { className: cn("ph-stat-val", toneMap[tone]), children: value }),
2107
+ footer && /* @__PURE__ */ jsx23("p", { className: "text-xs text-ph-subtle", children: footer })
1389
2108
  ] }));
1390
2109
  }
1391
2110
 
1392
2111
  // src/components/ui/Toast.tsx
1393
- import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
2112
+ import { jsx as jsx24, jsxs as jsxs21 } from "react/jsx-runtime";
1394
2113
  var statusConfig2 = {
1395
2114
  info: { icon: IconErrorOutline, color: "text-ph-info", bg: "ph-toast-info" },
1396
2115
  success: { icon: IconCheckCircle, color: "text-ph-success", bg: "ph-toast-success" },
@@ -1406,33 +2125,33 @@ function Toast({
1406
2125
  }) {
1407
2126
  const config = statusConfig2[status];
1408
2127
  const Icon = config.icon;
1409
- return /* @__PURE__ */ jsxs16("div", { className: cn("ph-toast", config.bg, className), children: [
1410
- /* @__PURE__ */ jsx20(Icon, { className: cn("mt-0.5 h-5 w-5 shrink-0", config.color), "aria-hidden": true }),
1411
- /* @__PURE__ */ jsxs16("div", { className: "pr-8", children: [
1412
- /* @__PURE__ */ jsx20("div", { className: "font-semibold", children: title }),
1413
- description && /* @__PURE__ */ jsx20("p", { className: "mt-1 text-xs text-ph-subtle", children: description })
2128
+ return /* @__PURE__ */ jsxs21("div", { className: cn("ph-toast", config.bg, className), children: [
2129
+ /* @__PURE__ */ jsx24(Icon, { className: cn("mt-0.5 h-5 w-5 shrink-0", config.color), "aria-hidden": true }),
2130
+ /* @__PURE__ */ jsxs21("div", { className: "pr-8", children: [
2131
+ /* @__PURE__ */ jsx24("div", { className: "font-semibold", children: title }),
2132
+ description && /* @__PURE__ */ jsx24("p", { className: "mt-1 text-xs text-ph-subtle", children: description })
1414
2133
  ] }),
1415
- onDismiss && /* @__PURE__ */ jsx20(
2134
+ onDismiss && /* @__PURE__ */ jsx24(
1416
2135
  "button",
1417
2136
  {
1418
2137
  type: "button",
1419
2138
  "aria-label": `Dismiss ${title}`,
1420
2139
  className: "absolute right-2 top-2 ph-btn ph-btn-ghost ph-btn-xs ph-btn-circle",
1421
2140
  onClick: onDismiss,
1422
- children: /* @__PURE__ */ jsx20(IconClose, { className: "h-4 w-4" })
2141
+ children: /* @__PURE__ */ jsx24(IconClose, { className: "h-4 w-4" })
1423
2142
  }
1424
2143
  )
1425
2144
  ] });
1426
2145
  }
1427
2146
  function ToastStack({ children, className }) {
1428
- return /* @__PURE__ */ jsx20("div", { className: cn("ph-toast-stack", className), children });
2147
+ return /* @__PURE__ */ jsx24("div", { className: cn("ph-toast-stack", className), children });
1429
2148
  }
1430
2149
 
1431
2150
  // src/components/ui/Tabs.tsx
1432
- import { jsx as jsx21 } from "react/jsx-runtime";
2151
+ import { jsx as jsx25 } from "react/jsx-runtime";
1433
2152
  function Tabs({ items, value, onChange, variant = "pill", className }) {
1434
2153
  if (variant === "underline") {
1435
- return /* @__PURE__ */ jsx21("div", { className: cn("flex gap-6 border-b border-ph-border", className), children: items.map((item) => /* @__PURE__ */ jsx21(
2154
+ return /* @__PURE__ */ jsx25("div", { className: cn("flex gap-6 border-b border-ph-border", className), children: items.map((item) => /* @__PURE__ */ jsx25(
1436
2155
  "button",
1437
2156
  {
1438
2157
  type: "button",
@@ -1446,7 +2165,7 @@ function Tabs({ items, value, onChange, variant = "pill", className }) {
1446
2165
  item.value
1447
2166
  )) });
1448
2167
  }
1449
- return /* @__PURE__ */ jsx21("div", { className: cn("ph-tabs-row inline-flex", className), children: items.map((item) => /* @__PURE__ */ jsx21(
2168
+ return /* @__PURE__ */ jsx25("div", { className: cn("ph-tabs-row inline-flex", className), children: items.map((item) => /* @__PURE__ */ jsx25(
1450
2169
  "button",
1451
2170
  {
1452
2171
  type: "button",
@@ -1645,6 +2364,34 @@ var THEMES = [
1645
2364
  description: "Notion dark mode \u2014 dark charcoal canvas with blue accent and clean typography.",
1646
2365
  colorScheme: "dark",
1647
2366
  group: "Productivity"
2367
+ },
2368
+ {
2369
+ id: "deepsea-light",
2370
+ name: "Tokyo Night Day",
2371
+ description: "Tokyo Night Day \u2014 soft bluish greys with vivid blue and purple accents.",
2372
+ colorScheme: "light",
2373
+ group: "Tokyo Night"
2374
+ },
2375
+ {
2376
+ id: "deepsea-dark",
2377
+ name: "Tokyo Night",
2378
+ description: "Tokyo Night \u2014 #1a1b26 base with signature blue, cyan, and purple.",
2379
+ colorScheme: "dark",
2380
+ group: "Tokyo Night"
2381
+ },
2382
+ {
2383
+ id: "kraken-light",
2384
+ name: "Kraken Light",
2385
+ description: "Medium-inspired warm paper, editorial black actions, and classic publication yellow.",
2386
+ colorScheme: "light",
2387
+ group: "Kraken"
2388
+ },
2389
+ {
2390
+ id: "kraken-dark",
2391
+ name: "Kraken Dark",
2392
+ description: "Medium-inspired night reading canvas with white actions and classic publication yellow.",
2393
+ colorScheme: "dark",
2394
+ group: "Kraken"
1648
2395
  }
1649
2396
  ];
1650
2397
  var THEME_GROUPS = Array.from(new Set(THEMES.map((theme) => theme.group)));
@@ -1690,17 +2437,17 @@ function ThemeDomSync() {
1690
2437
 
1691
2438
  // src/components/ui/ThemeManager.tsx
1692
2439
  import { useLayoutEffect as useLayoutEffect2 } from "react";
1693
- import { Fragment as Fragment5, jsx as jsx22 } from "react/jsx-runtime";
2440
+ import { Fragment as Fragment4, jsx as jsx26 } from "react/jsx-runtime";
1694
2441
  function ThemeManager({ children }) {
1695
2442
  useLayoutEffect2(() => {
1696
2443
  persistTheme(readStoredTheme());
1697
2444
  }, []);
1698
- return /* @__PURE__ */ jsx22(Fragment5, { children });
2445
+ return /* @__PURE__ */ jsx26(Fragment4, { children });
1699
2446
  }
1700
2447
 
1701
2448
  // src/components/ui/ThemeSwitcher.tsx
1702
2449
  import { useEffect, useState } from "react";
1703
- import { jsx as jsx23, jsxs as jsxs17 } from "react/jsx-runtime";
2450
+ import { jsx as jsx27, jsxs as jsxs22 } from "react/jsx-runtime";
1704
2451
  function ThemeSwitcher({ className }) {
1705
2452
  const [themeId, setThemeId] = useState("hedgehog-light");
1706
2453
  useEffect(() => {
@@ -1708,9 +2455,9 @@ function ThemeSwitcher({ className }) {
1708
2455
  persistTheme(id);
1709
2456
  setThemeId(id);
1710
2457
  }, []);
1711
- return /* @__PURE__ */ jsxs17("label", { className: cn("flex min-w-0 items-center gap-2", className), children: [
1712
- /* @__PURE__ */ jsx23("span", { className: "shrink-0 text-xs font-medium text-ph-mutedtext sm:text-sm", children: "Theme" }),
1713
- /* @__PURE__ */ jsx23(
2458
+ return /* @__PURE__ */ jsxs22("label", { className: cn("flex min-w-0 items-center gap-2", className), children: [
2459
+ /* @__PURE__ */ jsx27("span", { className: "shrink-0 text-xs font-medium text-ph-mutedtext sm:text-sm", children: "Theme" }),
2460
+ /* @__PURE__ */ jsx27(
1714
2461
  "select",
1715
2462
  {
1716
2463
  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",
@@ -1721,7 +2468,7 @@ function ThemeSwitcher({ className }) {
1721
2468
  persistTheme(next);
1722
2469
  setThemeId(next);
1723
2470
  },
1724
- children: THEME_GROUPS.map((group) => /* @__PURE__ */ jsx23("optgroup", { label: group, children: THEMES.filter((theme) => theme.group === group).map((theme) => /* @__PURE__ */ jsx23("option", { value: theme.id, children: theme.name }, theme.id)) }, group))
2471
+ children: THEME_GROUPS.map((group) => /* @__PURE__ */ jsx27("optgroup", { label: group, children: THEMES.filter((theme) => theme.group === group).map((theme) => /* @__PURE__ */ jsx27("option", { value: theme.id, children: theme.name }, theme.id)) }, group))
1725
2472
  }
1726
2473
  )
1727
2474
  ] });
@@ -1729,7 +2476,7 @@ function ThemeSwitcher({ className }) {
1729
2476
 
1730
2477
  // src/components/ui/Accordion.tsx
1731
2478
  import { useState as useState2 } from "react";
1732
- import { jsx as jsx24, jsxs as jsxs18 } from "react/jsx-runtime";
2479
+ import { jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
1733
2480
  function Accordion({
1734
2481
  items,
1735
2482
  allowMultiple = false,
@@ -1751,18 +2498,18 @@ function Accordion({
1751
2498
  return next;
1752
2499
  });
1753
2500
  };
1754
- return /* @__PURE__ */ jsx24("div", { className: cn("divide-y divide-ph-border rounded-xl border border-ph-border bg-ph-surface", className), children: items.map((item) => {
2501
+ return /* @__PURE__ */ jsx28("div", { className: cn("divide-y divide-ph-border rounded-xl border border-ph-border bg-ph-surface", className), children: items.map((item) => {
1755
2502
  const isOpen = openItems.has(item.id);
1756
- return /* @__PURE__ */ jsxs18("div", { className: "first:rounded-t-xl last:rounded-b-xl", children: [
1757
- /* @__PURE__ */ jsxs18(
2503
+ return /* @__PURE__ */ jsxs23("div", { className: "first:rounded-t-xl last:rounded-b-xl", children: [
2504
+ /* @__PURE__ */ jsxs23(
1758
2505
  "button",
1759
2506
  {
1760
2507
  type: "button",
1761
2508
  onClick: () => toggleItem(item.id),
1762
2509
  className: "flex w-full items-center justify-between px-5 py-4 text-left transition hover:bg-ph-muted",
1763
2510
  children: [
1764
- /* @__PURE__ */ jsx24("span", { className: "font-semibold text-ph-ink", children: item.title }),
1765
- /* @__PURE__ */ jsx24(
2511
+ /* @__PURE__ */ jsx28("span", { className: "font-semibold text-ph-ink", children: item.title }),
2512
+ /* @__PURE__ */ jsx28(
1766
2513
  IconChevronDown,
1767
2514
  {
1768
2515
  className: cn(
@@ -1774,14 +2521,14 @@ function Accordion({
1774
2521
  ]
1775
2522
  }
1776
2523
  ),
1777
- /* @__PURE__ */ jsx24(
2524
+ /* @__PURE__ */ jsx28(
1778
2525
  "div",
1779
2526
  {
1780
2527
  className: cn(
1781
2528
  "grid transition-all duration-200",
1782
2529
  isOpen ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
1783
2530
  ),
1784
- children: /* @__PURE__ */ jsx24("div", { className: "overflow-hidden", children: /* @__PURE__ */ jsx24("div", { className: "px-5 pb-4 text-ph-subtle", children: item.content }) })
2531
+ children: /* @__PURE__ */ jsx28("div", { className: "overflow-hidden", children: /* @__PURE__ */ jsx28("div", { className: "px-5 pb-4 text-ph-subtle", children: item.content }) })
1785
2532
  }
1786
2533
  )
1787
2534
  ] }, item.id);
@@ -1789,30 +2536,30 @@ function Accordion({
1789
2536
  }
1790
2537
 
1791
2538
  // src/components/ui/Stepper.tsx
1792
- import { jsx as jsx25, jsxs as jsxs19 } from "react/jsx-runtime";
2539
+ import { jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
1793
2540
  function Stepper({ steps, currentStep, className }) {
1794
- return /* @__PURE__ */ jsx25("div", { className: cn("flex items-start gap-2", className), children: steps.map((step, index) => {
2541
+ return /* @__PURE__ */ jsx29("div", { className: cn("flex items-start gap-2", className), children: steps.map((step, index) => {
1795
2542
  const isCompleted = index < currentStep;
1796
2543
  const isCurrent = index === currentStep;
1797
2544
  const isPending = index > currentStep;
1798
2545
  const isError = step.status === "error";
1799
- return /* @__PURE__ */ jsxs19("div", { className: "flex flex-1 items-start gap-2", children: [
1800
- /* @__PURE__ */ jsxs19("div", { className: "flex flex-1 flex-col items-center", children: [
1801
- /* @__PURE__ */ jsx25(
2546
+ return /* @__PURE__ */ jsxs24("div", { className: "flex flex-1 items-start gap-2", children: [
2547
+ /* @__PURE__ */ jsxs24("div", { className: "flex flex-1 flex-col items-center", children: [
2548
+ /* @__PURE__ */ jsx29(
1802
2549
  "div",
1803
2550
  {
1804
2551
  className: cn(
1805
2552
  "flex h-9 w-9 items-center justify-center rounded-full text-sm font-bold transition-colors",
1806
- isCompleted && "bg-ph-success text-white",
1807
- isCurrent && !isError && "bg-ph-brand text-white ring-4 ring-ph-brand/20",
1808
- isCurrent && isError && "bg-ph-danger text-white",
2553
+ isCompleted && "bg-ph-success text-[var(--ph-on-success)]",
2554
+ isCurrent && !isError && "bg-ph-brand text-[var(--ph-on-accent)] ring-4 ring-ph-brand/20",
2555
+ isCurrent && isError && "bg-ph-danger text-[var(--ph-on-danger)]",
1809
2556
  isPending && "bg-ph-muted text-ph-mutedtext"
1810
2557
  ),
1811
- children: isCompleted ? /* @__PURE__ */ jsx25("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", children: /* @__PURE__ */ jsx25("path", { d: "M5 13l4 4L19 7" }) }) : index + 1
2558
+ children: isCompleted ? /* @__PURE__ */ jsx29(IconCheck, { className: "h-5 w-5", "aria-hidden": true }) : index + 1
1812
2559
  }
1813
2560
  ),
1814
- /* @__PURE__ */ jsxs19("div", { className: "mt-2 text-center", children: [
1815
- /* @__PURE__ */ jsx25(
2561
+ /* @__PURE__ */ jsxs24("div", { className: "mt-2 text-center", children: [
2562
+ /* @__PURE__ */ jsx29(
1816
2563
  "p",
1817
2564
  {
1818
2565
  className: cn(
@@ -1823,10 +2570,10 @@ function Stepper({ steps, currentStep, className }) {
1823
2570
  children: step.label
1824
2571
  }
1825
2572
  ),
1826
- step.description && /* @__PURE__ */ jsx25("p", { className: "mt-0.5 text-xs text-ph-mutedtext", children: step.description })
2573
+ step.description && /* @__PURE__ */ jsx29("p", { className: "mt-0.5 text-xs text-ph-mutedtext", children: step.description })
1827
2574
  ] })
1828
2575
  ] }),
1829
- index < steps.length - 1 && /* @__PURE__ */ jsx25(
2576
+ index < steps.length - 1 && /* @__PURE__ */ jsx29(
1830
2577
  "div",
1831
2578
  {
1832
2579
  className: cn(
@@ -1840,16 +2587,16 @@ function Stepper({ steps, currentStep, className }) {
1840
2587
  }
1841
2588
 
1842
2589
  // src/components/ui/SegmentedControl.tsx
1843
- import { jsx as jsx26, jsxs as jsxs20 } from "react/jsx-runtime";
2590
+ import { jsx as jsx30, jsxs as jsxs25 } from "react/jsx-runtime";
1844
2591
  function SegmentedControl({ options, value, onChange, className }) {
1845
- return /* @__PURE__ */ jsx26(
2592
+ return /* @__PURE__ */ jsx30(
1846
2593
  "div",
1847
2594
  {
1848
2595
  className: cn(
1849
2596
  "inline-flex rounded-lg bg-ph-muted p-1",
1850
2597
  className
1851
2598
  ),
1852
- children: options.map((option) => /* @__PURE__ */ jsxs20(
2599
+ children: options.map((option) => /* @__PURE__ */ jsxs25(
1853
2600
  "button",
1854
2601
  {
1855
2602
  type: "button",
@@ -1859,7 +2606,7 @@ function SegmentedControl({ options, value, onChange, className }) {
1859
2606
  value === option.value ? "bg-ph-surface text-ph-ink shadow-ph" : "text-ph-subtle hover:text-ph-ink"
1860
2607
  ),
1861
2608
  children: [
1862
- option.icon && /* @__PURE__ */ jsx26("span", { className: "h-4 w-4", children: option.icon }),
2609
+ option.icon && /* @__PURE__ */ jsx30("span", { className: "h-4 w-4", children: option.icon }),
1863
2610
  option.label
1864
2611
  ]
1865
2612
  },
@@ -1870,8 +2617,8 @@ function SegmentedControl({ options, value, onChange, className }) {
1870
2617
  }
1871
2618
 
1872
2619
  // src/components/ui/CommandPalette.tsx
1873
- import { useState as useState3, useEffect as useEffect2, useRef } from "react";
1874
- import { jsx as jsx27, jsxs as jsxs21 } from "react/jsx-runtime";
2620
+ import { useState as useState3, useEffect as useEffect2, useRef as useRef2 } from "react";
2621
+ import { jsx as jsx31, jsxs as jsxs26 } from "react/jsx-runtime";
1875
2622
  function CommandPalette({
1876
2623
  items,
1877
2624
  isOpen,
@@ -1881,7 +2628,7 @@ function CommandPalette({
1881
2628
  }) {
1882
2629
  const [query, setQuery] = useState3("");
1883
2630
  const [selectedIndex, setSelectedIndex] = useState3(0);
1884
- const inputRef = useRef(null);
2631
+ const inputRef = useRef2(null);
1885
2632
  const filtered = items.filter(
1886
2633
  (item) => item.label.toLowerCase().includes(query.toLowerCase())
1887
2634
  );
@@ -1920,7 +2667,7 @@ function CommandPalette({
1920
2667
  return () => window.removeEventListener("keydown", handleKeyDown);
1921
2668
  }, [isOpen, filtered, selectedIndex, onClose]);
1922
2669
  if (!isOpen) return null;
1923
- return /* @__PURE__ */ jsx27("div", { className: "fixed inset-0 z-50 flex items-start justify-center bg-black/40 pt-[20vh] backdrop-blur-sm", children: /* @__PURE__ */ jsxs21(
2670
+ return /* @__PURE__ */ jsx31("div", { className: "fixed inset-0 z-50 flex items-start justify-center bg-black/40 pt-[20vh] backdrop-blur-sm", children: /* @__PURE__ */ jsxs26(
1924
2671
  "div",
1925
2672
  {
1926
2673
  className: cn(
@@ -1928,9 +2675,9 @@ function CommandPalette({
1928
2675
  className
1929
2676
  ),
1930
2677
  children: [
1931
- /* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-3 border-b border-ph-border px-4 py-3", children: [
1932
- /* @__PURE__ */ jsx27(IconSearch, { className: "h-5 w-5 text-ph-mutedtext" }),
1933
- /* @__PURE__ */ jsx27(
2678
+ /* @__PURE__ */ jsxs26("div", { className: "flex items-center gap-3 border-b border-ph-border px-4 py-3", children: [
2679
+ /* @__PURE__ */ jsx31(IconSearch, { className: "h-5 w-5 text-ph-mutedtext" }),
2680
+ /* @__PURE__ */ jsx31(
1934
2681
  "input",
1935
2682
  {
1936
2683
  ref: inputRef,
@@ -1944,9 +2691,9 @@ function CommandPalette({
1944
2691
  className: "flex-1 bg-transparent text-ph-ink outline-none placeholder:text-ph-mutedtext"
1945
2692
  }
1946
2693
  ),
1947
- /* @__PURE__ */ jsx27("kbd", { className: "rounded border border-ph-border bg-ph-muted px-1.5 py-0.5 text-xs text-ph-mutedtext", children: "ESC" })
2694
+ /* @__PURE__ */ jsx31("kbd", { className: "rounded border border-ph-border bg-ph-muted px-1.5 py-0.5 text-xs text-ph-mutedtext", children: "ESC" })
1948
2695
  ] }),
1949
- /* @__PURE__ */ jsx27("div", { className: "max-h-[50vh] overflow-y-auto py-2", children: filtered.length === 0 ? /* @__PURE__ */ jsx27("div", { className: "px-4 py-8 text-center text-sm text-ph-mutedtext", children: "No results found." }) : filtered.map((item, index) => /* @__PURE__ */ jsxs21(
2696
+ /* @__PURE__ */ jsx31("div", { className: "max-h-[50vh] overflow-y-auto py-2", children: filtered.length === 0 ? /* @__PURE__ */ jsx31("div", { className: "px-4 py-8 text-center text-sm text-ph-mutedtext", children: "No results found." }) : filtered.map((item, index) => /* @__PURE__ */ jsxs26(
1950
2697
  "button",
1951
2698
  {
1952
2699
  type: "button",
@@ -1960,9 +2707,9 @@ function CommandPalette({
1960
2707
  index === selectedIndex ? "bg-ph-muted text-ph-ink" : "text-ph-subtle"
1961
2708
  ),
1962
2709
  children: [
1963
- item.icon && /* @__PURE__ */ jsx27("span", { className: "h-5 w-5", children: item.icon }),
1964
- /* @__PURE__ */ jsx27("span", { className: "flex-1", children: item.label }),
1965
- item.shortcut && /* @__PURE__ */ jsx27("kbd", { className: "rounded border border-ph-border bg-ph-surface px-1.5 py-0.5 text-xs text-ph-mutedtext", children: item.shortcut })
2710
+ item.icon && /* @__PURE__ */ jsx31("span", { className: "h-5 w-5", children: item.icon }),
2711
+ /* @__PURE__ */ jsx31("span", { className: "flex-1", children: item.label }),
2712
+ item.shortcut && /* @__PURE__ */ jsx31("kbd", { className: "rounded border border-ph-border bg-ph-surface px-1.5 py-0.5 text-xs text-ph-mutedtext", children: item.shortcut })
1966
2713
  ]
1967
2714
  },
1968
2715
  item.id
@@ -1974,7 +2721,7 @@ function CommandPalette({
1974
2721
 
1975
2722
  // src/components/ui/Calendar.tsx
1976
2723
  import { useState as useState4 } from "react";
1977
- import { jsx as jsx28, jsxs as jsxs22 } from "react/jsx-runtime";
2724
+ import { jsx as jsx32, jsxs as jsxs27 } from "react/jsx-runtime";
1978
2725
  function Calendar({ value, onChange, className }) {
1979
2726
  const [currentMonth, setCurrentMonth] = useState4(value || /* @__PURE__ */ new Date());
1980
2727
  const today = /* @__PURE__ */ new Date();
@@ -2016,42 +2763,44 @@ function Calendar({ value, onChange, className }) {
2016
2763
  for (let i = 1; i <= daysInMonth; i++) {
2017
2764
  days.push(i);
2018
2765
  }
2019
- return /* @__PURE__ */ jsxs22("div", { className: cn("w-[280px] rounded-xl border border-ph-border bg-ph-surface p-4 shadow-ph", className), children: [
2020
- /* @__PURE__ */ jsxs22("div", { className: "mb-4 flex items-center justify-between", children: [
2021
- /* @__PURE__ */ jsx28(
2766
+ return /* @__PURE__ */ jsxs27("div", { className: cn("w-[280px] rounded-xl border border-ph-border bg-ph-surface p-4 shadow-ph", className), children: [
2767
+ /* @__PURE__ */ jsxs27("div", { className: "mb-4 flex items-center justify-between", children: [
2768
+ /* @__PURE__ */ jsx32(
2022
2769
  "button",
2023
2770
  {
2024
2771
  type: "button",
2025
2772
  onClick: prevMonth,
2773
+ "aria-label": "Previous month",
2026
2774
  className: "rounded-lg p-1 text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink",
2027
- children: /* @__PURE__ */ jsx28("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx28("path", { d: "M15 18l-6-6 6-6" }) })
2775
+ children: /* @__PURE__ */ jsx32(IconChevronLeft, { className: "h-5 w-5", "aria-hidden": true })
2028
2776
  }
2029
2777
  ),
2030
- /* @__PURE__ */ jsxs22("span", { className: "text-sm font-semibold text-ph-ink", children: [
2778
+ /* @__PURE__ */ jsxs27("span", { className: "text-sm font-semibold text-ph-ink", children: [
2031
2779
  monthNames[month],
2032
2780
  " ",
2033
2781
  year
2034
2782
  ] }),
2035
- /* @__PURE__ */ jsx28(
2783
+ /* @__PURE__ */ jsx32(
2036
2784
  "button",
2037
2785
  {
2038
2786
  type: "button",
2039
2787
  onClick: nextMonth,
2788
+ "aria-label": "Next month",
2040
2789
  className: "rounded-lg p-1 text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink",
2041
- children: /* @__PURE__ */ jsx28("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx28("path", { d: "M9 18l6-6-6-6" }) })
2790
+ children: /* @__PURE__ */ jsx32(IconChevronRight, { className: "h-5 w-5", "aria-hidden": true })
2042
2791
  }
2043
2792
  )
2044
2793
  ] }),
2045
- /* @__PURE__ */ jsxs22("div", { className: "grid grid-cols-7 gap-1", children: [
2046
- weekDays.map((day) => /* @__PURE__ */ jsx28("div", { className: "py-1 text-center text-xs font-medium text-ph-mutedtext", children: day }, day)),
2047
- days.map((day, index) => /* @__PURE__ */ jsx28("div", { className: "aspect-square", children: day && /* @__PURE__ */ jsx28(
2794
+ /* @__PURE__ */ jsxs27("div", { className: "grid grid-cols-7 gap-1", children: [
2795
+ weekDays.map((day) => /* @__PURE__ */ jsx32("div", { className: "py-1 text-center text-xs font-medium text-ph-mutedtext", children: day }, day)),
2796
+ days.map((day, index) => /* @__PURE__ */ jsx32("div", { className: "aspect-square", children: day && /* @__PURE__ */ jsx32(
2048
2797
  "button",
2049
2798
  {
2050
2799
  type: "button",
2051
2800
  onClick: () => handleSelect(day),
2052
2801
  className: cn(
2053
2802
  "flex h-full w-full items-center justify-center rounded-lg text-sm transition-colors",
2054
- isSelected(day) ? "bg-ph-brand font-semibold text-white shadow-ph" : isToday(day) ? "bg-ph-muted font-semibold text-ph-brand ring-1 ring-ph-brand/30" : "text-ph-ink hover:bg-ph-muted"
2803
+ isSelected(day) ? "bg-ph-brand font-semibold text-[var(--ph-on-accent)] shadow-ph" : isToday(day) ? "bg-ph-muted font-semibold text-ph-brand ring-1 ring-ph-brand/30" : "text-ph-ink hover:bg-ph-muted"
2055
2804
  ),
2056
2805
  children: day
2057
2806
  }
@@ -2062,10 +2811,10 @@ function Calendar({ value, onChange, className }) {
2062
2811
 
2063
2812
  // src/components/ui/HoverCard.tsx
2064
2813
  import { useState as useState5 } from "react";
2065
- import { jsx as jsx29, jsxs as jsxs23 } from "react/jsx-runtime";
2814
+ import { jsx as jsx33, jsxs as jsxs28 } from "react/jsx-runtime";
2066
2815
  function HoverCard({ trigger, children, className }) {
2067
2816
  const [isVisible, setIsVisible] = useState5(false);
2068
- return /* @__PURE__ */ jsxs23(
2817
+ return /* @__PURE__ */ jsxs28(
2069
2818
  "div",
2070
2819
  {
2071
2820
  className: "relative inline-block",
@@ -2073,7 +2822,7 @@ function HoverCard({ trigger, children, className }) {
2073
2822
  onMouseLeave: () => setIsVisible(false),
2074
2823
  children: [
2075
2824
  trigger,
2076
- /* @__PURE__ */ jsxs23(
2825
+ /* @__PURE__ */ jsxs28(
2077
2826
  "div",
2078
2827
  {
2079
2828
  className: cn(
@@ -2082,8 +2831,8 @@ function HoverCard({ trigger, children, className }) {
2082
2831
  className
2083
2832
  ),
2084
2833
  children: [
2085
- /* @__PURE__ */ jsx29("div", { className: "absolute -top-1.5 left-1/2 h-3 w-3 -translate-x-1/2 rotate-45 border-l border-t border-ph-border bg-ph-surface" }),
2086
- /* @__PURE__ */ jsx29("div", { className: "relative", children })
2834
+ /* @__PURE__ */ jsx33("div", { className: "absolute -top-1.5 left-1/2 h-3 w-3 -translate-x-1/2 rotate-45 border-l border-t border-ph-border bg-ph-surface" }),
2835
+ /* @__PURE__ */ jsx33("div", { className: "relative", children })
2087
2836
  ]
2088
2837
  }
2089
2838
  )
@@ -2093,9 +2842,9 @@ function HoverCard({ trigger, children, className }) {
2093
2842
  }
2094
2843
 
2095
2844
  // src/components/ui/EmptyState.tsx
2096
- import { jsx as jsx30, jsxs as jsxs24 } from "react/jsx-runtime";
2845
+ import { jsx as jsx34, jsxs as jsxs29 } from "react/jsx-runtime";
2097
2846
  function EmptyState({ icon, title, description, action, className }) {
2098
- return /* @__PURE__ */ jsxs24(
2847
+ return /* @__PURE__ */ jsxs29(
2099
2848
  "div",
2100
2849
  {
2101
2850
  className: cn(
@@ -2103,49 +2852,208 @@ function EmptyState({ icon, title, description, action, className }) {
2103
2852
  className
2104
2853
  ),
2105
2854
  children: [
2106
- icon && /* @__PURE__ */ jsx30("div", { className: "mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-ph-muted text-ph-mutedtext", children: icon }),
2107
- /* @__PURE__ */ jsx30("h3", { className: "text-base font-semibold text-ph-ink", children: title }),
2108
- description && /* @__PURE__ */ jsx30("p", { className: "mt-1 max-w-sm text-sm text-ph-subtle", children: description }),
2109
- action && /* @__PURE__ */ jsx30("div", { className: "mt-4", children: action })
2855
+ icon && /* @__PURE__ */ jsx34("div", { className: "mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-ph-muted text-ph-mutedtext", children: icon }),
2856
+ /* @__PURE__ */ jsx34("h3", { className: "text-base font-semibold text-ph-ink", children: title }),
2857
+ description && /* @__PURE__ */ jsx34("p", { className: "mt-1 max-w-sm text-sm text-ph-subtle", children: description }),
2858
+ action && /* @__PURE__ */ jsx34("div", { className: "mt-4", children: action })
2110
2859
  ]
2111
2860
  }
2112
2861
  );
2113
2862
  }
2114
2863
 
2115
2864
  // src/components/ui/FilterChips.tsx
2116
- import { jsx as jsx31, jsxs as jsxs25 } from "react/jsx-runtime";
2117
- function FilterChips({ chips, onToggle, onRemove, className }) {
2118
- return /* @__PURE__ */ jsx31("div", { className: cn("flex flex-wrap gap-2", className), children: chips.map((chip) => /* @__PURE__ */ jsxs25(
2119
- "button",
2865
+ import { Fragment as Fragment5, jsx as jsx35, jsxs as jsxs30 } from "react/jsx-runtime";
2866
+ function FilterChips({
2867
+ chips,
2868
+ onToggle,
2869
+ onRemove,
2870
+ className,
2871
+ "aria-label": ariaLabel = "Applied filters"
2872
+ }) {
2873
+ return /* @__PURE__ */ jsx35("div", { className: cn("ph-filter-chips", className), role: "group", "aria-label": ariaLabel, children: chips.map((chip) => {
2874
+ var _a;
2875
+ const label = (_a = chip.removeLabel) != null ? _a : getChipText(chip);
2876
+ const content = /* @__PURE__ */ jsxs30(Fragment5, { children: [
2877
+ /* @__PURE__ */ jsx35("span", { className: "ph-filter-chip__label", children: chip.label }),
2878
+ chip.value != null ? /* @__PURE__ */ jsx35("span", { className: "ph-filter-chip__value", children: chip.value }) : null
2879
+ ] });
2880
+ return /* @__PURE__ */ jsxs30(
2881
+ "span",
2882
+ {
2883
+ className: cn("ph-filter-chip", chip.active && "ph-filter-chip--active"),
2884
+ "data-state": chip.active ? "on" : "off",
2885
+ children: [
2886
+ onToggle ? /* @__PURE__ */ jsx35(
2887
+ "button",
2888
+ {
2889
+ type: "button",
2890
+ className: "ph-filter-chip__main",
2891
+ "aria-pressed": Boolean(chip.active),
2892
+ onClick: () => onToggle(chip.id),
2893
+ children: content
2894
+ }
2895
+ ) : /* @__PURE__ */ jsx35("span", { className: "ph-filter-chip__main", children: content }),
2896
+ chip.active && onRemove ? /* @__PURE__ */ jsx35(
2897
+ "button",
2898
+ {
2899
+ type: "button",
2900
+ className: "ph-filter-chip__remove",
2901
+ "aria-label": `Remove ${label} filter`,
2902
+ onClick: () => onRemove(chip.id),
2903
+ children: /* @__PURE__ */ jsx35(IconClose, { className: "h-3 w-3", "aria-hidden": true })
2904
+ }
2905
+ ) : null
2906
+ ]
2907
+ },
2908
+ chip.id
2909
+ );
2910
+ }) });
2911
+ }
2912
+ function getChipText(chip) {
2913
+ const label = typeof chip.label === "string" || typeof chip.label === "number" ? String(chip.label) : chip.id;
2914
+ const value = typeof chip.value === "string" || typeof chip.value === "number" ? String(chip.value) : null;
2915
+ return value ? `${label}: ${value}` : label;
2916
+ }
2917
+
2918
+ // src/components/ui/FilterBar.tsx
2919
+ import { jsx as jsx36, jsxs as jsxs31 } from "react/jsx-runtime";
2920
+ function FilterBar(_a) {
2921
+ var _b = _a, {
2922
+ children,
2923
+ label = "Filters and sorting",
2924
+ onClear,
2925
+ clearLabel = "Clear all",
2926
+ resultCount,
2927
+ className
2928
+ } = _b, props = __objRest(_b, [
2929
+ "children",
2930
+ "label",
2931
+ "onClear",
2932
+ "clearLabel",
2933
+ "resultCount",
2934
+ "className"
2935
+ ]);
2936
+ return /* @__PURE__ */ jsxs31("div", __spreadProps(__spreadValues({ className: cn("ph-filter-bar", className) }, props), { children: [
2937
+ /* @__PURE__ */ jsxs31("div", { className: "ph-filter-bar__controls", role: "group", "aria-label": label, children: [
2938
+ children,
2939
+ onClear ? /* @__PURE__ */ jsx36("button", { type: "button", className: "ph-filter-bar__clear", onClick: onClear, children: clearLabel }) : null
2940
+ ] }),
2941
+ resultCount != null ? /* @__PURE__ */ jsx36("output", { className: "ph-filter-bar__results", "aria-live": "polite", children: resultCount }) : null
2942
+ ] }));
2943
+ }
2944
+ function FilterMenu({
2945
+ label,
2946
+ value,
2947
+ options,
2948
+ onValueChange,
2949
+ placeholder = "Any",
2950
+ align = "start",
2951
+ disabled,
2952
+ className
2953
+ }) {
2954
+ var _a;
2955
+ const selected = options.find((option) => option.value === value);
2956
+ const displayValue = (_a = selected == null ? void 0 : selected.label) != null ? _a : placeholder;
2957
+ const accessibleValue = selected ? getOptionText(selected) : String(placeholder);
2958
+ return /* @__PURE__ */ jsx36(
2959
+ DropdownMenu,
2120
2960
  {
2121
- type: "button",
2122
- onClick: () => onToggle(chip.id),
2123
- className: cn(
2124
- "inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-sm font-medium transition-colors",
2125
- chip.active ? "bg-ph-brand text-white" : "bg-ph-muted text-ph-subtle hover:bg-ph-border hover:text-ph-ink"
2126
- ),
2127
- children: [
2128
- chip.label,
2129
- chip.active && /* @__PURE__ */ jsx31(
2130
- "span",
2961
+ "aria-label": `${label}: ${accessibleValue}`,
2962
+ align,
2963
+ disabled,
2964
+ className,
2965
+ trigger: /* @__PURE__ */ jsxs31("span", { className: cn("ph-filter-menu-trigger", selected && "ph-filter-menu-trigger--active"), children: [
2966
+ /* @__PURE__ */ jsx36(IconTuning, { className: "h-3.5 w-3.5", "aria-hidden": true }),
2967
+ /* @__PURE__ */ jsx36("span", { className: "ph-filter-menu-trigger__label", children: label }),
2968
+ /* @__PURE__ */ jsx36("span", { className: "ph-filter-menu-trigger__value", children: displayValue })
2969
+ ] }),
2970
+ children: /* @__PURE__ */ jsx36(DropdownRadioGroup, { value, onValueChange, children: options.map((option) => /* @__PURE__ */ jsx36(
2971
+ DropdownRadioItem,
2972
+ {
2973
+ value: option.value,
2974
+ textValue: getOptionText(option),
2975
+ disabled: option.disabled,
2976
+ children: option.label
2977
+ },
2978
+ option.value
2979
+ )) })
2980
+ }
2981
+ );
2982
+ }
2983
+ function SortMenu({
2984
+ label,
2985
+ value,
2986
+ options,
2987
+ onValueChange,
2988
+ direction = "descending",
2989
+ align = "end",
2990
+ disabled,
2991
+ className
2992
+ }) {
2993
+ const selected = options.find((option) => option.value === value);
2994
+ return /* @__PURE__ */ jsx36(
2995
+ DropdownMenu,
2996
+ {
2997
+ "aria-label": `${label}: ${selected ? getOptionText(selected) : "Choose sort order"}`,
2998
+ align,
2999
+ disabled,
3000
+ className,
3001
+ trigger: /* @__PURE__ */ jsxs31("span", { className: "ph-filter-menu-trigger ph-sort-menu-trigger", children: [
3002
+ /* @__PURE__ */ jsx36(
3003
+ IconArrowDown,
2131
3004
  {
2132
- onClick: (e) => {
2133
- e.stopPropagation();
2134
- onRemove(chip.id);
2135
- },
2136
- className: "ml-0.5 flex h-4 w-4 cursor-pointer items-center justify-center rounded-full hover:bg-white/20",
2137
- children: /* @__PURE__ */ jsx31(IconClose, { className: "h-3 w-3" })
3005
+ className: cn("h-3.5 w-3.5", direction === "ascending" && "rotate-180"),
3006
+ "aria-hidden": true
2138
3007
  }
2139
- )
2140
- ]
2141
- },
2142
- chip.id
2143
- )) });
3008
+ ),
3009
+ /* @__PURE__ */ jsx36("span", { className: "ph-filter-menu-trigger__label", children: label }),
3010
+ selected ? /* @__PURE__ */ jsx36("span", { className: "ph-filter-menu-trigger__value", children: selected.label }) : null
3011
+ ] }),
3012
+ children: /* @__PURE__ */ jsx36(DropdownRadioGroup, { value, onValueChange, children: options.map((option) => /* @__PURE__ */ jsx36(
3013
+ DropdownRadioItem,
3014
+ {
3015
+ value: option.value,
3016
+ textValue: getOptionText(option),
3017
+ disabled: option.disabled,
3018
+ children: option.label
3019
+ },
3020
+ option.value
3021
+ )) })
3022
+ }
3023
+ );
3024
+ }
3025
+ function getOptionText(option) {
3026
+ if (option.textValue) return option.textValue;
3027
+ if (typeof option.label === "string" || typeof option.label === "number") return String(option.label);
3028
+ return option.value;
3029
+ }
3030
+
3031
+ // src/components/ui/FilterControls.tsx
3032
+ import { jsx as jsx37, jsxs as jsxs32 } from "react/jsx-runtime";
3033
+ function FilterControls(_a) {
3034
+ var _b = _a, {
3035
+ children,
3036
+ barProps,
3037
+ chipsProps,
3038
+ emptyState,
3039
+ className
3040
+ } = _b, props = __objRest(_b, [
3041
+ "children",
3042
+ "barProps",
3043
+ "chipsProps",
3044
+ "emptyState",
3045
+ "className"
3046
+ ]);
3047
+ const hasChips = Boolean(chipsProps == null ? void 0 : chipsProps.chips.length);
3048
+ return /* @__PURE__ */ jsxs32("div", __spreadProps(__spreadValues({ className: cn("ph-filter-controls", className) }, props), { children: [
3049
+ /* @__PURE__ */ jsx37(FilterBar, __spreadProps(__spreadValues({}, barProps), { children })),
3050
+ hasChips && chipsProps ? /* @__PURE__ */ jsx37(FilterChips, __spreadValues({}, chipsProps)) : emptyState != null ? emptyState : null
3051
+ ] }));
2144
3052
  }
2145
3053
 
2146
3054
  // src/components/ui/CodeBlock.tsx
2147
3055
  import { useState as useState6 } from "react";
2148
- import { jsx as jsx32, jsxs as jsxs26 } from "react/jsx-runtime";
3056
+ import { jsx as jsx38, jsxs as jsxs33 } from "react/jsx-runtime";
2149
3057
  function CodeBlock({ code, language = "tsx", filename, className }) {
2150
3058
  const [copied, setCopied] = useState6(false);
2151
3059
  const handleCopy = async () => {
@@ -2153,17 +3061,17 @@ function CodeBlock({ code, language = "tsx", filename, className }) {
2153
3061
  setCopied(true);
2154
3062
  setTimeout(() => setCopied(false), 2e3);
2155
3063
  };
2156
- return /* @__PURE__ */ jsxs26("div", { className: cn("overflow-hidden rounded-lg border border-ph-border bg-[#1a1a2e]", className), children: [
2157
- (filename || language) && /* @__PURE__ */ jsxs26("div", { className: "flex items-center justify-between border-b border-white/10 px-4 py-2", children: [
2158
- /* @__PURE__ */ jsxs26("div", { className: "flex items-center gap-2", children: [
2159
- /* @__PURE__ */ jsxs26("div", { className: "flex gap-1.5", children: [
2160
- /* @__PURE__ */ jsx32("div", { className: "h-3 w-3 rounded-full bg-red-400" }),
2161
- /* @__PURE__ */ jsx32("div", { className: "h-3 w-3 rounded-full bg-amber-400" }),
2162
- /* @__PURE__ */ jsx32("div", { className: "h-3 w-3 rounded-full bg-emerald-400" })
3064
+ return /* @__PURE__ */ jsxs33("div", { className: cn("overflow-hidden rounded-lg border border-ph-border bg-[#1a1a2e]", className), children: [
3065
+ (filename || language) && /* @__PURE__ */ jsxs33("div", { className: "flex items-center justify-between border-b border-white/10 px-4 py-2", children: [
3066
+ /* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-2", children: [
3067
+ /* @__PURE__ */ jsxs33("div", { className: "flex gap-1.5", children: [
3068
+ /* @__PURE__ */ jsx38("div", { className: "h-3 w-3 rounded-full bg-red-400" }),
3069
+ /* @__PURE__ */ jsx38("div", { className: "h-3 w-3 rounded-full bg-amber-400" }),
3070
+ /* @__PURE__ */ jsx38("div", { className: "h-3 w-3 rounded-full bg-emerald-400" })
2163
3071
  ] }),
2164
- filename && /* @__PURE__ */ jsx32("span", { className: "ml-2 text-xs text-white/60", children: filename })
3072
+ filename && /* @__PURE__ */ jsx38("span", { className: "ml-2 text-xs text-white/60", children: filename })
2165
3073
  ] }),
2166
- /* @__PURE__ */ jsx32(
3074
+ /* @__PURE__ */ jsx38(
2167
3075
  "button",
2168
3076
  {
2169
3077
  type: "button",
@@ -2173,35 +3081,35 @@ function CodeBlock({ code, language = "tsx", filename, className }) {
2173
3081
  }
2174
3082
  )
2175
3083
  ] }),
2176
- /* @__PURE__ */ jsx32("pre", { className: "overflow-x-auto p-4 text-sm leading-relaxed", children: /* @__PURE__ */ jsx32("code", { className: "font-mono text-[#e4e4e7]", children: code }) })
3084
+ /* @__PURE__ */ jsx38("pre", { className: "overflow-x-auto p-4 text-sm leading-relaxed", children: /* @__PURE__ */ jsx38("code", { className: "font-mono text-[#e4e4e7]", children: code }) })
2177
3085
  ] });
2178
3086
  }
2179
3087
 
2180
3088
  // src/components/ui/ComponentDocs.tsx
2181
- import { jsx as jsx33, jsxs as jsxs27 } from "react/jsx-runtime";
3089
+ import { jsx as jsx39, jsxs as jsxs34 } from "react/jsx-runtime";
2182
3090
  function ComponentDocs({ title = "Props & variants", rows, defaultOpen = false, className }) {
2183
- return /* @__PURE__ */ jsxs27("details", { className: cn("ph-panel group overflow-hidden p-0", className), open: defaultOpen, children: [
2184
- /* @__PURE__ */ jsxs27("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: [
2185
- /* @__PURE__ */ jsx33("h3", { className: "text-xs font-semibold uppercase tracking-wider text-ph-mutedtext", children: title }),
2186
- /* @__PURE__ */ jsxs27("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: [
2187
- /* @__PURE__ */ jsx33("span", { className: "group-open:hidden", children: "Show" }),
2188
- /* @__PURE__ */ jsx33("span", { className: "hidden group-open:inline", children: "Hide" })
3091
+ return /* @__PURE__ */ jsxs34("details", { className: cn("ph-panel group overflow-hidden p-0", className), open: defaultOpen, children: [
3092
+ /* @__PURE__ */ jsxs34("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: [
3093
+ /* @__PURE__ */ jsx39("h3", { className: "text-xs font-semibold uppercase tracking-wider text-ph-mutedtext", children: title }),
3094
+ /* @__PURE__ */ jsxs34("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: [
3095
+ /* @__PURE__ */ jsx39("span", { className: "group-open:hidden", children: "Show" }),
3096
+ /* @__PURE__ */ jsx39("span", { className: "hidden group-open:inline", children: "Hide" })
2189
3097
  ] })
2190
3098
  ] }),
2191
- /* @__PURE__ */ jsx33("div", { className: "overflow-x-auto border-t border-ph-border", children: /* @__PURE__ */ jsxs27("table", { className: "w-full text-left text-sm", children: [
2192
- /* @__PURE__ */ jsx33("thead", { className: "bg-ph-muted text-xs uppercase tracking-wider text-ph-mutedtext", children: /* @__PURE__ */ jsxs27("tr", { children: [
2193
- /* @__PURE__ */ jsx33("th", { className: "px-4 py-2 font-semibold", children: "Prop" }),
2194
- /* @__PURE__ */ jsx33("th", { className: "px-4 py-2 font-semibold", children: "Type" }),
2195
- /* @__PURE__ */ jsx33("th", { className: "px-4 py-2 font-semibold", children: "Default" }),
2196
- /* @__PURE__ */ jsx33("th", { className: "px-4 py-2 font-semibold", children: "Use" })
3099
+ /* @__PURE__ */ jsx39("div", { className: "overflow-x-auto border-t border-ph-border", children: /* @__PURE__ */ jsxs34("table", { className: "w-full text-left text-sm", children: [
3100
+ /* @__PURE__ */ jsx39("thead", { className: "bg-ph-muted text-xs uppercase tracking-wider text-ph-mutedtext", children: /* @__PURE__ */ jsxs34("tr", { children: [
3101
+ /* @__PURE__ */ jsx39("th", { className: "px-4 py-2 font-semibold", children: "Prop" }),
3102
+ /* @__PURE__ */ jsx39("th", { className: "px-4 py-2 font-semibold", children: "Type" }),
3103
+ /* @__PURE__ */ jsx39("th", { className: "px-4 py-2 font-semibold", children: "Default" }),
3104
+ /* @__PURE__ */ jsx39("th", { className: "px-4 py-2 font-semibold", children: "Use" })
2197
3105
  ] }) }),
2198
- /* @__PURE__ */ jsx33("tbody", { className: "divide-y divide-ph-border", children: rows.map((row) => {
3106
+ /* @__PURE__ */ jsx39("tbody", { className: "divide-y divide-ph-border", children: rows.map((row) => {
2199
3107
  var _a;
2200
- return /* @__PURE__ */ jsxs27("tr", { children: [
2201
- /* @__PURE__ */ jsx33("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-ink", children: row.name }),
2202
- /* @__PURE__ */ jsx33("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: row.type }),
2203
- /* @__PURE__ */ jsx33("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: (_a = row.defaultValue) != null ? _a : "-" }),
2204
- /* @__PURE__ */ jsx33("td", { className: "px-4 py-3 align-top text-ph-subtle", children: row.description })
3108
+ return /* @__PURE__ */ jsxs34("tr", { children: [
3109
+ /* @__PURE__ */ jsx39("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-ink", children: row.name }),
3110
+ /* @__PURE__ */ jsx39("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: row.type }),
3111
+ /* @__PURE__ */ jsx39("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: (_a = row.defaultValue) != null ? _a : "-" }),
3112
+ /* @__PURE__ */ jsx39("td", { className: "px-4 py-3 align-top text-ph-subtle", children: row.description })
2205
3113
  ] }, row.name);
2206
3114
  }) })
2207
3115
  ] }) })
@@ -2210,7 +3118,7 @@ function ComponentDocs({ title = "Props & variants", rows, defaultOpen = false,
2210
3118
 
2211
3119
  // src/components/ui/ShowcaseWrapper.tsx
2212
3120
  import { useState as useState7 } from "react";
2213
- import { jsx as jsx34, jsxs as jsxs28 } from "react/jsx-runtime";
3121
+ import { jsx as jsx40, jsxs as jsxs35 } from "react/jsx-runtime";
2214
3122
  function ShowcaseWrapper({
2215
3123
  id,
2216
3124
  title,
@@ -2224,47 +3132,30 @@ function ShowcaseWrapper({
2224
3132
  var _a;
2225
3133
  const [showCode, setShowCode] = useState7(false);
2226
3134
  const fallbackId = (_a = titleIdMap[title]) != null ? _a : title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
2227
- return /* @__PURE__ */ jsxs28("section", { id: id != null ? id : fallbackId, className: cn("scroll-mt-20", className), children: [
2228
- /* @__PURE__ */ jsxs28("div", { className: "ph-h2-rule mb-8", children: [
2229
- /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-1.5", children: [
2230
- /* @__PURE__ */ jsx34("h2", { children: title }),
2231
- /* @__PURE__ */ jsx34(
3135
+ return /* @__PURE__ */ jsxs35("section", { id: id != null ? id : fallbackId, className: cn("scroll-mt-20", className), children: [
3136
+ /* @__PURE__ */ jsxs35("div", { className: "ph-h2-rule mb-8", children: [
3137
+ /* @__PURE__ */ jsxs35("div", { className: "flex items-center gap-1.5", children: [
3138
+ /* @__PURE__ */ jsx40("h2", { children: title }),
3139
+ /* @__PURE__ */ jsx40(
2232
3140
  "button",
2233
3141
  {
2234
3142
  type: "button",
2235
3143
  onClick: () => setShowCode(!showCode),
2236
3144
  className: cn(
2237
3145
  "flex h-10 w-10 items-center justify-center rounded-full border transition-all",
2238
- showCode ? "border-ph-brand bg-ph-brand text-white shadow-lg shadow-ph-brand/25" : "border-ph-border bg-ph-surface text-ph-subtle hover:border-ph-brand hover:text-ph-brand"
3146
+ 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"
2239
3147
  ),
2240
3148
  title: showCode ? "Hide code" : "Show code",
2241
- children: /* @__PURE__ */ jsxs28(
2242
- "svg",
2243
- {
2244
- className: "h-5 w-5",
2245
- viewBox: "0 0 24 24",
2246
- fill: "none",
2247
- stroke: "currentColor",
2248
- strokeWidth: "2",
2249
- strokeLinecap: "round",
2250
- strokeLinejoin: "round",
2251
- children: [
2252
- /* @__PURE__ */ jsx34("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", ry: "2" }),
2253
- /* @__PURE__ */ jsx34("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
2254
- /* @__PURE__ */ jsx34("line", { x1: "12", y1: "17", x2: "12", y2: "21" }),
2255
- /* @__PURE__ */ jsx34("line", { x1: "6", y1: "8", x2: "6", y2: "8" }),
2256
- /* @__PURE__ */ jsx34("line", { x1: "10", y1: "8", x2: "10", y2: "8" })
2257
- ]
2258
- }
2259
- )
3149
+ "aria-label": showCode ? "Hide code" : "Show code",
3150
+ children: /* @__PURE__ */ jsx40(IconCodePreview, { className: "h-5 w-5", "aria-hidden": true })
2260
3151
  }
2261
3152
  )
2262
3153
  ] }),
2263
- /* @__PURE__ */ jsx34("hr", {})
3154
+ /* @__PURE__ */ jsx40("hr", {})
2264
3155
  ] }),
2265
- description && /* @__PURE__ */ jsx34("p", { className: "mb-6 text-sm text-ph-subtle", children: description }),
2266
- docs && /* @__PURE__ */ jsx34("div", { className: "mb-6", children: docs }),
2267
- /* @__PURE__ */ jsxs28(
3156
+ description && /* @__PURE__ */ jsx40("p", { className: "mb-6 text-sm text-ph-subtle", children: description }),
3157
+ docs && /* @__PURE__ */ jsx40("div", { className: "mb-6", children: docs }),
3158
+ /* @__PURE__ */ jsxs35(
2268
3159
  "div",
2269
3160
  {
2270
3161
  className: cn(
@@ -2272,15 +3163,15 @@ function ShowcaseWrapper({
2272
3163
  showCode ? "lg:grid lg:grid-cols-[1fr,minmax(360px,420px)]" : "block"
2273
3164
  ),
2274
3165
  children: [
2275
- /* @__PURE__ */ jsx34("div", { className: cn("min-w-0", showCode && "lg:pr-2"), children }),
2276
- /* @__PURE__ */ jsx34(
3166
+ /* @__PURE__ */ jsx40("div", { className: cn("min-w-0", showCode && "lg:pr-2"), children }),
3167
+ /* @__PURE__ */ jsx40(
2277
3168
  "div",
2278
3169
  {
2279
3170
  className: cn(
2280
3171
  "transition-all duration-300",
2281
3172
  showCode ? "block opacity-100" : "hidden opacity-0 lg:hidden"
2282
3173
  ),
2283
- children: /* @__PURE__ */ jsx34("div", { className: "sticky top-20", children: /* @__PURE__ */ jsx34(CodeBlock, { code, filename }) })
3174
+ children: /* @__PURE__ */ jsx40("div", { className: "sticky top-20", children: /* @__PURE__ */ jsx40(CodeBlock, { code, filename }) })
2284
3175
  }
2285
3176
  )
2286
3177
  ]
@@ -2329,41 +3220,41 @@ var titleIdMap = {
2329
3220
  };
2330
3221
 
2331
3222
  // src/components/ui/CollapsibleSection.tsx
2332
- import { useState as useState8 } from "react";
2333
- import { jsx as jsx35, jsxs as jsxs29 } from "react/jsx-runtime";
3223
+ import { useId as useId5, useState as useState8 } from "react";
3224
+ import { jsx as jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
2334
3225
  function CollapsibleSection({ title, children, defaultOpen = true, id }) {
2335
3226
  const [isOpen, setIsOpen] = useState8(defaultOpen);
2336
- return /* @__PURE__ */ jsxs29("section", { id, className: "scroll-mt-20", children: [
2337
- /* @__PURE__ */ jsxs29(
3227
+ const generatedId = useId5();
3228
+ const contentId = `${id != null ? id : generatedId}-content`;
3229
+ return /* @__PURE__ */ jsxs36("section", { id, className: "scroll-mt-20", children: [
3230
+ /* @__PURE__ */ jsxs36(
2338
3231
  "button",
2339
3232
  {
2340
3233
  type: "button",
2341
3234
  onClick: () => setIsOpen(!isOpen),
3235
+ "aria-expanded": isOpen,
3236
+ "aria-controls": contentId,
2342
3237
  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",
2343
3238
  children: [
2344
- /* @__PURE__ */ jsx35("span", { className: "text-lg font-bold text-ph-ink", children: title }),
2345
- /* @__PURE__ */ jsx35(
2346
- "svg",
3239
+ /* @__PURE__ */ jsx41("span", { className: "text-lg font-bold text-ph-ink", children: title }),
3240
+ /* @__PURE__ */ jsx41(
3241
+ IconChevronDown,
2347
3242
  {
2348
3243
  className: cn(
2349
3244
  "h-5 w-5 text-ph-subtle transition-transform duration-200",
2350
3245
  isOpen && "rotate-180"
2351
3246
  ),
2352
- viewBox: "0 0 24 24",
2353
- fill: "none",
2354
- stroke: "currentColor",
2355
- strokeWidth: "2",
2356
- strokeLinecap: "round",
2357
- strokeLinejoin: "round",
2358
- children: /* @__PURE__ */ jsx35("path", { d: "M6 9l6 6 6-6" })
3247
+ "aria-hidden": true
2359
3248
  }
2360
3249
  )
2361
3250
  ]
2362
3251
  }
2363
3252
  ),
2364
- /* @__PURE__ */ jsx35(
3253
+ /* @__PURE__ */ jsx41(
2365
3254
  "div",
2366
3255
  {
3256
+ id: contentId,
3257
+ "aria-hidden": !isOpen,
2367
3258
  className: cn(
2368
3259
  "overflow-hidden transition-all duration-300",
2369
3260
  isOpen ? "max-h-[50000px] opacity-100" : "max-h-0 opacity-0"
@@ -2375,7 +3266,7 @@ function CollapsibleSection({ title, children, defaultOpen = true, id }) {
2375
3266
  }
2376
3267
 
2377
3268
  // src/components/ui/Typography.tsx
2378
- import { jsx as jsx36 } from "react/jsx-runtime";
3269
+ import { jsx as jsx42 } from "react/jsx-runtime";
2379
3270
  var toneMap2 = {
2380
3271
  default: "text-ph-ink",
2381
3272
  muted: "text-ph-mutedtext",
@@ -2404,47 +3295,47 @@ function Display({
2404
3295
  truncate,
2405
3296
  className
2406
3297
  }) {
2407
- return /* @__PURE__ */ jsx36("h1", { className: textClass("text-4xl font-extrabold tracking-tight md:text-5xl", tone, weight, truncate, className), children });
3298
+ return /* @__PURE__ */ jsx42("h1", { className: textClass("text-4xl font-extrabold tracking-tight md:text-5xl", tone, weight, truncate, className), children });
2408
3299
  }
2409
3300
  function H1({ children, tone = "default", weight, truncate, className }) {
2410
- return /* @__PURE__ */ jsx36("h1", { className: textClass("text-3xl font-bold tracking-tight md:text-4xl", tone, weight, truncate, className), children });
3301
+ return /* @__PURE__ */ jsx42("h1", { className: textClass("text-3xl font-bold tracking-tight md:text-4xl", tone, weight, truncate, className), children });
2411
3302
  }
2412
3303
  function H2({ children, tone = "default", weight, truncate, className }) {
2413
- return /* @__PURE__ */ jsx36("h2", { className: textClass("text-2xl font-bold tracking-tight", tone, weight, truncate, className), children });
3304
+ return /* @__PURE__ */ jsx42("h2", { className: textClass("text-2xl font-bold tracking-tight", tone, weight, truncate, className), children });
2414
3305
  }
2415
3306
  function H3({ children, tone = "default", weight, truncate, className }) {
2416
- return /* @__PURE__ */ jsx36("h3", { className: textClass("text-xl font-semibold", tone, weight, truncate, className), children });
3307
+ return /* @__PURE__ */ jsx42("h3", { className: textClass("text-xl font-semibold", tone, weight, truncate, className), children });
2417
3308
  }
2418
3309
  function H4({ children, tone = "default", weight, truncate, className }) {
2419
- return /* @__PURE__ */ jsx36("h4", { className: textClass("text-lg font-semibold", tone, weight, truncate, className), children });
3310
+ return /* @__PURE__ */ jsx42("h4", { className: textClass("text-lg font-semibold", tone, weight, truncate, className), children });
2420
3311
  }
2421
3312
  function H5({ children, tone = "default", weight, truncate, className }) {
2422
- return /* @__PURE__ */ jsx36("h5", { className: textClass("text-base font-semibold", tone, weight, truncate, className), children });
3313
+ return /* @__PURE__ */ jsx42("h5", { className: textClass("text-base font-semibold", tone, weight, truncate, className), children });
2423
3314
  }
2424
3315
  function P({ children, tone = "default", weight, truncate, className }) {
2425
- return /* @__PURE__ */ jsx36("p", { className: textClass("text-base leading-relaxed", tone, weight, truncate, className), children });
3316
+ return /* @__PURE__ */ jsx42("p", { className: textClass("text-base leading-relaxed", tone, weight, truncate, className), children });
2426
3317
  }
2427
3318
  function Small({ children, tone = "default", weight, truncate, className }) {
2428
- return /* @__PURE__ */ jsx36("span", { className: textClass("text-sm leading-relaxed", tone, weight, truncate, className), children });
3319
+ return /* @__PURE__ */ jsx42("span", { className: textClass("text-sm leading-relaxed", tone, weight, truncate, className), children });
2429
3320
  }
2430
3321
  function Caption({ children, tone = "muted", weight, truncate, className }) {
2431
- return /* @__PURE__ */ jsx36("span", { className: textClass("text-[11px] font-medium uppercase tracking-wider", tone, weight, truncate, className), children });
3322
+ return /* @__PURE__ */ jsx42("span", { className: textClass("text-[11px] font-medium uppercase tracking-wider", tone, weight, truncate, className), children });
2432
3323
  }
2433
3324
  function Overline({ children, tone = "muted", weight, truncate, className }) {
2434
- return /* @__PURE__ */ jsx36("span", { className: textClass("text-[10px] font-bold uppercase tracking-[0.15em]", tone, weight, truncate, className), children });
3325
+ return /* @__PURE__ */ jsx42("span", { className: textClass("text-[10px] font-bold uppercase tracking-[0.15em]", tone, weight, truncate, className), children });
2435
3326
  }
2436
3327
  function Lead({ children, tone = "subtle", weight, truncate, className }) {
2437
- return /* @__PURE__ */ jsx36("p", { className: textClass("text-lg leading-relaxed", tone, weight, truncate, className), children });
3328
+ return /* @__PURE__ */ jsx42("p", { className: textClass("text-lg leading-relaxed", tone, weight, truncate, className), children });
2438
3329
  }
2439
3330
  function Mono({ children, tone = "default", weight, truncate, className }) {
2440
- return /* @__PURE__ */ jsx36("code", { className: textClass("text-sm font-mono leading-relaxed", tone, weight, truncate, className), children });
3331
+ return /* @__PURE__ */ jsx42("code", { className: textClass("text-sm font-mono leading-relaxed", tone, weight, truncate, className), children });
2441
3332
  }
2442
3333
  function Label({ children, tone = "default", weight, truncate, className }) {
2443
- return /* @__PURE__ */ jsx36("label", { className: textClass("text-sm font-medium", tone, weight, truncate, className), children });
3334
+ return /* @__PURE__ */ jsx42("label", { className: textClass("text-sm font-medium", tone, weight, truncate, className), children });
2444
3335
  }
2445
3336
 
2446
3337
  // src/components/ui/Avatar.tsx
2447
- import { jsx as jsx37, jsxs as jsxs30 } from "react/jsx-runtime";
3338
+ import { jsx as jsx43, jsxs as jsxs37 } from "react/jsx-runtime";
2448
3339
  var sizeMap5 = {
2449
3340
  xs: "h-8 w-8 text-[10px]",
2450
3341
  sm: "h-10 w-10 text-xs",
@@ -2476,8 +3367,8 @@ function Avatar(_a) {
2476
3367
  "badge",
2477
3368
  "className"
2478
3369
  ]);
2479
- return /* @__PURE__ */ jsxs30("div", __spreadProps(__spreadValues({ className: cn("relative inline-flex shrink-0", className) }, props), { children: [
2480
- /* @__PURE__ */ jsx37(
3370
+ return /* @__PURE__ */ jsxs37("div", __spreadProps(__spreadValues({ className: cn("relative inline-flex shrink-0", className) }, props), { children: [
3371
+ /* @__PURE__ */ jsx43(
2481
3372
  "div",
2482
3373
  {
2483
3374
  className: cn(
@@ -2488,7 +3379,7 @@ function Avatar(_a) {
2488
3379
  children: icon || label
2489
3380
  }
2490
3381
  ),
2491
- status && /* @__PURE__ */ jsx37(
3382
+ status && /* @__PURE__ */ jsx43(
2492
3383
  "span",
2493
3384
  {
2494
3385
  className: cn(
@@ -2497,7 +3388,7 @@ function Avatar(_a) {
2497
3388
  )
2498
3389
  }
2499
3390
  ),
2500
- badge && /* @__PURE__ */ jsx37("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 })
3391
+ badge && /* @__PURE__ */ jsx43("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 })
2501
3392
  ] }));
2502
3393
  }
2503
3394
  function AvatarGroup(_a) {
@@ -2505,9 +3396,9 @@ function AvatarGroup(_a) {
2505
3396
  const items = Array.isArray(children) ? children : [children];
2506
3397
  const visible = max ? items.slice(0, max) : items;
2507
3398
  const remaining = max ? items.length - max : 0;
2508
- return /* @__PURE__ */ jsxs30("div", __spreadProps(__spreadValues({ className: cn("-space-x-3 flex rtl:space-x-reverse", className) }, props), { children: [
3399
+ return /* @__PURE__ */ jsxs37("div", __spreadProps(__spreadValues({ className: cn("-space-x-3 flex rtl:space-x-reverse", className) }, props), { children: [
2509
3400
  visible,
2510
- remaining > 0 && /* @__PURE__ */ jsx37(
3401
+ remaining > 0 && /* @__PURE__ */ jsx43(
2511
3402
  Avatar,
2512
3403
  {
2513
3404
  label: `+${remaining}`,
@@ -2519,7 +3410,7 @@ function AvatarGroup(_a) {
2519
3410
  }
2520
3411
 
2521
3412
  // src/components/ui/Progress.tsx
2522
- import { jsx as jsx38, jsxs as jsxs31 } from "react/jsx-runtime";
3413
+ import { jsx as jsx44, jsxs as jsxs38 } from "react/jsx-runtime";
2523
3414
  var sizeMap6 = {
2524
3415
  sm: "h-1",
2525
3416
  md: "h-2",
@@ -2544,15 +3435,15 @@ function Progress(_a) {
2544
3435
  "className"
2545
3436
  ]);
2546
3437
  const percentage = Math.min(100, Math.max(0, value / max * 100));
2547
- return /* @__PURE__ */ jsxs31("div", __spreadProps(__spreadValues({ className: cn("w-full", className) }, props), { children: [
2548
- (label || showPercentage) && /* @__PURE__ */ jsxs31("div", { className: "mb-1.5 flex justify-between text-sm text-ph-subtle", children: [
2549
- label && /* @__PURE__ */ jsx38("span", { children: label }),
2550
- showPercentage && /* @__PURE__ */ jsxs31("span", { className: "tabular-nums", children: [
3438
+ return /* @__PURE__ */ jsxs38("div", __spreadProps(__spreadValues({ className: cn("w-full", className) }, props), { children: [
3439
+ (label || showPercentage) && /* @__PURE__ */ jsxs38("div", { className: "mb-1.5 flex justify-between text-sm text-ph-subtle", children: [
3440
+ label && /* @__PURE__ */ jsx44("span", { children: label }),
3441
+ showPercentage && /* @__PURE__ */ jsxs38("span", { className: "tabular-nums", children: [
2551
3442
  Math.round(percentage),
2552
3443
  "%"
2553
3444
  ] })
2554
3445
  ] }),
2555
- /* @__PURE__ */ jsx38("div", { className: cn("ph-progress", sizeMap6[size]), children: /* @__PURE__ */ jsx38(
3446
+ /* @__PURE__ */ jsx44("div", { className: cn("ph-progress", sizeMap6[size]), children: /* @__PURE__ */ jsx44(
2556
3447
  "div",
2557
3448
  {
2558
3449
  className: cn("ph-progress-bar", color),
@@ -2567,7 +3458,7 @@ function Progress(_a) {
2567
3458
  }
2568
3459
 
2569
3460
  // src/components/ui/ChatBubble.tsx
2570
- import { jsx as jsx39, jsxs as jsxs32 } from "react/jsx-runtime";
3461
+ import { jsx as jsx45, jsxs as jsxs39 } from "react/jsx-runtime";
2571
3462
  function ChatBubble(_a) {
2572
3463
  var _b = _a, {
2573
3464
  children,
@@ -2587,7 +3478,7 @@ function ChatBubble(_a) {
2587
3478
  "className"
2588
3479
  ]);
2589
3480
  const isSelf = variant === "self";
2590
- return /* @__PURE__ */ jsxs32(
3481
+ return /* @__PURE__ */ jsxs39(
2591
3482
  "div",
2592
3483
  __spreadProps(__spreadValues({
2593
3484
  className: cn(
@@ -2597,9 +3488,9 @@ function ChatBubble(_a) {
2597
3488
  )
2598
3489
  }, props), {
2599
3490
  children: [
2600
- avatar && /* @__PURE__ */ jsx39("div", { className: "shrink-0", children: avatar }),
2601
- /* @__PURE__ */ jsxs32("div", { className: cn("min-w-0 flex-1", isSelf && "text-right"), children: [
2602
- (name || time) && /* @__PURE__ */ jsxs32(
3491
+ avatar && /* @__PURE__ */ jsx45("div", { className: "shrink-0", children: avatar }),
3492
+ /* @__PURE__ */ jsxs39("div", { className: cn("min-w-0 flex-1", isSelf && "text-right"), children: [
3493
+ (name || time) && /* @__PURE__ */ jsxs39(
2603
3494
  "header",
2604
3495
  {
2605
3496
  className: cn(
@@ -2607,12 +3498,12 @@ function ChatBubble(_a) {
2607
3498
  isSelf && "flex-row-reverse justify-end"
2608
3499
  ),
2609
3500
  children: [
2610
- name && /* @__PURE__ */ jsx39("span", { className: "font-semibold text-ph-ink", children: name }),
2611
- time && /* @__PURE__ */ jsx39("span", { children: time })
3501
+ name && /* @__PURE__ */ jsx45("span", { className: "font-semibold text-ph-ink", children: name }),
3502
+ time && /* @__PURE__ */ jsx45("span", { children: time })
2612
3503
  ]
2613
3504
  }
2614
3505
  ),
2615
- /* @__PURE__ */ jsx39(
3506
+ /* @__PURE__ */ jsx45(
2616
3507
  "div",
2617
3508
  {
2618
3509
  className: cn(
@@ -2622,7 +3513,7 @@ function ChatBubble(_a) {
2622
3513
  children
2623
3514
  }
2624
3515
  ),
2625
- footer && /* @__PURE__ */ jsx39("footer", { className: "mt-2 text-[11px] text-ph-mutedtext", children: footer })
3516
+ footer && /* @__PURE__ */ jsx45("footer", { className: "mt-2 text-[11px] text-ph-mutedtext", children: footer })
2626
3517
  ] })
2627
3518
  ]
2628
3519
  })
@@ -2630,7 +3521,7 @@ function ChatBubble(_a) {
2630
3521
  }
2631
3522
 
2632
3523
  // src/components/ui/Terminal.tsx
2633
- import { Fragment as Fragment6, jsx as jsx40, jsxs as jsxs33 } from "react/jsx-runtime";
3524
+ import { Fragment as Fragment6, jsx as jsx46, jsxs as jsxs40 } from "react/jsx-runtime";
2634
3525
  function Terminal(_a) {
2635
3526
  var _b = _a, {
2636
3527
  title = "sandbox",
@@ -2643,7 +3534,7 @@ function Terminal(_a) {
2643
3534
  "children",
2644
3535
  "className"
2645
3536
  ]);
2646
- return /* @__PURE__ */ jsxs33(
3537
+ return /* @__PURE__ */ jsxs40(
2647
3538
  "div",
2648
3539
  __spreadProps(__spreadValues({
2649
3540
  className: cn(
@@ -2652,18 +3543,18 @@ function Terminal(_a) {
2652
3543
  )
2653
3544
  }, props), {
2654
3545
  children: [
2655
- /* @__PURE__ */ jsxs33("header", { className: "flex items-center gap-2 border-b border-ph-border bg-ph-muted px-4 py-3", children: [
2656
- /* @__PURE__ */ jsx40("div", { className: "h-3 w-3 rounded-full bg-red-400" }),
2657
- /* @__PURE__ */ jsx40("div", { className: "h-3 w-3 rounded-full bg-amber-400" }),
2658
- /* @__PURE__ */ jsx40("div", { className: "h-3 w-3 rounded-full bg-emerald-400" }),
2659
- title && /* @__PURE__ */ jsx40("span", { className: "text-xs font-medium text-ph-mutedtext", children: title })
3546
+ /* @__PURE__ */ jsxs40("header", { className: "flex items-center gap-2 border-b border-ph-border bg-ph-muted px-4 py-3", children: [
3547
+ /* @__PURE__ */ jsx46("div", { className: "h-3 w-3 rounded-full bg-red-400" }),
3548
+ /* @__PURE__ */ jsx46("div", { className: "h-3 w-3 rounded-full bg-amber-400" }),
3549
+ /* @__PURE__ */ jsx46("div", { className: "h-3 w-3 rounded-full bg-emerald-400" }),
3550
+ title && /* @__PURE__ */ jsx46("span", { className: "text-xs font-medium text-ph-mutedtext", children: title })
2660
3551
  ] }),
2661
- /* @__PURE__ */ jsx40("div", { className: "ph-code rounded-none border-x-0 border-b-0 text-[13px] leading-relaxed", children: children || /* @__PURE__ */ jsx40(Fragment6, { children: lines == null ? void 0 : lines.map((line, i) => {
3552
+ /* @__PURE__ */ jsx46("div", { className: "ph-code rounded-none border-x-0 border-b-0 text-[13px] leading-relaxed", children: children || /* @__PURE__ */ jsx46(Fragment6, { children: lines == null ? void 0 : lines.map((line, i) => {
2662
3553
  const text = typeof line === "string" ? line : line.text;
2663
3554
  const color = typeof line === "string" ? void 0 : line.color;
2664
- return /* @__PURE__ */ jsxs33("span", { children: [
2665
- /* @__PURE__ */ jsx40("span", { className: color || "text-neutral-600", children: text }),
2666
- i < lines.length - 1 && /* @__PURE__ */ jsx40("br", {})
3555
+ return /* @__PURE__ */ jsxs40("span", { children: [
3556
+ /* @__PURE__ */ jsx46("span", { className: color || "text-neutral-600", children: text }),
3557
+ i < lines.length - 1 && /* @__PURE__ */ jsx46("br", {})
2667
3558
  ] }, i);
2668
3559
  }) }) })
2669
3560
  ]
@@ -2672,7 +3563,7 @@ function Terminal(_a) {
2672
3563
  }
2673
3564
 
2674
3565
  // src/components/ui/Indicator.tsx
2675
- import { jsx as jsx41, jsxs as jsxs34 } from "react/jsx-runtime";
3566
+ import { jsx as jsx47, jsxs as jsxs41 } from "react/jsx-runtime";
2676
3567
  var positionMap = {
2677
3568
  "top-right": "-right-[2px] -top-[2px]",
2678
3569
  "top-left": "-left-[2px] -top-[2px]",
@@ -2695,8 +3586,8 @@ function Indicator(_a) {
2695
3586
  "dot",
2696
3587
  "className"
2697
3588
  ]);
2698
- return /* @__PURE__ */ jsxs34("div", __spreadProps(__spreadValues({ className: cn("relative inline-flex items-center justify-center", className) }, props), { children: [
2699
- dot ? /* @__PURE__ */ jsx41(
3589
+ return /* @__PURE__ */ jsxs41("div", __spreadProps(__spreadValues({ className: cn("relative inline-flex items-center justify-center", className) }, props), { children: [
3590
+ dot ? /* @__PURE__ */ jsx47(
2700
3591
  "span",
2701
3592
  {
2702
3593
  className: cn(
@@ -2705,7 +3596,7 @@ function Indicator(_a) {
2705
3596
  positionMap[position]
2706
3597
  )
2707
3598
  }
2708
- ) : badge != null ? /* @__PURE__ */ jsx41(
3599
+ ) : badge != null ? /* @__PURE__ */ jsx47(
2709
3600
  "span",
2710
3601
  {
2711
3602
  className: cn(
@@ -2721,7 +3612,7 @@ function Indicator(_a) {
2721
3612
  }
2722
3613
 
2723
3614
  // src/components/ui/Timeline.tsx
2724
- import { jsx as jsx42, jsxs as jsxs35 } from "react/jsx-runtime";
3615
+ import { jsx as jsx48, jsxs as jsxs42 } from "react/jsx-runtime";
2725
3616
  function Timeline(_a) {
2726
3617
  var _b = _a, {
2727
3618
  events,
@@ -2732,15 +3623,15 @@ function Timeline(_a) {
2732
3623
  "alternate",
2733
3624
  "className"
2734
3625
  ]);
2735
- return /* @__PURE__ */ jsx42(
3626
+ return /* @__PURE__ */ jsx48(
2736
3627
  "ol",
2737
3628
  __spreadProps(__spreadValues({
2738
3629
  className: cn("relative space-y-8", className)
2739
3630
  }, props), {
2740
3631
  children: events.map((event, idx) => {
2741
3632
  const align = alternate && idx % 2 !== 0 ? "lg:flex-row-reverse" : "";
2742
- return /* @__PURE__ */ jsxs35("li", { className: cn("relative flex gap-6", align), children: [
2743
- /* @__PURE__ */ jsx42(
3633
+ return /* @__PURE__ */ jsxs42("li", { className: cn("relative flex gap-6", align), children: [
3634
+ /* @__PURE__ */ jsx48(
2744
3635
  "div",
2745
3636
  {
2746
3637
  className: cn(
@@ -2750,12 +3641,12 @@ function Timeline(_a) {
2750
3641
  children: event.icon
2751
3642
  }
2752
3643
  ),
2753
- /* @__PURE__ */ jsxs35("article", { className: "flex-1 rounded-xl border border-ph-border bg-ph-surface p-4 shadow-ph", children: [
2754
- /* @__PURE__ */ jsxs35("div", { className: "flex flex-wrap items-baseline gap-3", children: [
2755
- /* @__PURE__ */ jsx42("h4", { className: "text-base font-semibold text-ph-ink", children: event.title }),
2756
- event.time && /* @__PURE__ */ jsx42("time", { className: "text-[11px] font-semibold uppercase tracking-wide text-ph-mutedtext", children: event.time })
3644
+ /* @__PURE__ */ jsxs42("article", { className: "flex-1 rounded-xl border border-ph-border bg-ph-surface p-4 shadow-ph", children: [
3645
+ /* @__PURE__ */ jsxs42("div", { className: "flex flex-wrap items-baseline gap-3", children: [
3646
+ /* @__PURE__ */ jsx48("h4", { className: "text-base font-semibold text-ph-ink", children: event.title }),
3647
+ event.time && /* @__PURE__ */ jsx48("time", { className: "text-[11px] font-semibold uppercase tracking-wide text-ph-mutedtext", children: event.time })
2757
3648
  ] }),
2758
- event.description && /* @__PURE__ */ jsx42("p", { className: "mt-2 text-sm text-ph-subtle", children: event.description })
3649
+ event.description && /* @__PURE__ */ jsx48("p", { className: "mt-2 text-sm text-ph-subtle", children: event.description })
2759
3650
  ] })
2760
3651
  ] }, event.id);
2761
3652
  })
@@ -2791,6 +3682,7 @@ export {
2791
3682
  IconRobot,
2792
3683
  IconExclamation,
2793
3684
  IconErrorOutline,
3685
+ IconInfo,
2794
3686
  IconCancel,
2795
3687
  IconCheckCircle,
2796
3688
  IconArrowUp,
@@ -2831,9 +3723,23 @@ export {
2831
3723
  IconToggle,
2832
3724
  IconRocket,
2833
3725
  IconTerminal,
3726
+ IconOldWindow,
3727
+ IconCommandCursor,
3728
+ IconDataReel,
3729
+ IconCodePreview,
3730
+ IconInsightBoard,
3731
+ IconEventStream,
3732
+ IconFeatureGate,
3733
+ IconReplayFrame,
3734
+ IconQueryStack,
3735
+ IconExperimentSplit,
3736
+ IconSurveyCard,
3737
+ OLD_UI_ICONS,
2834
3738
  IconActivity,
2835
3739
  IconFlask,
2836
3740
  IconSpinner,
3741
+ CANONICAL_ICONS,
3742
+ PH_ICON_ALIASES,
2837
3743
  PH_ICONS,
2838
3744
  IconByName,
2839
3745
  Alert,
@@ -2841,9 +3747,20 @@ export {
2841
3747
  Card,
2842
3748
  Drawer,
2843
3749
  Kbd,
3750
+ Loader,
3751
+ Skeleton,
3752
+ LoadingState,
3753
+ AuthLayout,
3754
+ AuthCard,
3755
+ AuthDivider,
3756
+ SettingsNav,
3757
+ SettingsLayout,
2844
3758
  DropdownMenu,
2845
3759
  DropdownButton,
2846
3760
  DropdownItem,
3761
+ DropdownRadioGroup,
3762
+ DropdownRadioItem,
3763
+ FormField,
2847
3764
  Input,
2848
3765
  Select,
2849
3766
  Textarea,
@@ -2883,6 +3800,10 @@ export {
2883
3800
  HoverCard,
2884
3801
  EmptyState,
2885
3802
  FilterChips,
3803
+ FilterBar,
3804
+ FilterMenu,
3805
+ SortMenu,
3806
+ FilterControls,
2886
3807
  CodeBlock,
2887
3808
  ComponentDocs,
2888
3809
  ShowcaseWrapper,