@ship-it-ui/ui 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -201,14 +201,29 @@ var buttonStyles = cva(
201
201
  md: "h-[32px] px-3 text-[12px] gap-[6px] rounded-md",
202
202
  lg: "h-[38px] px-4 text-[13px] gap-[7px] rounded-[7px]"
203
203
  },
204
+ density: {
205
+ comfortable: "",
206
+ touch: ""
207
+ },
204
208
  fullWidth: {
205
209
  true: "w-full",
206
210
  false: ""
207
211
  }
208
212
  },
213
+ compoundVariants: [
214
+ // Mobile density — bumps every size to meet 44pt minimum touch target.
215
+ {
216
+ size: "sm",
217
+ density: "touch",
218
+ class: "h-[36px] px-[14px] text-[13px] gap-[7px] rounded-base"
219
+ },
220
+ { size: "md", density: "touch", class: "h-touch px-[18px] text-m-body gap-2 rounded-base" },
221
+ { size: "lg", density: "touch", class: "h-[52px] px-[22px] text-[16px] gap-2 rounded-base" }
222
+ ],
209
223
  defaultVariants: {
210
224
  variant: "primary",
211
225
  size: "md",
226
+ density: "comfortable",
212
227
  fullWidth: false
213
228
  }
214
229
  }
@@ -223,10 +238,14 @@ function Spinner({ size }) {
223
238
  }
224
239
  );
225
240
  }
226
- var iconSize = { sm: 11, md: 12, lg: 13 };
241
+ var iconSize = {
242
+ comfortable: { sm: 11, md: 12, lg: 13 },
243
+ touch: { sm: 13, md: 15, lg: 16 }
244
+ };
227
245
  var Button = forwardRef(function Button2({
228
246
  variant,
229
247
  size,
248
+ density,
230
249
  fullWidth,
231
250
  icon,
232
251
  trailing,
@@ -239,8 +258,8 @@ var Button = forwardRef(function Button2({
239
258
  ...props
240
259
  }, ref) {
241
260
  const isDisabled = disabled || loading;
242
- const iconPx = iconSize[size ?? "md"];
243
- const composedClassName = cn(buttonStyles({ variant, size, fullWidth }), className);
261
+ const iconPx = iconSize[density ?? "comfortable"][size ?? "md"];
262
+ const composedClassName = cn(buttonStyles({ variant, size, density, fullWidth }), className);
244
263
  if (asChild) {
245
264
  return /* @__PURE__ */ jsx(
246
265
  Slot,
@@ -301,18 +320,28 @@ var iconButtonStyles = cva2(
301
320
  sm: "h-[26px] w-[26px] text-[12px] rounded-[5px]",
302
321
  md: "h-[32px] w-[32px] text-[13px] rounded-md",
303
322
  lg: "h-[38px] w-[38px] text-[15px] rounded-[7px]"
323
+ },
324
+ density: {
325
+ comfortable: "",
326
+ touch: ""
304
327
  }
305
328
  },
306
- defaultVariants: { variant: "secondary", size: "md" }
329
+ compoundVariants: [
330
+ // Mobile density — 44pt minimum touch target, circular tap.
331
+ { size: "sm", density: "touch", class: "h-[36px] w-[36px] text-[14px] rounded-full" },
332
+ { size: "md", density: "touch", class: "h-touch w-touch text-[16px] rounded-full" },
333
+ { size: "lg", density: "touch", class: "h-[52px] w-[52px] text-[18px] rounded-full" }
334
+ ],
335
+ defaultVariants: { variant: "secondary", size: "md", density: "comfortable" }
307
336
  }
308
337
  );
309
- var IconButton = forwardRef2(function IconButton2({ variant, size, icon, type, className, ...props }, ref) {
338
+ var IconButton = forwardRef2(function IconButton2({ variant, size, density, icon, type, className, ...props }, ref) {
310
339
  return /* @__PURE__ */ jsx2(
311
340
  "button",
312
341
  {
313
342
  ref,
314
343
  type: type ?? "button",
315
- className: cn(iconButtonStyles({ variant, size }), className),
344
+ className: cn(iconButtonStyles({ variant, size, density }), className),
316
345
  ...props,
317
346
  children: icon
318
347
  }
@@ -432,14 +461,16 @@ FAB.displayName = "FAB";
432
461
  import * as RadixCheckbox from "@radix-ui/react-checkbox";
433
462
  import { forwardRef as forwardRef6, useId } from "react";
434
463
  import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
435
- var Checkbox = forwardRef6(function Checkbox2({ label, className, id: idProp, ...props }, ref) {
464
+ var Checkbox = forwardRef6(function Checkbox2({ label, density = "comfortable", className, id: idProp, ...props }, ref) {
436
465
  const reactId = useId();
437
466
  const id = idProp ?? `cb-${reactId}`;
467
+ const isTouch = density === "touch";
438
468
  return /* @__PURE__ */ jsxs3(
439
469
  "span",
440
470
  {
441
471
  className: cn(
442
- "inline-flex items-center gap-2 select-none",
472
+ "inline-flex items-center select-none",
473
+ isTouch ? "min-h-touch gap-3" : "gap-2",
443
474
  props.disabled && "cursor-not-allowed opacity-40",
444
475
  className
445
476
  ),
@@ -450,18 +481,32 @@ var Checkbox = forwardRef6(function Checkbox2({ label, className, id: idProp, ..
450
481
  ref,
451
482
  id,
452
483
  className: cn(
453
- "grid h-4 w-4 place-items-center rounded-xs",
454
- "bg-panel border-border-strong border",
484
+ "grid place-items-center",
485
+ isTouch ? "h-[22px] w-[22px] rounded-sm border-[1.5px]" : "h-4 w-4 rounded-xs border",
486
+ "bg-panel border-border-strong",
455
487
  "data-[state=checked]:bg-accent data-[state=checked]:border-accent",
456
488
  "data-[state=indeterminate]:bg-accent data-[state=indeterminate]:border-accent",
457
489
  "transition-[background,border-color] duration-(--duration-micro)",
458
490
  "focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]"
459
491
  ),
460
492
  ...props,
461
- children: /* @__PURE__ */ jsx6(RadixCheckbox.Indicator, { className: "text-on-accent text-[11px] leading-none", children: props.checked === "indeterminate" ? "\u2212" : "\u2713" })
493
+ children: /* @__PURE__ */ jsx6(
494
+ RadixCheckbox.Indicator,
495
+ {
496
+ className: cn("text-on-accent leading-none", isTouch ? "text-[14px]" : "text-[11px]"),
497
+ children: props.checked === "indeterminate" ? "\u2212" : "\u2713"
498
+ }
499
+ )
462
500
  }
463
501
  ),
464
- label && /* @__PURE__ */ jsx6("label", { htmlFor: id, className: "cursor-pointer text-[13px]", children: label })
502
+ label && /* @__PURE__ */ jsx6(
503
+ "label",
504
+ {
505
+ htmlFor: id,
506
+ className: cn("cursor-pointer", isTouch ? "text-m-body" : "text-[13px]"),
507
+ children: label
508
+ }
509
+ )
465
510
  ]
466
511
  }
467
512
  );
@@ -512,17 +557,28 @@ var inputWrapperStyles = cva3(
512
557
  tone: {
513
558
  default: "bg-panel border-border focus-within:border-accent focus-within:ring-accent-dim",
514
559
  err: "bg-panel border-err focus-within:border-err focus-within:ring-err/30"
560
+ },
561
+ density: {
562
+ comfortable: "",
563
+ touch: ""
515
564
  }
516
565
  },
517
- defaultVariants: { size: "md", tone: "default" }
566
+ compoundVariants: [
567
+ // Mobile density — 52px standard input height (MInput in the canvas);
568
+ // sm collapses to 44pt min, lg pushes to 56pt for prominent forms.
569
+ { size: "sm", density: "touch", class: "h-touch px-3 text-m-body rounded-m-tab" },
570
+ { size: "md", density: "touch", class: "h-[52px] px-[14px] text-m-body rounded-m-tab" },
571
+ { size: "lg", density: "touch", class: "h-row px-4 text-m-body-lg rounded-m-tab" }
572
+ ],
573
+ defaultVariants: { size: "md", tone: "default", density: "comfortable" }
518
574
  }
519
575
  );
520
- var Input = forwardRef7(function Input2({ size, tone, icon, trailing, error, width, className, style, disabled, ...props }, ref) {
576
+ var Input = forwardRef7(function Input2({ size, tone, density, icon, trailing, error, width, className, style, disabled, ...props }, ref) {
521
577
  const computedTone = error ? "err" : tone;
522
578
  return /* @__PURE__ */ jsxs5(
523
579
  "div",
524
580
  {
525
- className: cn(inputWrapperStyles({ size, tone: computedTone }), className),
581
+ className: cn(inputWrapperStyles({ size, tone: computedTone, density }), className),
526
582
  style: { width, ...style },
527
583
  children: [
528
584
  icon && /* @__PURE__ */ jsx8("span", { className: "text-text-dim leading-none", children: icon }),
@@ -551,27 +607,32 @@ Input.displayName = "Input";
551
607
  import { forwardRef as forwardRef8 } from "react";
552
608
  import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
553
609
  var SearchInput = forwardRef8(function SearchInput2({
554
- shortcut = "\u2318K",
555
- width = 360,
610
+ shortcut,
611
+ width,
612
+ density = "comfortable",
556
613
  className,
557
614
  style,
558
615
  placeholder = "Search\u2026",
559
616
  "aria-label": ariaLabel,
560
617
  ...props
561
618
  }, ref) {
619
+ const isTouch = density === "touch";
620
+ const resolvedWidth = width ?? (isTouch ? "100%" : 360);
621
+ const resolvedShortcut = shortcut ?? (isTouch ? void 0 : "\u2318K");
562
622
  return /* @__PURE__ */ jsxs6(
563
623
  "div",
564
624
  {
565
625
  className: cn(
566
- "rounded-base flex h-9 items-center gap-2 px-3 font-sans",
626
+ "flex items-center gap-2 font-sans",
627
+ isTouch ? "h-touch rounded-m-tab px-[14px]" : "rounded-base h-9 px-3",
567
628
  "bg-panel-2 border-border border",
568
629
  "focus-within:border-accent focus-within:ring-accent-dim focus-within:ring-[3px]",
569
630
  "transition-[border-color,box-shadow] duration-(--duration-micro)",
570
631
  className
571
632
  ),
572
- style: { width, ...style },
633
+ style: { width: resolvedWidth, ...style },
573
634
  children: [
574
- /* @__PURE__ */ jsx9("span", { className: "text-text-dim leading-none", "aria-hidden": true, children: "\u2315" }),
635
+ /* @__PURE__ */ jsx9("span", { className: cn("text-text-dim leading-none", isTouch && "text-[18px]"), "aria-hidden": true, children: "\u2315" }),
575
636
  /* @__PURE__ */ jsx9(
576
637
  "input",
577
638
  {
@@ -579,11 +640,14 @@ var SearchInput = forwardRef8(function SearchInput2({
579
640
  type: "search",
580
641
  placeholder,
581
642
  "aria-label": ariaLabel ?? (typeof placeholder === "string" ? placeholder : "Search"),
582
- className: "text-text placeholder:text-text-dim min-w-0 flex-1 border-none bg-transparent text-[13px] outline-none",
643
+ className: cn(
644
+ "text-text placeholder:text-text-dim min-w-0 flex-1 border-none bg-transparent outline-none",
645
+ isTouch ? "text-m-body" : "text-[13px]"
646
+ ),
583
647
  ...props
584
648
  }
585
649
  ),
586
- shortcut && /* @__PURE__ */ jsx9("kbd", { className: "text-text-dim border-border rounded-xs border px-[6px] py-[2px] font-mono text-[10px]", children: shortcut })
650
+ resolvedShortcut && /* @__PURE__ */ jsx9("kbd", { className: "text-text-dim border-border rounded-xs border px-[6px] py-[2px] font-mono text-[10px]", children: resolvedShortcut })
587
651
  ]
588
652
  }
589
653
  );
@@ -917,14 +981,26 @@ import * as RadixSwitch from "@radix-ui/react-switch";
917
981
  import { forwardRef as forwardRef13, useId as useId5 } from "react";
918
982
  import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
919
983
  var trackClasses = {
920
- sm: "h-4 w-7",
921
- md: "h-5 w-9"
984
+ comfortable: {
985
+ sm: "h-4 w-7",
986
+ md: "h-5 w-9"
987
+ },
988
+ touch: {
989
+ sm: "h-[26px] w-[44px]",
990
+ md: "h-[30px] w-[50px]"
991
+ }
922
992
  };
923
993
  var thumbClasses = {
924
- sm: "h-3 w-3 data-[state=checked]:translate-x-3",
925
- md: "h-4 w-4 data-[state=checked]:translate-x-4"
994
+ comfortable: {
995
+ sm: "h-3 w-3 data-[state=checked]:translate-x-3",
996
+ md: "h-4 w-4 data-[state=checked]:translate-x-4"
997
+ },
998
+ touch: {
999
+ sm: "h-[22px] w-[22px] data-[state=checked]:translate-x-[18px]",
1000
+ md: "h-[26px] w-[26px] data-[state=checked]:translate-x-5"
1001
+ }
926
1002
  };
927
- var Switch = forwardRef13(function Switch2({ label, size = "md", className, id: idProp, ...props }, ref) {
1003
+ var Switch = forwardRef13(function Switch2({ label, size = "md", density = "comfortable", className, id: idProp, ...props }, ref) {
928
1004
  const reactId = useId5();
929
1005
  const id = idProp ?? `sw-${reactId}`;
930
1006
  return /* @__PURE__ */ jsxs11(
@@ -946,7 +1022,7 @@ var Switch = forwardRef13(function Switch2({ label, size = "md", className, id:
946
1022
  "bg-panel-2 border-border data-[state=checked]:bg-accent data-[state=checked]:border-accent",
947
1023
  "focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]",
948
1024
  "disabled:cursor-not-allowed",
949
- trackClasses[size]
1025
+ trackClasses[density][size]
950
1026
  ),
951
1027
  ...props,
952
1028
  children: /* @__PURE__ */ jsx14(
@@ -955,13 +1031,20 @@ var Switch = forwardRef13(function Switch2({ label, size = "md", className, id:
955
1031
  className: cn(
956
1032
  "bg-text absolute top-1/2 left-[1px] -translate-y-1/2 rounded-full shadow-sm",
957
1033
  "data-[state=checked]:bg-on-accent transition-transform duration-(--duration-micro)",
958
- thumbClasses[size]
1034
+ thumbClasses[density][size]
959
1035
  )
960
1036
  }
961
1037
  )
962
1038
  }
963
1039
  ),
964
- label && /* @__PURE__ */ jsx14("label", { htmlFor: id, className: "cursor-pointer text-[13px]", children: label })
1040
+ label && /* @__PURE__ */ jsx14(
1041
+ "label",
1042
+ {
1043
+ htmlFor: id,
1044
+ className: cn("cursor-pointer", density === "touch" ? "text-m-body" : "text-[13px]"),
1045
+ children: label
1046
+ }
1047
+ )
965
1048
  ]
966
1049
  }
967
1050
  );
@@ -1229,7 +1312,7 @@ import { cva as cva6 } from "class-variance-authority";
1229
1312
  import { forwardRef as forwardRef19 } from "react";
1230
1313
  import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
1231
1314
  var cardStyles = cva6(
1232
- "block bg-panel border border-border rounded-base transition-[border-color,transform,box-shadow] duration-(--duration-step)",
1315
+ "block bg-panel border border-border transition-[border-color,transform,box-shadow] duration-(--duration-step)",
1233
1316
  {
1234
1317
  variants: {
1235
1318
  variant: {
@@ -1240,14 +1323,19 @@ var cardStyles = cva6(
1240
1323
  interactive: {
1241
1324
  true: "cursor-pointer hover:border-border-strong hover:-translate-y-px hover:shadow",
1242
1325
  false: ""
1326
+ },
1327
+ density: {
1328
+ comfortable: "rounded-base",
1329
+ touch: "rounded-m-card"
1243
1330
  }
1244
1331
  },
1245
- defaultVariants: { variant: "default", interactive: false }
1332
+ defaultVariants: { variant: "default", interactive: false, density: "comfortable" }
1246
1333
  }
1247
1334
  );
1248
1335
  var Card = forwardRef19(function Card2({
1249
1336
  variant,
1250
1337
  interactive,
1338
+ density,
1251
1339
  title,
1252
1340
  description,
1253
1341
  actions,
@@ -1284,7 +1372,11 @@ var Card = forwardRef19(function Card2({
1284
1372
  onKeyDown: handleKeyDown,
1285
1373
  role: isInteractive ? "button" : void 0,
1286
1374
  tabIndex: isInteractive ? 0 : void 0,
1287
- className: cn(cardStyles({ variant, interactive: wantsInteractive }), "p-[18px]", className),
1375
+ className: cn(
1376
+ cardStyles({ variant, interactive: wantsInteractive, density }),
1377
+ density === "touch" ? "p-4" : "p-[18px]",
1378
+ className
1379
+ ),
1288
1380
  ...props,
1289
1381
  children: [
1290
1382
  (title || actions) && /* @__PURE__ */ jsxs16("div", { className: cn("flex items-start gap-3", (description || children) && "mb-[10px]"), children: [
@@ -1299,15 +1391,16 @@ var Card = forwardRef19(function Card2({
1299
1391
  );
1300
1392
  });
1301
1393
  Card.displayName = "Card";
1302
- var CardLink = forwardRef19(function CardLink2({ variant, title, description, footer, className, children, href, ...props }, ref) {
1394
+ var CardLink = forwardRef19(function CardLink2({ variant, density, title, description, footer, className, children, href, ...props }, ref) {
1303
1395
  return /* @__PURE__ */ jsxs16(
1304
1396
  "a",
1305
1397
  {
1306
1398
  ref,
1307
1399
  href,
1308
1400
  className: cn(
1309
- cardStyles({ variant, interactive: true }),
1310
- "focus-visible:ring-accent-dim p-[18px] no-underline outline-none focus-visible:ring-[3px]",
1401
+ cardStyles({ variant, interactive: true, density }),
1402
+ "focus-visible:ring-accent-dim no-underline outline-none focus-visible:ring-[3px]",
1403
+ density === "touch" ? "p-4" : "p-[18px]",
1311
1404
  className
1312
1405
  ),
1313
1406
  ...props,
@@ -1358,19 +1451,21 @@ StatCard.displayName = "StatCard";
1358
1451
  // src/components/Chip/Chip.tsx
1359
1452
  import { forwardRef as forwardRef21 } from "react";
1360
1453
  import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
1361
- var Chip = forwardRef21(function Chip2({ icon, onRemove, className, children, ...props }, ref) {
1454
+ var Chip = forwardRef21(function Chip2({ icon, onRemove, density = "comfortable", className, children, ...props }, ref) {
1455
+ const isTouch = density === "touch";
1362
1456
  return /* @__PURE__ */ jsxs18(
1363
1457
  "span",
1364
1458
  {
1365
1459
  ref,
1366
1460
  className: cn(
1367
- "inline-flex h-[26px] items-center gap-[6px] py-[4px] pr-1 pl-[10px] font-sans text-[12px]",
1461
+ "inline-flex items-center gap-[6px] font-sans",
1462
+ isTouch ? "text-m-mono h-8 py-[5px] pr-[6px] pl-3" : "h-[26px] py-[4px] pr-1 pl-[10px] text-[12px]",
1368
1463
  "bg-panel-2 text-text border-border rounded-full border",
1369
1464
  className
1370
1465
  ),
1371
1466
  ...props,
1372
1467
  children: [
1373
- icon && /* @__PURE__ */ jsx22("span", { className: "text-text-dim inline-flex text-[10px]", children: icon }),
1468
+ icon && /* @__PURE__ */ jsx22("span", { className: cn("text-text-dim inline-flex", isTouch ? "text-[12px]" : "text-[10px]"), children: icon }),
1374
1469
  children,
1375
1470
  onRemove && /* @__PURE__ */ jsx22(
1376
1471
  "button",
@@ -1378,7 +1473,10 @@ var Chip = forwardRef21(function Chip2({ icon, onRemove, className, children, ..
1378
1473
  type: "button",
1379
1474
  onClick: onRemove,
1380
1475
  "aria-label": "Remove",
1381
- className: "bg-panel text-text-dim hover:text-text grid h-[18px] w-[18px] place-items-center rounded-full text-[10px] leading-none",
1476
+ className: cn(
1477
+ "bg-panel text-text-dim hover:text-text grid place-items-center rounded-full leading-none",
1478
+ isTouch ? "h-[22px] w-[22px] text-[12px]" : "h-[18px] w-[18px] text-[10px]"
1479
+ ),
1382
1480
  children: "\xD7"
1383
1481
  }
1384
1482
  )
@@ -1409,10 +1507,71 @@ var Kbd = forwardRef22(function Kbd2({ className, children, ...props }, ref) {
1409
1507
  });
1410
1508
  Kbd.displayName = "Kbd";
1411
1509
 
1510
+ // src/components/ScrollArea/ScrollArea.tsx
1511
+ import * as RadixScrollArea from "@radix-ui/react-scroll-area";
1512
+ import { forwardRef as forwardRef23 } from "react";
1513
+ import { jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
1514
+ var scrollbarBase = "flex touch-none select-none p-[2px] transition-colors duration-(--duration-micro)";
1515
+ var thumbBase = 'relative flex-1 rounded-full bg-text-muted/40 hover:bg-text-muted/60 before:absolute before:inset-1/2 before:size-full before:min-h-[44px] before:min-w-[44px] before:-translate-x-1/2 before:-translate-y-1/2 before:content-[""]';
1516
+ var ScrollArea = forwardRef23(function ScrollArea2({
1517
+ type = "hover",
1518
+ orientation = "vertical",
1519
+ scrollHideDelay = 600,
1520
+ className,
1521
+ viewportClassName,
1522
+ viewportRef,
1523
+ children,
1524
+ ...props
1525
+ }, ref) {
1526
+ const showVertical = orientation === "vertical" || orientation === "both";
1527
+ const showHorizontal = orientation === "horizontal" || orientation === "both";
1528
+ return /* @__PURE__ */ jsxs19(
1529
+ RadixScrollArea.Root,
1530
+ {
1531
+ ref,
1532
+ type,
1533
+ scrollHideDelay,
1534
+ className: cn("relative overflow-hidden", className),
1535
+ ...props,
1536
+ children: [
1537
+ /* @__PURE__ */ jsx24(
1538
+ RadixScrollArea.Viewport,
1539
+ {
1540
+ ref: viewportRef,
1541
+ className: cn("h-full w-full rounded-[inherit]", viewportClassName),
1542
+ children
1543
+ }
1544
+ ),
1545
+ showVertical && /* @__PURE__ */ jsx24(
1546
+ RadixScrollArea.Scrollbar,
1547
+ {
1548
+ orientation: "vertical",
1549
+ className: cn(scrollbarBase, "bg-panel-2/40 hover:bg-panel-2/80 h-full w-[10px]"),
1550
+ children: /* @__PURE__ */ jsx24(RadixScrollArea.Thumb, { className: thumbBase })
1551
+ }
1552
+ ),
1553
+ showHorizontal && /* @__PURE__ */ jsx24(
1554
+ RadixScrollArea.Scrollbar,
1555
+ {
1556
+ orientation: "horizontal",
1557
+ className: cn(
1558
+ scrollbarBase,
1559
+ "bg-panel-2/40 hover:bg-panel-2/80 h-[10px] w-full flex-col"
1560
+ ),
1561
+ children: /* @__PURE__ */ jsx24(RadixScrollArea.Thumb, { className: thumbBase })
1562
+ }
1563
+ ),
1564
+ orientation === "both" && /* @__PURE__ */ jsx24(RadixScrollArea.Corner, { className: "bg-panel-2/60" })
1565
+ ]
1566
+ }
1567
+ );
1568
+ });
1569
+ ScrollArea.displayName = "ScrollArea";
1570
+
1412
1571
  // src/components/Skeleton/Skeleton.tsx
1413
1572
  import { cva as cva7 } from "class-variance-authority";
1414
- import { forwardRef as forwardRef23 } from "react";
1415
- import { jsx as jsx24 } from "react/jsx-runtime";
1573
+ import { forwardRef as forwardRef24 } from "react";
1574
+ import { jsx as jsx25 } from "react/jsx-runtime";
1416
1575
  var skeletonStyles = cva7("block bg-panel-2 animate-[ship-skeleton_1.4s_infinite]", {
1417
1576
  variants: {
1418
1577
  shape: {
@@ -1424,11 +1583,11 @@ var skeletonStyles = cva7("block bg-panel-2 animate-[ship-skeleton_1.4s_infinite
1424
1583
  defaultVariants: { shape: "line" }
1425
1584
  });
1426
1585
  var defaultHeight = { line: 14, block: 80, circle: 40 };
1427
- var Skeleton = forwardRef23(function Skeleton2({ shape = "line", width = "100%", height, standalone = false, className, style, ...props }, ref) {
1586
+ var Skeleton = forwardRef24(function Skeleton2({ shape = "line", width = "100%", height, standalone = false, className, style, ...props }, ref) {
1428
1587
  const h = height ?? defaultHeight[shape];
1429
1588
  const w = shape === "circle" ? h : width;
1430
1589
  const a11yProps = standalone ? { role: "status", "aria-busy": true, "aria-label": "Loading" } : { "aria-hidden": true };
1431
- return /* @__PURE__ */ jsx24(
1590
+ return /* @__PURE__ */ jsx25(
1432
1591
  "div",
1433
1592
  {
1434
1593
  ref,
@@ -1440,11 +1599,11 @@ var Skeleton = forwardRef23(function Skeleton2({ shape = "line", width = "100%",
1440
1599
  );
1441
1600
  });
1442
1601
  Skeleton.displayName = "Skeleton";
1443
- var SkeletonGroup = forwardRef23(function SkeletonGroup2({ label = "Loading", loading = true, className, children, ...props }, ref) {
1602
+ var SkeletonGroup = forwardRef24(function SkeletonGroup2({ label = "Loading", loading = true, className, children, ...props }, ref) {
1444
1603
  if (!loading) {
1445
- return /* @__PURE__ */ jsx24("div", { ref, className, ...props, children });
1604
+ return /* @__PURE__ */ jsx25("div", { ref, className, ...props, children });
1446
1605
  }
1447
- return /* @__PURE__ */ jsx24(
1606
+ return /* @__PURE__ */ jsx25(
1448
1607
  "div",
1449
1608
  {
1450
1609
  ref,
@@ -1460,10 +1619,10 @@ var SkeletonGroup = forwardRef23(function SkeletonGroup2({ label = "Loading", lo
1460
1619
  SkeletonGroup.displayName = "SkeletonGroup";
1461
1620
 
1462
1621
  // src/components/Tag/Tag.tsx
1463
- import { forwardRef as forwardRef24 } from "react";
1464
- import { jsx as jsx25, jsxs as jsxs19 } from "react/jsx-runtime";
1465
- var Tag = forwardRef24(function Tag2({ onRemove, icon, size = 22, className, children, ...props }, ref) {
1466
- return /* @__PURE__ */ jsxs19(
1622
+ import { forwardRef as forwardRef25 } from "react";
1623
+ import { jsx as jsx26, jsxs as jsxs20 } from "react/jsx-runtime";
1624
+ var Tag = forwardRef25(function Tag2({ onRemove, icon, size = 22, className, children, ...props }, ref) {
1625
+ return /* @__PURE__ */ jsxs20(
1467
1626
  "span",
1468
1627
  {
1469
1628
  ref,
@@ -1475,9 +1634,9 @@ var Tag = forwardRef24(function Tag2({ onRemove, icon, size = 22, className, chi
1475
1634
  style: { height: size },
1476
1635
  ...props,
1477
1636
  children: [
1478
- icon && /* @__PURE__ */ jsx25("span", { className: "text-text-dim inline-flex", children: icon }),
1637
+ icon && /* @__PURE__ */ jsx26("span", { className: "text-text-dim inline-flex", children: icon }),
1479
1638
  children,
1480
- onRemove && /* @__PURE__ */ jsx25(
1639
+ onRemove && /* @__PURE__ */ jsx26(
1481
1640
  "button",
1482
1641
  {
1483
1642
  type: "button",
@@ -1495,14 +1654,14 @@ Tag.displayName = "Tag";
1495
1654
 
1496
1655
  // src/components/ContextMenu/ContextMenu.tsx
1497
1656
  import * as RadixContext from "@radix-ui/react-context-menu";
1498
- import { forwardRef as forwardRef25 } from "react";
1499
- import { jsx as jsx26, jsxs as jsxs20 } from "react/jsx-runtime";
1657
+ import { forwardRef as forwardRef26 } from "react";
1658
+ import { jsx as jsx27, jsxs as jsxs21 } from "react/jsx-runtime";
1500
1659
  var ContextMenuRoot = RadixContext.Root;
1501
1660
  var ContextMenuTrigger = RadixContext.Trigger;
1502
1661
  var ContextMenuPortal = RadixContext.Portal;
1503
- var ContextMenuContent = forwardRef25(
1662
+ var ContextMenuContent = forwardRef26(
1504
1663
  function ContextMenuContent2({ className, ...props }, ref) {
1505
- return /* @__PURE__ */ jsx26(RadixContext.Portal, { children: /* @__PURE__ */ jsx26(
1664
+ return /* @__PURE__ */ jsx27(RadixContext.Portal, { children: /* @__PURE__ */ jsx27(
1506
1665
  RadixContext.Content,
1507
1666
  {
1508
1667
  ref,
@@ -1522,26 +1681,26 @@ var itemBase = cn(
1522
1681
  "data-[highlighted]:bg-panel-2",
1523
1682
  "data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
1524
1683
  );
1525
- var ContextMenuItem = forwardRef25(
1684
+ var ContextMenuItem = forwardRef26(
1526
1685
  function ContextMenuItem2({ icon, trailing, destructive, className, children, ...props }, ref) {
1527
- return /* @__PURE__ */ jsxs20(
1686
+ return /* @__PURE__ */ jsxs21(
1528
1687
  RadixContext.Item,
1529
1688
  {
1530
1689
  ref,
1531
1690
  className: cn(itemBase, destructive ? "text-err" : "text-text", className),
1532
1691
  ...props,
1533
1692
  children: [
1534
- icon && /* @__PURE__ */ jsx26("span", { className: "w-[14px] text-[12px] opacity-70", children: icon }),
1535
- /* @__PURE__ */ jsx26("span", { className: "flex-1", children }),
1536
- trailing && /* @__PURE__ */ jsx26("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
1693
+ icon && /* @__PURE__ */ jsx27("span", { className: "w-[14px] text-[12px] opacity-70", children: icon }),
1694
+ /* @__PURE__ */ jsx27("span", { className: "flex-1", children }),
1695
+ trailing && /* @__PURE__ */ jsx27("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
1537
1696
  ]
1538
1697
  }
1539
1698
  );
1540
1699
  }
1541
1700
  );
1542
1701
  ContextMenuItem.displayName = "ContextMenuItem";
1543
- var ContextMenuSeparator = forwardRef25(function ContextMenuSeparator2({ className, ...props }, ref) {
1544
- return /* @__PURE__ */ jsx26(
1702
+ var ContextMenuSeparator = forwardRef26(function ContextMenuSeparator2({ className, ...props }, ref) {
1703
+ return /* @__PURE__ */ jsx27(
1545
1704
  RadixContext.Separator,
1546
1705
  {
1547
1706
  ref,
@@ -1555,15 +1714,15 @@ var ContextMenu = RadixContext.Root;
1555
1714
 
1556
1715
  // src/components/Dialog/Dialog.tsx
1557
1716
  import * as RadixDialog from "@radix-ui/react-dialog";
1558
- import { forwardRef as forwardRef26 } from "react";
1559
- import { jsx as jsx27, jsxs as jsxs21 } from "react/jsx-runtime";
1717
+ import { forwardRef as forwardRef27 } from "react";
1718
+ import { jsx as jsx28, jsxs as jsxs22 } from "react/jsx-runtime";
1560
1719
  var DialogRoot = RadixDialog.Root;
1561
1720
  var DialogTrigger = RadixDialog.Trigger;
1562
1721
  var DialogClose = RadixDialog.Close;
1563
1722
  var DialogPortal = RadixDialog.Portal;
1564
- var DialogOverlay = forwardRef26(
1723
+ var DialogOverlay = forwardRef27(
1565
1724
  function DialogOverlay2({ className, ...props }, ref) {
1566
- return /* @__PURE__ */ jsx27(
1725
+ return /* @__PURE__ */ jsx28(
1567
1726
  RadixDialog.Overlay,
1568
1727
  {
1569
1728
  ref,
@@ -1578,10 +1737,10 @@ var DialogOverlay = forwardRef26(
1578
1737
  }
1579
1738
  );
1580
1739
  DialogOverlay.displayName = "DialogOverlay";
1581
- var DialogContent = forwardRef26(function DialogContent2({ className, width = 460, style, children, ...props }, ref) {
1582
- return /* @__PURE__ */ jsxs21(DialogPortal, { children: [
1583
- /* @__PURE__ */ jsx27(DialogOverlay, {}),
1584
- /* @__PURE__ */ jsx27(
1740
+ var DialogContent = forwardRef27(function DialogContent2({ className, width = 460, style, children, ...props }, ref) {
1741
+ return /* @__PURE__ */ jsxs22(DialogPortal, { children: [
1742
+ /* @__PURE__ */ jsx28(DialogOverlay, {}),
1743
+ /* @__PURE__ */ jsx28(
1585
1744
  RadixDialog.Content,
1586
1745
  {
1587
1746
  ref,
@@ -1601,31 +1760,32 @@ var DialogContent = forwardRef26(function DialogContent2({ className, width = 46
1601
1760
  });
1602
1761
  DialogContent.displayName = "DialogContent";
1603
1762
  function Dialog({ title, description, footer, width, children, ...rootProps }) {
1604
- return /* @__PURE__ */ jsx27(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs21(DialogContent, { width, children: [
1605
- title && /* @__PURE__ */ jsx27(
1763
+ return /* @__PURE__ */ jsx28(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs22(DialogContent, { width, children: [
1764
+ title && /* @__PURE__ */ jsx28(
1606
1765
  RadixDialog.Title,
1607
1766
  {
1608
1767
  className: cn("text-[16px] font-medium", description ? "mb-[6px]" : "mb-4"),
1609
1768
  children: title
1610
1769
  }
1611
1770
  ),
1612
- description && /* @__PURE__ */ jsx27(RadixDialog.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
1771
+ description && /* @__PURE__ */ jsx28(RadixDialog.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
1613
1772
  children,
1614
- footer && /* @__PURE__ */ jsx27("div", { className: "mt-5 flex justify-end gap-2", children: footer })
1773
+ footer && /* @__PURE__ */ jsx28("div", { className: "mt-5 flex justify-end gap-2", children: footer })
1615
1774
  ] }) });
1616
1775
  }
1617
1776
 
1618
1777
  // src/components/Dialog/Drawer.tsx
1619
1778
  import * as RadixDialog2 from "@radix-ui/react-dialog";
1620
- import { forwardRef as forwardRef27 } from "react";
1621
- import { jsx as jsx28, jsxs as jsxs22 } from "react/jsx-runtime";
1779
+ import { forwardRef as forwardRef28 } from "react";
1780
+ import { jsx as jsx29, jsxs as jsxs23 } from "react/jsx-runtime";
1622
1781
  var sideClasses = {
1623
- left: "left-0 border-r border-border-strong data-[state=open]:animate-[ship-slide-in-left_220ms_var(--easing-out)]",
1624
- right: "right-0 border-l border-border-strong data-[state=open]:animate-[ship-slide-in-right_220ms_var(--easing-out)]"
1782
+ left: "top-0 bottom-0 left-0 border-r border-border-strong data-[state=open]:animate-[ship-slide-in-left_220ms_var(--easing-out)]",
1783
+ right: "top-0 bottom-0 right-0 border-l border-border-strong data-[state=open]:animate-[ship-slide-in-right_220ms_var(--easing-out)]",
1784
+ bottom: "bottom-0 left-0 right-0 border-t border-border-strong rounded-t-m-sheet data-[state=open]:animate-[ship-slide-in-bottom_240ms_var(--easing-out)]"
1625
1785
  };
1626
- var DrawerHeader = ({ title, onClose }) => /* @__PURE__ */ jsxs22("div", { className: "border-border flex items-center justify-between border-b p-[16px] px-5", children: [
1627
- /* @__PURE__ */ jsx28(RadixDialog2.Title, { className: "text-[14px] font-medium", children: title }),
1628
- /* @__PURE__ */ jsx28(
1786
+ var DrawerHeader = ({ title, onClose }) => /* @__PURE__ */ jsxs23("div", { className: "border-border flex items-center justify-between border-b p-[16px] px-5", children: [
1787
+ /* @__PURE__ */ jsx29(RadixDialog2.Title, { className: "text-[14px] font-medium", children: title }),
1788
+ /* @__PURE__ */ jsx29(
1629
1789
  RadixDialog2.Close,
1630
1790
  {
1631
1791
  onClick: onClose,
@@ -1635,22 +1795,28 @@ var DrawerHeader = ({ title, onClose }) => /* @__PURE__ */ jsxs22("div", { class
1635
1795
  }
1636
1796
  )
1637
1797
  ] });
1638
- var Drawer = forwardRef27(function Drawer2({ side = "right", title, width = 420, children, ...rootProps }, ref) {
1639
- return /* @__PURE__ */ jsx28(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs22(DialogPortal, { children: [
1640
- /* @__PURE__ */ jsx28(DialogOverlay, {}),
1641
- /* @__PURE__ */ jsxs22(
1798
+ var SheetHeader = ({ title }) => /* @__PURE__ */ jsx29("div", { className: "px-5 pb-3", children: /* @__PURE__ */ jsx29(RadixDialog2.Title, { className: "text-m-body-lg font-semibold tracking-tight", children: title }) });
1799
+ var DragHandle = () => /* @__PURE__ */ jsx29("div", { className: "flex justify-center pt-3 pb-2", "aria-hidden": true, children: /* @__PURE__ */ jsx29("span", { className: "bg-border-strong h-1 w-9 rounded-full" }) });
1800
+ var Drawer = forwardRef28(function Drawer2({ side = "right", title, width = 420, height = "85vh", handle, children, ...rootProps }, ref) {
1801
+ const isBottom = side === "bottom";
1802
+ const showHandle = isBottom && (handle ?? true);
1803
+ const dimensionStyle = isBottom ? { height } : { width };
1804
+ return /* @__PURE__ */ jsx29(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs23(DialogPortal, { children: [
1805
+ /* @__PURE__ */ jsx29(DialogOverlay, {}),
1806
+ /* @__PURE__ */ jsxs23(
1642
1807
  RadixDialog2.Content,
1643
1808
  {
1644
1809
  ref,
1645
1810
  "aria-describedby": void 0,
1646
1811
  className: cn(
1647
- "bg-panel z-modal fixed top-0 bottom-0 flex flex-col shadow-lg outline-none",
1812
+ "bg-panel z-modal fixed flex flex-col shadow-lg outline-none",
1648
1813
  sideClasses[side]
1649
1814
  ),
1650
- style: { width },
1815
+ style: dimensionStyle,
1651
1816
  children: [
1652
- title ? /* @__PURE__ */ jsx28(DrawerHeader, { title }) : /* @__PURE__ */ jsx28(RadixDialog2.Title, { className: "sr-only", children: "Drawer" }),
1653
- /* @__PURE__ */ jsx28("div", { className: "flex-1 overflow-auto p-5", children })
1817
+ showHandle && /* @__PURE__ */ jsx29(DragHandle, {}),
1818
+ title ? isBottom ? /* @__PURE__ */ jsx29(SheetHeader, { title }) : /* @__PURE__ */ jsx29(DrawerHeader, { title }) : /* @__PURE__ */ jsx29(RadixDialog2.Title, { className: "sr-only", children: isBottom ? "Sheet" : "Drawer" }),
1819
+ /* @__PURE__ */ jsx29("div", { className: cn("flex-1 overflow-auto", isBottom ? "px-5 pb-6" : "p-5"), children })
1654
1820
  ]
1655
1821
  }
1656
1822
  )
@@ -1660,12 +1826,12 @@ Drawer.displayName = "Drawer";
1660
1826
 
1661
1827
  // src/components/Dialog/Sheet.tsx
1662
1828
  import * as RadixDialog3 from "@radix-ui/react-dialog";
1663
- import { forwardRef as forwardRef28 } from "react";
1664
- import { jsx as jsx29, jsxs as jsxs23 } from "react/jsx-runtime";
1665
- var Sheet = forwardRef28(function Sheet2({ title, width = "min(640px, 90vw)", children, ...rootProps }, ref) {
1666
- return /* @__PURE__ */ jsx29(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs23(DialogPortal, { children: [
1667
- /* @__PURE__ */ jsx29(DialogOverlay, {}),
1668
- /* @__PURE__ */ jsxs23(
1829
+ import { forwardRef as forwardRef29 } from "react";
1830
+ import { jsx as jsx30, jsxs as jsxs24 } from "react/jsx-runtime";
1831
+ var Sheet = forwardRef29(function Sheet2({ title, width = "min(640px, 90vw)", children, ...rootProps }, ref) {
1832
+ return /* @__PURE__ */ jsx30(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs24(DialogPortal, { children: [
1833
+ /* @__PURE__ */ jsx30(DialogOverlay, {}),
1834
+ /* @__PURE__ */ jsxs24(
1669
1835
  RadixDialog3.Content,
1670
1836
  {
1671
1837
  ref,
@@ -1677,7 +1843,7 @@ var Sheet = forwardRef28(function Sheet2({ title, width = "min(640px, 90vw)", ch
1677
1843
  ),
1678
1844
  style: { width },
1679
1845
  children: [
1680
- title ? /* @__PURE__ */ jsx29(RadixDialog3.Title, { className: "mb-1 text-[15px] font-medium", children: title }) : /* @__PURE__ */ jsx29(RadixDialog3.Title, { className: "sr-only", children: "Sheet" }),
1846
+ title ? /* @__PURE__ */ jsx30(RadixDialog3.Title, { className: "mb-1 text-[15px] font-medium", children: title }) : /* @__PURE__ */ jsx30(RadixDialog3.Title, { className: "sr-only", children: "Sheet" }),
1681
1847
  children
1682
1848
  ]
1683
1849
  }
@@ -1688,15 +1854,15 @@ Sheet.displayName = "Sheet";
1688
1854
 
1689
1855
  // src/components/Dialog/AlertDialog.tsx
1690
1856
  import * as RadixAlert from "@radix-ui/react-alert-dialog";
1691
- import { forwardRef as forwardRef29 } from "react";
1692
- import { jsx as jsx30, jsxs as jsxs24 } from "react/jsx-runtime";
1857
+ import { forwardRef as forwardRef30 } from "react";
1858
+ import { jsx as jsx31, jsxs as jsxs25 } from "react/jsx-runtime";
1693
1859
  var AlertDialogRoot = RadixAlert.Root;
1694
1860
  var AlertDialogTrigger = RadixAlert.Trigger;
1695
1861
  var AlertDialogAction = RadixAlert.Action;
1696
1862
  var AlertDialogCancel = RadixAlert.Cancel;
1697
- var AlertDialog = forwardRef29(function AlertDialog2({ title, description, footer, width = 460, children, ...rootProps }, ref) {
1698
- return /* @__PURE__ */ jsx30(AlertDialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs24(RadixAlert.Portal, { children: [
1699
- /* @__PURE__ */ jsx30(
1863
+ var AlertDialog = forwardRef30(function AlertDialog2({ title, description, footer, width = 460, children, ...rootProps }, ref) {
1864
+ return /* @__PURE__ */ jsx31(AlertDialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs25(RadixAlert.Portal, { children: [
1865
+ /* @__PURE__ */ jsx31(
1700
1866
  RadixAlert.Overlay,
1701
1867
  {
1702
1868
  className: cn(
@@ -1705,7 +1871,7 @@ var AlertDialog = forwardRef29(function AlertDialog2({ title, description, foote
1705
1871
  )
1706
1872
  }
1707
1873
  ),
1708
- /* @__PURE__ */ jsxs24(
1874
+ /* @__PURE__ */ jsxs25(
1709
1875
  RadixAlert.Content,
1710
1876
  {
1711
1877
  ref,
@@ -1716,16 +1882,16 @@ var AlertDialog = forwardRef29(function AlertDialog2({ title, description, foote
1716
1882
  "data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]"
1717
1883
  ),
1718
1884
  children: [
1719
- /* @__PURE__ */ jsx30(
1885
+ /* @__PURE__ */ jsx31(
1720
1886
  RadixAlert.Title,
1721
1887
  {
1722
1888
  className: cn("text-[16px] font-medium", description ? "mb-[6px]" : "mb-4"),
1723
1889
  children: title
1724
1890
  }
1725
1891
  ),
1726
- description && /* @__PURE__ */ jsx30(RadixAlert.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
1892
+ description && /* @__PURE__ */ jsx31(RadixAlert.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
1727
1893
  children,
1728
- footer && /* @__PURE__ */ jsx30("div", { className: "mt-5 flex justify-end gap-2", children: footer })
1894
+ footer && /* @__PURE__ */ jsx31("div", { className: "mt-5 flex justify-end gap-2", children: footer })
1729
1895
  ]
1730
1896
  }
1731
1897
  )
@@ -1735,17 +1901,17 @@ AlertDialog.displayName = "AlertDialog";
1735
1901
 
1736
1902
  // src/components/DropdownMenu/DropdownMenu.tsx
1737
1903
  import * as RadixMenu from "@radix-ui/react-dropdown-menu";
1738
- import { forwardRef as forwardRef30 } from "react";
1739
- import { jsx as jsx31, jsxs as jsxs25 } from "react/jsx-runtime";
1904
+ import { forwardRef as forwardRef31 } from "react";
1905
+ import { jsx as jsx32, jsxs as jsxs26 } from "react/jsx-runtime";
1740
1906
  var DropdownMenuRoot = RadixMenu.Root;
1741
1907
  var DropdownMenuTrigger = RadixMenu.Trigger;
1742
1908
  var DropdownMenuPortal = RadixMenu.Portal;
1743
1909
  var DropdownMenuGroup = RadixMenu.Group;
1744
1910
  var DropdownMenuLabel = RadixMenu.Label;
1745
1911
  var DropdownMenuRadioGroup = RadixMenu.RadioGroup;
1746
- var DropdownMenuContent = forwardRef30(
1912
+ var DropdownMenuContent = forwardRef31(
1747
1913
  function DropdownMenuContent2({ className, sideOffset = 6, align = "start", ...props }, ref) {
1748
- return /* @__PURE__ */ jsx31(RadixMenu.Portal, { children: /* @__PURE__ */ jsx31(
1914
+ return /* @__PURE__ */ jsx32(RadixMenu.Portal, { children: /* @__PURE__ */ jsx32(
1749
1915
  RadixMenu.Content,
1750
1916
  {
1751
1917
  ref,
@@ -1767,32 +1933,32 @@ var itemBase2 = cn(
1767
1933
  "data-[highlighted]:bg-panel-2",
1768
1934
  "data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
1769
1935
  );
1770
- var MenuItem = forwardRef30(function MenuItem2({ icon, trailing, destructive, className, children, ...props }, ref) {
1771
- return /* @__PURE__ */ jsxs25(
1936
+ var MenuItem = forwardRef31(function MenuItem2({ icon, trailing, destructive, className, children, ...props }, ref) {
1937
+ return /* @__PURE__ */ jsxs26(
1772
1938
  RadixMenu.Item,
1773
1939
  {
1774
1940
  ref,
1775
1941
  className: cn(itemBase2, destructive ? "text-err" : "text-text", className),
1776
1942
  ...props,
1777
1943
  children: [
1778
- icon && /* @__PURE__ */ jsx31("span", { className: "w-[14px] text-[12px] opacity-70", children: icon }),
1779
- /* @__PURE__ */ jsx31("span", { className: "flex-1", children }),
1780
- trailing && /* @__PURE__ */ jsx31("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
1944
+ icon && /* @__PURE__ */ jsx32("span", { className: "w-[14px] text-[12px] opacity-70", children: icon }),
1945
+ /* @__PURE__ */ jsx32("span", { className: "flex-1", children }),
1946
+ trailing && /* @__PURE__ */ jsx32("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
1781
1947
  ]
1782
1948
  }
1783
1949
  );
1784
1950
  });
1785
1951
  MenuItem.displayName = "MenuItem";
1786
- var MenuCheckboxItem = forwardRef30(
1952
+ var MenuCheckboxItem = forwardRef31(
1787
1953
  function MenuCheckboxItem2({ className, children, ...props }, ref) {
1788
- return /* @__PURE__ */ jsxs25(
1954
+ return /* @__PURE__ */ jsxs26(
1789
1955
  RadixMenu.CheckboxItem,
1790
1956
  {
1791
1957
  ref,
1792
1958
  className: cn(itemBase2, "text-text relative pl-[26px]", className),
1793
1959
  ...props,
1794
1960
  children: [
1795
- /* @__PURE__ */ jsx31(RadixMenu.ItemIndicator, { className: "text-accent absolute top-1/2 left-2 -translate-y-1/2 text-[10px]", children: "\u2713" }),
1961
+ /* @__PURE__ */ jsx32(RadixMenu.ItemIndicator, { className: "text-accent absolute top-1/2 left-2 -translate-y-1/2 text-[10px]", children: "\u2713" }),
1796
1962
  children
1797
1963
  ]
1798
1964
  }
@@ -1800,9 +1966,9 @@ var MenuCheckboxItem = forwardRef30(
1800
1966
  }
1801
1967
  );
1802
1968
  MenuCheckboxItem.displayName = "MenuCheckboxItem";
1803
- var MenuSeparator = forwardRef30(
1969
+ var MenuSeparator = forwardRef31(
1804
1970
  function MenuSeparator2({ className, ...props }, ref) {
1805
- return /* @__PURE__ */ jsx31(
1971
+ return /* @__PURE__ */ jsx32(
1806
1972
  RadixMenu.Separator,
1807
1973
  {
1808
1974
  ref,
@@ -1817,14 +1983,14 @@ var DropdownMenu = RadixMenu.Root;
1817
1983
 
1818
1984
  // src/components/HoverCard/HoverCard.tsx
1819
1985
  import * as RadixHoverCard from "@radix-ui/react-hover-card";
1820
- import { forwardRef as forwardRef31 } from "react";
1821
- import { jsx as jsx32, jsxs as jsxs26 } from "react/jsx-runtime";
1986
+ import { forwardRef as forwardRef32 } from "react";
1987
+ import { jsx as jsx33, jsxs as jsxs27 } from "react/jsx-runtime";
1822
1988
  var HoverCardRoot = RadixHoverCard.Root;
1823
1989
  var HoverCardTrigger = RadixHoverCard.Trigger;
1824
1990
  var HoverCardPortal = RadixHoverCard.Portal;
1825
- var HoverCardContent = forwardRef31(
1991
+ var HoverCardContent = forwardRef32(
1826
1992
  function HoverCardContent2({ className, sideOffset = 4, ...props }, ref) {
1827
- return /* @__PURE__ */ jsx32(RadixHoverCard.Portal, { children: /* @__PURE__ */ jsx32(
1993
+ return /* @__PURE__ */ jsx33(RadixHoverCard.Portal, { children: /* @__PURE__ */ jsx33(
1828
1994
  RadixHoverCard.Content,
1829
1995
  {
1830
1996
  ref,
@@ -1841,25 +2007,25 @@ var HoverCardContent = forwardRef31(
1841
2007
  );
1842
2008
  HoverCardContent.displayName = "HoverCardContent";
1843
2009
  function HoverCard({ trigger, content, ...rootProps }) {
1844
- return /* @__PURE__ */ jsxs26(RadixHoverCard.Root, { openDelay: 200, closeDelay: 120, ...rootProps, children: [
1845
- /* @__PURE__ */ jsx32(RadixHoverCard.Trigger, { asChild: true, children: trigger }),
1846
- /* @__PURE__ */ jsx32(HoverCardContent, { children: content })
2010
+ return /* @__PURE__ */ jsxs27(RadixHoverCard.Root, { openDelay: 200, closeDelay: 120, ...rootProps, children: [
2011
+ /* @__PURE__ */ jsx33(RadixHoverCard.Trigger, { asChild: true, children: trigger }),
2012
+ /* @__PURE__ */ jsx33(HoverCardContent, { children: content })
1847
2013
  ] });
1848
2014
  }
1849
2015
 
1850
2016
  // src/components/Popover/Popover.tsx
1851
2017
  import * as RadixPopover from "@radix-ui/react-popover";
1852
- import { forwardRef as forwardRef32 } from "react";
1853
- import { jsx as jsx33 } from "react/jsx-runtime";
2018
+ import { forwardRef as forwardRef33 } from "react";
2019
+ import { jsx as jsx34 } from "react/jsx-runtime";
1854
2020
  var PopoverRoot = RadixPopover.Root;
1855
2021
  var PopoverTrigger = RadixPopover.Trigger;
1856
2022
  var PopoverAnchor = RadixPopover.Anchor;
1857
2023
  var PopoverPortal = RadixPopover.Portal;
1858
2024
  var PopoverClose = RadixPopover.Close;
1859
2025
  var PopoverArrow = RadixPopover.Arrow;
1860
- var PopoverContent = forwardRef32(
2026
+ var PopoverContent = forwardRef33(
1861
2027
  function PopoverContent2({ className, align = "start", sideOffset = 6, ...props }, ref) {
1862
- return /* @__PURE__ */ jsx33(RadixPopover.Portal, { children: /* @__PURE__ */ jsx33(
2028
+ return /* @__PURE__ */ jsx34(RadixPopover.Portal, { children: /* @__PURE__ */ jsx34(
1863
2029
  RadixPopover.Content,
1864
2030
  {
1865
2031
  ref,
@@ -1882,13 +2048,13 @@ var Popover = RadixPopover.Root;
1882
2048
  import * as RadixToast from "@radix-ui/react-toast";
1883
2049
  import {
1884
2050
  createContext,
1885
- forwardRef as forwardRef33,
2051
+ forwardRef as forwardRef34,
1886
2052
  useCallback as useCallback6,
1887
2053
  useContext,
1888
2054
  useMemo,
1889
2055
  useState as useState7
1890
2056
  } from "react";
1891
- import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
2057
+ import { jsx as jsx35, jsxs as jsxs28 } from "react/jsx-runtime";
1892
2058
  var ToastContext = createContext(null);
1893
2059
  var variantIcon = {
1894
2060
  default: "\u25CF",
@@ -1931,10 +2097,10 @@ function ToastProvider({ children }) {
1931
2097
  setToasts((prev) => prev.filter((t) => t.id !== id));
1932
2098
  }, []);
1933
2099
  const value = useMemo(() => ({ toast, dismiss }), [toast, dismiss]);
1934
- return /* @__PURE__ */ jsx34(ToastContext.Provider, { value, children: /* @__PURE__ */ jsxs27(RadixToast.Provider, { swipeDirection: "right", children: [
2100
+ return /* @__PURE__ */ jsx35(ToastContext.Provider, { value, children: /* @__PURE__ */ jsxs28(RadixToast.Provider, { swipeDirection: "right", children: [
1935
2101
  children,
1936
- toasts.map((t) => /* @__PURE__ */ jsx34(ToastCard, { toast: t, onDismiss: () => dismiss(t.id) }, t.id)),
1937
- /* @__PURE__ */ jsx34(RadixToast.Viewport, { className: "z-toast fixed right-5 bottom-5 flex w-[380px] max-w-[calc(100vw-40px)] flex-col gap-2 outline-none" })
2102
+ toasts.map((t) => /* @__PURE__ */ jsx35(ToastCard, { toast: t, onDismiss: () => dismiss(t.id) }, t.id)),
2103
+ /* @__PURE__ */ jsx35(RadixToast.Viewport, { className: "z-toast fixed right-5 bottom-5 flex w-[380px] max-w-[calc(100vw-40px)] flex-col gap-2 outline-none" })
1938
2104
  ] }) });
1939
2105
  }
1940
2106
  function useToast() {
@@ -1942,9 +2108,9 @@ function useToast() {
1942
2108
  if (!ctx) throw new Error("useToast must be inside <ToastProvider>");
1943
2109
  return ctx;
1944
2110
  }
1945
- var ToastCard = forwardRef33(function ToastCard2({ toast, onDismiss }, ref) {
2111
+ var ToastCard = forwardRef34(function ToastCard2({ toast, onDismiss }, ref) {
1946
2112
  const variant = toast.variant ?? "default";
1947
- return /* @__PURE__ */ jsxs27(
2113
+ return /* @__PURE__ */ jsxs28(
1948
2114
  RadixToast.Root,
1949
2115
  {
1950
2116
  ref,
@@ -1959,13 +2125,13 @@ var ToastCard = forwardRef33(function ToastCard2({ toast, onDismiss }, ref) {
1959
2125
  variantBorderLeft[variant]
1960
2126
  ),
1961
2127
  children: [
1962
- /* @__PURE__ */ jsx34("span", { className: cn("mt-px text-[14px] leading-none", variantTextColor[variant]), children: variantIcon[variant] }),
1963
- /* @__PURE__ */ jsxs27("div", { className: "min-w-0 flex-1", children: [
1964
- /* @__PURE__ */ jsx34(RadixToast.Title, { className: "text-text text-[13px] font-medium", children: toast.title }),
1965
- toast.description && /* @__PURE__ */ jsx34(RadixToast.Description, { className: "text-text-muted mt-[2px] text-[12px] leading-[1.5]", children: toast.description }),
1966
- toast.action && /* @__PURE__ */ jsx34("div", { className: "mt-2", children: toast.action })
2128
+ /* @__PURE__ */ jsx35("span", { className: cn("mt-px text-[14px] leading-none", variantTextColor[variant]), children: variantIcon[variant] }),
2129
+ /* @__PURE__ */ jsxs28("div", { className: "min-w-0 flex-1", children: [
2130
+ /* @__PURE__ */ jsx35(RadixToast.Title, { className: "text-text text-[13px] font-medium", children: toast.title }),
2131
+ toast.description && /* @__PURE__ */ jsx35(RadixToast.Description, { className: "text-text-muted mt-[2px] text-[12px] leading-[1.5]", children: toast.description }),
2132
+ toast.action && /* @__PURE__ */ jsx35("div", { className: "mt-2", children: toast.action })
1967
2133
  ] }),
1968
- /* @__PURE__ */ jsx34(
2134
+ /* @__PURE__ */ jsx35(
1969
2135
  RadixToast.Close,
1970
2136
  {
1971
2137
  "aria-label": "Dismiss",
@@ -1981,16 +2147,16 @@ ToastCard.displayName = "ToastCard";
1981
2147
 
1982
2148
  // src/components/Tooltip/Tooltip.tsx
1983
2149
  import * as RadixTooltip from "@radix-ui/react-tooltip";
1984
- import { forwardRef as forwardRef34 } from "react";
1985
- import { jsx as jsx35, jsxs as jsxs28 } from "react/jsx-runtime";
2150
+ import { forwardRef as forwardRef35 } from "react";
2151
+ import { jsx as jsx36, jsxs as jsxs29 } from "react/jsx-runtime";
1986
2152
  var TooltipProvider = RadixTooltip.Provider;
1987
2153
  var TooltipRoot = RadixTooltip.Root;
1988
2154
  var TooltipTrigger = RadixTooltip.Trigger;
1989
2155
  var TooltipPortal = RadixTooltip.Portal;
1990
2156
  var TooltipArrow = RadixTooltip.Arrow;
1991
- var TooltipContent = forwardRef34(
2157
+ var TooltipContent = forwardRef35(
1992
2158
  function TooltipContent2({ className, sideOffset = 6, ...props }, ref) {
1993
- return /* @__PURE__ */ jsx35(RadixTooltip.Portal, { children: /* @__PURE__ */ jsx35(
2159
+ return /* @__PURE__ */ jsx36(RadixTooltip.Portal, { children: /* @__PURE__ */ jsx36(
1994
2160
  RadixTooltip.Content,
1995
2161
  {
1996
2162
  ref,
@@ -2008,16 +2174,16 @@ var TooltipContent = forwardRef34(
2008
2174
  );
2009
2175
  TooltipContent.displayName = "TooltipContent";
2010
2176
  function Tooltip({ content, children, side = "top", delayDuration = 400 }) {
2011
- return /* @__PURE__ */ jsx35(TooltipProvider, { delayDuration, children: /* @__PURE__ */ jsxs28(TooltipRoot, { children: [
2012
- /* @__PURE__ */ jsx35(TooltipTrigger, { asChild: true, children }),
2013
- /* @__PURE__ */ jsx35(TooltipContent, { side, children: content })
2177
+ return /* @__PURE__ */ jsx36(TooltipProvider, { delayDuration, children: /* @__PURE__ */ jsxs29(TooltipRoot, { children: [
2178
+ /* @__PURE__ */ jsx36(TooltipTrigger, { asChild: true, children }),
2179
+ /* @__PURE__ */ jsx36(TooltipContent, { side, children: content })
2014
2180
  ] }) });
2015
2181
  }
2016
2182
 
2017
2183
  // src/patterns/Alert/Alert.tsx
2018
2184
  import { cva as cva8 } from "class-variance-authority";
2019
- import { forwardRef as forwardRef35 } from "react";
2020
- import { jsx as jsx36, jsxs as jsxs29 } from "react/jsx-runtime";
2185
+ import { forwardRef as forwardRef36 } from "react";
2186
+ import { jsx as jsx37, jsxs as jsxs30 } from "react/jsx-runtime";
2021
2187
  var alertStyles = cva8("flex items-start gap-3 rounded-base border bg-panel p-3 text-[13px]", {
2022
2188
  variants: {
2023
2189
  tone: {
@@ -2041,7 +2207,7 @@ var defaultGlyph = {
2041
2207
  warn: "!",
2042
2208
  err: "\xD7"
2043
2209
  };
2044
- var Alert = forwardRef35(function Alert2({
2210
+ var Alert = forwardRef36(function Alert2({
2045
2211
  tone = "accent",
2046
2212
  title,
2047
2213
  description,
@@ -2053,7 +2219,7 @@ var Alert = forwardRef35(function Alert2({
2053
2219
  ...props
2054
2220
  }, ref) {
2055
2221
  const t = tone ?? "accent";
2056
- return /* @__PURE__ */ jsxs29(
2222
+ return /* @__PURE__ */ jsxs30(
2057
2223
  "div",
2058
2224
  {
2059
2225
  ref,
@@ -2062,13 +2228,13 @@ var Alert = forwardRef35(function Alert2({
2062
2228
  className: cn(alertStyles({ tone }), className),
2063
2229
  ...props,
2064
2230
  children: [
2065
- /* @__PURE__ */ jsx36("span", { "aria-hidden": true, className: cn("mt-[1px] text-[14px] leading-none", iconColorClass[t]), children: icon ?? defaultGlyph[t] }),
2066
- /* @__PURE__ */ jsxs29("div", { className: "min-w-0 flex-1", children: [
2067
- title && /* @__PURE__ */ jsx36("div", { className: "font-medium", children: title }),
2068
- description && /* @__PURE__ */ jsx36("div", { className: "text-text-muted mt-[2px] text-[12px]", children: description }),
2231
+ /* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: cn("mt-[1px] text-[14px] leading-none", iconColorClass[t]), children: icon ?? defaultGlyph[t] }),
2232
+ /* @__PURE__ */ jsxs30("div", { className: "min-w-0 flex-1", children: [
2233
+ title && /* @__PURE__ */ jsx37("div", { className: "font-medium", children: title }),
2234
+ description && /* @__PURE__ */ jsx37("div", { className: "text-text-muted mt-[2px] text-[12px]", children: description }),
2069
2235
  children
2070
2236
  ] }),
2071
- action && /* @__PURE__ */ jsx36("div", { className: "ml-1 shrink-0", children: action })
2237
+ action && /* @__PURE__ */ jsx37("div", { className: "ml-1 shrink-0", children: action })
2072
2238
  ]
2073
2239
  }
2074
2240
  );
@@ -2077,8 +2243,8 @@ Alert.displayName = "Alert";
2077
2243
 
2078
2244
  // src/patterns/Banner/Banner.tsx
2079
2245
  import { cva as cva9 } from "class-variance-authority";
2080
- import { forwardRef as forwardRef36 } from "react";
2081
- import { jsx as jsx37, jsxs as jsxs30 } from "react/jsx-runtime";
2246
+ import { forwardRef as forwardRef37 } from "react";
2247
+ import { jsx as jsx38, jsxs as jsxs31 } from "react/jsx-runtime";
2082
2248
  var bannerStyles = cva9(
2083
2249
  "flex items-center gap-3 border-b border-border px-[14px] py-2 text-[12px]",
2084
2250
  {
@@ -2103,9 +2269,9 @@ var defaultGlyph2 = {
2103
2269
  warn: "!",
2104
2270
  err: "\xD7"
2105
2271
  };
2106
- var Banner = forwardRef36(function Banner2({ tone = "accent", sticky, icon, action, live = "polite", className, children, ...props }, ref) {
2272
+ var Banner = forwardRef37(function Banner2({ tone = "accent", sticky, icon, action, live = "polite", className, children, ...props }, ref) {
2107
2273
  const t = tone ?? "accent";
2108
- return /* @__PURE__ */ jsxs30(
2274
+ return /* @__PURE__ */ jsxs31(
2109
2275
  "div",
2110
2276
  {
2111
2277
  ref,
@@ -2114,9 +2280,9 @@ var Banner = forwardRef36(function Banner2({ tone = "accent", sticky, icon, acti
2114
2280
  className: cn(bannerStyles({ tone, sticky }), className),
2115
2281
  ...props,
2116
2282
  children: [
2117
- /* @__PURE__ */ jsx37("span", { "aria-hidden": true, className: "leading-none", children: icon ?? defaultGlyph2[t] }),
2118
- /* @__PURE__ */ jsx37("div", { className: "min-w-0 flex-1", children }),
2119
- action && /* @__PURE__ */ jsx37("div", { className: "ml-auto", children: action })
2283
+ /* @__PURE__ */ jsx38("span", { "aria-hidden": true, className: "leading-none", children: icon ?? defaultGlyph2[t] }),
2284
+ /* @__PURE__ */ jsx38("div", { className: "min-w-0 flex-1", children }),
2285
+ action && /* @__PURE__ */ jsx38("div", { className: "ml-auto", children: action })
2120
2286
  ]
2121
2287
  }
2122
2288
  );
@@ -2126,30 +2292,30 @@ Banner.displayName = "Banner";
2126
2292
  // src/patterns/Breadcrumbs/Breadcrumbs.tsx
2127
2293
  import {
2128
2294
  Children as Children2,
2129
- forwardRef as forwardRef37,
2295
+ forwardRef as forwardRef38,
2130
2296
  isValidElement as isValidElement2
2131
2297
  } from "react";
2132
- import { jsx as jsx38, jsxs as jsxs31 } from "react/jsx-runtime";
2133
- var Breadcrumbs = forwardRef37(function Breadcrumbs2({ separator = "/", className, children, ...props }, ref) {
2298
+ import { jsx as jsx39, jsxs as jsxs32 } from "react/jsx-runtime";
2299
+ var Breadcrumbs = forwardRef38(function Breadcrumbs2({ separator = "/", className, children, ...props }, ref) {
2134
2300
  const crumbs = Children2.toArray(children).filter(isValidElement2);
2135
2301
  const last = crumbs.length - 1;
2136
- return /* @__PURE__ */ jsx38("nav", { ref, "aria-label": "Breadcrumb", className: cn("text-[13px]", className), ...props, children: /* @__PURE__ */ jsx38("ol", { className: "text-text-muted flex flex-wrap items-center gap-[6px]", children: crumbs.map((crumb, i) => {
2302
+ return /* @__PURE__ */ jsx39("nav", { ref, "aria-label": "Breadcrumb", className: cn("text-[13px]", className), ...props, children: /* @__PURE__ */ jsx39("ol", { className: "text-text-muted flex flex-wrap items-center gap-[6px]", children: crumbs.map((crumb, i) => {
2137
2303
  const isCurrent = i === last;
2138
- return /* @__PURE__ */ jsxs31("li", { className: "inline-flex items-center gap-[6px]", children: [
2139
- isCurrent ? /* @__PURE__ */ jsx38(Crumb, { ...crumb.props, current: true }) : crumb,
2140
- !isCurrent && /* @__PURE__ */ jsx38("span", { "aria-hidden": true, className: "text-text-dim", children: separator })
2304
+ return /* @__PURE__ */ jsxs32("li", { className: "inline-flex items-center gap-[6px]", children: [
2305
+ isCurrent ? /* @__PURE__ */ jsx39(Crumb, { ...crumb.props, current: true }) : crumb,
2306
+ !isCurrent && /* @__PURE__ */ jsx39("span", { "aria-hidden": true, className: "text-text-dim", children: separator })
2141
2307
  ] }, i);
2142
2308
  }) }) });
2143
2309
  });
2144
2310
  Breadcrumbs.displayName = "Breadcrumbs";
2145
- var Crumb = forwardRef37(function Crumb2({ current, className, href, children, ...props }, ref) {
2311
+ var Crumb = forwardRef38(function Crumb2({ current, className, href, children, ...props }, ref) {
2146
2312
  if (current) {
2147
- return /* @__PURE__ */ jsx38("span", { "aria-current": "page", className: cn("text-text", className), children });
2313
+ return /* @__PURE__ */ jsx39("span", { "aria-current": "page", className: cn("text-text", className), children });
2148
2314
  }
2149
2315
  if (href === void 0) {
2150
- return /* @__PURE__ */ jsx38("span", { className: cn("text-text-dim", className), children });
2316
+ return /* @__PURE__ */ jsx39("span", { className: cn("text-text-dim", className), children });
2151
2317
  }
2152
- return /* @__PURE__ */ jsx38(
2318
+ return /* @__PURE__ */ jsx39(
2153
2319
  "a",
2154
2320
  {
2155
2321
  ref,
@@ -2164,14 +2330,14 @@ Crumb.displayName = "Crumb";
2164
2330
 
2165
2331
  // src/patterns/Combobox/Combobox.tsx
2166
2332
  import {
2167
- forwardRef as forwardRef38,
2333
+ forwardRef as forwardRef39,
2168
2334
  useEffect as useEffect5,
2169
2335
  useId as useId6,
2170
2336
  useMemo as useMemo2,
2171
2337
  useRef as useRef4,
2172
2338
  useState as useState8
2173
2339
  } from "react";
2174
- import { jsx as jsx39, jsxs as jsxs32 } from "react/jsx-runtime";
2340
+ import { jsx as jsx40, jsxs as jsxs33 } from "react/jsx-runtime";
2175
2341
  function normalize(option) {
2176
2342
  if (typeof option === "string") {
2177
2343
  return { value: option, label: option, searchText: option.toLowerCase() };
@@ -2187,7 +2353,7 @@ function normalize(option) {
2187
2353
  };
2188
2354
  }
2189
2355
  var defaultFilter = (option, query) => option.searchText.includes(query.toLowerCase());
2190
- var Combobox = forwardRef38(function Combobox2({
2356
+ var Combobox = forwardRef39(function Combobox2({
2191
2357
  options,
2192
2358
  value: valueProp,
2193
2359
  defaultValue,
@@ -2264,8 +2430,8 @@ var Combobox = forwardRef38(function Combobox2({
2264
2430
  setOpen(false);
2265
2431
  }
2266
2432
  };
2267
- return /* @__PURE__ */ jsxs32("div", { ref: wrapperRef, className: "relative", style: { width }, children: [
2268
- /* @__PURE__ */ jsx39(
2433
+ return /* @__PURE__ */ jsxs33("div", { ref: wrapperRef, className: "relative", style: { width }, children: [
2434
+ /* @__PURE__ */ jsx40(
2269
2435
  "input",
2270
2436
  {
2271
2437
  ref,
@@ -2299,7 +2465,7 @@ var Combobox = forwardRef38(function Combobox2({
2299
2465
  )
2300
2466
  }
2301
2467
  ),
2302
- open && /* @__PURE__ */ jsx39(
2468
+ open && /* @__PURE__ */ jsx40(
2303
2469
  "ul",
2304
2470
  {
2305
2471
  id: listboxId,
@@ -2309,9 +2475,9 @@ var Combobox = forwardRef38(function Combobox2({
2309
2475
  "z-dropdown absolute top-full right-0 left-0 mt-1 max-h-[220px] overflow-auto",
2310
2476
  "border-border bg-panel rounded-md border p-1 shadow-lg"
2311
2477
  ),
2312
- children: filtered.length === 0 ? /* @__PURE__ */ jsx39("li", { className: "text-text-dim px-2 py-3 text-center text-[12px]", role: "presentation", children: emptyState ?? "No matches" }) : filtered.map((option, i) => {
2478
+ children: filtered.length === 0 ? /* @__PURE__ */ jsx40("li", { className: "text-text-dim px-2 py-3 text-center text-[12px]", role: "presentation", children: emptyState ?? "No matches" }) : filtered.map((option, i) => {
2313
2479
  const isActive = i === cursor;
2314
- return /* @__PURE__ */ jsxs32(
2480
+ return /* @__PURE__ */ jsxs33(
2315
2481
  "li",
2316
2482
  {
2317
2483
  id: `${listboxId}-option-${i}`,
@@ -2329,8 +2495,8 @@ var Combobox = forwardRef38(function Combobox2({
2329
2495
  option.disabled && "pointer-events-none opacity-40"
2330
2496
  ),
2331
2497
  children: [
2332
- /* @__PURE__ */ jsx39("div", { children: option.label }),
2333
- option.description && /* @__PURE__ */ jsx39("div", { className: "text-text-dim text-[11px]", children: option.description })
2498
+ /* @__PURE__ */ jsx40("div", { children: option.label }),
2499
+ option.description && /* @__PURE__ */ jsx40("div", { className: "text-text-dim text-[11px]", children: option.description })
2334
2500
  ]
2335
2501
  },
2336
2502
  option.value
@@ -2338,19 +2504,19 @@ var Combobox = forwardRef38(function Combobox2({
2338
2504
  })
2339
2505
  }
2340
2506
  ),
2341
- name && /* @__PURE__ */ jsx39("input", { type: "hidden", name, value: value ?? "", readOnly: true })
2507
+ name && /* @__PURE__ */ jsx40("input", { type: "hidden", name, value: value ?? "", readOnly: true })
2342
2508
  ] });
2343
2509
  });
2344
2510
  Combobox.displayName = "Combobox";
2345
2511
 
2346
2512
  // src/patterns/CommandPalette/CommandPalette.tsx
2347
2513
  import * as RadixDialog4 from "@radix-ui/react-dialog";
2348
- import { forwardRef as forwardRef39, useEffect as useEffect6, useId as useId7, useMemo as useMemo3 } from "react";
2349
- import { Fragment, jsx as jsx40, jsxs as jsxs33 } from "react/jsx-runtime";
2514
+ import { forwardRef as forwardRef40, useEffect as useEffect6, useId as useId7, useMemo as useMemo3 } from "react";
2515
+ import { Fragment, jsx as jsx41, jsxs as jsxs34 } from "react/jsx-runtime";
2350
2516
  function flatItems(groups) {
2351
2517
  return groups.flatMap((g) => g.items);
2352
2518
  }
2353
- var CommandPalette = forwardRef39(
2519
+ var CommandPalette = forwardRef40(
2354
2520
  function CommandPalette2({
2355
2521
  open,
2356
2522
  onOpenChange,
@@ -2379,8 +2545,8 @@ var CommandPalette = forwardRef39(
2379
2545
  useEffect6(() => {
2380
2546
  setCursor(0);
2381
2547
  }, [query, groups, setCursor]);
2382
- return /* @__PURE__ */ jsx40(RadixDialog4.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs33(RadixDialog4.Portal, { children: [
2383
- /* @__PURE__ */ jsx40(
2548
+ return /* @__PURE__ */ jsx41(RadixDialog4.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs34(RadixDialog4.Portal, { children: [
2549
+ /* @__PURE__ */ jsx41(
2384
2550
  RadixDialog4.Overlay,
2385
2551
  {
2386
2552
  className: cn(
@@ -2389,7 +2555,7 @@ var CommandPalette = forwardRef39(
2389
2555
  )
2390
2556
  }
2391
2557
  ),
2392
- /* @__PURE__ */ jsxs33(
2558
+ /* @__PURE__ */ jsxs34(
2393
2559
  RadixDialog4.Content,
2394
2560
  {
2395
2561
  ref,
@@ -2403,10 +2569,10 @@ var CommandPalette = forwardRef39(
2403
2569
  ),
2404
2570
  onKeyDown,
2405
2571
  children: [
2406
- /* @__PURE__ */ jsx40(RadixDialog4.Title, { className: "sr-only", children: "Command palette" }),
2407
- /* @__PURE__ */ jsxs33("div", { className: "border-border flex items-center gap-[10px] border-b px-4 py-[14px]", children: [
2408
- /* @__PURE__ */ jsx40("span", { "aria-hidden": true, className: "text-text-dim", children: "\u2315" }),
2409
- /* @__PURE__ */ jsx40(
2572
+ /* @__PURE__ */ jsx41(RadixDialog4.Title, { className: "sr-only", children: "Command palette" }),
2573
+ /* @__PURE__ */ jsxs34("div", { className: "border-border flex items-center gap-[10px] border-b px-4 py-[14px]", children: [
2574
+ /* @__PURE__ */ jsx41("span", { "aria-hidden": true, className: "text-text-dim", children: "\u2315" }),
2575
+ /* @__PURE__ */ jsx41(
2410
2576
  "input",
2411
2577
  {
2412
2578
  autoFocus: true,
@@ -2423,9 +2589,9 @@ var CommandPalette = forwardRef39(
2423
2589
  className: "text-text placeholder:text-text-dim flex-1 border-0 bg-transparent text-[14px] outline-none"
2424
2590
  }
2425
2591
  ),
2426
- /* @__PURE__ */ jsx40("span", { className: "border-border text-text-dim rounded-xs border px-[6px] py-[2px] font-mono text-[10px]", children: "ESC" })
2592
+ /* @__PURE__ */ jsx41("span", { className: "border-border text-text-dim rounded-xs border px-[6px] py-[2px] font-mono text-[10px]", children: "ESC" })
2427
2593
  ] }),
2428
- /* @__PURE__ */ jsx40("div", { id: listboxId, className: "min-h-[220px] p-2", role: "listbox", "aria-label": "Results", children: flat.length === 0 ? emptyState ?? /* @__PURE__ */ jsx40("div", { className: "text-text-dim px-3 py-5 text-center text-[12px]", children: "No matches" }) : /* @__PURE__ */ jsx40(
2594
+ /* @__PURE__ */ jsx41("div", { id: listboxId, className: "min-h-[220px] p-2", role: "listbox", "aria-label": "Results", children: flat.length === 0 ? emptyState ?? /* @__PURE__ */ jsx41("div", { className: "text-text-dim px-3 py-5 text-center text-[12px]", children: "No matches" }) : /* @__PURE__ */ jsx41(
2429
2595
  CommandGroups,
2430
2596
  {
2431
2597
  groups,
@@ -2435,7 +2601,7 @@ var CommandPalette = forwardRef39(
2435
2601
  optionId
2436
2602
  }
2437
2603
  ) }),
2438
- footer && /* @__PURE__ */ jsx40("div", { className: "border-border text-text-dim flex gap-4 border-t px-[14px] py-[10px] font-mono text-[10px]", children: footer })
2604
+ footer && /* @__PURE__ */ jsx41("div", { className: "border-border text-text-dim flex gap-4 border-t px-[14px] py-[10px] font-mono text-[10px]", children: footer })
2439
2605
  ]
2440
2606
  }
2441
2607
  )
@@ -2445,10 +2611,10 @@ var CommandPalette = forwardRef39(
2445
2611
  CommandPalette.displayName = "CommandPalette";
2446
2612
  function CommandGroups({ groups, cursor, setCursor, onSelect, optionId }) {
2447
2613
  let runningIndex = 0;
2448
- return /* @__PURE__ */ jsx40(Fragment, { children: groups.map((group, gIdx) => {
2614
+ return /* @__PURE__ */ jsx41(Fragment, { children: groups.map((group, gIdx) => {
2449
2615
  if (group.items.length === 0) return null;
2450
- return /* @__PURE__ */ jsxs33("div", { children: [
2451
- group.label && /* @__PURE__ */ jsxs33("div", { className: "text-text-dim px-2 pt-2 pb-1 font-mono text-[9px] tracking-[1.4px] uppercase", children: [
2616
+ return /* @__PURE__ */ jsxs34("div", { children: [
2617
+ group.label && /* @__PURE__ */ jsxs34("div", { className: "text-text-dim px-2 pt-2 pb-1 font-mono text-[9px] tracking-[1.4px] uppercase", children: [
2452
2618
  group.label,
2453
2619
  " \xB7 ",
2454
2620
  group.items.length
@@ -2456,7 +2622,7 @@ function CommandGroups({ groups, cursor, setCursor, onSelect, optionId }) {
2456
2622
  group.items.map((item) => {
2457
2623
  const myIndex = runningIndex++;
2458
2624
  const isActive = cursor === myIndex;
2459
- return /* @__PURE__ */ jsxs33(
2625
+ return /* @__PURE__ */ jsxs34(
2460
2626
  "button",
2461
2627
  {
2462
2628
  id: optionId(myIndex),
@@ -2470,7 +2636,7 @@ function CommandGroups({ groups, cursor, setCursor, onSelect, optionId }) {
2470
2636
  isActive ? "bg-accent-dim text-accent" : "text-text hover:bg-panel-2"
2471
2637
  ),
2472
2638
  children: [
2473
- item.glyph != null && /* @__PURE__ */ jsx40(
2639
+ item.glyph != null && /* @__PURE__ */ jsx41(
2474
2640
  "span",
2475
2641
  {
2476
2642
  "aria-hidden": true,
@@ -2481,11 +2647,11 @@ function CommandGroups({ groups, cursor, setCursor, onSelect, optionId }) {
2481
2647
  children: item.glyph
2482
2648
  }
2483
2649
  ),
2484
- /* @__PURE__ */ jsxs33("span", { className: "min-w-0 flex-1", children: [
2485
- /* @__PURE__ */ jsx40("span", { className: "block truncate text-[13px]", children: item.label }),
2486
- item.description && /* @__PURE__ */ jsx40("span", { className: "text-text-dim block truncate text-[11px]", children: item.description })
2650
+ /* @__PURE__ */ jsxs34("span", { className: "min-w-0 flex-1", children: [
2651
+ /* @__PURE__ */ jsx41("span", { className: "block truncate text-[13px]", children: item.label }),
2652
+ item.description && /* @__PURE__ */ jsx41("span", { className: "text-text-dim block truncate text-[11px]", children: item.description })
2487
2653
  ] }),
2488
- item.trailing && /* @__PURE__ */ jsx40("span", { className: "text-text-dim font-mono text-[10px]", children: item.trailing })
2654
+ item.trailing && /* @__PURE__ */ jsx41("span", { className: "text-text-dim font-mono text-[10px]", children: item.trailing })
2489
2655
  ]
2490
2656
  },
2491
2657
  item.id
@@ -2508,7 +2674,7 @@ function filterCommandItems(query, groups) {
2508
2674
 
2509
2675
  // src/patterns/DataTable/DataTable.tsx
2510
2676
  import { useEffect as useEffect7, useMemo as useMemo4, useRef as useRef5 } from "react";
2511
- import { jsx as jsx41, jsxs as jsxs34 } from "react/jsx-runtime";
2677
+ import { jsx as jsx42, jsxs as jsxs35 } from "react/jsx-runtime";
2512
2678
  var alignClass = {
2513
2679
  left: "text-left",
2514
2680
  right: "text-right",
@@ -2596,10 +2762,10 @@ function DataTable(props) {
2596
2762
  return next;
2597
2763
  });
2598
2764
  };
2599
- return /* @__PURE__ */ jsxs34("table", { ref, className: cn("w-full border-collapse text-[12px]", className), children: [
2600
- caption && /* @__PURE__ */ jsx41("caption", { className: "sr-only", children: caption }),
2601
- /* @__PURE__ */ jsx41("thead", { className: cn("bg-panel-2", stickyHeader && "z-raised sticky top-0"), children: /* @__PURE__ */ jsxs34("tr", { children: [
2602
- selectable && /* @__PURE__ */ jsx41("th", { scope: "col", className: "border-border w-8 border-b px-3 py-2 text-left", children: /* @__PURE__ */ jsx41(
2765
+ return /* @__PURE__ */ jsxs35("table", { ref, className: cn("w-full border-collapse text-[12px]", className), children: [
2766
+ caption && /* @__PURE__ */ jsx42("caption", { className: "sr-only", children: caption }),
2767
+ /* @__PURE__ */ jsx42("thead", { className: cn("bg-panel-2", stickyHeader && "z-raised sticky top-0"), children: /* @__PURE__ */ jsxs35("tr", { children: [
2768
+ selectable && /* @__PURE__ */ jsx42("th", { scope: "col", className: "border-border w-8 border-b px-3 py-2 text-left", children: /* @__PURE__ */ jsx42(
2603
2769
  "input",
2604
2770
  {
2605
2771
  ref: headerCheckRef,
@@ -2615,8 +2781,8 @@ function DataTable(props) {
2615
2781
  const isSorted = sort?.key === col.key;
2616
2782
  const ariaSort = !sortable ? void 0 : isSorted ? sort?.direction === "asc" ? "ascending" : "descending" : "none";
2617
2783
  const align = col.align ?? "left";
2618
- const indicator = sortable && isSorted && /* @__PURE__ */ jsx41("span", { "aria-hidden": true, className: "ml-1", children: sort?.direction === "asc" ? "\u2191" : "\u2193" });
2619
- return /* @__PURE__ */ jsx41(
2784
+ const indicator = sortable && isSorted && /* @__PURE__ */ jsx42("span", { "aria-hidden": true, className: "ml-1", children: sort?.direction === "asc" ? "\u2191" : "\u2193" });
2785
+ return /* @__PURE__ */ jsx42(
2620
2786
  "th",
2621
2787
  {
2622
2788
  scope: "col",
@@ -2628,7 +2794,7 @@ function DataTable(props) {
2628
2794
  sortable && "cursor-pointer",
2629
2795
  isSorted ? "text-accent" : "text-text-dim"
2630
2796
  ),
2631
- children: sortable ? /* @__PURE__ */ jsxs34(
2797
+ children: sortable ? /* @__PURE__ */ jsxs35(
2632
2798
  "button",
2633
2799
  {
2634
2800
  type: "button",
@@ -2645,8 +2811,8 @@ function DataTable(props) {
2645
2811
  );
2646
2812
  })
2647
2813
  ] }) }),
2648
- /* @__PURE__ */ jsxs34("tbody", { children: [
2649
- sortedData.length === 0 && /* @__PURE__ */ jsx41("tr", { children: /* @__PURE__ */ jsx41(
2814
+ /* @__PURE__ */ jsxs35("tbody", { children: [
2815
+ sortedData.length === 0 && /* @__PURE__ */ jsx42("tr", { children: /* @__PURE__ */ jsx42(
2650
2816
  "td",
2651
2817
  {
2652
2818
  colSpan: columns.length + (selectable ? 1 : 0),
@@ -2657,7 +2823,7 @@ function DataTable(props) {
2657
2823
  sortedData.map((row) => {
2658
2824
  const id = rowKey(row);
2659
2825
  const isSelected = selectedSet.has(id);
2660
- return /* @__PURE__ */ jsxs34(
2826
+ return /* @__PURE__ */ jsxs35(
2661
2827
  "tr",
2662
2828
  {
2663
2829
  "data-state": isSelected ? "selected" : void 0,
@@ -2666,7 +2832,7 @@ function DataTable(props) {
2666
2832
  isSelected ? "bg-accent-dim/50" : "hover:bg-panel-2"
2667
2833
  ),
2668
2834
  children: [
2669
- selectable && /* @__PURE__ */ jsx41("td", { className: "px-3 py-[10px]", children: /* @__PURE__ */ jsx41(
2835
+ selectable && /* @__PURE__ */ jsx42("td", { className: "px-3 py-[10px]", children: /* @__PURE__ */ jsx42(
2670
2836
  "input",
2671
2837
  {
2672
2838
  type: "checkbox",
@@ -2676,7 +2842,7 @@ function DataTable(props) {
2676
2842
  className: "cursor-pointer accent-[var(--color-accent)]"
2677
2843
  }
2678
2844
  ) }),
2679
- columns.map((col) => /* @__PURE__ */ jsx41("td", { className: cn("px-3 py-[10px]", alignClass[col.align ?? "left"]), children: col.cell ? col.cell(row) : col.accessor ? String(col.accessor(row)) : null }, col.key))
2845
+ columns.map((col) => /* @__PURE__ */ jsx42("td", { className: cn("px-3 py-[10px]", alignClass[col.align ?? "left"]), children: col.cell ? col.cell(row) : col.accessor ? String(col.accessor(row)) : null }, col.key))
2680
2846
  ]
2681
2847
  },
2682
2848
  id
@@ -2688,13 +2854,13 @@ function DataTable(props) {
2688
2854
 
2689
2855
  // src/patterns/DatePicker/Calendar.tsx
2690
2856
  import {
2691
- forwardRef as forwardRef40,
2857
+ forwardRef as forwardRef41,
2692
2858
  useCallback as useCallback7,
2693
2859
  useEffect as useEffect8,
2694
2860
  useRef as useRef6,
2695
2861
  useState as useState9
2696
2862
  } from "react";
2697
- import { jsx as jsx42, jsxs as jsxs35 } from "react/jsx-runtime";
2863
+ import { jsx as jsx43, jsxs as jsxs36 } from "react/jsx-runtime";
2698
2864
  var MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
2699
2865
  var DAYS = ["S", "M", "T", "W", "T", "F", "S"];
2700
2866
  function isSameDay(a, b) {
@@ -2705,7 +2871,7 @@ function clampDay(year, month, day) {
2705
2871
  const max = new Date(year, month + 1, 0).getDate();
2706
2872
  return Math.min(Math.max(1, day), max);
2707
2873
  }
2708
- var Calendar = forwardRef40(function Calendar2({
2874
+ var Calendar = forwardRef41(function Calendar2({
2709
2875
  value,
2710
2876
  defaultValue,
2711
2877
  onValueChange,
@@ -2836,7 +3002,7 @@ var Calendar = forwardRef40(function Calendar2({
2836
3002
  },
2837
3003
  [month, year, moveFocus]
2838
3004
  );
2839
- return /* @__PURE__ */ jsxs35(
3005
+ return /* @__PURE__ */ jsxs36(
2840
3006
  "div",
2841
3007
  {
2842
3008
  ref,
@@ -2848,14 +3014,14 @@ var Calendar = forwardRef40(function Calendar2({
2848
3014
  ),
2849
3015
  ...props,
2850
3016
  children: [
2851
- /* @__PURE__ */ jsxs35("div", { className: "mb-3 flex items-center justify-between", children: [
2852
- /* @__PURE__ */ jsxs35("span", { className: "text-[13px] font-medium", "aria-live": "polite", children: [
3017
+ /* @__PURE__ */ jsxs36("div", { className: "mb-3 flex items-center justify-between", children: [
3018
+ /* @__PURE__ */ jsxs36("span", { className: "text-[13px] font-medium", "aria-live": "polite", children: [
2853
3019
  MONTHS[month],
2854
3020
  " ",
2855
3021
  year
2856
3022
  ] }),
2857
- /* @__PURE__ */ jsxs35("div", { className: "flex gap-1", children: [
2858
- /* @__PURE__ */ jsx42(
3023
+ /* @__PURE__ */ jsxs36("div", { className: "flex gap-1", children: [
3024
+ /* @__PURE__ */ jsx43(
2859
3025
  IconButton,
2860
3026
  {
2861
3027
  size: "sm",
@@ -2865,11 +3031,11 @@ var Calendar = forwardRef40(function Calendar2({
2865
3031
  onClick: goPrev
2866
3032
  }
2867
3033
  ),
2868
- /* @__PURE__ */ jsx42(IconButton, { size: "sm", variant: "ghost", icon: "\u203A", "aria-label": "Next month", onClick: goNext })
3034
+ /* @__PURE__ */ jsx43(IconButton, { size: "sm", variant: "ghost", icon: "\u203A", "aria-label": "Next month", onClick: goNext })
2869
3035
  ] })
2870
3036
  ] }),
2871
- /* @__PURE__ */ jsxs35("div", { role: "grid", "aria-label": `${MONTHS[month]} ${year}`, className: "flex flex-col gap-[2px]", children: [
2872
- /* @__PURE__ */ jsx42("div", { role: "row", className: "grid grid-cols-7 gap-[2px]", children: DAYS.map((d, i) => /* @__PURE__ */ jsx42(
3037
+ /* @__PURE__ */ jsxs36("div", { role: "grid", "aria-label": `${MONTHS[month]} ${year}`, className: "flex flex-col gap-[2px]", children: [
3038
+ /* @__PURE__ */ jsx43("div", { role: "row", className: "grid grid-cols-7 gap-[2px]", children: DAYS.map((d, i) => /* @__PURE__ */ jsx43(
2873
3039
  "div",
2874
3040
  {
2875
3041
  role: "columnheader",
@@ -2889,7 +3055,7 @@ var Calendar = forwardRef40(function Calendar2({
2889
3055
  const cellIndex = r * 7 + c;
2890
3056
  const dayNum = cellIndex - firstDayOfMonth + 1;
2891
3057
  if (dayNum < 1 || dayNum > daysInMonth) {
2892
- cells.push(/* @__PURE__ */ jsx42("div", { role: "gridcell", "aria-hidden": true }, `pad-${r}-${c}`));
3058
+ cells.push(/* @__PURE__ */ jsx43("div", { role: "gridcell", "aria-hidden": true }, `pad-${r}-${c}`));
2893
3059
  continue;
2894
3060
  }
2895
3061
  const date = new Date(year, month, dayNum);
@@ -2899,7 +3065,7 @@ var Calendar = forwardRef40(function Calendar2({
2899
3065
  const isFocused = dayNum === effectiveFocusDay;
2900
3066
  const day = dayNum;
2901
3067
  cells.push(
2902
- /* @__PURE__ */ jsx42("div", { role: "gridcell", "aria-selected": isSelected, children: /* @__PURE__ */ jsx42(
3068
+ /* @__PURE__ */ jsx43("div", { role: "gridcell", "aria-selected": isSelected, children: /* @__PURE__ */ jsx43(
2903
3069
  "button",
2904
3070
  {
2905
3071
  ref: (node) => {
@@ -2930,7 +3096,7 @@ var Calendar = forwardRef40(function Calendar2({
2930
3096
  );
2931
3097
  }
2932
3098
  rows.push(
2933
- /* @__PURE__ */ jsx42("div", { role: "row", className: "grid grid-cols-7 gap-[2px]", children: cells }, `row-${r}`)
3099
+ /* @__PURE__ */ jsx43("div", { role: "row", className: "grid grid-cols-7 gap-[2px]", children: cells }, `row-${r}`)
2934
3100
  );
2935
3101
  }
2936
3102
  return rows;
@@ -2944,10 +3110,10 @@ Calendar.displayName = "Calendar";
2944
3110
 
2945
3111
  // src/patterns/DatePicker/DatePicker.tsx
2946
3112
  import * as RadixPopover2 from "@radix-ui/react-popover";
2947
- import { forwardRef as forwardRef41, useState as useState10 } from "react";
2948
- import { jsx as jsx43, jsxs as jsxs36 } from "react/jsx-runtime";
3113
+ import { forwardRef as forwardRef42, useState as useState10 } from "react";
3114
+ import { jsx as jsx44, jsxs as jsxs37 } from "react/jsx-runtime";
2949
3115
  var defaultFormat = (d) => d.toLocaleDateString();
2950
- var DatePicker = forwardRef41(function DatePicker2({
3116
+ var DatePicker = forwardRef42(function DatePicker2({
2951
3117
  value: valueProp,
2952
3118
  defaultValue,
2953
3119
  onValueChange,
@@ -2967,8 +3133,8 @@ var DatePicker = forwardRef41(function DatePicker2({
2967
3133
  defaultValue,
2968
3134
  onChange: onValueChange
2969
3135
  });
2970
- return /* @__PURE__ */ jsxs36(RadixPopover2.Root, { open, onOpenChange: setOpen, children: [
2971
- /* @__PURE__ */ jsx43(RadixPopover2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs36(
3136
+ return /* @__PURE__ */ jsxs37(RadixPopover2.Root, { open, onOpenChange: setOpen, children: [
3137
+ /* @__PURE__ */ jsx44(RadixPopover2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs37(
2972
3138
  "button",
2973
3139
  {
2974
3140
  ref,
@@ -2985,18 +3151,18 @@ var DatePicker = forwardRef41(function DatePicker2({
2985
3151
  ),
2986
3152
  style: { width },
2987
3153
  children: [
2988
- /* @__PURE__ */ jsx43("span", { "aria-hidden": true, className: "text-text-dim", children: "\u25A2" }),
2989
- /* @__PURE__ */ jsx43("span", { className: cn("flex-1 truncate", !value && "text-text-dim"), children: value ? format(value) : emptyLabel ?? placeholder })
3154
+ /* @__PURE__ */ jsx44("span", { "aria-hidden": true, className: "text-text-dim", children: "\u25A2" }),
3155
+ /* @__PURE__ */ jsx44("span", { className: cn("flex-1 truncate", !value && "text-text-dim"), children: value ? format(value) : emptyLabel ?? placeholder })
2990
3156
  ]
2991
3157
  }
2992
3158
  ) }),
2993
- /* @__PURE__ */ jsx43(RadixPopover2.Portal, { children: /* @__PURE__ */ jsx43(
3159
+ /* @__PURE__ */ jsx44(RadixPopover2.Portal, { children: /* @__PURE__ */ jsx44(
2994
3160
  RadixPopover2.Content,
2995
3161
  {
2996
3162
  align: "start",
2997
3163
  sideOffset: 6,
2998
3164
  className: "z-popover outline-none data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]",
2999
- children: /* @__PURE__ */ jsx43(
3165
+ children: /* @__PURE__ */ jsx44(
3000
3166
  Calendar,
3001
3167
  {
3002
3168
  value,
@@ -3011,17 +3177,17 @@ var DatePicker = forwardRef41(function DatePicker2({
3011
3177
  )
3012
3178
  }
3013
3179
  ) }),
3014
- name && /* @__PURE__ */ jsx43("input", { type: "hidden", name, value: value ? value.toISOString() : "", readOnly: true })
3180
+ name && /* @__PURE__ */ jsx44("input", { type: "hidden", name, value: value ? value.toISOString() : "", readOnly: true })
3015
3181
  ] });
3016
3182
  });
3017
3183
  DatePicker.displayName = "DatePicker";
3018
3184
 
3019
3185
  // src/patterns/Dots/Dots.tsx
3020
- import { forwardRef as forwardRef42 } from "react";
3021
- import { jsx as jsx44 } from "react/jsx-runtime";
3022
- var Dots = forwardRef42(function Dots2({ total, current, onChange, className, "aria-label": ariaLabel = "Progress", ...props }, ref) {
3186
+ import { forwardRef as forwardRef43 } from "react";
3187
+ import { jsx as jsx45 } from "react/jsx-runtime";
3188
+ var Dots = forwardRef43(function Dots2({ total, current, onChange, className, "aria-label": ariaLabel = "Progress", ...props }, ref) {
3023
3189
  const interactive = typeof onChange === "function";
3024
- return /* @__PURE__ */ jsx44(
3190
+ return /* @__PURE__ */ jsx45(
3025
3191
  "nav",
3026
3192
  {
3027
3193
  ref,
@@ -3035,7 +3201,7 @@ var Dots = forwardRef42(function Dots2({ total, current, onChange, className, "a
3035
3201
  isActive ? "w-[18px] bg-accent" : "w-[6px] bg-panel-2"
3036
3202
  );
3037
3203
  if (interactive) {
3038
- return /* @__PURE__ */ jsx44(
3204
+ return /* @__PURE__ */ jsx45(
3039
3205
  "button",
3040
3206
  {
3041
3207
  type: "button",
@@ -3052,7 +3218,7 @@ var Dots = forwardRef42(function Dots2({ total, current, onChange, className, "a
3052
3218
  i
3053
3219
  );
3054
3220
  }
3055
- return /* @__PURE__ */ jsx44("span", { "aria-hidden": true, className: sharedClass }, i);
3221
+ return /* @__PURE__ */ jsx45("span", { "aria-hidden": true, className: sharedClass }, i);
3056
3222
  })
3057
3223
  }
3058
3224
  );
@@ -3061,15 +3227,15 @@ Dots.displayName = "Dots";
3061
3227
 
3062
3228
  // src/patterns/Dropzone/Dropzone.tsx
3063
3229
  import {
3064
- forwardRef as forwardRef43,
3230
+ forwardRef as forwardRef44,
3065
3231
  useState as useState11
3066
3232
  } from "react";
3067
- import { jsx as jsx45, jsxs as jsxs37 } from "react/jsx-runtime";
3233
+ import { jsx as jsx46, jsxs as jsxs38 } from "react/jsx-runtime";
3068
3234
  function listToArray(list) {
3069
3235
  if (!list) return [];
3070
3236
  return Array.from(list);
3071
3237
  }
3072
- var Dropzone = forwardRef43(function Dropzone2({
3238
+ var Dropzone = forwardRef44(function Dropzone2({
3073
3239
  onFiles,
3074
3240
  accept,
3075
3241
  multiple = true,
@@ -3094,7 +3260,7 @@ var Dropzone = forwardRef43(function Dropzone2({
3094
3260
  const files = listToArray(e.dataTransfer.files);
3095
3261
  if (files.length) onFiles?.(files);
3096
3262
  };
3097
- return /* @__PURE__ */ jsxs37(
3263
+ return /* @__PURE__ */ jsxs38(
3098
3264
  "label",
3099
3265
  {
3100
3266
  ref,
@@ -3111,7 +3277,7 @@ var Dropzone = forwardRef43(function Dropzone2({
3111
3277
  ),
3112
3278
  ...props,
3113
3279
  children: [
3114
- /* @__PURE__ */ jsx45(
3280
+ /* @__PURE__ */ jsx46(
3115
3281
  "input",
3116
3282
  {
3117
3283
  type: "file",
@@ -3127,7 +3293,7 @@ var Dropzone = forwardRef43(function Dropzone2({
3127
3293
  }
3128
3294
  }
3129
3295
  ),
3130
- /* @__PURE__ */ jsx45(
3296
+ /* @__PURE__ */ jsx46(
3131
3297
  "div",
3132
3298
  {
3133
3299
  "aria-hidden": true,
@@ -3135,8 +3301,8 @@ var Dropzone = forwardRef43(function Dropzone2({
3135
3301
  children: icon
3136
3302
  }
3137
3303
  ),
3138
- /* @__PURE__ */ jsx45("div", { className: "mb-1 text-[13px] font-medium", children: title }),
3139
- description && /* @__PURE__ */ jsx45("div", { className: "text-text-dim text-[11px]", children: description })
3304
+ /* @__PURE__ */ jsx46("div", { className: "mb-1 text-[13px] font-medium", children: title }),
3305
+ description && /* @__PURE__ */ jsx46("div", { className: "text-text-dim text-[11px]", children: description })
3140
3306
  ]
3141
3307
  }
3142
3308
  );
@@ -3145,8 +3311,8 @@ Dropzone.displayName = "Dropzone";
3145
3311
 
3146
3312
  // src/patterns/EmptyState/EmptyState.tsx
3147
3313
  import { cva as cva10 } from "class-variance-authority";
3148
- import { forwardRef as forwardRef44 } from "react";
3149
- import { jsx as jsx46, jsxs as jsxs38 } from "react/jsx-runtime";
3314
+ import { forwardRef as forwardRef45 } from "react";
3315
+ import { jsx as jsx47, jsxs as jsxs39 } from "react/jsx-runtime";
3150
3316
  var plateStyles = cva10("grid h-12 w-12 place-items-center rounded-base text-[22px]", {
3151
3317
  variants: {
3152
3318
  tone: {
@@ -3159,8 +3325,8 @@ var plateStyles = cva10("grid h-12 w-12 place-items-center rounded-base text-[22
3159
3325
  },
3160
3326
  defaultVariants: { tone: "neutral" }
3161
3327
  });
3162
- var EmptyState = forwardRef44(function EmptyState2({ icon, title, description, action, chips, tone, className, ...props }, ref) {
3163
- return /* @__PURE__ */ jsxs38(
3328
+ var EmptyState = forwardRef45(function EmptyState2({ icon, title, description, action, chips, tone, className, ...props }, ref) {
3329
+ return /* @__PURE__ */ jsxs39(
3164
3330
  "div",
3165
3331
  {
3166
3332
  ref,
@@ -3170,10 +3336,10 @@ var EmptyState = forwardRef44(function EmptyState2({ icon, title, description, a
3170
3336
  ),
3171
3337
  ...props,
3172
3338
  children: [
3173
- icon != null && /* @__PURE__ */ jsx46("span", { "aria-hidden": true, className: plateStyles({ tone: tone ?? "neutral" }), children: icon }),
3174
- /* @__PURE__ */ jsx46("div", { className: "text-[14px] font-medium", children: title }),
3175
- description && /* @__PURE__ */ jsx46("div", { className: "text-text-muted max-w-[260px] text-[12px] leading-[1.5]", children: description }),
3176
- chips && chips.length > 0 && /* @__PURE__ */ jsx46("div", { className: "flex w-full flex-col gap-1", children: chips.map((c, i) => /* @__PURE__ */ jsx46(
3339
+ icon != null && /* @__PURE__ */ jsx47("span", { "aria-hidden": true, className: plateStyles({ tone: tone ?? "neutral" }), children: icon }),
3340
+ /* @__PURE__ */ jsx47("div", { className: "text-[14px] font-medium", children: title }),
3341
+ description && /* @__PURE__ */ jsx47("div", { className: "text-text-muted max-w-[260px] text-[12px] leading-[1.5]", children: description }),
3342
+ chips && chips.length > 0 && /* @__PURE__ */ jsx47("div", { className: "flex w-full flex-col gap-1", children: chips.map((c, i) => /* @__PURE__ */ jsx47(
3177
3343
  "button",
3178
3344
  {
3179
3345
  type: "button",
@@ -3195,18 +3361,18 @@ var EmptyState = forwardRef44(function EmptyState2({ icon, title, description, a
3195
3361
  EmptyState.displayName = "EmptyState";
3196
3362
 
3197
3363
  // src/patterns/FileChip/FileChip.tsx
3198
- import { forwardRef as forwardRef45 } from "react";
3199
- import { jsx as jsx47, jsxs as jsxs39 } from "react/jsx-runtime";
3364
+ import { forwardRef as forwardRef46 } from "react";
3365
+ import { jsx as jsx48, jsxs as jsxs40 } from "react/jsx-runtime";
3200
3366
  function deriveExt(name) {
3201
3367
  const dot = name.lastIndexOf(".");
3202
3368
  if (dot < 0) return "FILE";
3203
3369
  return name.slice(dot + 1).slice(0, 4).toUpperCase();
3204
3370
  }
3205
- var FileChip = forwardRef45(function FileChip2({ name, size, progress, icon, onRemove, failed, className, ...props }, ref) {
3371
+ var FileChip = forwardRef46(function FileChip2({ name, size, progress, icon, onRemove, failed, className, ...props }, ref) {
3206
3372
  const ext = deriveExt(name);
3207
3373
  const showProgress = typeof progress === "number";
3208
3374
  const isComplete = showProgress && progress >= 100;
3209
- return /* @__PURE__ */ jsxs39(
3375
+ return /* @__PURE__ */ jsxs40(
3210
3376
  "div",
3211
3377
  {
3212
3378
  ref,
@@ -3216,7 +3382,7 @@ var FileChip = forwardRef45(function FileChip2({ name, size, progress, icon, onR
3216
3382
  ),
3217
3383
  ...props,
3218
3384
  children: [
3219
- /* @__PURE__ */ jsx47(
3385
+ /* @__PURE__ */ jsx48(
3220
3386
  "span",
3221
3387
  {
3222
3388
  "aria-hidden": true,
@@ -3224,17 +3390,17 @@ var FileChip = forwardRef45(function FileChip2({ name, size, progress, icon, onR
3224
3390
  children: icon ?? ext
3225
3391
  }
3226
3392
  ),
3227
- /* @__PURE__ */ jsxs39("div", { className: "min-w-0 flex-1", children: [
3228
- /* @__PURE__ */ jsx47("div", { className: "truncate text-[12px] font-medium", children: name }),
3229
- /* @__PURE__ */ jsxs39("div", { className: cn("font-mono text-[10px]", failed ? "text-err" : "text-text-dim"), children: [
3393
+ /* @__PURE__ */ jsxs40("div", { className: "min-w-0 flex-1", children: [
3394
+ /* @__PURE__ */ jsx48("div", { className: "truncate text-[12px] font-medium", children: name }),
3395
+ /* @__PURE__ */ jsxs40("div", { className: cn("font-mono text-[10px]", failed ? "text-err" : "text-text-dim"), children: [
3230
3396
  size,
3231
- showProgress && !isComplete && /* @__PURE__ */ jsxs39("span", { children: [
3397
+ showProgress && !isComplete && /* @__PURE__ */ jsxs40("span", { children: [
3232
3398
  " \xB7 ",
3233
3399
  Math.round(progress),
3234
3400
  "%"
3235
3401
  ] })
3236
3402
  ] }),
3237
- showProgress && !isComplete && /* @__PURE__ */ jsx47("div", { className: "bg-panel mt-1 h-[2px] overflow-hidden rounded-full", children: /* @__PURE__ */ jsx47(
3403
+ showProgress && !isComplete && /* @__PURE__ */ jsx48("div", { className: "bg-panel mt-1 h-[2px] overflow-hidden rounded-full", children: /* @__PURE__ */ jsx48(
3238
3404
  "div",
3239
3405
  {
3240
3406
  className: cn(
@@ -3245,7 +3411,7 @@ var FileChip = forwardRef45(function FileChip2({ name, size, progress, icon, onR
3245
3411
  }
3246
3412
  ) })
3247
3413
  ] }),
3248
- onRemove && /* @__PURE__ */ jsx47(
3414
+ onRemove && /* @__PURE__ */ jsx48(
3249
3415
  "button",
3250
3416
  {
3251
3417
  type: "button",
@@ -3264,120 +3430,429 @@ var FileChip = forwardRef45(function FileChip2({ name, size, progress, icon, onR
3264
3430
  });
3265
3431
  FileChip.displayName = "FileChip";
3266
3432
 
3267
- // src/patterns/Menubar/Menubar.tsx
3268
- import * as RadixMenubar from "@radix-ui/react-menubar";
3269
- import { forwardRef as forwardRef46 } from "react";
3270
- import { jsx as jsx48, jsxs as jsxs40 } from "react/jsx-runtime";
3271
- var Menubar = forwardRef46(function Menubar2({ className, ...props }, ref) {
3272
- return /* @__PURE__ */ jsx48(
3273
- RadixMenubar.Root,
3433
+ // src/patterns/FilterPanel/FilterPanel.tsx
3434
+ import { forwardRef as forwardRef47, useCallback as useCallback8, useState as useState12 } from "react";
3435
+ import { jsx as jsx49, jsxs as jsxs41 } from "react/jsx-runtime";
3436
+ var EMPTY = Object.freeze({});
3437
+ var FilterPanel = forwardRef47(function FilterPanel2({
3438
+ facets,
3439
+ value,
3440
+ defaultValue,
3441
+ onValueChange,
3442
+ onReset,
3443
+ counts,
3444
+ title = "Filter",
3445
+ resetLabel = "Reset",
3446
+ className,
3447
+ ...props
3448
+ }, ref) {
3449
+ const [selection, setSelection] = useControllableState({
3450
+ value,
3451
+ defaultValue: defaultValue ?? EMPTY,
3452
+ onChange: onValueChange
3453
+ });
3454
+ const total = facets.reduce((sum, facet) => sum + (selection[facet.id]?.length ?? 0), 0);
3455
+ const toggle = useCallback8(
3456
+ (facetId, optionValue, next) => {
3457
+ setSelection((prev) => {
3458
+ const current = prev?.[facetId] ?? [];
3459
+ const filtered = current.filter((v) => v !== optionValue);
3460
+ const updated = next ? [...filtered, optionValue] : filtered;
3461
+ return { ...prev ?? {}, [facetId]: updated };
3462
+ });
3463
+ },
3464
+ [setSelection]
3465
+ );
3466
+ const handleReset = useCallback8(() => {
3467
+ setSelection(EMPTY);
3468
+ onReset?.();
3469
+ }, [setSelection, onReset]);
3470
+ return /* @__PURE__ */ jsxs41(
3471
+ "div",
3274
3472
  {
3275
3473
  ref,
3474
+ role: "group",
3475
+ "aria-label": typeof title === "string" ? title : void 0,
3276
3476
  className: cn(
3277
- "border-border bg-panel flex h-[30px] items-center gap-[2px] border-b px-3",
3477
+ "rounded-base border-border bg-panel flex w-[260px] flex-col gap-3 border p-4",
3278
3478
  className
3279
3479
  ),
3280
- ...props
3480
+ ...props,
3481
+ children: [
3482
+ /* @__PURE__ */ jsxs41("div", { className: "flex items-center gap-2", children: [
3483
+ /* @__PURE__ */ jsx49("span", { className: "text-text-dim font-mono text-[10px] tracking-[1.4px] uppercase", children: title }),
3484
+ total > 0 && /* @__PURE__ */ jsx49(Badge, { size: "sm", variant: "accent", children: total }),
3485
+ /* @__PURE__ */ jsx49(
3486
+ Button,
3487
+ {
3488
+ type: "button",
3489
+ variant: "ghost",
3490
+ size: "sm",
3491
+ onClick: handleReset,
3492
+ disabled: total === 0,
3493
+ className: "ml-auto",
3494
+ children: resetLabel
3495
+ }
3496
+ )
3497
+ ] }),
3498
+ facets.map((facet) => /* @__PURE__ */ jsx49(
3499
+ FilterFacetGroup,
3500
+ {
3501
+ facet,
3502
+ selected: selection[facet.id] ?? [],
3503
+ counts: counts?.[facet.id],
3504
+ onToggle: toggle
3505
+ },
3506
+ facet.id
3507
+ ))
3508
+ ]
3281
3509
  }
3282
3510
  );
3283
3511
  });
3284
- Menubar.displayName = "Menubar";
3285
- var MenubarMenu = RadixMenubar.Menu;
3286
- var MenubarTrigger = forwardRef46(
3287
- function MenubarTrigger2({ className, ...props }, ref) {
3288
- return /* @__PURE__ */ jsx48(
3289
- RadixMenubar.Trigger,
3512
+ FilterPanel.displayName = "FilterPanel";
3513
+ function FilterFacetGroup({ facet, selected, counts, onToggle }) {
3514
+ const collapsible = facet.collapsible ?? true;
3515
+ const [open, setOpen] = useState12(facet.defaultOpen ?? true);
3516
+ const isOpen = !collapsible || open;
3517
+ const selectedCount = selected.length;
3518
+ const headingClass = "text-text-muted flex items-center gap-[6px] font-mono text-[10px] tracking-[1.4px] uppercase";
3519
+ return /* @__PURE__ */ jsxs41("section", { className: "flex flex-col gap-1", children: [
3520
+ collapsible ? /* @__PURE__ */ jsxs41(
3521
+ "button",
3290
3522
  {
3291
- ref,
3523
+ type: "button",
3524
+ "aria-expanded": isOpen,
3525
+ onClick: () => setOpen((v) => !v),
3292
3526
  className: cn(
3293
- "text-text cursor-pointer rounded-xs border-0 bg-transparent px-[10px] py-1 text-[12px] outline-none",
3294
- "transition-colors duration-(--duration-micro)",
3295
- "data-[state=open]:bg-panel-2 hover:bg-panel-2",
3527
+ headingClass,
3528
+ "cursor-pointer rounded-xs px-1 py-[2px] outline-none",
3296
3529
  "focus-visible:ring-accent-dim focus-visible:ring-[3px]",
3297
- className
3530
+ "hover:text-text"
3298
3531
  ),
3299
- ...props
3532
+ children: [
3533
+ /* @__PURE__ */ jsx49("span", { className: "flex-1 text-left", children: facet.label }),
3534
+ selectedCount > 0 && /* @__PURE__ */ jsx49(Badge, { size: "sm", variant: "neutral", children: selectedCount }),
3535
+ /* @__PURE__ */ jsx49("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
3536
+ ]
3300
3537
  }
3301
- );
3302
- }
3303
- );
3304
- MenubarTrigger.displayName = "MenubarTrigger";
3305
- var MenubarContent = forwardRef46(
3306
- function MenubarContent2({ className, sideOffset = 6, align = "start", ...props }, ref) {
3307
- return /* @__PURE__ */ jsx48(RadixMenubar.Portal, { children: /* @__PURE__ */ jsx48(
3308
- RadixMenubar.Content,
3309
- {
3310
- ref,
3311
- sideOffset,
3312
- align,
3313
- className: cn(
3314
- "border-border-strong bg-panel z-popover min-w-[180px] rounded-md border p-1 shadow-lg outline-none",
3315
- "data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]",
3316
- className
3538
+ ) : /* @__PURE__ */ jsxs41("div", { className: cn(headingClass, "px-1 py-[2px]"), children: [
3539
+ /* @__PURE__ */ jsx49("span", { className: "flex-1", children: facet.label }),
3540
+ selectedCount > 0 && /* @__PURE__ */ jsx49(Badge, { size: "sm", variant: "neutral", children: selectedCount })
3541
+ ] }),
3542
+ isOpen && /* @__PURE__ */ jsx49("ul", { className: "m-0 flex list-none flex-col gap-[2px] p-0", children: facet.options.map((option) => {
3543
+ const isSelected = selected.includes(option.value);
3544
+ const count = counts?.[option.value];
3545
+ return /* @__PURE__ */ jsxs41("li", { className: "flex items-center gap-2 px-1 py-[3px]", children: [
3546
+ /* @__PURE__ */ jsx49(
3547
+ Checkbox,
3548
+ {
3549
+ checked: isSelected,
3550
+ onCheckedChange: (next) => onToggle(facet.id, option.value, next === true),
3551
+ label: option.label
3552
+ }
3317
3553
  ),
3318
- ...props
3319
- }
3320
- ) });
3321
- }
3322
- );
3323
- MenubarContent.displayName = "MenubarContent";
3324
- var itemBase3 = cn(
3325
- "flex items-center gap-2 rounded-sm px-[10px] py-[6px] text-[12px] cursor-pointer outline-none",
3326
- "data-[highlighted]:bg-panel-2",
3327
- "data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
3328
- );
3329
- var MenubarItem = forwardRef46(function MenubarItem2({ trailing, destructive, className, children, ...props }, ref) {
3330
- return /* @__PURE__ */ jsxs40(
3331
- RadixMenubar.Item,
3332
- {
3333
- ref,
3334
- className: cn(itemBase3, destructive ? "text-err" : "text-text", className),
3335
- ...props,
3336
- children: [
3337
- /* @__PURE__ */ jsx48("span", { className: "flex-1", children }),
3338
- trailing && /* @__PURE__ */ jsx48("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
3339
- ]
3340
- }
3341
- );
3342
- });
3343
- MenubarItem.displayName = "MenubarItem";
3344
- var MenubarSeparator = forwardRef46(
3345
- function MenubarSeparator2({ className, ...props }, ref) {
3346
- return /* @__PURE__ */ jsx48(
3347
- RadixMenubar.Separator,
3348
- {
3349
- ref,
3350
- className: cn("bg-border my-1 h-px", className),
3351
- ...props
3352
- }
3353
- );
3354
- }
3355
- );
3356
- MenubarSeparator.displayName = "MenubarSeparator";
3554
+ typeof count === "number" && /* @__PURE__ */ jsx49("span", { className: "text-text-dim ml-auto font-mono text-[10px] tabular-nums", children: count })
3555
+ ] }, option.value);
3556
+ }) })
3557
+ ] });
3558
+ }
3357
3559
 
3358
- // src/patterns/NavBar/NavBar.tsx
3359
- import * as RadixNav from "@radix-ui/react-navigation-menu";
3360
- import {
3361
- forwardRef as forwardRef48,
3362
- useCallback as useCallback9,
3363
- useEffect as useEffect9,
3364
- useRef as useRef7,
3365
- useState as useState13
3366
- } from "react";
3560
+ // src/patterns/HealthScore/HealthScore.tsx
3561
+ import { forwardRef as forwardRef49 } from "react";
3367
3562
 
3368
- // src/patterns/Sidebar/Sidebar.tsx
3369
- import {
3370
- forwardRef as forwardRef47,
3371
- useCallback as useCallback8,
3372
- useState as useState12
3373
- } from "react";
3374
- import { Fragment as Fragment2, jsx as jsx49, jsxs as jsxs41 } from "react/jsx-runtime";
3375
- var Sidebar = forwardRef47(function Sidebar2({ width = 240, className, style, ...props }, ref) {
3376
- return /* @__PURE__ */ jsx49(
3377
- "aside",
3378
- {
3379
- ref,
3380
- style: { width, ...style },
3563
+ // src/patterns/RadialProgress/RadialProgress.tsx
3564
+ import { forwardRef as forwardRef48 } from "react";
3565
+ import { jsx as jsx50, jsxs as jsxs42 } from "react/jsx-runtime";
3566
+ var toneStrokeClass = {
3567
+ accent: "stroke-accent",
3568
+ ok: "stroke-ok",
3569
+ warn: "stroke-warn",
3570
+ err: "stroke-err"
3571
+ };
3572
+ var RadialProgress = forwardRef48(
3573
+ function RadialProgress2({
3574
+ value,
3575
+ max = 100,
3576
+ size = 64,
3577
+ thickness = 4,
3578
+ tone,
3579
+ children,
3580
+ className,
3581
+ "aria-label": ariaLabel,
3582
+ ...props
3583
+ }, ref) {
3584
+ const clamped = Math.min(max, Math.max(0, value));
3585
+ const pct = max > 0 ? clamped / max * 100 : 0;
3586
+ const r = (size - thickness) / 2;
3587
+ const c = 2 * Math.PI * r;
3588
+ const dash = pct / 100 * c;
3589
+ const resolvedTone = tone ?? (clamped >= max ? "ok" : "accent");
3590
+ return /* @__PURE__ */ jsxs42(
3591
+ "div",
3592
+ {
3593
+ ref,
3594
+ role: "progressbar",
3595
+ "aria-valuemin": 0,
3596
+ "aria-valuemax": max,
3597
+ "aria-valuenow": Math.round(pct),
3598
+ "aria-label": ariaLabel ?? `${Math.round(pct)}%`,
3599
+ className: cn("relative inline-grid place-items-center", className),
3600
+ style: { width: size, height: size },
3601
+ ...props,
3602
+ children: [
3603
+ /* @__PURE__ */ jsxs42("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
3604
+ /* @__PURE__ */ jsx50(
3605
+ "circle",
3606
+ {
3607
+ cx: size / 2,
3608
+ cy: size / 2,
3609
+ r,
3610
+ fill: "none",
3611
+ strokeWidth: thickness,
3612
+ className: "stroke-panel-2"
3613
+ }
3614
+ ),
3615
+ /* @__PURE__ */ jsx50(
3616
+ "circle",
3617
+ {
3618
+ cx: size / 2,
3619
+ cy: size / 2,
3620
+ r,
3621
+ fill: "none",
3622
+ strokeWidth: thickness,
3623
+ strokeLinecap: "round",
3624
+ strokeDasharray: `${dash} ${c}`,
3625
+ transform: `rotate(-90 ${size / 2} ${size / 2})`,
3626
+ className: cn(
3627
+ "transition-[stroke-dasharray] duration-(--duration-step)",
3628
+ toneStrokeClass[resolvedTone]
3629
+ )
3630
+ }
3631
+ )
3632
+ ] }),
3633
+ /* @__PURE__ */ jsx50("div", { className: "absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums", children: children ?? `${Math.round(pct)}%` })
3634
+ ]
3635
+ }
3636
+ );
3637
+ }
3638
+ );
3639
+ RadialProgress.displayName = "RadialProgress";
3640
+
3641
+ // src/patterns/HealthScore/HealthScore.tsx
3642
+ import { jsx as jsx51, jsxs as jsxs43 } from "react/jsx-runtime";
3643
+ function deltaTone(delta) {
3644
+ if (delta > 0) return "ok";
3645
+ if (delta < 0) return "err";
3646
+ return "accent";
3647
+ }
3648
+ function deltaGlyph(delta) {
3649
+ if (delta > 0) return "\u2191";
3650
+ if (delta < 0) return "\u2193";
3651
+ return "\xB7";
3652
+ }
3653
+ var toneTextClass = {
3654
+ accent: "text-text-muted",
3655
+ ok: "text-ok",
3656
+ warn: "text-warn",
3657
+ err: "text-err"
3658
+ };
3659
+ var HealthScore = forwardRef49(function HealthScore2({
3660
+ value,
3661
+ max = 100,
3662
+ delta,
3663
+ label,
3664
+ breakdown,
3665
+ size = 72,
3666
+ tone,
3667
+ className,
3668
+ "aria-label": ariaLabel,
3669
+ ...props
3670
+ }, ref) {
3671
+ const pct = max > 0 ? Math.round(Math.min(max, Math.max(0, value)) / max * 100) : 0;
3672
+ const resolvedTone = tone ?? (pct >= 80 ? "ok" : pct >= 50 ? "accent" : "warn");
3673
+ const indicatorTone = typeof delta === "number" ? deltaTone(delta) : "accent";
3674
+ const core = /* @__PURE__ */ jsxs43(
3675
+ "div",
3676
+ {
3677
+ ref,
3678
+ className: cn("inline-flex flex-col items-center gap-1", className),
3679
+ "aria-label": ariaLabel ?? `${pct}% health`,
3680
+ ...props,
3681
+ children: [
3682
+ /* @__PURE__ */ jsx51(RadialProgress, { value, max, size, tone: resolvedTone }),
3683
+ label && /* @__PURE__ */ jsx51("div", { className: "text-text-muted mt-1 text-[12px] leading-tight", children: label }),
3684
+ typeof delta === "number" && /* @__PURE__ */ jsxs43("div", { className: cn("font-mono text-[11px] tabular-nums", toneTextClass[indicatorTone]), children: [
3685
+ /* @__PURE__ */ jsx51("span", { "aria-hidden": true, children: deltaGlyph(delta) }),
3686
+ " ",
3687
+ Math.abs(delta)
3688
+ ] })
3689
+ ]
3690
+ }
3691
+ );
3692
+ if (!breakdown || breakdown.length === 0) {
3693
+ return core;
3694
+ }
3695
+ return /* @__PURE__ */ jsx51(
3696
+ HoverCard,
3697
+ {
3698
+ trigger: /* @__PURE__ */ jsx51("span", { className: "inline-flex", children: core }),
3699
+ content: /* @__PURE__ */ jsxs43("div", { className: "flex min-w-[180px] flex-col gap-2", children: [
3700
+ /* @__PURE__ */ jsx51("div", { className: "text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase", children: "Breakdown" }),
3701
+ /* @__PURE__ */ jsx51("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-[12px]", children: breakdown.map((entry, i) => /* @__PURE__ */ jsxs43("li", { className: "flex items-center gap-2", children: [
3702
+ /* @__PURE__ */ jsx51("span", { className: "text-text-muted flex-1 truncate", children: entry.label }),
3703
+ /* @__PURE__ */ jsx51(
3704
+ "span",
3705
+ {
3706
+ className: cn(
3707
+ "font-mono tabular-nums",
3708
+ entry.tone ? toneTextClass[entry.tone] : "text-text"
3709
+ ),
3710
+ children: entry.value
3711
+ }
3712
+ )
3713
+ ] }, i)) })
3714
+ ] })
3715
+ }
3716
+ );
3717
+ });
3718
+ HealthScore.displayName = "HealthScore";
3719
+
3720
+ // src/patterns/LargeTitle/LargeTitle.tsx
3721
+ import { forwardRef as forwardRef50 } from "react";
3722
+ import { jsx as jsx52, jsxs as jsxs44 } from "react/jsx-runtime";
3723
+ var LargeTitle = forwardRef50(function LargeTitle2({ title, eyebrow, trailing, className, ...props }, ref) {
3724
+ return /* @__PURE__ */ jsxs44(
3725
+ "header",
3726
+ {
3727
+ ref,
3728
+ className: cn("px-screen flex items-end justify-between gap-3 py-3 pb-4", className),
3729
+ ...props,
3730
+ children: [
3731
+ /* @__PURE__ */ jsxs44("div", { className: "min-w-0 flex-1", children: [
3732
+ eyebrow && /* @__PURE__ */ jsx52("div", { className: "text-m-eyebrow text-accent mb-[6px] font-mono tracking-wide uppercase", children: eyebrow }),
3733
+ /* @__PURE__ */ jsx52("h1", { className: "text-m-h1 m-0 truncate leading-tight font-medium tracking-tight", children: title })
3734
+ ] }),
3735
+ trailing && /* @__PURE__ */ jsx52("div", { className: "shrink-0", children: trailing })
3736
+ ]
3737
+ }
3738
+ );
3739
+ });
3740
+ LargeTitle.displayName = "LargeTitle";
3741
+
3742
+ // src/patterns/Menubar/Menubar.tsx
3743
+ import * as RadixMenubar from "@radix-ui/react-menubar";
3744
+ import { forwardRef as forwardRef51 } from "react";
3745
+ import { jsx as jsx53, jsxs as jsxs45 } from "react/jsx-runtime";
3746
+ var Menubar = forwardRef51(function Menubar2({ className, ...props }, ref) {
3747
+ return /* @__PURE__ */ jsx53(
3748
+ RadixMenubar.Root,
3749
+ {
3750
+ ref,
3751
+ className: cn(
3752
+ "border-border bg-panel flex h-[30px] items-center gap-[2px] border-b px-3",
3753
+ className
3754
+ ),
3755
+ ...props
3756
+ }
3757
+ );
3758
+ });
3759
+ Menubar.displayName = "Menubar";
3760
+ var MenubarMenu = RadixMenubar.Menu;
3761
+ var MenubarTrigger = forwardRef51(
3762
+ function MenubarTrigger2({ className, ...props }, ref) {
3763
+ return /* @__PURE__ */ jsx53(
3764
+ RadixMenubar.Trigger,
3765
+ {
3766
+ ref,
3767
+ className: cn(
3768
+ "text-text cursor-pointer rounded-xs border-0 bg-transparent px-[10px] py-1 text-[12px] outline-none",
3769
+ "transition-colors duration-(--duration-micro)",
3770
+ "data-[state=open]:bg-panel-2 hover:bg-panel-2",
3771
+ "focus-visible:ring-accent-dim focus-visible:ring-[3px]",
3772
+ className
3773
+ ),
3774
+ ...props
3775
+ }
3776
+ );
3777
+ }
3778
+ );
3779
+ MenubarTrigger.displayName = "MenubarTrigger";
3780
+ var MenubarContent = forwardRef51(
3781
+ function MenubarContent2({ className, sideOffset = 6, align = "start", ...props }, ref) {
3782
+ return /* @__PURE__ */ jsx53(RadixMenubar.Portal, { children: /* @__PURE__ */ jsx53(
3783
+ RadixMenubar.Content,
3784
+ {
3785
+ ref,
3786
+ sideOffset,
3787
+ align,
3788
+ className: cn(
3789
+ "border-border-strong bg-panel z-popover min-w-[180px] rounded-md border p-1 shadow-lg outline-none",
3790
+ "data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]",
3791
+ className
3792
+ ),
3793
+ ...props
3794
+ }
3795
+ ) });
3796
+ }
3797
+ );
3798
+ MenubarContent.displayName = "MenubarContent";
3799
+ var itemBase3 = cn(
3800
+ "flex items-center gap-2 rounded-sm px-[10px] py-[6px] text-[12px] cursor-pointer outline-none",
3801
+ "data-[highlighted]:bg-panel-2",
3802
+ "data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
3803
+ );
3804
+ var MenubarItem = forwardRef51(function MenubarItem2({ trailing, destructive, className, children, ...props }, ref) {
3805
+ return /* @__PURE__ */ jsxs45(
3806
+ RadixMenubar.Item,
3807
+ {
3808
+ ref,
3809
+ className: cn(itemBase3, destructive ? "text-err" : "text-text", className),
3810
+ ...props,
3811
+ children: [
3812
+ /* @__PURE__ */ jsx53("span", { className: "flex-1", children }),
3813
+ trailing && /* @__PURE__ */ jsx53("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
3814
+ ]
3815
+ }
3816
+ );
3817
+ });
3818
+ MenubarItem.displayName = "MenubarItem";
3819
+ var MenubarSeparator = forwardRef51(
3820
+ function MenubarSeparator2({ className, ...props }, ref) {
3821
+ return /* @__PURE__ */ jsx53(
3822
+ RadixMenubar.Separator,
3823
+ {
3824
+ ref,
3825
+ className: cn("bg-border my-1 h-px", className),
3826
+ ...props
3827
+ }
3828
+ );
3829
+ }
3830
+ );
3831
+ MenubarSeparator.displayName = "MenubarSeparator";
3832
+
3833
+ // src/patterns/NavBar/NavBar.tsx
3834
+ import * as RadixNav from "@radix-ui/react-navigation-menu";
3835
+ import {
3836
+ forwardRef as forwardRef53,
3837
+ useCallback as useCallback10,
3838
+ useEffect as useEffect9,
3839
+ useRef as useRef7,
3840
+ useState as useState14
3841
+ } from "react";
3842
+
3843
+ // src/patterns/Sidebar/Sidebar.tsx
3844
+ import {
3845
+ forwardRef as forwardRef52,
3846
+ useCallback as useCallback9,
3847
+ useState as useState13
3848
+ } from "react";
3849
+ import { Fragment as Fragment2, jsx as jsx54, jsxs as jsxs46 } from "react/jsx-runtime";
3850
+ var Sidebar = forwardRef52(function Sidebar2({ width = 240, className, style, ...props }, ref) {
3851
+ return /* @__PURE__ */ jsx54(
3852
+ "aside",
3853
+ {
3854
+ ref,
3855
+ style: { width, ...style },
3381
3856
  className: cn(
3382
3857
  "border-border bg-panel flex h-full flex-col gap-2 border-r p-[14px]",
3383
3858
  className
@@ -3387,12 +3862,12 @@ var Sidebar = forwardRef47(function Sidebar2({ width = 240, className, style, ..
3387
3862
  );
3388
3863
  });
3389
3864
  Sidebar.displayName = "Sidebar";
3390
- var NavItem = forwardRef47(
3865
+ var NavItem = forwardRef52(
3391
3866
  function NavItem2({ icon, label, active, badge, href, disabled, className, ...props }, ref) {
3392
- const inner = /* @__PURE__ */ jsxs41(Fragment2, { children: [
3393
- icon && /* @__PURE__ */ jsx49("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: icon }),
3394
- /* @__PURE__ */ jsx49("span", { className: "flex-1 truncate", children: label }),
3395
- badge != null && /* @__PURE__ */ jsx49(
3867
+ const inner = /* @__PURE__ */ jsxs46(Fragment2, { children: [
3868
+ icon && /* @__PURE__ */ jsx54("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: icon }),
3869
+ /* @__PURE__ */ jsx54("span", { className: "flex-1 truncate", children: label }),
3870
+ badge != null && /* @__PURE__ */ jsx54(
3396
3871
  "span",
3397
3872
  {
3398
3873
  className: cn(
@@ -3413,7 +3888,7 @@ var NavItem = forwardRef47(
3413
3888
  );
3414
3889
  if (href) {
3415
3890
  const anchorProps = props;
3416
- return /* @__PURE__ */ jsx49(
3891
+ return /* @__PURE__ */ jsx54(
3417
3892
  "a",
3418
3893
  {
3419
3894
  ref,
@@ -3427,7 +3902,7 @@ var NavItem = forwardRef47(
3427
3902
  );
3428
3903
  }
3429
3904
  const buttonProps = props;
3430
- return /* @__PURE__ */ jsx49(
3905
+ return /* @__PURE__ */ jsx54(
3431
3906
  "button",
3432
3907
  {
3433
3908
  ref,
@@ -3442,7 +3917,7 @@ var NavItem = forwardRef47(
3442
3917
  }
3443
3918
  );
3444
3919
  NavItem.displayName = "NavItem";
3445
- var NavSection = forwardRef47(function NavSection2({
3920
+ var NavSection = forwardRef52(function NavSection2({
3446
3921
  label,
3447
3922
  icon,
3448
3923
  action,
@@ -3456,16 +3931,16 @@ var NavSection = forwardRef47(function NavSection2({
3456
3931
  ...props
3457
3932
  }, ref) {
3458
3933
  const isControlled = open !== void 0;
3459
- const [internalOpen, setInternalOpen] = useState12(defaultOpen);
3934
+ const [internalOpen, setInternalOpen] = useState13(defaultOpen);
3460
3935
  const isOpen = !collapsible || (isControlled ? open : internalOpen);
3461
- const toggle = useCallback8(() => {
3936
+ const toggle = useCallback9(() => {
3462
3937
  const next = !isOpen;
3463
3938
  if (!isControlled) setInternalOpen(next);
3464
3939
  onOpenChange?.(next);
3465
3940
  }, [isOpen, isControlled, onOpenChange]);
3466
3941
  const eyebrowClass = "text-text-dim flex items-center gap-[6px] px-2 pt-2 font-mono text-[9px] tracking-[1.4px] uppercase";
3467
- return /* @__PURE__ */ jsxs41("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
3468
- collapsible ? /* @__PURE__ */ jsxs41(
3942
+ return /* @__PURE__ */ jsxs46("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
3943
+ collapsible ? /* @__PURE__ */ jsxs46(
3469
3944
  "button",
3470
3945
  {
3471
3946
  type: "button",
@@ -3478,18 +3953,18 @@ var NavSection = forwardRef47(function NavSection2({
3478
3953
  "hover:text-text-muted"
3479
3954
  ),
3480
3955
  children: [
3481
- icon != null && /* @__PURE__ */ jsx49("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
3482
- /* @__PURE__ */ jsx49("span", { className: "flex-1 text-left", children: label }),
3956
+ icon != null && /* @__PURE__ */ jsx54("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
3957
+ /* @__PURE__ */ jsx54("span", { className: "flex-1 text-left", children: label }),
3483
3958
  action,
3484
- /* @__PURE__ */ jsx49("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
3959
+ /* @__PURE__ */ jsx54("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
3485
3960
  ]
3486
3961
  }
3487
- ) : /* @__PURE__ */ jsxs41("div", { className: eyebrowClass, children: [
3488
- icon != null && /* @__PURE__ */ jsx49("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
3489
- /* @__PURE__ */ jsx49("span", { className: "flex-1", children: label }),
3962
+ ) : /* @__PURE__ */ jsxs46("div", { className: eyebrowClass, children: [
3963
+ icon != null && /* @__PURE__ */ jsx54("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
3964
+ /* @__PURE__ */ jsx54("span", { className: "flex-1", children: label }),
3490
3965
  action
3491
3966
  ] }),
3492
- isOpen && /* @__PURE__ */ jsx49(
3967
+ isOpen && /* @__PURE__ */ jsx54(
3493
3968
  "div",
3494
3969
  {
3495
3970
  className: cn("flex flex-col gap-[2px]", indent > 0 && "border-border ml-2 border-l"),
@@ -3502,12 +3977,12 @@ var NavSection = forwardRef47(function NavSection2({
3502
3977
  NavSection.displayName = "NavSection";
3503
3978
 
3504
3979
  // src/patterns/NavBar/NavBar.tsx
3505
- import { Fragment as Fragment3, jsx as jsx50, jsxs as jsxs42 } from "react/jsx-runtime";
3980
+ import { Fragment as Fragment3, jsx as jsx55, jsxs as jsxs47 } from "react/jsx-runtime";
3506
3981
  function isActiveTree(item, activeId) {
3507
3982
  if (item.id === activeId) return true;
3508
3983
  return item.children?.some((c) => isActiveTree(c, activeId)) ?? false;
3509
3984
  }
3510
- var NavBar = forwardRef48(function NavBar2({
3985
+ var NavBar = forwardRef53(function NavBar2({
3511
3986
  orientation = "horizontal",
3512
3987
  items,
3513
3988
  brand,
@@ -3521,17 +3996,17 @@ var NavBar = forwardRef48(function NavBar2({
3521
3996
  ...props
3522
3997
  }, ref) {
3523
3998
  const isControlled = value !== void 0;
3524
- const [internalValue, setInternalValue] = useState13(defaultValue);
3999
+ const [internalValue, setInternalValue] = useState14(defaultValue);
3525
4000
  const activeId = isControlled ? value : internalValue;
3526
- const [drawerOpen, setDrawerOpen] = useState13(false);
3527
- const select = useCallback9(
4001
+ const [drawerOpen, setDrawerOpen] = useState14(false);
4002
+ const select = useCallback10(
3528
4003
  (id) => {
3529
4004
  if (!isControlled) setInternalValue(id);
3530
4005
  onValueChange?.(id);
3531
4006
  },
3532
4007
  [isControlled, onValueChange]
3533
4008
  );
3534
- const handleItemActivate = useCallback9(
4009
+ const handleItemActivate = useCallback10(
3535
4010
  (id) => {
3536
4011
  select(id);
3537
4012
  setDrawerOpen(false);
@@ -3543,7 +4018,7 @@ var NavBar = forwardRef48(function NavBar2({
3543
4018
  // drawer is open on a viewport that's resizing past `md`, both navs can
3544
4019
  // sit in the DOM together. Identical accessible names would trip axe's
3545
4020
  // `landmark-unique` rule.
3546
- /* @__PURE__ */ jsx50("nav", { "aria-label": "Mobile navigation", className: "flex flex-col gap-1", children: items.map((item) => /* @__PURE__ */ jsx50(
4021
+ /* @__PURE__ */ jsx55("nav", { "aria-label": "Mobile navigation", className: "flex flex-col gap-1", children: items.map((item) => /* @__PURE__ */ jsx55(
3547
4022
  VerticalItem,
3548
4023
  {
3549
4024
  item,
@@ -3553,14 +4028,14 @@ var NavBar = forwardRef48(function NavBar2({
3553
4028
  item.id
3554
4029
  )) })
3555
4030
  );
3556
- const mobileBar = responsive ? /* @__PURE__ */ jsxs42(
4031
+ const mobileBar = responsive ? /* @__PURE__ */ jsxs47(
3557
4032
  "div",
3558
4033
  {
3559
4034
  className: cn(
3560
4035
  "border-border bg-panel z-overlay sticky top-0 flex h-[52px] items-center gap-4 border-b px-5 md:hidden"
3561
4036
  ),
3562
4037
  children: [
3563
- /* @__PURE__ */ jsx50(
4038
+ /* @__PURE__ */ jsx55(
3564
4039
  "button",
3565
4040
  {
3566
4041
  type: "button",
@@ -3570,15 +4045,15 @@ var NavBar = forwardRef48(function NavBar2({
3570
4045
  children: "\u2630"
3571
4046
  }
3572
4047
  ),
3573
- brand && /* @__PURE__ */ jsx50("div", { className: "flex flex-1 items-center text-[13px] font-medium whitespace-nowrap", children: brand }),
3574
- actions && /* @__PURE__ */ jsx50("div", { className: "flex items-center gap-3", children: actions })
4048
+ brand && /* @__PURE__ */ jsx55("div", { className: "flex flex-1 items-center text-[13px] font-medium whitespace-nowrap", children: brand }),
4049
+ actions && /* @__PURE__ */ jsx55("div", { className: "flex items-center gap-3", children: actions })
3575
4050
  ]
3576
4051
  }
3577
4052
  ) : null;
3578
4053
  if (orientation === "horizontal") {
3579
- return /* @__PURE__ */ jsxs42(Fragment3, { children: [
4054
+ return /* @__PURE__ */ jsxs47(Fragment3, { children: [
3580
4055
  mobileBar,
3581
- /* @__PURE__ */ jsxs42(
4056
+ /* @__PURE__ */ jsxs47(
3582
4057
  "header",
3583
4058
  {
3584
4059
  ref,
@@ -3589,10 +4064,10 @@ var NavBar = forwardRef48(function NavBar2({
3589
4064
  ),
3590
4065
  ...props,
3591
4066
  children: [
3592
- brand && /* @__PURE__ */ jsx50("div", { className: "shrink-0 text-[13px] font-medium whitespace-nowrap", children: brand }),
3593
- /* @__PURE__ */ jsxs42(RadixNav.Root, { className: "relative flex-1", delayDuration: 120, children: [
3594
- /* @__PURE__ */ jsx50(RadixNav.List, { className: "m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!", children: items.map(
3595
- (item) => item.children?.length ? /* @__PURE__ */ jsx50(
4067
+ brand && /* @__PURE__ */ jsx55("div", { className: "shrink-0 text-[13px] font-medium whitespace-nowrap", children: brand }),
4068
+ /* @__PURE__ */ jsxs47(RadixNav.Root, { className: "relative flex-1", delayDuration: 120, children: [
4069
+ /* @__PURE__ */ jsx55(RadixNav.List, { className: "m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!", children: items.map(
4070
+ (item) => item.children?.length ? /* @__PURE__ */ jsx55(
3596
4071
  HorizontalDropdown,
3597
4072
  {
3598
4073
  item,
@@ -3601,7 +4076,7 @@ var NavBar = forwardRef48(function NavBar2({
3601
4076
  onActivate: handleItemActivate
3602
4077
  },
3603
4078
  item.id
3604
- ) : /* @__PURE__ */ jsx50(RadixNav.Item, { children: /* @__PURE__ */ jsx50(
4079
+ ) : /* @__PURE__ */ jsx55(RadixNav.Item, { children: /* @__PURE__ */ jsx55(
3605
4080
  HorizontalLink,
3606
4081
  {
3607
4082
  item,
@@ -3610,13 +4085,13 @@ var NavBar = forwardRef48(function NavBar2({
3610
4085
  }
3611
4086
  ) }, item.id)
3612
4087
  ) }),
3613
- /* @__PURE__ */ jsx50("div", { className: "z-popover absolute top-full left-0 flex justify-start", children: /* @__PURE__ */ jsx50(RadixNav.Viewport, { className: "origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]" }) })
4088
+ /* @__PURE__ */ jsx55("div", { className: "z-popover absolute top-full left-0 flex justify-start", children: /* @__PURE__ */ jsx55(RadixNav.Viewport, { className: "origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]" }) })
3614
4089
  ] }),
3615
- actions && /* @__PURE__ */ jsx50("div", { className: "flex items-center gap-3", children: actions })
4090
+ actions && /* @__PURE__ */ jsx55("div", { className: "flex items-center gap-3", children: actions })
3616
4091
  ]
3617
4092
  }
3618
4093
  ),
3619
- responsive && /* @__PURE__ */ jsx50(
4094
+ responsive && /* @__PURE__ */ jsx55(
3620
4095
  Drawer,
3621
4096
  {
3622
4097
  open: drawerOpen,
@@ -3629,9 +4104,9 @@ var NavBar = forwardRef48(function NavBar2({
3629
4104
  )
3630
4105
  ] });
3631
4106
  }
3632
- return /* @__PURE__ */ jsxs42(Fragment3, { children: [
4107
+ return /* @__PURE__ */ jsxs47(Fragment3, { children: [
3633
4108
  mobileBar,
3634
- /* @__PURE__ */ jsxs42(
4109
+ /* @__PURE__ */ jsxs47(
3635
4110
  "aside",
3636
4111
  {
3637
4112
  ref,
@@ -3644,8 +4119,8 @@ var NavBar = forwardRef48(function NavBar2({
3644
4119
  ),
3645
4120
  ...props,
3646
4121
  children: [
3647
- brand && /* @__PURE__ */ jsx50("div", { className: "px-2 py-1 text-[13px] font-medium", children: brand }),
3648
- /* @__PURE__ */ jsx50("nav", { "aria-label": "Sidebar navigation", className: "flex flex-1 flex-col gap-1 overflow-y-auto", children: items.map((item) => /* @__PURE__ */ jsx50(
4122
+ brand && /* @__PURE__ */ jsx55("div", { className: "px-2 py-1 text-[13px] font-medium", children: brand }),
4123
+ /* @__PURE__ */ jsx55("nav", { "aria-label": "Sidebar navigation", className: "flex flex-1 flex-col gap-1 overflow-y-auto", children: items.map((item) => /* @__PURE__ */ jsx55(
3649
4124
  VerticalItem,
3650
4125
  {
3651
4126
  item,
@@ -3654,11 +4129,11 @@ var NavBar = forwardRef48(function NavBar2({
3654
4129
  },
3655
4130
  item.id
3656
4131
  )) }),
3657
- actions && /* @__PURE__ */ jsx50("div", { className: "border-border mt-auto flex flex-col gap-2 border-t pt-3", children: actions })
4132
+ actions && /* @__PURE__ */ jsx55("div", { className: "border-border mt-auto flex flex-col gap-2 border-t pt-3", children: actions })
3658
4133
  ]
3659
4134
  }
3660
4135
  ),
3661
- responsive && /* @__PURE__ */ jsx50(
4136
+ responsive && /* @__PURE__ */ jsx55(
3662
4137
  Drawer,
3663
4138
  {
3664
4139
  open: drawerOpen,
@@ -3687,13 +4162,13 @@ function HorizontalLink({ item, active, onActivate }) {
3687
4162
  }
3688
4163
  onActivate(item.id);
3689
4164
  };
3690
- const inner = /* @__PURE__ */ jsxs42(Fragment3, { children: [
3691
- item.icon != null && /* @__PURE__ */ jsx50("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
3692
- /* @__PURE__ */ jsx50("span", { children: item.label }),
3693
- item.badge != null && /* @__PURE__ */ jsx50(ItemBadge, { active, children: item.badge })
4165
+ const inner = /* @__PURE__ */ jsxs47(Fragment3, { children: [
4166
+ item.icon != null && /* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
4167
+ /* @__PURE__ */ jsx55("span", { children: item.label }),
4168
+ item.badge != null && /* @__PURE__ */ jsx55(ItemBadge, { active, children: item.badge })
3694
4169
  ] });
3695
4170
  if (item.href) {
3696
- return /* @__PURE__ */ jsx50(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx50(
4171
+ return /* @__PURE__ */ jsx55(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx55(
3697
4172
  "a",
3698
4173
  {
3699
4174
  href: item.href,
@@ -3705,7 +4180,7 @@ function HorizontalLink({ item, active, onActivate }) {
3705
4180
  }
3706
4181
  ) });
3707
4182
  }
3708
- return /* @__PURE__ */ jsx50(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx50(
4183
+ return /* @__PURE__ */ jsx55(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx55(
3709
4184
  "button",
3710
4185
  {
3711
4186
  type: "button",
@@ -3718,8 +4193,8 @@ function HorizontalLink({ item, active, onActivate }) {
3718
4193
  ) });
3719
4194
  }
3720
4195
  function HorizontalDropdown({ item, active, activeId, onActivate }) {
3721
- return /* @__PURE__ */ jsxs42(RadixNav.Item, { children: [
3722
- /* @__PURE__ */ jsxs42(
4196
+ return /* @__PURE__ */ jsxs47(RadixNav.Item, { children: [
4197
+ /* @__PURE__ */ jsxs47(
3723
4198
  RadixNav.Trigger,
3724
4199
  {
3725
4200
  className: cn(
@@ -3731,9 +4206,9 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
3731
4206
  ),
3732
4207
  disabled: item.disabled,
3733
4208
  children: [
3734
- item.icon != null && /* @__PURE__ */ jsx50("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
3735
- /* @__PURE__ */ jsx50("span", { children: item.label }),
3736
- /* @__PURE__ */ jsx50(
4209
+ item.icon != null && /* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
4210
+ /* @__PURE__ */ jsx55("span", { children: item.label }),
4211
+ /* @__PURE__ */ jsx55(
3737
4212
  "span",
3738
4213
  {
3739
4214
  "aria-hidden": true,
@@ -3744,7 +4219,7 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
3744
4219
  ]
3745
4220
  }
3746
4221
  ),
3747
- /* @__PURE__ */ jsx50(RadixNav.Content, { className: "border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg", children: /* @__PURE__ */ jsx50("ul", { className: "m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!", children: item.children.map((child) => /* @__PURE__ */ jsx50("li", { children: /* @__PURE__ */ jsx50(DropdownLink, { item: child, active: child.id === activeId, onActivate }) }, child.id)) }) })
4222
+ /* @__PURE__ */ jsx55(RadixNav.Content, { className: "border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg", children: /* @__PURE__ */ jsx55("ul", { className: "m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!", children: item.children.map((child) => /* @__PURE__ */ jsx55("li", { children: /* @__PURE__ */ jsx55(DropdownLink, { item: child, active: child.id === activeId, onActivate }) }, child.id)) }) })
3748
4223
  ] });
3749
4224
  }
3750
4225
  function DropdownLink({ item, active, onActivate }) {
@@ -3761,13 +4236,13 @@ function DropdownLink({ item, active, onActivate }) {
3761
4236
  }
3762
4237
  onActivate(item.id);
3763
4238
  };
3764
- const inner = /* @__PURE__ */ jsxs42(Fragment3, { children: [
3765
- item.icon != null && /* @__PURE__ */ jsx50("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
3766
- /* @__PURE__ */ jsx50("span", { className: "flex-1", children: item.label }),
3767
- item.badge != null && /* @__PURE__ */ jsx50(ItemBadge, { active, children: item.badge })
4239
+ const inner = /* @__PURE__ */ jsxs47(Fragment3, { children: [
4240
+ item.icon != null && /* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
4241
+ /* @__PURE__ */ jsx55("span", { className: "flex-1", children: item.label }),
4242
+ item.badge != null && /* @__PURE__ */ jsx55(ItemBadge, { active, children: item.badge })
3768
4243
  ] });
3769
4244
  if (item.href) {
3770
- return /* @__PURE__ */ jsx50(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx50(
4245
+ return /* @__PURE__ */ jsx55(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx55(
3771
4246
  "a",
3772
4247
  {
3773
4248
  href: item.href,
@@ -3779,7 +4254,7 @@ function DropdownLink({ item, active, onActivate }) {
3779
4254
  }
3780
4255
  ) });
3781
4256
  }
3782
- return /* @__PURE__ */ jsx50(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx50(
4257
+ return /* @__PURE__ */ jsx55(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx55(
3783
4258
  "button",
3784
4259
  {
3785
4260
  type: "button",
@@ -3794,7 +4269,7 @@ function DropdownLink({ item, active, onActivate }) {
3794
4269
  function VerticalItem({ item, activeId, onActivate }) {
3795
4270
  const hasChildren = (item.children?.length ?? 0) > 0;
3796
4271
  const treeActive = isActiveTree(item, activeId);
3797
- const [open, setOpen] = useState13(treeActive);
4272
+ const [open, setOpen] = useState14(treeActive);
3798
4273
  const prevTreeActive = useRef7(treeActive);
3799
4274
  useEffect9(() => {
3800
4275
  if (treeActive && !prevTreeActive.current) setOpen(true);
@@ -3808,7 +4283,7 @@ function VerticalItem({ item, activeId, onActivate }) {
3808
4283
  }
3809
4284
  onActivate(item.id);
3810
4285
  };
3811
- return /* @__PURE__ */ jsx50(
4286
+ return /* @__PURE__ */ jsx55(
3812
4287
  NavItem,
3813
4288
  {
3814
4289
  icon: item.icon,
@@ -3821,8 +4296,8 @@ function VerticalItem({ item, activeId, onActivate }) {
3821
4296
  }
3822
4297
  );
3823
4298
  }
3824
- return /* @__PURE__ */ jsxs42("div", { className: "flex flex-col", children: [
3825
- /* @__PURE__ */ jsxs42(
4299
+ return /* @__PURE__ */ jsxs47("div", { className: "flex flex-col", children: [
4300
+ /* @__PURE__ */ jsxs47(
3826
4301
  "button",
3827
4302
  {
3828
4303
  type: "button",
@@ -3838,18 +4313,18 @@ function VerticalItem({ item, activeId, onActivate }) {
3838
4313
  item.disabled && "pointer-events-none opacity-50"
3839
4314
  ),
3840
4315
  children: [
3841
- item.icon != null && /* @__PURE__ */ jsx50("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: item.icon }),
3842
- /* @__PURE__ */ jsx50("span", { className: "flex-1 truncate", children: item.label }),
3843
- item.badge != null && /* @__PURE__ */ jsx50(ItemBadge, { active: treeActive, children: item.badge }),
3844
- /* @__PURE__ */ jsx50("span", { "aria-hidden": true, className: "text-[10px] opacity-60", children: open ? "\u25BE" : "\u25B8" })
4316
+ item.icon != null && /* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: item.icon }),
4317
+ /* @__PURE__ */ jsx55("span", { className: "flex-1 truncate", children: item.label }),
4318
+ item.badge != null && /* @__PURE__ */ jsx55(ItemBadge, { active: treeActive, children: item.badge }),
4319
+ /* @__PURE__ */ jsx55("span", { "aria-hidden": true, className: "text-[10px] opacity-60", children: open ? "\u25BE" : "\u25B8" })
3845
4320
  ]
3846
4321
  }
3847
4322
  ),
3848
- open && /* @__PURE__ */ jsx50("div", { className: "border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3", children: item.children.map((child) => /* @__PURE__ */ jsx50(VerticalItem, { item: child, activeId, onActivate }, child.id)) })
4323
+ open && /* @__PURE__ */ jsx55("div", { className: "border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3", children: item.children.map((child) => /* @__PURE__ */ jsx55(VerticalItem, { item: child, activeId, onActivate }, child.id)) })
3849
4324
  ] });
3850
4325
  }
3851
4326
  function ItemBadge({ active, children }) {
3852
- return /* @__PURE__ */ jsx50(
4327
+ return /* @__PURE__ */ jsx55(
3853
4328
  "span",
3854
4329
  {
3855
4330
  className: cn(
@@ -3861,9 +4336,105 @@ function ItemBadge({ active, children }) {
3861
4336
  );
3862
4337
  }
3863
4338
 
4339
+ // src/patterns/OnboardingChecklist/OnboardingChecklist.tsx
4340
+ import { forwardRef as forwardRef54 } from "react";
4341
+ import { Fragment as Fragment4, jsx as jsx56, jsxs as jsxs48 } from "react/jsx-runtime";
4342
+ var statusDot = {
4343
+ pending: "off",
4344
+ "in-progress": "sync",
4345
+ done: "ok"
4346
+ };
4347
+ var labelStateClass = {
4348
+ pending: "text-text",
4349
+ "in-progress": "text-text",
4350
+ done: "text-text-dim line-through"
4351
+ };
4352
+ var OnboardingChecklist = forwardRef54(
4353
+ function OnboardingChecklist2({ items, onItemClick, title = "Get started", progressLabel, hideProgress, className, ...props }, ref) {
4354
+ const total = items.length;
4355
+ const done = items.filter((i) => i.status === "done").length;
4356
+ return /* @__PURE__ */ jsxs48(
4357
+ "section",
4358
+ {
4359
+ ref,
4360
+ "aria-label": typeof title === "string" ? title : void 0,
4361
+ className: cn(
4362
+ "rounded-base border-border bg-panel flex flex-col gap-3 border p-5",
4363
+ className
4364
+ ),
4365
+ ...props,
4366
+ children: [
4367
+ /* @__PURE__ */ jsxs48("header", { className: "flex items-center gap-2", children: [
4368
+ /* @__PURE__ */ jsx56("span", { className: "text-[14px] font-medium", children: title }),
4369
+ /* @__PURE__ */ jsx56("span", { className: "text-text-dim ml-auto font-mono text-[11px] tabular-nums", children: progressLabel ?? `${done} of ${total} complete` })
4370
+ ] }),
4371
+ !hideProgress && total > 0 && /* @__PURE__ */ jsx56(
4372
+ "div",
4373
+ {
4374
+ role: "progressbar",
4375
+ "aria-valuemin": 0,
4376
+ "aria-valuemax": total,
4377
+ "aria-valuenow": done,
4378
+ "aria-label": typeof title === "string" ? `${title} progress` : "Setup progress",
4379
+ className: "bg-panel-2 h-[3px] w-full overflow-hidden rounded-full",
4380
+ children: /* @__PURE__ */ jsx56(
4381
+ "span",
4382
+ {
4383
+ "aria-hidden": true,
4384
+ className: cn(
4385
+ "block h-full rounded-full transition-[width] duration-(--duration-step)",
4386
+ done === total ? "bg-ok" : "bg-accent"
4387
+ ),
4388
+ style: { width: `${total > 0 ? done / total * 100 : 0}%` }
4389
+ }
4390
+ )
4391
+ }
4392
+ ),
4393
+ /* @__PURE__ */ jsx56("ul", { className: "m-0 flex list-none flex-col gap-1 p-0", children: items.map((item) => {
4394
+ const interactive = typeof onItemClick === "function";
4395
+ const labelBlock = /* @__PURE__ */ jsxs48(Fragment4, { children: [
4396
+ /* @__PURE__ */ jsx56(
4397
+ StatusDot,
4398
+ {
4399
+ state: statusDot[item.status],
4400
+ pulse: item.status === "in-progress",
4401
+ size: 10,
4402
+ className: "mt-[3px]"
4403
+ }
4404
+ ),
4405
+ /* @__PURE__ */ jsxs48("div", { className: "flex min-w-0 flex-1 flex-col gap-[2px]", children: [
4406
+ /* @__PURE__ */ jsx56("span", { className: cn("text-[13px]", labelStateClass[item.status]), children: item.label }),
4407
+ item.description && /* @__PURE__ */ jsx56("span", { className: "text-text-muted text-[12px] leading-[1.45]", children: item.description })
4408
+ ] })
4409
+ ] });
4410
+ const labelRegionClass = cn(
4411
+ "flex flex-1 items-start gap-3 rounded-md px-2 py-2 text-left transition-colors duration-(--duration-micro)",
4412
+ interactive && "cursor-pointer outline-none hover:bg-panel-2 focus-visible:ring-[3px] focus-visible:ring-accent-dim"
4413
+ );
4414
+ return /* @__PURE__ */ jsxs48("li", { className: "flex items-start gap-2", children: [
4415
+ interactive ? /* @__PURE__ */ jsx56(
4416
+ "button",
4417
+ {
4418
+ type: "button",
4419
+ "aria-current": item.status === "in-progress" ? "step" : void 0,
4420
+ onClick: () => onItemClick(item.id),
4421
+ className: labelRegionClass,
4422
+ children: labelBlock
4423
+ }
4424
+ ) : /* @__PURE__ */ jsx56("div", { className: labelRegionClass, children: labelBlock }),
4425
+ item.action && /* @__PURE__ */ jsx56("div", { className: "shrink-0 self-center", children: item.action })
4426
+ ] }, item.id);
4427
+ }) })
4428
+ ]
4429
+ }
4430
+ );
4431
+ }
4432
+ );
4433
+ OnboardingChecklist.displayName = "OnboardingChecklist";
4434
+
3864
4435
  // src/patterns/Pagination/Pagination.tsx
3865
- import { forwardRef as forwardRef49 } from "react";
3866
- import { jsx as jsx51, jsxs as jsxs43 } from "react/jsx-runtime";
4436
+ import { forwardRef as forwardRef55 } from "react";
4437
+ import { jsx as jsx57, jsxs as jsxs49 } from "react/jsx-runtime";
3867
4438
  function buildRange(page, total, siblings) {
3868
4439
  if (total <= 0) return [];
3869
4440
  const items = [];
@@ -3876,9 +4447,9 @@ function buildRange(page, total, siblings) {
3876
4447
  if (total > 1) items.push(total);
3877
4448
  return items;
3878
4449
  }
3879
- var Pagination = forwardRef49(function Pagination2({ page, total, onPageChange, siblings = 1, className, ...props }, ref) {
4450
+ var Pagination = forwardRef55(function Pagination2({ page, total, onPageChange, siblings = 1, className, ...props }, ref) {
3880
4451
  const items = buildRange(page, total, siblings);
3881
- return /* @__PURE__ */ jsxs43(
4452
+ return /* @__PURE__ */ jsxs49(
3882
4453
  "nav",
3883
4454
  {
3884
4455
  ref,
@@ -3886,7 +4457,7 @@ var Pagination = forwardRef49(function Pagination2({ page, total, onPageChange,
3886
4457
  className: cn("inline-flex items-center gap-1", className),
3887
4458
  ...props,
3888
4459
  children: [
3889
- /* @__PURE__ */ jsx51(
4460
+ /* @__PURE__ */ jsx57(
3890
4461
  IconButton,
3891
4462
  {
3892
4463
  size: "sm",
@@ -3899,7 +4470,7 @@ var Pagination = forwardRef49(function Pagination2({ page, total, onPageChange,
3899
4470
  ),
3900
4471
  items.map((item, i) => {
3901
4472
  if (item === "start-ellipsis" || item === "end-ellipsis") {
3902
- return /* @__PURE__ */ jsx51(
4473
+ return /* @__PURE__ */ jsx57(
3903
4474
  "span",
3904
4475
  {
3905
4476
  "aria-hidden": true,
@@ -3910,7 +4481,7 @@ var Pagination = forwardRef49(function Pagination2({ page, total, onPageChange,
3910
4481
  );
3911
4482
  }
3912
4483
  const isActive = item === page;
3913
- return /* @__PURE__ */ jsx51(
4484
+ return /* @__PURE__ */ jsx57(
3914
4485
  "button",
3915
4486
  {
3916
4487
  type: "button",
@@ -3928,7 +4499,7 @@ var Pagination = forwardRef49(function Pagination2({ page, total, onPageChange,
3928
4499
  item
3929
4500
  );
3930
4501
  }),
3931
- /* @__PURE__ */ jsx51(
4502
+ /* @__PURE__ */ jsx57(
3932
4503
  IconButton,
3933
4504
  {
3934
4505
  size: "sm",
@@ -3947,8 +4518,8 @@ Pagination.displayName = "Pagination";
3947
4518
 
3948
4519
  // src/patterns/Progress/Progress.tsx
3949
4520
  import { cva as cva11 } from "class-variance-authority";
3950
- import { forwardRef as forwardRef50 } from "react";
3951
- import { jsx as jsx52, jsxs as jsxs44 } from "react/jsx-runtime";
4521
+ import { forwardRef as forwardRef56 } from "react";
4522
+ import { jsx as jsx58, jsxs as jsxs50 } from "react/jsx-runtime";
3952
4523
  var trackStyles = cva11("w-full rounded-full bg-panel-2 overflow-hidden", {
3953
4524
  variants: {
3954
4525
  size: {
@@ -3970,7 +4541,7 @@ var fillStyles = cva11("h-full rounded-full transition-[width] duration-(--durat
3970
4541
  },
3971
4542
  defaultVariants: { tone: "accent" }
3972
4543
  });
3973
- var Progress = forwardRef50(function Progress2({
4544
+ var Progress = forwardRef56(function Progress2({
3974
4545
  value = 0,
3975
4546
  max = 100,
3976
4547
  indeterminate = false,
@@ -3984,15 +4555,15 @@ var Progress = forwardRef50(function Progress2({
3984
4555
  const clamped = Math.min(max, Math.max(0, value));
3985
4556
  const pct = max > 0 ? clamped / max * 100 : 0;
3986
4557
  const display = Math.round(pct);
3987
- return /* @__PURE__ */ jsxs44("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
3988
- label != null && /* @__PURE__ */ jsxs44("div", { className: "flex text-[12px]", children: [
3989
- /* @__PURE__ */ jsx52("span", { className: "text-text-muted", children: label }),
3990
- showValue && !indeterminate && /* @__PURE__ */ jsxs44("span", { className: "text-text ml-auto font-mono tabular-nums", children: [
4558
+ return /* @__PURE__ */ jsxs50("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
4559
+ label != null && /* @__PURE__ */ jsxs50("div", { className: "flex text-[12px]", children: [
4560
+ /* @__PURE__ */ jsx58("span", { className: "text-text-muted", children: label }),
4561
+ showValue && !indeterminate && /* @__PURE__ */ jsxs50("span", { className: "text-text ml-auto font-mono tabular-nums", children: [
3991
4562
  display,
3992
4563
  "%"
3993
4564
  ] })
3994
4565
  ] }),
3995
- /* @__PURE__ */ jsx52(
4566
+ /* @__PURE__ */ jsx58(
3996
4567
  "div",
3997
4568
  {
3998
4569
  role: "progressbar",
@@ -4001,7 +4572,7 @@ var Progress = forwardRef50(function Progress2({
4001
4572
  "aria-valuenow": indeterminate ? void 0 : display,
4002
4573
  "aria-label": typeof label === "string" ? label : void 0,
4003
4574
  className: trackStyles({ size }),
4004
- children: indeterminate ? /* @__PURE__ */ jsx52(
4575
+ children: indeterminate ? /* @__PURE__ */ jsx58(
4005
4576
  "span",
4006
4577
  {
4007
4578
  "aria-hidden": true,
@@ -4011,94 +4582,61 @@ var Progress = forwardRef50(function Progress2({
4011
4582
  "animate-[ship-indeterminate_1.4s_linear_infinite]"
4012
4583
  )
4013
4584
  }
4014
- ) : /* @__PURE__ */ jsx52("span", { "aria-hidden": true, className: fillStyles({ tone }), style: { width: `${pct}%` } })
4585
+ ) : /* @__PURE__ */ jsx58("span", { "aria-hidden": true, className: fillStyles({ tone }), style: { width: `${pct}%` } })
4015
4586
  }
4016
4587
  )
4017
4588
  ] });
4018
4589
  });
4019
4590
  Progress.displayName = "Progress";
4020
4591
 
4021
- // src/patterns/RadialProgress/RadialProgress.tsx
4022
- import { forwardRef as forwardRef51 } from "react";
4023
- import { jsx as jsx53, jsxs as jsxs45 } from "react/jsx-runtime";
4024
- var toneStrokeClass = {
4025
- accent: "stroke-accent",
4026
- ok: "stroke-ok",
4027
- warn: "stroke-warn",
4028
- err: "stroke-err"
4592
+ // src/patterns/PullToRefresh/PullToRefresh.tsx
4593
+ import { forwardRef as forwardRef57 } from "react";
4594
+ import { jsx as jsx59, jsxs as jsxs51 } from "react/jsx-runtime";
4595
+ var labels = {
4596
+ idle: "Pull to refresh",
4597
+ pulling: "Pull to refresh",
4598
+ ready: "Release to refresh",
4599
+ loading: "Refreshing\u2026"
4029
4600
  };
4030
- var RadialProgress = forwardRef51(
4031
- function RadialProgress2({
4032
- value,
4033
- max = 100,
4034
- size = 64,
4035
- thickness = 4,
4036
- tone,
4037
- children,
4038
- className,
4039
- "aria-label": ariaLabel,
4040
- ...props
4041
- }, ref) {
4042
- const clamped = Math.min(max, Math.max(0, value));
4043
- const pct = max > 0 ? clamped / max * 100 : 0;
4044
- const r = (size - thickness) / 2;
4045
- const c = 2 * Math.PI * r;
4046
- const dash = pct / 100 * c;
4047
- const resolvedTone = tone ?? (clamped >= max ? "ok" : "accent");
4048
- return /* @__PURE__ */ jsxs45(
4049
- "div",
4050
- {
4051
- ref,
4052
- role: "progressbar",
4053
- "aria-valuemin": 0,
4054
- "aria-valuemax": max,
4055
- "aria-valuenow": Math.round(pct),
4056
- "aria-label": ariaLabel ?? `${Math.round(pct)}%`,
4057
- className: cn("relative inline-grid place-items-center", className),
4058
- style: { width: size, height: size },
4059
- ...props,
4060
- children: [
4061
- /* @__PURE__ */ jsxs45("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
4062
- /* @__PURE__ */ jsx53(
4063
- "circle",
4064
- {
4065
- cx: size / 2,
4066
- cy: size / 2,
4067
- r,
4068
- fill: "none",
4069
- strokeWidth: thickness,
4070
- className: "stroke-panel-2"
4071
- }
4601
+ var PullToRefresh = forwardRef57(function PullToRefresh2({ state = "idle", label, className, ...props }, ref) {
4602
+ const isLoading = state === "loading";
4603
+ const transform = state === "ready" ? "rotate(180deg)" : state === "pulling" ? "rotate(90deg)" : "rotate(0deg)";
4604
+ return /* @__PURE__ */ jsxs51(
4605
+ "div",
4606
+ {
4607
+ ref,
4608
+ role: "status",
4609
+ "aria-live": "polite",
4610
+ "aria-busy": isLoading || void 0,
4611
+ className: cn("text-text-muted flex flex-col items-center gap-[6px] py-3", className),
4612
+ ...props,
4613
+ children: [
4614
+ /* @__PURE__ */ jsx59(
4615
+ "div",
4616
+ {
4617
+ "aria-hidden": true,
4618
+ className: cn(
4619
+ "border-border border-t-accent rounded-full border-2",
4620
+ isLoading && "animate-[ship-spin_700ms_linear_infinite]"
4072
4621
  ),
4073
- /* @__PURE__ */ jsx53(
4074
- "circle",
4075
- {
4076
- cx: size / 2,
4077
- cy: size / 2,
4078
- r,
4079
- fill: "none",
4080
- strokeWidth: thickness,
4081
- strokeLinecap: "round",
4082
- strokeDasharray: `${dash} ${c}`,
4083
- transform: `rotate(-90 ${size / 2} ${size / 2})`,
4084
- className: cn(
4085
- "transition-[stroke-dasharray] duration-(--duration-step)",
4086
- toneStrokeClass[resolvedTone]
4087
- )
4088
- }
4089
- )
4090
- ] }),
4091
- /* @__PURE__ */ jsx53("div", { className: "absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums", children: children ?? `${Math.round(pct)}%` })
4092
- ]
4093
- }
4094
- );
4095
- }
4096
- );
4097
- RadialProgress.displayName = "RadialProgress";
4622
+ style: {
4623
+ width: 22,
4624
+ height: 22,
4625
+ transform: isLoading ? void 0 : transform,
4626
+ transition: isLoading ? void 0 : "transform 200ms var(--easing-out)"
4627
+ }
4628
+ }
4629
+ ),
4630
+ /* @__PURE__ */ jsx59("span", { className: "text-m-eyebrow font-mono tracking-wide uppercase", children: label ?? labels[state] })
4631
+ ]
4632
+ }
4633
+ );
4634
+ });
4635
+ PullToRefresh.displayName = "PullToRefresh";
4098
4636
 
4099
4637
  // src/patterns/Sparkline/Sparkline.tsx
4100
- import { forwardRef as forwardRef52, useMemo as useMemo5 } from "react";
4101
- import { jsx as jsx54, jsxs as jsxs46 } from "react/jsx-runtime";
4638
+ import { forwardRef as forwardRef58, useMemo as useMemo5 } from "react";
4639
+ import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
4102
4640
  function buildPath(values, w, h) {
4103
4641
  if (values.length === 0) return { line: "", area: "" };
4104
4642
  const pad = 2;
@@ -4117,7 +4655,7 @@ function buildPath(values, w, h) {
4117
4655
  )} L${pad.toFixed(2)},${(h - pad).toFixed(2)} Z`;
4118
4656
  return { line, area };
4119
4657
  }
4120
- var Sparkline = forwardRef52(function Sparkline2({
4658
+ var Sparkline = forwardRef58(function Sparkline2({
4121
4659
  values,
4122
4660
  width = 160,
4123
4661
  height = 32,
@@ -4129,7 +4667,7 @@ var Sparkline = forwardRef52(function Sparkline2({
4129
4667
  ...props
4130
4668
  }, ref) {
4131
4669
  const { line, area } = useMemo5(() => buildPath(values, width, height), [values, width, height]);
4132
- return /* @__PURE__ */ jsxs46(
4670
+ return /* @__PURE__ */ jsxs52(
4133
4671
  "svg",
4134
4672
  {
4135
4673
  ref,
@@ -4141,8 +4679,8 @@ var Sparkline = forwardRef52(function Sparkline2({
4141
4679
  className: cn("inline-block", className),
4142
4680
  ...props,
4143
4681
  children: [
4144
- fill && /* @__PURE__ */ jsx54("path", { d: area, fill: stroke, fillOpacity: 0.16, stroke: "none" }),
4145
- /* @__PURE__ */ jsx54(
4682
+ fill && /* @__PURE__ */ jsx60("path", { d: area, fill: stroke, fillOpacity: 0.16, stroke: "none" }),
4683
+ /* @__PURE__ */ jsx60(
4146
4684
  "path",
4147
4685
  {
4148
4686
  d: line,
@@ -4160,16 +4698,16 @@ var Sparkline = forwardRef52(function Sparkline2({
4160
4698
  Sparkline.displayName = "Sparkline";
4161
4699
 
4162
4700
  // src/patterns/Spinner/Spinner.tsx
4163
- import { forwardRef as forwardRef53 } from "react";
4164
- import { jsx as jsx55 } from "react/jsx-runtime";
4701
+ import { forwardRef as forwardRef59 } from "react";
4702
+ import { jsx as jsx61 } from "react/jsx-runtime";
4165
4703
  var sizes = {
4166
4704
  sm: { box: "h-3 w-3", border: "border-[2px]" },
4167
4705
  md: { box: "h-4 w-4", border: "border-[2px]" },
4168
4706
  lg: { box: "h-5 w-5", border: "border-[2px]" }
4169
4707
  };
4170
- var Spinner2 = forwardRef53(function Spinner3({ size = "md", label = "Loading", className, ...props }, ref) {
4708
+ var Spinner2 = forwardRef59(function Spinner3({ size = "md", label = "Loading", className, ...props }, ref) {
4171
4709
  const s = sizes[size];
4172
- return /* @__PURE__ */ jsx55(
4710
+ return /* @__PURE__ */ jsx61(
4173
4711
  "span",
4174
4712
  {
4175
4713
  ref,
@@ -4177,7 +4715,7 @@ var Spinner2 = forwardRef53(function Spinner3({ size = "md", label = "Loading",
4177
4715
  "aria-label": label,
4178
4716
  className: cn("inline-block", className),
4179
4717
  ...props,
4180
- children: /* @__PURE__ */ jsx55(
4718
+ children: /* @__PURE__ */ jsx61(
4181
4719
  "span",
4182
4720
  {
4183
4721
  "aria-hidden": true,
@@ -4194,15 +4732,15 @@ var Spinner2 = forwardRef53(function Spinner3({ size = "md", label = "Loading",
4194
4732
  Spinner2.displayName = "Spinner";
4195
4733
 
4196
4734
  // src/patterns/Stepper/Stepper.tsx
4197
- import { forwardRef as forwardRef54, Fragment as Fragment4 } from "react";
4198
- import { jsx as jsx56, jsxs as jsxs47 } from "react/jsx-runtime";
4735
+ import { forwardRef as forwardRef60, Fragment as Fragment5 } from "react";
4736
+ import { jsx as jsx62, jsxs as jsxs53 } from "react/jsx-runtime";
4199
4737
  var dotBase = "h-6 w-6 rounded-full grid place-items-center text-[11px] font-mono font-semibold border";
4200
4738
  var dotStateClass = {
4201
4739
  done: "bg-accent text-on-accent border-accent",
4202
4740
  current: "bg-accent-dim text-accent border-accent",
4203
4741
  upcoming: "bg-panel text-text-dim border-border"
4204
4742
  };
4205
- var labelStateClass = {
4743
+ var labelStateClass2 = {
4206
4744
  done: "text-text",
4207
4745
  current: "text-text font-medium",
4208
4746
  upcoming: "text-text-dim"
@@ -4212,8 +4750,8 @@ function stateFor(index, current) {
4212
4750
  if (index === current) return "current";
4213
4751
  return "upcoming";
4214
4752
  }
4215
- var Stepper = forwardRef54(function Stepper2({ steps, current, className, ...props }, ref) {
4216
- return /* @__PURE__ */ jsx56(
4753
+ var Stepper = forwardRef60(function Stepper2({ steps, current, className, ...props }, ref) {
4754
+ return /* @__PURE__ */ jsx62(
4217
4755
  "ol",
4218
4756
  {
4219
4757
  ref,
@@ -4225,19 +4763,19 @@ var Stepper = forwardRef54(function Stepper2({ steps, current, className, ...pro
4225
4763
  const id = typeof step === "string" ? void 0 : step.id;
4226
4764
  const state = stateFor(i, current);
4227
4765
  const connectorActive = i < current;
4228
- return /* @__PURE__ */ jsxs47(Fragment4, { children: [
4229
- /* @__PURE__ */ jsxs47(
4766
+ return /* @__PURE__ */ jsxs53(Fragment5, { children: [
4767
+ /* @__PURE__ */ jsxs53(
4230
4768
  "li",
4231
4769
  {
4232
4770
  "aria-current": state === "current" ? "step" : void 0,
4233
4771
  className: "flex items-center gap-2",
4234
4772
  children: [
4235
- /* @__PURE__ */ jsx56("span", { "aria-hidden": true, className: cn(dotBase, dotStateClass[state]), children: state === "done" ? "\u2713" : i + 1 }),
4236
- /* @__PURE__ */ jsx56("span", { className: cn("text-[12px]", labelStateClass[state]), children: label })
4773
+ /* @__PURE__ */ jsx62("span", { "aria-hidden": true, className: cn(dotBase, dotStateClass[state]), children: state === "done" ? "\u2713" : i + 1 }),
4774
+ /* @__PURE__ */ jsx62("span", { className: cn("text-[12px]", labelStateClass2[state]), children: label })
4237
4775
  ]
4238
4776
  }
4239
4777
  ),
4240
- i < steps.length - 1 && /* @__PURE__ */ jsx56(
4778
+ i < steps.length - 1 && /* @__PURE__ */ jsx62(
4241
4779
  "span",
4242
4780
  {
4243
4781
  "aria-hidden": true,
@@ -4251,11 +4789,113 @@ var Stepper = forwardRef54(function Stepper2({ steps, current, className, ...pro
4251
4789
  });
4252
4790
  Stepper.displayName = "Stepper";
4253
4791
 
4792
+ // src/patterns/TabBar/TabBar.tsx
4793
+ import {
4794
+ forwardRef as forwardRef61,
4795
+ useCallback as useCallback11,
4796
+ useState as useState15
4797
+ } from "react";
4798
+ import { jsx as jsx63, jsxs as jsxs54 } from "react/jsx-runtime";
4799
+ var TabBar = forwardRef61(function TabBar2({ items, value, defaultValue, onValueChange, className, ...props }, ref) {
4800
+ const isControlled = value !== void 0;
4801
+ const [internalValue, setInternalValue] = useState15(defaultValue);
4802
+ const activeId = isControlled ? value : internalValue;
4803
+ const handleSelect = useCallback11(
4804
+ (id, e) => {
4805
+ if (!isControlled) setInternalValue(id);
4806
+ onValueChange?.(id);
4807
+ e.stopPropagation();
4808
+ },
4809
+ [isControlled, onValueChange]
4810
+ );
4811
+ return /* @__PURE__ */ jsx63(
4812
+ "nav",
4813
+ {
4814
+ ref,
4815
+ "aria-label": "Primary",
4816
+ className: cn(
4817
+ "border-border bg-panel h-tabbar grid items-center border-t",
4818
+ "pb-[env(safe-area-inset-bottom)]",
4819
+ className
4820
+ ),
4821
+ style: { gridTemplateColumns: `repeat(${items.length}, minmax(0, 1fr))` },
4822
+ ...props,
4823
+ children: items.map((item) => {
4824
+ const isActive = item.id === activeId;
4825
+ if (item.elevated) {
4826
+ return /* @__PURE__ */ jsx63("div", { className: "grid place-items-center", children: /* @__PURE__ */ jsxs54(
4827
+ "button",
4828
+ {
4829
+ type: "button",
4830
+ "aria-current": isActive ? "page" : void 0,
4831
+ disabled: item.disabled,
4832
+ onClick: (e) => handleSelect(item.id, e),
4833
+ className: cn(
4834
+ "bg-accent text-on-accent grid place-items-center rounded-2xl shadow-lg",
4835
+ "-mt-[10px] h-[52px] w-[52px]",
4836
+ "transition-[filter,transform] duration-(--duration-micro)",
4837
+ "hover:brightness-110 active:scale-95",
4838
+ "focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]",
4839
+ "disabled:cursor-not-allowed disabled:opacity-40"
4840
+ ),
4841
+ children: [
4842
+ /* @__PURE__ */ jsx63("span", { "aria-hidden": true, children: item.icon }),
4843
+ /* @__PURE__ */ jsx63("span", { className: "sr-only", children: item.label })
4844
+ ]
4845
+ }
4846
+ ) }, item.id);
4847
+ }
4848
+ return /* @__PURE__ */ jsxs54(
4849
+ "button",
4850
+ {
4851
+ type: "button",
4852
+ "aria-current": isActive ? "page" : void 0,
4853
+ disabled: item.disabled,
4854
+ onClick: (e) => handleSelect(item.id, e),
4855
+ className: cn(
4856
+ "flex flex-col items-center justify-center gap-[3px] border-0 bg-transparent",
4857
+ "h-full cursor-pointer outline-none",
4858
+ "focus-visible:ring-accent-dim focus-visible:ring-[3px]",
4859
+ "disabled:cursor-not-allowed disabled:opacity-40",
4860
+ isActive ? "text-accent-text" : "text-text-muted hover:text-text"
4861
+ ),
4862
+ children: [
4863
+ /* @__PURE__ */ jsxs54("span", { className: "relative inline-flex", "aria-hidden": true, children: [
4864
+ item.icon,
4865
+ item.badge != null && /* @__PURE__ */ jsx63(
4866
+ "span",
4867
+ {
4868
+ className: cn(
4869
+ "absolute -top-1 -right-2 rounded-full font-mono leading-none",
4870
+ "bg-err text-on-accent min-w-[16px] px-[5px] py-[2px] text-center text-[9px]"
4871
+ ),
4872
+ children: item.badge
4873
+ }
4874
+ )
4875
+ ] }),
4876
+ /* @__PURE__ */ jsxs54("span", { className: "text-[10px] font-medium tracking-tight", children: [
4877
+ item.label,
4878
+ item.badge != null && /* @__PURE__ */ jsxs54("span", { className: "sr-only", children: [
4879
+ ", ",
4880
+ item.badge,
4881
+ " unread"
4882
+ ] })
4883
+ ] })
4884
+ ]
4885
+ },
4886
+ item.id
4887
+ );
4888
+ })
4889
+ }
4890
+ );
4891
+ });
4892
+ TabBar.displayName = "TabBar";
4893
+
4254
4894
  // src/patterns/Tabs/Tabs.tsx
4255
4895
  import * as RadixTabs from "@radix-ui/react-tabs";
4256
4896
  import { cva as cva12 } from "class-variance-authority";
4257
- import { createContext as createContext2, forwardRef as forwardRef55, useContext as useContext2 } from "react";
4258
- import { jsx as jsx57 } from "react/jsx-runtime";
4897
+ import { createContext as createContext2, forwardRef as forwardRef62, useContext as useContext2 } from "react";
4898
+ import { jsx as jsx64 } from "react/jsx-runtime";
4259
4899
  var TabsVariantContext = createContext2("underline");
4260
4900
  var tabsListStyles = cva12("", {
4261
4901
  variants: {
@@ -4286,8 +4926,8 @@ var tabsTriggerStyles = cva12(
4286
4926
  }
4287
4927
  }
4288
4928
  );
4289
- var Tabs = forwardRef55(function Tabs2({ variant = "underline", className, ...props }, ref) {
4290
- return /* @__PURE__ */ jsx57(TabsVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx57(
4929
+ var Tabs = forwardRef62(function Tabs2({ variant = "underline", className, ...props }, ref) {
4930
+ return /* @__PURE__ */ jsx64(TabsVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx64(
4291
4931
  RadixTabs.Root,
4292
4932
  {
4293
4933
  ref,
@@ -4297,14 +4937,14 @@ var Tabs = forwardRef55(function Tabs2({ variant = "underline", className, ...pr
4297
4937
  ) });
4298
4938
  });
4299
4939
  Tabs.displayName = "Tabs";
4300
- var TabsList = forwardRef55(function TabsList2({ className, ...props }, ref) {
4940
+ var TabsList = forwardRef62(function TabsList2({ className, ...props }, ref) {
4301
4941
  const variant = useContext2(TabsVariantContext);
4302
- return /* @__PURE__ */ jsx57(RadixTabs.List, { ref, className: cn(tabsListStyles({ variant }), className), ...props });
4942
+ return /* @__PURE__ */ jsx64(RadixTabs.List, { ref, className: cn(tabsListStyles({ variant }), className), ...props });
4303
4943
  });
4304
4944
  TabsList.displayName = "TabsList";
4305
- var Tab = forwardRef55(function Tab2({ className, ...props }, ref) {
4945
+ var Tab = forwardRef62(function Tab2({ className, ...props }, ref) {
4306
4946
  const variant = useContext2(TabsVariantContext);
4307
- return /* @__PURE__ */ jsx57(
4947
+ return /* @__PURE__ */ jsx64(
4308
4948
  RadixTabs.Trigger,
4309
4949
  {
4310
4950
  ref,
@@ -4314,9 +4954,9 @@ var Tab = forwardRef55(function Tab2({ className, ...props }, ref) {
4314
4954
  );
4315
4955
  });
4316
4956
  Tab.displayName = "Tab";
4317
- var TabsContent = forwardRef55(
4957
+ var TabsContent = forwardRef62(
4318
4958
  function TabsContent2({ className, ...props }, ref) {
4319
- return /* @__PURE__ */ jsx57(
4959
+ return /* @__PURE__ */ jsx64(
4320
4960
  RadixTabs.Content,
4321
4961
  {
4322
4962
  ref,
@@ -4332,8 +4972,8 @@ var TabsContent = forwardRef55(
4332
4972
  TabsContent.displayName = "TabsContent";
4333
4973
 
4334
4974
  // src/patterns/Timeline/Timeline.tsx
4335
- import { forwardRef as forwardRef56 } from "react";
4336
- import { jsx as jsx58, jsxs as jsxs48 } from "react/jsx-runtime";
4975
+ import { forwardRef as forwardRef63 } from "react";
4976
+ import { jsx as jsx65, jsxs as jsxs55 } from "react/jsx-runtime";
4337
4977
  var ringClass = {
4338
4978
  accent: "border-accent",
4339
4979
  ok: "border-ok",
@@ -4341,8 +4981,8 @@ var ringClass = {
4341
4981
  err: "border-err",
4342
4982
  muted: "border-text-dim"
4343
4983
  };
4344
- var Timeline = forwardRef56(function Timeline2({ events, className, children, ...props }, ref) {
4345
- return /* @__PURE__ */ jsx58(
4984
+ var Timeline = forwardRef63(function Timeline2({ events, className, children, ...props }, ref) {
4985
+ return /* @__PURE__ */ jsx65(
4346
4986
  "ol",
4347
4987
  {
4348
4988
  ref,
@@ -4352,14 +4992,14 @@ var Timeline = forwardRef56(function Timeline2({ events, className, children, ..
4352
4992
  className
4353
4993
  ),
4354
4994
  ...props,
4355
- children: events ? events.map((e, i) => /* @__PURE__ */ jsx58(TimelineItem, { tone: e.tone, time: e.time, description: e.description, children: e.title }, i)) : children
4995
+ children: events ? events.map((e, i) => /* @__PURE__ */ jsx65(TimelineItem, { tone: e.tone, time: e.time, description: e.description, children: e.title }, i)) : children
4356
4996
  }
4357
4997
  );
4358
4998
  });
4359
4999
  Timeline.displayName = "Timeline";
4360
- var TimelineItem = forwardRef56(function TimelineItem2({ tone = "accent", description, time, className, children, ...props }, ref) {
4361
- return /* @__PURE__ */ jsxs48("li", { ref, className: cn("relative mb-[18px] last:mb-0", className), ...props, children: [
4362
- /* @__PURE__ */ jsx58(
5000
+ var TimelineItem = forwardRef63(function TimelineItem2({ tone = "accent", description, time, className, children, ...props }, ref) {
5001
+ return /* @__PURE__ */ jsxs55("li", { ref, className: cn("relative mb-[18px] last:mb-0", className), ...props, children: [
5002
+ /* @__PURE__ */ jsx65(
4363
5003
  "span",
4364
5004
  {
4365
5005
  "aria-hidden": true,
@@ -4369,31 +5009,174 @@ var TimelineItem = forwardRef56(function TimelineItem2({ tone = "accent", descri
4369
5009
  )
4370
5010
  }
4371
5011
  ),
4372
- /* @__PURE__ */ jsx58("div", { className: "text-[13px] font-medium", children }),
4373
- description && /* @__PURE__ */ jsx58("div", { className: "text-text-muted text-[12px]", children: description }),
4374
- time && /* @__PURE__ */ jsx58("div", { className: "text-text-dim mt-[2px] font-mono text-[10px]", children: time })
5012
+ /* @__PURE__ */ jsx65("div", { className: "text-[13px] font-medium", children }),
5013
+ description && /* @__PURE__ */ jsx65("div", { className: "text-text-muted text-[12px]", children: description }),
5014
+ time && /* @__PURE__ */ jsx65("div", { className: "text-text-dim mt-[2px] font-mono text-[10px]", children: time })
4375
5015
  ] });
4376
5016
  });
4377
5017
  TimelineItem.displayName = "TimelineItem";
4378
5018
 
5019
+ // src/patterns/Timeline/ActivityTimeline.tsx
5020
+ import { forwardRef as forwardRef64 } from "react";
5021
+
5022
+ // src/patterns/Timeline/formatRelative.ts
5023
+ var SECOND = 1e3;
5024
+ var MINUTE = 60 * SECOND;
5025
+ var HOUR = 60 * MINUTE;
5026
+ var DAY = 24 * HOUR;
5027
+ var WEEK = 7 * DAY;
5028
+ var MONTH = 30 * DAY;
5029
+ var YEAR = 365 * DAY;
5030
+ var UNITS = [
5031
+ { ms: YEAR, short: "y" },
5032
+ { ms: MONTH, short: "mo" },
5033
+ { ms: WEEK, short: "w" },
5034
+ { ms: DAY, short: "d" },
5035
+ { ms: HOUR, short: "h" },
5036
+ { ms: MINUTE, short: "m" },
5037
+ { ms: SECOND, short: "s" }
5038
+ ];
5039
+ function formatRelative(input, now = /* @__PURE__ */ new Date()) {
5040
+ const target = input instanceof Date ? input : new Date(input);
5041
+ if (Number.isNaN(target.getTime())) return "";
5042
+ const diffMs = now.getTime() - target.getTime();
5043
+ const abs = Math.abs(diffMs);
5044
+ if (abs < 5 * SECOND) return "just now";
5045
+ for (const unit of UNITS) {
5046
+ if (abs >= unit.ms) {
5047
+ const n = Math.floor(abs / unit.ms);
5048
+ return diffMs >= 0 ? `${n}${unit.short} ago` : `in ${n}${unit.short}`;
5049
+ }
5050
+ }
5051
+ return "just now";
5052
+ }
5053
+
5054
+ // src/patterns/Timeline/ActivityTimeline.tsx
5055
+ import { jsx as jsx66, jsxs as jsxs56 } from "react/jsx-runtime";
5056
+ var ringClass2 = {
5057
+ accent: "border-accent",
5058
+ ok: "border-ok",
5059
+ warn: "border-warn",
5060
+ err: "border-err",
5061
+ muted: "border-text-dim"
5062
+ };
5063
+ var ActivityTimeline = forwardRef64(
5064
+ function ActivityTimeline2({ events, relativeNow, className, ...props }, ref) {
5065
+ const now = relativeNow ?? /* @__PURE__ */ new Date();
5066
+ return /* @__PURE__ */ jsx66(
5067
+ "ol",
5068
+ {
5069
+ ref,
5070
+ className: cn(
5071
+ "relative m-0 list-none p-0 pl-6",
5072
+ "before:bg-border before:absolute before:top-[6px] before:bottom-[6px] before:left-[7px] before:w-px",
5073
+ className
5074
+ ),
5075
+ ...props,
5076
+ children: events.map((event) => {
5077
+ const tone = event.tone ?? "accent";
5078
+ const time = formatRelative(event.at, now);
5079
+ return /* @__PURE__ */ jsxs56("li", { className: "relative mb-4 last:mb-0", children: [
5080
+ /* @__PURE__ */ jsx66(
5081
+ "span",
5082
+ {
5083
+ "aria-hidden": true,
5084
+ className: cn(
5085
+ "bg-bg absolute top-[4px] -left-6 h-[14px] w-[14px] rounded-full border-2",
5086
+ ringClass2[tone]
5087
+ )
5088
+ }
5089
+ ),
5090
+ /* @__PURE__ */ jsxs56("div", { className: "flex items-baseline gap-2", children: [
5091
+ event.icon && /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "text-text-muted font-mono text-[12px]", children: event.icon }),
5092
+ /* @__PURE__ */ jsx66("div", { className: "text-[13px] font-medium", children: event.title }),
5093
+ time && /* @__PURE__ */ jsx66("time", { className: "text-text-dim ml-auto font-mono text-[10px]", children: time })
5094
+ ] }),
5095
+ event.actor && /* @__PURE__ */ jsxs56("div", { className: "text-text-muted mt-[2px] flex items-center gap-[6px] text-[12px]", children: [
5096
+ event.actor.avatar && /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "inline-flex", children: event.actor.avatar }),
5097
+ /* @__PURE__ */ jsx66("span", { children: event.actor.name })
5098
+ ] }),
5099
+ event.payload && /* @__PURE__ */ jsx66("div", { className: "border-border bg-panel-2 mt-2 rounded-md border px-3 py-2 font-mono text-[11px] leading-[1.5]", children: event.payload })
5100
+ ] }, event.id);
5101
+ })
5102
+ }
5103
+ );
5104
+ }
5105
+ );
5106
+ ActivityTimeline.displayName = "ActivityTimeline";
5107
+
4379
5108
  // src/patterns/Topbar/Topbar.tsx
4380
- import { forwardRef as forwardRef57 } from "react";
4381
- import { jsx as jsx59, jsxs as jsxs49 } from "react/jsx-runtime";
4382
- var Topbar = forwardRef57(function Topbar2({ title, leading, actions, className, children, ...props }, ref) {
4383
- return /* @__PURE__ */ jsxs49(
5109
+ import { forwardRef as forwardRef65 } from "react";
5110
+ import { jsx as jsx67, jsxs as jsxs57 } from "react/jsx-runtime";
5111
+ var Topbar = forwardRef65(function Topbar2({
5112
+ title,
5113
+ eyebrow,
5114
+ leading,
5115
+ back,
5116
+ onBack,
5117
+ actions,
5118
+ density = "comfortable",
5119
+ className,
5120
+ children,
5121
+ ...props
5122
+ }, ref) {
5123
+ const isTouch = density === "touch";
5124
+ const backHandler = typeof back === "function" ? back : back ? onBack : void 0;
5125
+ return /* @__PURE__ */ jsxs57(
4384
5126
  "header",
4385
5127
  {
4386
5128
  ref,
4387
5129
  className: cn(
4388
- "border-border bg-panel flex h-[52px] items-center gap-4 border-b px-5",
5130
+ "border-border bg-panel flex items-center border-b",
5131
+ isTouch ? "h-navbar gap-2 px-3" : "h-[52px] gap-4 px-5",
4389
5132
  className
4390
5133
  ),
4391
5134
  ...props,
4392
5135
  children: [
5136
+ isTouch && back && /* @__PURE__ */ jsx67(
5137
+ "button",
5138
+ {
5139
+ type: "button",
5140
+ onClick: backHandler,
5141
+ "aria-label": "Back",
5142
+ className: cn(
5143
+ "text-text inline-grid place-items-center rounded-md bg-transparent",
5144
+ // The back button is only rendered in touch density — use the
5145
+ // touch token (44pt) instead of `h-9 w-9` (36px) so it meets the
5146
+ // HIG minimum the rest of the touch surface enforces.
5147
+ "hover:bg-panel-2 h-touch w-touch",
5148
+ "focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]"
5149
+ ),
5150
+ children: /* @__PURE__ */ jsx67(
5151
+ "svg",
5152
+ {
5153
+ width: "20",
5154
+ height: "20",
5155
+ viewBox: "0 0 24 24",
5156
+ fill: "none",
5157
+ stroke: "currentColor",
5158
+ strokeWidth: "2",
5159
+ "aria-hidden": true,
5160
+ children: /* @__PURE__ */ jsx67("path", { d: "m15 18-6-6 6-6" })
5161
+ }
5162
+ )
5163
+ }
5164
+ ),
4393
5165
  leading,
4394
- title && /* @__PURE__ */ jsx59("div", { className: "text-[13px] font-medium", children: title }),
4395
- /* @__PURE__ */ jsx59("div", { className: "flex flex-1 items-center" }),
4396
- actions && /* @__PURE__ */ jsx59("div", { className: "flex items-center gap-3", children: actions }),
5166
+ (title || isTouch && eyebrow) && /* @__PURE__ */ jsxs57("div", { className: cn("min-w-0", isTouch && "flex-1"), children: [
5167
+ isTouch && eyebrow && /* @__PURE__ */ jsx67("div", { className: "text-m-eyebrow text-accent font-mono tracking-wide uppercase", children: eyebrow }),
5168
+ title && /* @__PURE__ */ jsx67(
5169
+ "div",
5170
+ {
5171
+ className: cn(
5172
+ isTouch ? "text-m-body-lg truncate font-semibold tracking-tight" : "text-[13px] font-medium"
5173
+ ),
5174
+ children: title
5175
+ }
5176
+ )
5177
+ ] }),
5178
+ !isTouch && /* @__PURE__ */ jsx67("div", { className: "flex flex-1 items-center" }),
5179
+ actions && /* @__PURE__ */ jsx67("div", { className: cn("flex items-center", isTouch ? "gap-1" : "gap-3"), children: actions }),
4397
5180
  children
4398
5181
  ]
4399
5182
  }
@@ -4403,14 +5186,14 @@ Topbar.displayName = "Topbar";
4403
5186
 
4404
5187
  // src/patterns/Tree/Tree.tsx
4405
5188
  import {
4406
- forwardRef as forwardRef58,
4407
- useCallback as useCallback10,
5189
+ forwardRef as forwardRef66,
5190
+ useCallback as useCallback12,
4408
5191
  useEffect as useEffect10,
4409
5192
  useMemo as useMemo6,
4410
5193
  useRef as useRef8,
4411
- useState as useState14
5194
+ useState as useState16
4412
5195
  } from "react";
4413
- import { jsx as jsx60, jsxs as jsxs50 } from "react/jsx-runtime";
5196
+ import { jsx as jsx68, jsxs as jsxs58 } from "react/jsx-runtime";
4414
5197
  var EMPTY_SET2 = /* @__PURE__ */ new Set();
4415
5198
  function flattenVisible(items, expanded, level, parentId, out) {
4416
5199
  for (const item of items) {
@@ -4421,7 +5204,7 @@ function flattenVisible(items, expanded, level, parentId, out) {
4421
5204
  }
4422
5205
  }
4423
5206
  }
4424
- var Tree = forwardRef58(function Tree2({
5207
+ var Tree = forwardRef66(function Tree2({
4425
5208
  items,
4426
5209
  expanded: expandedProp,
4427
5210
  defaultExpanded,
@@ -4449,7 +5232,7 @@ var Tree = forwardRef58(function Tree2({
4449
5232
  flattenVisible(items, expandedSet, 1, null, out);
4450
5233
  return out;
4451
5234
  }, [items, expandedSet]);
4452
- const [activeId, setActiveId] = useState14(null);
5235
+ const [activeId, setActiveId] = useState16(null);
4453
5236
  useEffect10(() => {
4454
5237
  if (activeId && !flatVisible.some((f) => f.id === activeId)) {
4455
5238
  setActiveId(null);
@@ -4461,7 +5244,7 @@ var Tree = forwardRef58(function Tree2({
4461
5244
  return flatVisible[0]?.id ?? null;
4462
5245
  }, [activeId, flatVisible, value]);
4463
5246
  const listRef = useRef8(null);
4464
- const setRefs = useCallback10(
5247
+ const setRefs = useCallback12(
4465
5248
  (node) => {
4466
5249
  listRef.current = node;
4467
5250
  if (typeof ref === "function") ref(node);
@@ -4469,20 +5252,20 @@ var Tree = forwardRef58(function Tree2({
4469
5252
  },
4470
5253
  [ref]
4471
5254
  );
4472
- const focusItem = useCallback10((id) => {
5255
+ const focusItem = useCallback12((id) => {
4473
5256
  const root = listRef.current;
4474
5257
  if (!root) return;
4475
5258
  const el = root.querySelector(`[data-treeitem-id="${CSS.escape(id)}"]`);
4476
5259
  el?.focus();
4477
5260
  }, []);
4478
- const moveActive = useCallback10(
5261
+ const moveActive = useCallback12(
4479
5262
  (id) => {
4480
5263
  setActiveId(id);
4481
5264
  queueMicrotask(() => focusItem(id));
4482
5265
  },
4483
5266
  [focusItem]
4484
5267
  );
4485
- const toggle = useCallback10(
5268
+ const toggle = useCallback12(
4486
5269
  (id) => {
4487
5270
  setExpanded((prev) => {
4488
5271
  const next = new Set(prev ?? EMPTY_SET2);
@@ -4493,7 +5276,7 @@ var Tree = forwardRef58(function Tree2({
4493
5276
  },
4494
5277
  [setExpanded]
4495
5278
  );
4496
- const expand = useCallback10(
5279
+ const expand = useCallback12(
4497
5280
  (id) => {
4498
5281
  setExpanded((prev) => {
4499
5282
  const base = prev ?? EMPTY_SET2;
@@ -4505,7 +5288,7 @@ var Tree = forwardRef58(function Tree2({
4505
5288
  },
4506
5289
  [setExpanded]
4507
5290
  );
4508
- const collapse = useCallback10(
5291
+ const collapse = useCallback12(
4509
5292
  (id) => {
4510
5293
  setExpanded((prev) => {
4511
5294
  const base = prev ?? EMPTY_SET2;
@@ -4517,13 +5300,13 @@ var Tree = forwardRef58(function Tree2({
4517
5300
  },
4518
5301
  [setExpanded]
4519
5302
  );
4520
- const selectItem = useCallback10(
5303
+ const selectItem = useCallback12(
4521
5304
  (id) => {
4522
5305
  setValue(id);
4523
5306
  },
4524
5307
  [setValue]
4525
5308
  );
4526
- const handleKeyDown = useCallback10(
5309
+ const handleKeyDown = useCallback12(
4527
5310
  (e) => {
4528
5311
  onKeyDown?.(e);
4529
5312
  if (e.defaultPrevented) return;
@@ -4603,7 +5386,7 @@ var Tree = forwardRef58(function Tree2({
4603
5386
  toggle
4604
5387
  ]
4605
5388
  );
4606
- return /* @__PURE__ */ jsx60(
5389
+ return /* @__PURE__ */ jsx68(
4607
5390
  "ul",
4608
5391
  {
4609
5392
  ref: setRefs,
@@ -4611,7 +5394,7 @@ var Tree = forwardRef58(function Tree2({
4611
5394
  className: cn("flex flex-col gap-px text-[12px]", className),
4612
5395
  onKeyDown: handleKeyDown,
4613
5396
  ...props,
4614
- children: items.map((item) => /* @__PURE__ */ jsx60(
5397
+ children: items.map((item) => /* @__PURE__ */ jsx68(
4615
5398
  TreeItemRow,
4616
5399
  {
4617
5400
  item,
@@ -4646,8 +5429,8 @@ function TreeItemRow({
4646
5429
  const isExpanded = hasChildren && expanded.has(item.id);
4647
5430
  const isSelected = selected === item.id;
4648
5431
  const isTabStop = tabStopId === item.id;
4649
- return /* @__PURE__ */ jsxs50("li", { role: "none", children: [
4650
- /* @__PURE__ */ jsxs50(
5432
+ return /* @__PURE__ */ jsxs58("li", { role: "none", children: [
5433
+ /* @__PURE__ */ jsxs58(
4651
5434
  "div",
4652
5435
  {
4653
5436
  role: "treeitem",
@@ -4670,14 +5453,14 @@ function TreeItemRow({
4670
5453
  isSelected ? "bg-accent-dim text-accent" : "text-text hover:bg-panel-2"
4671
5454
  ),
4672
5455
  children: [
4673
- /* @__PURE__ */ jsx60("span", { "aria-hidden": true, className: "text-text-dim grid w-3 place-items-center text-[10px]", children: hasChildren ? isExpanded ? "\u25BE" : "\u25B8" : "" }),
4674
- item.icon && /* @__PURE__ */ jsx60("span", { "aria-hidden": true, className: "text-[12px] opacity-80", children: item.icon }),
4675
- /* @__PURE__ */ jsx60("span", { className: "flex-1 truncate", children: item.label }),
5456
+ /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "text-text-dim grid w-3 place-items-center text-[10px]", children: hasChildren ? isExpanded ? "\u25BE" : "\u25B8" : "" }),
5457
+ item.icon && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "text-[12px] opacity-80", children: item.icon }),
5458
+ /* @__PURE__ */ jsx68("span", { className: "flex-1 truncate", children: item.label }),
4676
5459
  item.trailing
4677
5460
  ]
4678
5461
  }
4679
5462
  ),
4680
- hasChildren && isExpanded && /* @__PURE__ */ jsx60("ul", { role: "group", className: "flex flex-col gap-px", children: (item.children ?? []).map((child) => /* @__PURE__ */ jsx60(
5463
+ hasChildren && isExpanded && /* @__PURE__ */ jsx68("ul", { role: "group", className: "flex flex-col gap-px", children: (item.children ?? []).map((child) => /* @__PURE__ */ jsx68(
4681
5464
  TreeItemRow,
4682
5465
  {
4683
5466
  item: child,
@@ -4693,7 +5476,83 @@ function TreeItemRow({
4693
5476
  )) })
4694
5477
  ] });
4695
5478
  }
5479
+
5480
+ // src/patterns/WizardDialog/WizardDialog.tsx
5481
+ import * as RadixDialog5 from "@radix-ui/react-dialog";
5482
+ import { forwardRef as forwardRef67, useCallback as useCallback13, useMemo as useMemo7, useState as useState17 } from "react";
5483
+ import { jsx as jsx69, jsxs as jsxs59 } from "react/jsx-runtime";
5484
+ var WizardDialog = forwardRef67(function WizardDialog2({
5485
+ open,
5486
+ defaultOpen,
5487
+ onOpenChange,
5488
+ steps,
5489
+ initialStep = 0,
5490
+ onComplete,
5491
+ title,
5492
+ description,
5493
+ width = 560,
5494
+ nextLabel = "Next",
5495
+ completeLabel = "Done",
5496
+ backLabel = "Back",
5497
+ cancelLabel,
5498
+ onCancel
5499
+ }, ref) {
5500
+ const [current, setCurrent] = useState17(initialStep);
5501
+ const total = steps.length;
5502
+ const safeCurrent = Math.min(current, Math.max(0, total - 1));
5503
+ const step = steps[safeCurrent];
5504
+ const goTo = useCallback13(
5505
+ (index) => {
5506
+ setCurrent(Math.min(Math.max(0, index), Math.max(0, total - 1)));
5507
+ },
5508
+ [total]
5509
+ );
5510
+ const goNext = useCallback13(() => setCurrent((c) => Math.min(c + 1, total - 1)), [total]);
5511
+ const goBack = useCallback13(() => setCurrent((c) => Math.max(c - 1, 0)), []);
5512
+ const ctx = useMemo7(
5513
+ () => ({
5514
+ current: safeCurrent,
5515
+ total,
5516
+ goNext,
5517
+ goBack,
5518
+ goTo,
5519
+ isFirst: safeCurrent === 0,
5520
+ isLast: safeCurrent >= total - 1
5521
+ }),
5522
+ [safeCurrent, total, goNext, goBack, goTo]
5523
+ );
5524
+ const stepperSteps = useMemo7(() => steps.map((s) => ({ id: s.id, label: s.label })), [steps]);
5525
+ if (!step) return null;
5526
+ const canAdvance = step.canAdvance ? step.canAdvance(ctx) : true;
5527
+ const body = typeof step.content === "function" ? step.content(ctx) : step.content;
5528
+ const handlePrimary = () => {
5529
+ if (ctx.isLast) {
5530
+ onComplete?.();
5531
+ } else {
5532
+ goNext();
5533
+ }
5534
+ };
5535
+ return /* @__PURE__ */ jsx69(DialogRoot, { open, defaultOpen, onOpenChange, children: /* @__PURE__ */ jsxs59(DialogContent, { ref, width, children: [
5536
+ title && /* @__PURE__ */ jsx69(WizardTitle, { children: title }),
5537
+ description && /* @__PURE__ */ jsx69(WizardDescription, { children: description }),
5538
+ /* @__PURE__ */ jsx69("div", { className: "mb-5", children: /* @__PURE__ */ jsx69(Stepper, { steps: stepperSteps, current: safeCurrent }) }),
5539
+ /* @__PURE__ */ jsx69("div", { className: "mb-5", children: body }),
5540
+ /* @__PURE__ */ jsxs59("div", { className: "flex justify-end gap-2", children: [
5541
+ cancelLabel && /* @__PURE__ */ jsx69(Button, { type: "button", variant: "ghost", onClick: onCancel, children: cancelLabel }),
5542
+ /* @__PURE__ */ jsx69(Button, { type: "button", variant: "secondary", onClick: goBack, disabled: ctx.isFirst, children: backLabel }),
5543
+ /* @__PURE__ */ jsx69(Button, { type: "button", variant: "primary", onClick: handlePrimary, disabled: !canAdvance, children: ctx.isLast ? completeLabel : nextLabel })
5544
+ ] })
5545
+ ] }) });
5546
+ });
5547
+ function WizardTitle({ children }) {
5548
+ return /* @__PURE__ */ jsx69(RadixDialog5.Title, { className: "mb-2 text-[16px] font-medium", children });
5549
+ }
5550
+ function WizardDescription({ children }) {
5551
+ return /* @__PURE__ */ jsx69(RadixDialog5.Description, { className: "text-text-muted mb-4 text-[13px] leading-[1.55]", children });
5552
+ }
5553
+ WizardDialog.displayName = "WizardDialog";
4696
5554
  export {
5555
+ ActivityTimeline,
4697
5556
  Alert,
4698
5557
  AlertDialog,
4699
5558
  AlertDialogAction,
@@ -4746,6 +5605,8 @@ export {
4746
5605
  FAB,
4747
5606
  Field,
4748
5607
  FileChip,
5608
+ FilterPanel,
5609
+ HealthScore,
4749
5610
  HoverCard,
4750
5611
  HoverCardContent,
4751
5612
  HoverCardPortal,
@@ -4754,6 +5615,7 @@ export {
4754
5615
  IconButton,
4755
5616
  Input,
4756
5617
  Kbd,
5618
+ LargeTitle,
4757
5619
  MenuCheckboxItem,
4758
5620
  MenuItem,
4759
5621
  MenuSeparator,
@@ -4767,6 +5629,7 @@ export {
4767
5629
  NavItem,
4768
5630
  NavSection,
4769
5631
  OTP,
5632
+ OnboardingChecklist,
4770
5633
  Pagination,
4771
5634
  Popover,
4772
5635
  PopoverAnchor,
@@ -4777,9 +5640,11 @@ export {
4777
5640
  PopoverRoot,
4778
5641
  PopoverTrigger,
4779
5642
  Progress,
5643
+ PullToRefresh,
4780
5644
  RadialProgress,
4781
5645
  Radio,
4782
5646
  RadioGroup,
5647
+ ScrollArea,
4783
5648
  SearchInput,
4784
5649
  Select,
4785
5650
  SelectContent,
@@ -4802,6 +5667,7 @@ export {
4802
5667
  Stepper,
4803
5668
  Switch,
4804
5669
  Tab,
5670
+ TabBar,
4805
5671
  Tabs,
4806
5672
  TabsContent,
4807
5673
  TabsList,
@@ -4820,11 +5686,13 @@ export {
4820
5686
  TooltipTrigger,
4821
5687
  Topbar,
4822
5688
  Tree,
5689
+ WizardDialog,
4823
5690
  badgeStyles,
4824
5691
  buttonStyles,
4825
5692
  cardStyles,
4826
5693
  cn,
4827
5694
  filterCommandItems,
5695
+ formatRelative,
4828
5696
  iconButtonStyles,
4829
5697
  useControllableState,
4830
5698
  useDisclosure,