@assure-one/design-system 0.3.0 → 0.4.1

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
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import * as React13 from 'react';
2
+ import * as React36 from 'react';
3
3
  import { forwardRef, useState, useCallback, useId, useRef, useImperativeHandle, useEffect, createContext, useContext, useMemo } from 'react';
4
4
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
5
5
  import { clsx } from 'clsx';
@@ -272,6 +272,7 @@ var systemTokens = {
272
272
  },
273
273
  layout: {
274
274
  shellSidebarWidth: "var(--shell-sidebar-w)",
275
+ shellSidebarRailWidth: "var(--shell-sidebar-w-rail)",
275
276
  shellHeaderHeight: "var(--shell-header-h)",
276
277
  contentPad: "var(--content-pad)"
277
278
  },
@@ -451,7 +452,7 @@ function MenuIcon({ size = 24, ...props }) {
451
452
  {
452
453
  d: "M3 12h18M3 6h18M3 18h18",
453
454
  stroke: "currentColor",
454
- strokeWidth: "2",
455
+ strokeWidth: "1.5",
455
456
  strokeLinecap: "round"
456
457
  }
457
458
  ) });
@@ -2107,7 +2108,19 @@ function MicrosoftBrandIcon({ size = 24, ...props }) {
2107
2108
  /* @__PURE__ */ jsx("rect", { x: "13", y: "13", width: "10", height: "10", fill: "#FFB900" })
2108
2109
  ] });
2109
2110
  }
2110
- var Accordion = React13.forwardRef(function Accordion2({ className, ...props }, ref) {
2111
+ function FilterIcon({ size = 24, ...props }) {
2112
+ return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx(
2113
+ "path",
2114
+ {
2115
+ d: "M3 4h18l-7 8v6l-4 2v-8L3 4z",
2116
+ stroke: "currentColor",
2117
+ strokeWidth: "1.5",
2118
+ strokeLinecap: "round",
2119
+ strokeLinejoin: "round"
2120
+ }
2121
+ ) });
2122
+ }
2123
+ var Accordion = React36.forwardRef(function Accordion2({ className, ...props }, ref) {
2111
2124
  return /* @__PURE__ */ jsx(
2112
2125
  AccordionPrimitive.Root,
2113
2126
  {
@@ -2118,11 +2131,11 @@ var Accordion = React13.forwardRef(function Accordion2({ className, ...props },
2118
2131
  );
2119
2132
  });
2120
2133
  Accordion.displayName = AccordionPrimitive.Root.displayName;
2121
- var AccordionItem = React13.forwardRef(function AccordionItem2({ className, ...props }, ref) {
2134
+ var AccordionItem = React36.forwardRef(function AccordionItem2({ className, ...props }, ref) {
2122
2135
  return /* @__PURE__ */ jsx(AccordionPrimitive.Item, { ref, className: cn(className), ...props });
2123
2136
  });
2124
2137
  AccordionItem.displayName = AccordionPrimitive.Item.displayName;
2125
- var AccordionTrigger = React13.forwardRef(function AccordionTrigger2({ children, className, ...props }, ref) {
2138
+ var AccordionTrigger = React36.forwardRef(function AccordionTrigger2({ children, className, ...props }, ref) {
2126
2139
  return /* @__PURE__ */ jsx(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
2127
2140
  AccordionPrimitive.Trigger,
2128
2141
  {
@@ -2150,7 +2163,7 @@ var AccordionTrigger = React13.forwardRef(function AccordionTrigger2({ children,
2150
2163
  ) });
2151
2164
  });
2152
2165
  AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
2153
- var AccordionContent = React13.forwardRef(function AccordionContent2({ children, className, ...props }, ref) {
2166
+ var AccordionContent = React36.forwardRef(function AccordionContent2({ children, className, ...props }, ref) {
2154
2167
  return /* @__PURE__ */ jsx(
2155
2168
  AccordionPrimitive.Content,
2156
2169
  {
@@ -2170,7 +2183,7 @@ AccordionContent.displayName = AccordionPrimitive.Content.displayName;
2170
2183
  var AlertDialog = AlertDialogPrimitive.Root;
2171
2184
  var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
2172
2185
  var AlertDialogPortal = AlertDialogPrimitive.Portal;
2173
- var AlertDialogOverlay = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2186
+ var AlertDialogOverlay = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2174
2187
  AlertDialogPrimitive.Overlay,
2175
2188
  {
2176
2189
  ref,
@@ -2185,7 +2198,7 @@ var AlertDialogOverlay = React13.forwardRef(({ className, ...props }, ref) => /*
2185
2198
  }
2186
2199
  ));
2187
2200
  AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
2188
- var AlertDialogContent = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
2201
+ var AlertDialogContent = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
2189
2202
  /* @__PURE__ */ jsx(AlertDialogOverlay, {}),
2190
2203
  /* @__PURE__ */ jsx(
2191
2204
  AlertDialogPrimitive.Content,
@@ -2220,7 +2233,7 @@ var AlertDialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
2220
2233
  }
2221
2234
  );
2222
2235
  AlertDialogFooter.displayName = "AlertDialogFooter";
2223
- var AlertDialogTitle = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2236
+ var AlertDialogTitle = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2224
2237
  AlertDialogPrimitive.Title,
2225
2238
  {
2226
2239
  ref,
@@ -2232,7 +2245,7 @@ var AlertDialogTitle = React13.forwardRef(({ className, ...props }, ref) => /* @
2232
2245
  }
2233
2246
  ));
2234
2247
  AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
2235
- var AlertDialogDescription = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2248
+ var AlertDialogDescription = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2236
2249
  AlertDialogPrimitive.Description,
2237
2250
  {
2238
2251
  ref,
@@ -2241,7 +2254,7 @@ var AlertDialogDescription = React13.forwardRef(({ className, ...props }, ref) =
2241
2254
  }
2242
2255
  ));
2243
2256
  AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
2244
- var AlertDialogAction = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2257
+ var AlertDialogAction = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2245
2258
  AlertDialogPrimitive.Action,
2246
2259
  {
2247
2260
  ref,
@@ -2257,7 +2270,7 @@ var AlertDialogAction = React13.forwardRef(({ className, ...props }, ref) => /*
2257
2270
  }
2258
2271
  ));
2259
2272
  AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
2260
- var AlertDialogCancel = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
2273
+ var AlertDialogCancel = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
2261
2274
  AlertDialogPrimitive.Cancel,
2262
2275
  {
2263
2276
  ref,
@@ -2355,7 +2368,7 @@ var AlertDescription = forwardRef(function AlertDescription2({ className, ...pro
2355
2368
  return /* @__PURE__ */ jsx("p", { ref, className: cn("text-sm opacity-90", className), ...props });
2356
2369
  });
2357
2370
  AlertDescription.displayName = "AlertDescription";
2358
- var AspectRatio = React13.forwardRef(function AspectRatio2({ className, ratio = 16 / 9, ...props }, ref) {
2371
+ var AspectRatio = React36.forwardRef(function AspectRatio2({ className, ratio = 16 / 9, ...props }, ref) {
2359
2372
  return /* @__PURE__ */ jsx(
2360
2373
  AspectRatioPrimitive.Root,
2361
2374
  {
@@ -2408,7 +2421,7 @@ var statusDotSizes = {
2408
2421
  function getInitials(name) {
2409
2422
  return name.split(" ").map((part) => part[0]).filter(Boolean).slice(0, 2).join("").toUpperCase();
2410
2423
  }
2411
- var Avatar = React13.forwardRef(
2424
+ var Avatar = React36.forwardRef(
2412
2425
  function Avatar2({ src, alt, name, size = "md", variant = "initials", status, className, ...props }, ref) {
2413
2426
  const initials = name ? getInitials(name) : "?";
2414
2427
  const resolvedSize = size ?? "md";
@@ -2609,12 +2622,18 @@ var buttonVariants = cva(
2609
2622
  ghost: "bg-transparent text-fg-2 hover:bg-bg-2 hover:text-fg",
2610
2623
  outline: "border border-rule-strong bg-bg text-fg-2 hover:bg-bg-2 hover:border-fg-4",
2611
2624
  link: "bg-transparent text-accent underline-offset-4 hover:underline p-0 h-auto",
2612
- accent: "bg-accent text-fg-on-accent hover:bg-accent-hover active:bg-accent-active"
2625
+ accent: "bg-accent text-fg-on-accent hover:bg-accent-hover active:bg-accent-active",
2626
+ dashed: "border-2 border-dashed border-rule bg-transparent text-fg-3 hover:border-fg-4 hover:bg-bg-2 hover:text-fg"
2613
2627
  },
2614
2628
  size: {
2615
2629
  sm: "h-8 px-3 text-sm gap-1.5",
2616
2630
  md: "h-10 px-4 text-sm gap-2",
2617
2631
  lg: "h-12 px-6 text-base gap-2",
2632
+ // Icon-only sizes. Hit target ≥ 24px (WCAG 2.5.5 floor).
2633
+ // `icon-xs` / `icon-sm` are for dense in-row action stacks where
2634
+ // `size="icon"` (40×40) would visually crowd the row.
2635
+ "icon-xs": "size-6 [&_svg]:size-3.5",
2636
+ "icon-sm": "size-7 [&_svg]:size-4",
2618
2637
  icon: "size-10"
2619
2638
  }
2620
2639
  },
@@ -2697,7 +2716,7 @@ function Calendar({
2697
2716
  classNames,
2698
2717
  ...props
2699
2718
  }) {
2700
- const { modifiers, modifiersClassNames } = React13.useMemo(() => {
2719
+ const { modifiers, modifiersClassNames } = React36.useMemo(() => {
2701
2720
  const buckets = {};
2702
2721
  for (const h of highlights) {
2703
2722
  const key = h.color ?? "primary";
@@ -2712,7 +2731,7 @@ function Calendar({
2712
2731
  }
2713
2732
  return { modifiers: mods, modifiersClassNames: modClasses };
2714
2733
  }, [highlights]);
2715
- const disabledMatcher = React13.useMemo(() => {
2734
+ const disabledMatcher = React36.useMemo(() => {
2716
2735
  if (!minDate && !maxDate) return void 0;
2717
2736
  if (minDate && maxDate) return [{ before: minDate }, { after: maxDate }];
2718
2737
  if (minDate) return { before: minDate };
@@ -2844,8 +2863,8 @@ var CardAction = forwardRef(
2844
2863
  }
2845
2864
  );
2846
2865
  CardAction.displayName = "CardAction";
2847
- var Checkbox = React13.forwardRef(function Checkbox2({ label, indeterminate, checked, defaultChecked, className, id: providedId, ...props }, ref) {
2848
- const generatedId = React13.useId();
2866
+ var Checkbox = React36.forwardRef(function Checkbox2({ label, indeterminate, checked, defaultChecked, className, id: providedId, ...props }, ref) {
2867
+ const generatedId = React36.useId();
2849
2868
  const id = providedId ?? generatedId;
2850
2869
  const resolvedChecked = indeterminate ? "indeterminate" : checked;
2851
2870
  return /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-2", children: [
@@ -2885,7 +2904,7 @@ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
2885
2904
  var SelectRoot = SelectPrimitive.Root;
2886
2905
  var SelectGroup = SelectPrimitive.Group;
2887
2906
  var SelectValue = SelectPrimitive.Value;
2888
- var SelectTrigger = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
2907
+ var SelectTrigger = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
2889
2908
  SelectPrimitive.Trigger,
2890
2909
  {
2891
2910
  ref,
@@ -2916,7 +2935,7 @@ var SelectTrigger = React13.forwardRef(({ className, children, ...props }, ref)
2916
2935
  }
2917
2936
  ));
2918
2937
  SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
2919
- var SelectScrollUpButton = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2938
+ var SelectScrollUpButton = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2920
2939
  SelectPrimitive.ScrollUpButton,
2921
2940
  {
2922
2941
  ref,
@@ -2926,7 +2945,7 @@ var SelectScrollUpButton = React13.forwardRef(({ className, ...props }, ref) =>
2926
2945
  }
2927
2946
  ));
2928
2947
  SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
2929
- var SelectScrollDownButton = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2948
+ var SelectScrollDownButton = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2930
2949
  SelectPrimitive.ScrollDownButton,
2931
2950
  {
2932
2951
  ref,
@@ -2936,7 +2955,7 @@ var SelectScrollDownButton = React13.forwardRef(({ className, ...props }, ref) =
2936
2955
  }
2937
2956
  ));
2938
2957
  SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
2939
- var SelectContent = React13.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
2958
+ var SelectContent = React36.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
2940
2959
  SelectPrimitive.Content,
2941
2960
  {
2942
2961
  ref,
@@ -2970,7 +2989,7 @@ var SelectContent = React13.forwardRef(({ className, children, position = "poppe
2970
2989
  }
2971
2990
  ) }));
2972
2991
  SelectContent.displayName = SelectPrimitive.Content.displayName;
2973
- var SelectLabel = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2992
+ var SelectLabel = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2974
2993
  SelectPrimitive.Label,
2975
2994
  {
2976
2995
  ref,
@@ -2982,7 +3001,7 @@ var SelectLabel = React13.forwardRef(({ className, ...props }, ref) => /* @__PUR
2982
3001
  }
2983
3002
  ));
2984
3003
  SelectLabel.displayName = SelectPrimitive.Label.displayName;
2985
- var SelectItem = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3004
+ var SelectItem = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
2986
3005
  SelectPrimitive.Item,
2987
3006
  {
2988
3007
  ref,
@@ -3003,7 +3022,7 @@ var SelectItem = React13.forwardRef(({ className, children, ...props }, ref) =>
3003
3022
  }
3004
3023
  ));
3005
3024
  SelectItem.displayName = SelectPrimitive.Item.displayName;
3006
- var SelectSeparator = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3025
+ var SelectSeparator = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3007
3026
  SelectPrimitive.Separator,
3008
3027
  {
3009
3028
  ref,
@@ -3087,11 +3106,11 @@ function ClientSelect({
3087
3106
  ] });
3088
3107
  }
3089
3108
  ClientSelect.displayName = "ClientSelect";
3090
- var Collapsible = React13.forwardRef(function Collapsible2({ className, ...props }, ref) {
3109
+ var Collapsible = React36.forwardRef(function Collapsible2({ className, ...props }, ref) {
3091
3110
  return /* @__PURE__ */ jsx(CollapsiblePrimitive.Root, { ref, className: cn(className), ...props });
3092
3111
  });
3093
3112
  Collapsible.displayName = CollapsiblePrimitive.Root.displayName;
3094
- var CollapsibleTrigger = React13.forwardRef(function CollapsibleTrigger2({ className, ...props }, ref) {
3113
+ var CollapsibleTrigger = React36.forwardRef(function CollapsibleTrigger2({ className, ...props }, ref) {
3095
3114
  return /* @__PURE__ */ jsx(
3096
3115
  CollapsiblePrimitive.Trigger,
3097
3116
  {
@@ -3106,7 +3125,7 @@ var CollapsibleTrigger = React13.forwardRef(function CollapsibleTrigger2({ class
3106
3125
  );
3107
3126
  });
3108
3127
  CollapsibleTrigger.displayName = CollapsiblePrimitive.Trigger.displayName;
3109
- var CollapsibleContent = React13.forwardRef(function CollapsibleContent2({ className, ...props }, ref) {
3128
+ var CollapsibleContent = React36.forwardRef(function CollapsibleContent2({ className, ...props }, ref) {
3110
3129
  return /* @__PURE__ */ jsx(
3111
3130
  CollapsiblePrimitive.Content,
3112
3131
  {
@@ -3183,7 +3202,7 @@ ComingSoon.displayName = "ComingSoon";
3183
3202
  var Dialog = DialogPrimitive.Root;
3184
3203
  var DialogTrigger = DialogPrimitive.Trigger;
3185
3204
  var DialogPortal = DialogPrimitive.Portal;
3186
- var DialogOverlay = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3205
+ var DialogOverlay = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3187
3206
  DialogPrimitive.Overlay,
3188
3207
  {
3189
3208
  ref,
@@ -3204,7 +3223,7 @@ var dialogSizeStyles = {
3204
3223
  lg: "max-w-2xl",
3205
3224
  full: "max-w-[calc(100vw-2rem)]"
3206
3225
  };
3207
- var DialogContent = React13.forwardRef(({ size = "md", showCloseButton = true, className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
3226
+ var DialogContent = React36.forwardRef(({ size = "md", showCloseButton = true, className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
3208
3227
  /* @__PURE__ */ jsx(DialogOverlay, {}),
3209
3228
  /* @__PURE__ */ jsxs(
3210
3229
  DialogPrimitive.Content,
@@ -3245,7 +3264,7 @@ var DialogContent = React13.forwardRef(({ size = "md", showCloseButton = true, c
3245
3264
  )
3246
3265
  ] }));
3247
3266
  DialogContent.displayName = DialogPrimitive.Content.displayName;
3248
- var DialogClose = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Close, { ref, className: cn(className), ...props }));
3267
+ var DialogClose = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Close, { ref, className: cn(className), ...props }));
3249
3268
  DialogClose.displayName = "DialogClose";
3250
3269
  var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("mb-4 flex flex-col gap-1.5 pr-8", className), ...props });
3251
3270
  DialogHeader.displayName = "DialogHeader";
@@ -3260,7 +3279,7 @@ var DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
3260
3279
  }
3261
3280
  );
3262
3281
  DialogFooter.displayName = "DialogFooter";
3263
- var DialogTitle = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3282
+ var DialogTitle = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3264
3283
  DialogPrimitive.Title,
3265
3284
  {
3266
3285
  ref,
@@ -3272,7 +3291,7 @@ var DialogTitle = React13.forwardRef(({ className, ...props }, ref) => /* @__PUR
3272
3291
  }
3273
3292
  ));
3274
3293
  DialogTitle.displayName = DialogPrimitive.Title.displayName;
3275
- var DialogDescription = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3294
+ var DialogDescription = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3276
3295
  DialogPrimitive.Description,
3277
3296
  {
3278
3297
  ref,
@@ -3302,17 +3321,17 @@ function CommandPalette({
3302
3321
  onOpenChange,
3303
3322
  placeholder = "Type a command or search..."
3304
3323
  }) {
3305
- const [internalOpen, setInternalOpen] = React13.useState(false);
3324
+ const [internalOpen, setInternalOpen] = React36.useState(false);
3306
3325
  const isControlled = controlledOpen !== void 0;
3307
3326
  const open = isControlled ? controlledOpen : internalOpen;
3308
- const setOpen = React13.useCallback(
3327
+ const setOpen = React36.useCallback(
3309
3328
  (value) => {
3310
3329
  if (!isControlled) setInternalOpen(value);
3311
3330
  onOpenChange?.(value);
3312
3331
  },
3313
3332
  [isControlled, onOpenChange]
3314
3333
  );
3315
- React13.useEffect(() => {
3334
+ React36.useEffect(() => {
3316
3335
  function handleKeyDown(e) {
3317
3336
  if ((e.metaKey || e.ctrlKey) && e.key === "k") {
3318
3337
  e.preventDefault();
@@ -3462,8 +3481,8 @@ function ConfirmActionButton({
3462
3481
  destructive = true,
3463
3482
  contentClassName
3464
3483
  }) {
3465
- const [open, setOpen] = React13.useState(false);
3466
- const [pending, setPending] = React13.useState(false);
3484
+ const [open, setOpen] = React36.useState(false);
3485
+ const [pending, setPending] = React36.useState(false);
3467
3486
  const handleConfirm = async (event) => {
3468
3487
  event.preventDefault();
3469
3488
  setPending(true);
@@ -3514,7 +3533,7 @@ var ContextMenuGroup = ContextMenuPrimitive.Group;
3514
3533
  var ContextMenuPortal = ContextMenuPrimitive.Portal;
3515
3534
  var ContextMenuSub = ContextMenuPrimitive.Sub;
3516
3535
  var ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
3517
- var ContextMenuSubTrigger = React13.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3536
+ var ContextMenuSubTrigger = React36.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3518
3537
  ContextMenuPrimitive.SubTrigger,
3519
3538
  {
3520
3539
  ref,
@@ -3535,7 +3554,7 @@ var ContextMenuSubTrigger = React13.forwardRef(({ className, inset, children, ..
3535
3554
  }
3536
3555
  ));
3537
3556
  ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;
3538
- var ContextMenuSubContent = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3557
+ var ContextMenuSubContent = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3539
3558
  ContextMenuPrimitive.SubContent,
3540
3559
  {
3541
3560
  ref,
@@ -3551,7 +3570,7 @@ var ContextMenuSubContent = React13.forwardRef(({ className, ...props }, ref) =>
3551
3570
  }
3552
3571
  ));
3553
3572
  ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;
3554
- var ContextMenuContent = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
3573
+ var ContextMenuContent = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
3555
3574
  ContextMenuPrimitive.Content,
3556
3575
  {
3557
3576
  ref,
@@ -3567,7 +3586,7 @@ var ContextMenuContent = React13.forwardRef(({ className, ...props }, ref) => /*
3567
3586
  }
3568
3587
  ) }));
3569
3588
  ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;
3570
- var ContextMenuItem = React13.forwardRef(({ className, destructive, inset, ...props }, ref) => /* @__PURE__ */ jsx(
3589
+ var ContextMenuItem = React36.forwardRef(({ className, destructive, inset, ...props }, ref) => /* @__PURE__ */ jsx(
3571
3590
  ContextMenuPrimitive.Item,
3572
3591
  {
3573
3592
  ref,
@@ -3585,7 +3604,7 @@ var ContextMenuItem = React13.forwardRef(({ className, destructive, inset, ...pr
3585
3604
  }
3586
3605
  ));
3587
3606
  ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;
3588
- var ContextMenuCheckboxItem = React13.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
3607
+ var ContextMenuCheckboxItem = React36.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
3589
3608
  ContextMenuPrimitive.CheckboxItem,
3590
3609
  {
3591
3610
  ref,
@@ -3605,7 +3624,7 @@ var ContextMenuCheckboxItem = React13.forwardRef(({ className, children, checked
3605
3624
  }
3606
3625
  ));
3607
3626
  ContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName;
3608
- var ContextMenuRadioItem = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3627
+ var ContextMenuRadioItem = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3609
3628
  ContextMenuPrimitive.RadioItem,
3610
3629
  {
3611
3630
  ref,
@@ -3624,7 +3643,7 @@ var ContextMenuRadioItem = React13.forwardRef(({ className, children, ...props }
3624
3643
  }
3625
3644
  ));
3626
3645
  ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;
3627
- var ContextMenuLabel = React13.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
3646
+ var ContextMenuLabel = React36.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
3628
3647
  ContextMenuPrimitive.Label,
3629
3648
  {
3630
3649
  ref,
@@ -3637,7 +3656,7 @@ var ContextMenuLabel = React13.forwardRef(({ className, inset, ...props }, ref)
3637
3656
  }
3638
3657
  ));
3639
3658
  ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;
3640
- var ContextMenuSeparator = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3659
+ var ContextMenuSeparator = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3641
3660
  ContextMenuPrimitive.Separator,
3642
3661
  {
3643
3662
  ref,
@@ -3686,7 +3705,7 @@ var PopoverTrigger = PopoverPrimitive.Trigger;
3686
3705
  var PopoverAnchor = PopoverPrimitive.Anchor;
3687
3706
  var PopoverPortal = PopoverPrimitive.Portal;
3688
3707
  var PopoverClose = PopoverPrimitive.Close;
3689
- var PopoverContent = React13.forwardRef(({ className, align = "center", side = "bottom", sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
3708
+ var PopoverContent = React36.forwardRef(({ className, align = "center", side = "bottom", sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
3690
3709
  PopoverPrimitive.Content,
3691
3710
  {
3692
3711
  ref,
@@ -3896,13 +3915,50 @@ var DatePicker = forwardRef(function DatePicker2({
3896
3915
  ] });
3897
3916
  });
3898
3917
  DatePicker.displayName = "DatePicker";
3918
+ var chipVariants = cva(
3919
+ cn(
3920
+ "inline-flex items-center gap-1 rounded-full px-2.5 py-1",
3921
+ "text-[12px] font-medium",
3922
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
3923
+ "motion-reduce:transition-none",
3924
+ "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]"
3925
+ ),
3926
+ {
3927
+ variants: {
3928
+ variant: {
3929
+ primary: "bg-primary/10 text-primary hover:bg-primary/15",
3930
+ neutral: "bg-muted text-fg-2 hover:bg-muted/80"
3931
+ }
3932
+ },
3933
+ defaultVariants: {
3934
+ variant: "primary"
3935
+ }
3936
+ }
3937
+ );
3938
+ var DismissibleChip = React36.forwardRef(function DismissibleChip2({ label, onDismiss, variant, className, ...props }, ref) {
3939
+ return /* @__PURE__ */ jsxs(
3940
+ "button",
3941
+ {
3942
+ ref,
3943
+ type: "button",
3944
+ onClick: onDismiss,
3945
+ "aria-label": typeof label === "string" ? `Remove ${label} filter` : "Remove filter",
3946
+ className: cn(chipVariants({ variant }), className),
3947
+ ...props,
3948
+ children: [
3949
+ /* @__PURE__ */ jsx("span", { children: label }),
3950
+ /* @__PURE__ */ jsx(XIcon, { size: 12, "aria-hidden": "true" })
3951
+ ]
3952
+ }
3953
+ );
3954
+ });
3899
3955
  var DropdownMenu = DropdownMenuPrimitive.Root;
3900
3956
  var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
3901
3957
  var DropdownMenuGroup = DropdownMenuPrimitive.Group;
3902
3958
  var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
3903
3959
  var DropdownMenuSub = DropdownMenuPrimitive.Sub;
3904
3960
  var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
3905
- var DropdownMenuSubTrigger = React13.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3961
+ var DropdownMenuSubTrigger = React36.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3906
3962
  DropdownMenuPrimitive.SubTrigger,
3907
3963
  {
3908
3964
  ref,
@@ -3923,7 +3979,7 @@ var DropdownMenuSubTrigger = React13.forwardRef(({ className, inset, children, .
3923
3979
  }
3924
3980
  ));
3925
3981
  DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
3926
- var DropdownMenuSubContent = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3982
+ var DropdownMenuSubContent = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3927
3983
  DropdownMenuPrimitive.SubContent,
3928
3984
  {
3929
3985
  ref,
@@ -3939,7 +3995,7 @@ var DropdownMenuSubContent = React13.forwardRef(({ className, ...props }, ref) =
3939
3995
  }
3940
3996
  ));
3941
3997
  DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
3942
- var DropdownMenuContent = React13.forwardRef(({ className, sideOffset = 6, align = "start", ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
3998
+ var DropdownMenuContent = React36.forwardRef(({ className, sideOffset = 6, align = "start", ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
3943
3999
  DropdownMenuPrimitive.Content,
3944
4000
  {
3945
4001
  ref,
@@ -3957,7 +4013,7 @@ var DropdownMenuContent = React13.forwardRef(({ className, sideOffset = 6, align
3957
4013
  }
3958
4014
  ) }));
3959
4015
  DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
3960
- var DropdownMenuItem = React13.forwardRef(({ className, destructive, inset, ...props }, ref) => /* @__PURE__ */ jsx(
4016
+ var DropdownMenuItem = React36.forwardRef(({ className, destructive, inset, ...props }, ref) => /* @__PURE__ */ jsx(
3961
4017
  DropdownMenuPrimitive.Item,
3962
4018
  {
3963
4019
  ref,
@@ -3975,7 +4031,7 @@ var DropdownMenuItem = React13.forwardRef(({ className, destructive, inset, ...p
3975
4031
  }
3976
4032
  ));
3977
4033
  DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
3978
- var DropdownMenuCheckboxItem = React13.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
4034
+ var DropdownMenuCheckboxItem = React36.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
3979
4035
  DropdownMenuPrimitive.CheckboxItem,
3980
4036
  {
3981
4037
  ref,
@@ -3995,7 +4051,7 @@ var DropdownMenuCheckboxItem = React13.forwardRef(({ className, children, checke
3995
4051
  }
3996
4052
  ));
3997
4053
  DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
3998
- var DropdownMenuRadioItem = React13.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
4054
+ var DropdownMenuRadioItem = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3999
4055
  DropdownMenuPrimitive.RadioItem,
4000
4056
  {
4001
4057
  ref,
@@ -4014,7 +4070,7 @@ var DropdownMenuRadioItem = React13.forwardRef(({ className, children, ...props
4014
4070
  }
4015
4071
  ));
4016
4072
  DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
4017
- var DropdownMenuLabel = React13.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
4073
+ var DropdownMenuLabel = React36.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
4018
4074
  DropdownMenuPrimitive.Label,
4019
4075
  {
4020
4076
  ref,
@@ -4027,7 +4083,7 @@ var DropdownMenuLabel = React13.forwardRef(({ className, inset, ...props }, ref)
4027
4083
  }
4028
4084
  ));
4029
4085
  DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
4030
- var DropdownMenuSeparator = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4086
+ var DropdownMenuSeparator = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4031
4087
  DropdownMenuPrimitive.Separator,
4032
4088
  {
4033
4089
  ref,
@@ -4226,10 +4282,23 @@ function FormSuccess({ children, className, ...props }) {
4226
4282
  }
4227
4283
  );
4228
4284
  }
4285
+ var FormSection = forwardRef(function FormSection2({ title, description, action, headSpacing = "mt-4", className, children, ...props }, ref) {
4286
+ return /* @__PURE__ */ jsxs("fieldset", { ref, className: cn("min-w-0", className), ...props, children: [
4287
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
4288
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
4289
+ /* @__PURE__ */ jsx("legend", { className: "text-fg text-sm font-semibold", children: title }),
4290
+ description && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-0.5 text-xs leading-relaxed", children: description })
4291
+ ] }),
4292
+ action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
4293
+ ] }),
4294
+ /* @__PURE__ */ jsx("div", { className: headSpacing, children })
4295
+ ] });
4296
+ });
4297
+ FormSection.displayName = "FormSection";
4229
4298
  var HoverCard = HoverCardPrimitive.Root;
4230
4299
  var HoverCardTrigger = HoverCardPrimitive.Trigger;
4231
4300
  var HoverCardPortal = HoverCardPrimitive.Portal;
4232
- var HoverCardContent = React13.forwardRef(({ className, align = "center", side = "bottom", sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(HoverCardPrimitive.Portal, { children: /* @__PURE__ */ jsx(
4301
+ var HoverCardContent = React36.forwardRef(({ className, align = "center", side = "bottom", sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(HoverCardPrimitive.Portal, { children: /* @__PURE__ */ jsx(
4233
4302
  HoverCardPrimitive.Content,
4234
4303
  {
4235
4304
  ref,
@@ -4391,8 +4460,8 @@ var kbdClass2 = cn(
4391
4460
  "[border-bottom-width:1.5px]"
4392
4461
  );
4393
4462
  function KeyboardShortcutsDialog() {
4394
- const [open, setOpen] = React13.useState(false);
4395
- React13.useEffect(() => {
4463
+ const [open, setOpen] = React36.useState(false);
4464
+ React36.useEffect(() => {
4396
4465
  function handleKeyDown(e) {
4397
4466
  const target = e.target;
4398
4467
  if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement || target?.isContentEditable) {
@@ -4428,7 +4497,7 @@ function KeyboardShortcutsDialog() {
4428
4497
  className: "flex items-center justify-between gap-3 py-1",
4429
4498
  children: [
4430
4499
  /* @__PURE__ */ jsx("span", { className: "text-fg text-sm", children: shortcut.description }),
4431
- /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1", children: shortcut.keys.map((key, i) => /* @__PURE__ */ jsxs(React13.Fragment, { children: [
4500
+ /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1", children: shortcut.keys.map((key, i) => /* @__PURE__ */ jsxs(React36.Fragment, { children: [
4432
4501
  i > 0 && /* @__PURE__ */ jsx("span", { className: "text-fg-4 mx-0.5 text-[11px]", children: "then" }),
4433
4502
  /* @__PURE__ */ jsx("kbd", { className: kbdClass2, children: key })
4434
4503
  ] }, i)) })
@@ -4447,7 +4516,7 @@ function KeyboardShortcutsDialog() {
4447
4516
  var labelVariants = cva(
4448
4517
  "text-[13px] font-medium leading-none text-fg select-none peer-disabled:cursor-not-allowed peer-disabled:text-fg-disabled has-[+input:disabled]:text-fg-disabled"
4449
4518
  );
4450
- var Label4 = React13.forwardRef(
4519
+ var Label4 = React36.forwardRef(
4451
4520
  function Label5({ children, required, className, ...props }, ref) {
4452
4521
  return /* @__PURE__ */ jsxs(LabelPrimitive.Root, { ref, className: cn(labelVariants(), className), ...props, children: [
4453
4522
  children,
@@ -4456,23 +4525,106 @@ var Label4 = React13.forwardRef(
4456
4525
  }
4457
4526
  );
4458
4527
  Label4.displayName = LabelPrimitive.Root.displayName;
4459
- var LinkButton = forwardRef(function LinkButton2({ href, variant = "primary", size = "md", iconLeft, iconRight, children, className, ...props }, ref) {
4460
- return /* @__PURE__ */ jsxs(
4461
- Link,
4528
+ var LinkButton = forwardRef(function LinkButton2({
4529
+ href,
4530
+ variant = "primary",
4531
+ size = "md",
4532
+ iconLeft,
4533
+ iconRight,
4534
+ children,
4535
+ className,
4536
+ external,
4537
+ target,
4538
+ rel,
4539
+ ...props
4540
+ }, ref) {
4541
+ const classes = cn(buttonVariants({ variant, size }), className);
4542
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
4543
+ iconLeft && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconLeft }),
4544
+ children,
4545
+ iconRight && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconRight })
4546
+ ] });
4547
+ if (external) {
4548
+ const safeRel = rel ?? (target === "_blank" ? "noopener noreferrer" : void 0);
4549
+ return /* @__PURE__ */ jsx(
4550
+ "a",
4551
+ {
4552
+ ref,
4553
+ href,
4554
+ className: classes,
4555
+ target,
4556
+ rel: safeRel,
4557
+ ...props,
4558
+ children: content
4559
+ }
4560
+ );
4561
+ }
4562
+ return /* @__PURE__ */ jsx(Link, { ref, href, className: classes, target, rel, ...props, children: content });
4563
+ });
4564
+ LinkButton.displayName = "LinkButton";
4565
+ var Skeleton = forwardRef(function Skeleton2({ className, ...props }, ref) {
4566
+ return /* @__PURE__ */ jsx(
4567
+ "div",
4462
4568
  {
4463
4569
  ref,
4464
- href,
4465
- className: cn(buttonVariants({ variant, size }), className),
4570
+ className: cn("skeleton bg-bg-3 rounded-icon animate-pulse", className),
4571
+ "aria-hidden": "true",
4572
+ ...props
4573
+ }
4574
+ );
4575
+ });
4576
+ Skeleton.displayName = "Skeleton";
4577
+ var SkeletonText = forwardRef(function SkeletonText2({ lines = 3, className, ...props }, ref) {
4578
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("space-y-2", className), "aria-hidden": "true", ...props, children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx(
4579
+ "div",
4580
+ {
4581
+ className: cn(
4582
+ "skeleton bg-bg-3 rounded-icon h-4 animate-pulse",
4583
+ i === lines - 1 && "w-3/4"
4584
+ )
4585
+ },
4586
+ i
4587
+ )) });
4588
+ });
4589
+ SkeletonText.displayName = "SkeletonText";
4590
+ var SkeletonCircle = forwardRef(
4591
+ function SkeletonCircle2({ size = 40, className, ...props }, ref) {
4592
+ return /* @__PURE__ */ jsx(
4593
+ "div",
4594
+ {
4595
+ ref,
4596
+ className: cn("skeleton bg-bg-3 animate-pulse rounded-full", className),
4597
+ style: { width: size, height: size },
4598
+ "aria-hidden": "true",
4599
+ ...props
4600
+ }
4601
+ );
4602
+ }
4603
+ );
4604
+ SkeletonCircle.displayName = "SkeletonCircle";
4605
+ var LoadingRows = forwardRef(function LoadingRows2({
4606
+ count = 3,
4607
+ rowHeight = "h-14",
4608
+ gap = "gap-2",
4609
+ rowClassName,
4610
+ label = "Loading",
4611
+ className,
4612
+ ...props
4613
+ }, ref) {
4614
+ return /* @__PURE__ */ jsx(
4615
+ "div",
4616
+ {
4617
+ ref,
4618
+ role: "status",
4619
+ "aria-busy": "true",
4620
+ "aria-label": label,
4621
+ className: cn("flex flex-col", gap, className),
4466
4622
  ...props,
4467
- children: [
4468
- iconLeft && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconLeft }),
4469
- children,
4470
- iconRight && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconRight })
4471
- ]
4623
+ children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsx(Skeleton, { className: cn(rowHeight, "w-full", rowClassName) }, i))
4472
4624
  }
4473
4625
  );
4474
4626
  });
4475
- LinkButton.displayName = "LinkButton";
4627
+ LoadingRows.displayName = "LoadingRows";
4476
4628
  var sizeStyles = {
4477
4629
  sm: { icon: 20, text: "text-sm", gap: "gap-2" },
4478
4630
  md: { icon: 24, text: "text-[17px]", gap: "gap-2.5" },
@@ -4669,7 +4821,7 @@ function MultiSelectField({
4669
4821
  size = "md",
4670
4822
  id
4671
4823
  }) {
4672
- const selected = React13.useMemo(
4824
+ const selected = React36.useMemo(
4673
4825
  () => new Set(value ? value.split(",").filter(Boolean) : []),
4674
4826
  [value]
4675
4827
  );
@@ -4682,7 +4834,7 @@ function MultiSelectField({
4682
4834
  }
4683
4835
  onChange(Array.from(next).join(","));
4684
4836
  };
4685
- const generatedId = React13.useId();
4837
+ const generatedId = React36.useId();
4686
4838
  const groupId = id ?? generatedId;
4687
4839
  return /* @__PURE__ */ jsxs("div", { className: cn("w-full", className), children: [
4688
4840
  /* @__PURE__ */ jsx(
@@ -5090,12 +5242,12 @@ var ProgressRing = forwardRef(function ProgressRing2({ value, max = 100, size =
5090
5242
  );
5091
5243
  });
5092
5244
  ProgressRing.displayName = "ProgressRing";
5093
- var RadioGroup3 = React13.forwardRef(function RadioGroup4({ className, ...props }, ref) {
5245
+ var RadioGroup3 = React36.forwardRef(function RadioGroup4({ className, ...props }, ref) {
5094
5246
  return /* @__PURE__ */ jsx(RadioGroupPrimitive.Root, { ref, className: cn("grid gap-2", className), ...props });
5095
5247
  });
5096
5248
  RadioGroup3.displayName = RadioGroupPrimitive.Root.displayName;
5097
- var RadioGroupItem = React13.forwardRef(function RadioGroupItem2({ className, label, id: providedId, ...props }, ref) {
5098
- const generatedId = React13.useId();
5249
+ var RadioGroupItem = React36.forwardRef(function RadioGroupItem2({ className, label, id: providedId, ...props }, ref) {
5250
+ const generatedId = React36.useId();
5099
5251
  const id = providedId ?? generatedId;
5100
5252
  const root = /* @__PURE__ */ jsx(
5101
5253
  RadioGroupPrimitive.Item,
@@ -5130,7 +5282,7 @@ var RadioGroupItem = React13.forwardRef(function RadioGroupItem2({ className, la
5130
5282
  ] });
5131
5283
  });
5132
5284
  RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
5133
- var ScrollArea = React13.forwardRef(function ScrollArea2({ className, children, ...props }, ref) {
5285
+ var ScrollArea = React36.forwardRef(function ScrollArea2({ className, children, ...props }, ref) {
5134
5286
  return /* @__PURE__ */ jsxs(
5135
5287
  ScrollAreaPrimitive.Root,
5136
5288
  {
@@ -5146,7 +5298,7 @@ var ScrollArea = React13.forwardRef(function ScrollArea2({ className, children,
5146
5298
  );
5147
5299
  });
5148
5300
  ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
5149
- var ScrollBar = React13.forwardRef(function ScrollBar2({ className, orientation = "vertical", ...props }, ref) {
5301
+ var ScrollBar = React36.forwardRef(function ScrollBar2({ className, orientation = "vertical", ...props }, ref) {
5150
5302
  return /* @__PURE__ */ jsx(
5151
5303
  ScrollAreaPrimitive.ScrollAreaScrollbar,
5152
5304
  {
@@ -5208,7 +5360,7 @@ var searchInputVariants = cva(
5208
5360
  }
5209
5361
  }
5210
5362
  );
5211
- var SearchInput = React13.forwardRef(
5363
+ var SearchInput = React36.forwardRef(
5212
5364
  function SearchInput2({
5213
5365
  value,
5214
5366
  onValueChange,
@@ -5221,8 +5373,8 @@ var SearchInput = React13.forwardRef(
5221
5373
  ...props
5222
5374
  }, ref) {
5223
5375
  const debouncedValue = useDebounce(value, debounceMs);
5224
- const isFirstRender = React13.useRef(true);
5225
- React13.useEffect(() => {
5376
+ const isFirstRender = React36.useRef(true);
5377
+ React36.useEffect(() => {
5226
5378
  if (isFirstRender.current) {
5227
5379
  isFirstRender.current = false;
5228
5380
  return;
@@ -5290,27 +5442,27 @@ function SearchSelect({
5290
5442
  className,
5291
5443
  disabled = false
5292
5444
  }) {
5293
- const [search, setSearch] = React13.useState("");
5294
- const [open, setOpen] = React13.useState(false);
5295
- const selectedIds = React13.useMemo(() => new Set(selected.map((s) => s.id)), [selected]);
5296
- const filtered = React13.useMemo(
5445
+ const [search, setSearch] = React36.useState("");
5446
+ const [open, setOpen] = React36.useState(false);
5447
+ const selectedIds = React36.useMemo(() => new Set(selected.map((s) => s.id)), [selected]);
5448
+ const filtered = React36.useMemo(
5297
5449
  () => options.filter((opt) => !selectedIds.has(opt.id)),
5298
5450
  [options, selectedIds]
5299
5451
  );
5300
5452
  const trimmedSearch = search.trim();
5301
- const hasExactMatch = React13.useMemo(
5453
+ const hasExactMatch = React36.useMemo(
5302
5454
  () => options.some((opt) => opt.label.toLowerCase() === trimmedSearch.toLowerCase()),
5303
5455
  [options, trimmedSearch]
5304
5456
  );
5305
5457
  const showCreate = !!onCreate && trimmedSearch.length > 0 && !hasExactMatch;
5306
- const handleSelect = React13.useCallback(
5458
+ const handleSelect = React36.useCallback(
5307
5459
  (option) => {
5308
5460
  onSelect(option);
5309
5461
  setSearch("");
5310
5462
  },
5311
5463
  [onSelect]
5312
5464
  );
5313
- const handleCreate = React13.useCallback(() => {
5465
+ const handleCreate = React36.useCallback(() => {
5314
5466
  if (onCreate && trimmedSearch) {
5315
5467
  onCreate(trimmedSearch);
5316
5468
  setSearch("");
@@ -5536,7 +5688,7 @@ var SectionHead = forwardRef(function SectionHead2({ eyebrow, title, meta, class
5536
5688
  );
5537
5689
  });
5538
5690
  SectionHead.displayName = "SectionHead";
5539
- var Separator4 = React13.forwardRef(function Separator5({ className, orientation = "horizontal", decorative = true, ...props }, ref) {
5691
+ var Separator4 = React36.forwardRef(function Separator5({ className, orientation = "horizontal", decorative = true, ...props }, ref) {
5540
5692
  return /* @__PURE__ */ jsx(
5541
5693
  SeparatorPrimitive.Root,
5542
5694
  {
@@ -5553,13 +5705,13 @@ var Separator4 = React13.forwardRef(function Separator5({ className, orientation
5553
5705
  );
5554
5706
  });
5555
5707
  Separator4.displayName = SeparatorPrimitive.Root.displayName;
5556
- var SheetSideContext = React13.createContext({});
5708
+ var SheetSideContext = React36.createContext({});
5557
5709
  var Sheet = ({ side, children, ...props }) => /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...props, children: /* @__PURE__ */ jsx(SheetSideContext, { value: { side }, children }) });
5558
5710
  Sheet.displayName = "Sheet";
5559
5711
  var SheetTrigger = DialogPrimitive.Trigger;
5560
5712
  var SheetClose = DialogPrimitive.Close;
5561
5713
  var SheetPortal = DialogPrimitive.Portal;
5562
- var SheetOverlay = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
5714
+ var SheetOverlay = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
5563
5715
  DialogPrimitive.Overlay,
5564
5716
  {
5565
5717
  ref,
@@ -5604,8 +5756,8 @@ var sheetVariants = cva(
5604
5756
  defaultVariants: { side: "right" }
5605
5757
  }
5606
5758
  );
5607
- var SheetContent = React13.forwardRef(({ side, className, children, showCloseButton = true, ...props }, ref) => {
5608
- const ctx = React13.use(SheetSideContext);
5759
+ var SheetContent = React36.forwardRef(({ side, className, children, showCloseButton = true, ...props }, ref) => {
5760
+ const ctx = React36.use(SheetSideContext);
5609
5761
  const resolvedSide = side ?? ctx.side ?? "right";
5610
5762
  return /* @__PURE__ */ jsxs(SheetPortal, { children: [
5611
5763
  /* @__PURE__ */ jsx(SheetOverlay, {}),
@@ -5650,7 +5802,7 @@ var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
5650
5802
  }
5651
5803
  );
5652
5804
  SheetFooter.displayName = "SheetFooter";
5653
- var SheetTitle = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
5805
+ var SheetTitle = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
5654
5806
  DialogPrimitive.Title,
5655
5807
  {
5656
5808
  ref,
@@ -5662,7 +5814,7 @@ var SheetTitle = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE
5662
5814
  }
5663
5815
  ));
5664
5816
  SheetTitle.displayName = DialogPrimitive.Title.displayName;
5665
- var SheetDescription = React13.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Description, { ref, className: cn("text-fg-3 text-sm", className), ...props }));
5817
+ var SheetDescription = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Description, { ref, className: cn("text-fg-3 text-sm", className), ...props }));
5666
5818
  SheetDescription.displayName = DialogPrimitive.Description.displayName;
5667
5819
  var sideDrawerVariants = cva(
5668
5820
  cn(
@@ -5779,47 +5931,7 @@ function SideDrawerFooter({ children, className }) {
5779
5931
  SideDrawer.Header = SideDrawerHeader;
5780
5932
  SideDrawer.Body = SideDrawerBody;
5781
5933
  SideDrawer.Footer = SideDrawerFooter;
5782
- var Skeleton = forwardRef(function Skeleton2({ className, ...props }, ref) {
5783
- return /* @__PURE__ */ jsx(
5784
- "div",
5785
- {
5786
- ref,
5787
- className: cn("skeleton bg-bg-3 rounded-icon animate-pulse", className),
5788
- "aria-hidden": "true",
5789
- ...props
5790
- }
5791
- );
5792
- });
5793
- Skeleton.displayName = "Skeleton";
5794
- var SkeletonText = forwardRef(function SkeletonText2({ lines = 3, className, ...props }, ref) {
5795
- return /* @__PURE__ */ jsx("div", { ref, className: cn("space-y-2", className), "aria-hidden": "true", ...props, children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx(
5796
- "div",
5797
- {
5798
- className: cn(
5799
- "skeleton bg-bg-3 rounded-icon h-4 animate-pulse",
5800
- i === lines - 1 && "w-3/4"
5801
- )
5802
- },
5803
- i
5804
- )) });
5805
- });
5806
- SkeletonText.displayName = "SkeletonText";
5807
- var SkeletonCircle = forwardRef(
5808
- function SkeletonCircle2({ size = 40, className, ...props }, ref) {
5809
- return /* @__PURE__ */ jsx(
5810
- "div",
5811
- {
5812
- ref,
5813
- className: cn("skeleton bg-bg-3 animate-pulse rounded-full", className),
5814
- style: { width: size, height: size },
5815
- "aria-hidden": "true",
5816
- ...props
5817
- }
5818
- );
5819
- }
5820
- );
5821
- SkeletonCircle.displayName = "SkeletonCircle";
5822
- var Slider = React13.forwardRef(
5934
+ var Slider = React36.forwardRef(
5823
5935
  function Slider2({
5824
5936
  className,
5825
5937
  label,
@@ -5831,7 +5943,7 @@ var Slider = React13.forwardRef(
5831
5943
  defaultValue,
5832
5944
  ...props
5833
5945
  }, ref) {
5834
- const generatedId = React13.useId();
5946
+ const generatedId = React36.useId();
5835
5947
  const id = providedId ?? generatedId;
5836
5948
  const displayValue = (() => {
5837
5949
  const v = value ?? defaultValue;
@@ -6119,9 +6231,9 @@ var switchThumbVariants = cva(
6119
6231
  }
6120
6232
  }
6121
6233
  );
6122
- var Switch = React13.forwardRef(
6234
+ var Switch = React36.forwardRef(
6123
6235
  function Switch2({ label, size, className, id: providedId, ...props }, ref) {
6124
- const generatedId = React13.useId();
6236
+ const generatedId = React36.useId();
6125
6237
  const id = providedId ?? generatedId;
6126
6238
  const root = /* @__PURE__ */ jsx(
6127
6239
  SwitchPrimitive.Root,
@@ -6253,13 +6365,13 @@ var TableCaption = forwardRef(
6253
6365
  }
6254
6366
  );
6255
6367
  TableCaption.displayName = "TableCaption";
6256
- var Tabs = React13.forwardRef(
6368
+ var Tabs = React36.forwardRef(
6257
6369
  function Tabs2({ className, ...props }, ref) {
6258
6370
  return /* @__PURE__ */ jsx(TabsPrimitive.Root, { ref, className: cn(className), ...props });
6259
6371
  }
6260
6372
  );
6261
6373
  Tabs.displayName = TabsPrimitive.Root.displayName;
6262
- var TabsList = React13.forwardRef(function TabsList2({ className, ...props }, ref) {
6374
+ var TabsList = React36.forwardRef(function TabsList2({ className, ...props }, ref) {
6263
6375
  return /* @__PURE__ */ jsx(
6264
6376
  TabsPrimitive.List,
6265
6377
  {
@@ -6282,13 +6394,16 @@ var triggerVariants = cva(
6282
6394
  {
6283
6395
  variants: {
6284
6396
  variant: {
6285
- // §5.16: tab current = text-accent + 2px accent underline (tabs are
6286
- // interaction, so cyan; Pro purple is reserved for selection state
6287
- // on list/dropdown surfaces).
6397
+ // §5.16: tab current = 2px accent underline + bold foreground text.
6398
+ // The cyan rule carries the brand statement (tabs are interaction,
6399
+ // so cyan; Pro purple is reserved for selection state on
6400
+ // list/dropdown surfaces). The active LABEL stays in `text-fg` for
6401
+ // legibility — accent on text was too low-contrast against the page
6402
+ // background, especially in dark mode.
6288
6403
  underline: cn(
6289
6404
  "rounded-none bg-transparent px-3.5 py-2.5",
6290
6405
  "border-b-2 border-transparent -mb-px",
6291
- "data-[state=active]:border-accent data-[state=active]:text-accent"
6406
+ "data-[state=active]:border-accent data-[state=active]:text-fg data-[state=active]:font-semibold"
6292
6407
  ),
6293
6408
  pill: cn(
6294
6409
  "rounded-pill px-3 py-1.5",
@@ -6301,7 +6416,7 @@ var triggerVariants = cva(
6301
6416
  }
6302
6417
  }
6303
6418
  );
6304
- var TabsTrigger = React13.forwardRef(function TabsTrigger2({ className, variant, ...props }, ref) {
6419
+ var TabsTrigger = React36.forwardRef(function TabsTrigger2({ className, variant, ...props }, ref) {
6305
6420
  return /* @__PURE__ */ jsx(
6306
6421
  TabsPrimitive.Trigger,
6307
6422
  {
@@ -6312,7 +6427,7 @@ var TabsTrigger = React13.forwardRef(function TabsTrigger2({ className, variant,
6312
6427
  );
6313
6428
  });
6314
6429
  TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
6315
- var TabsContent = React13.forwardRef(function TabsContent2({ className, ...props }, ref) {
6430
+ var TabsContent = React36.forwardRef(function TabsContent2({ className, ...props }, ref) {
6316
6431
  return /* @__PURE__ */ jsx(
6317
6432
  TabsPrimitive.Content,
6318
6433
  {
@@ -6337,7 +6452,7 @@ function TeamMemberSelect({
6337
6452
  placeholder = "Select team member...",
6338
6453
  className
6339
6454
  }) {
6340
- const options = React13.useMemo(() => {
6455
+ const options = React36.useMemo(() => {
6341
6456
  const meBadge = /* @__PURE__ */ jsx(
6342
6457
  Badge,
6343
6458
  {
@@ -6604,10 +6719,10 @@ var itemVariants = cva(
6604
6719
  }
6605
6720
  }
6606
6721
  );
6607
- var ToggleGroupContext = React13.createContext({
6722
+ var ToggleGroupContext = React36.createContext({
6608
6723
  variant: "default"
6609
6724
  });
6610
- var ToggleGroup = React13.forwardRef(function ToggleGroup2({ className, variant, children, ...props }, ref) {
6725
+ var ToggleGroup = React36.forwardRef(function ToggleGroup2({ className, variant, children, ...props }, ref) {
6611
6726
  return /* @__PURE__ */ jsx(
6612
6727
  ToggleGroupPrimitive.Root,
6613
6728
  {
@@ -6619,8 +6734,8 @@ var ToggleGroup = React13.forwardRef(function ToggleGroup2({ className, variant,
6619
6734
  );
6620
6735
  });
6621
6736
  ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
6622
- var ToggleGroupItem = React13.forwardRef(function ToggleGroupItem2({ className, variant, ...props }, ref) {
6623
- const ctx = React13.useContext(ToggleGroupContext);
6737
+ var ToggleGroupItem = React36.forwardRef(function ToggleGroupItem2({ className, variant, ...props }, ref) {
6738
+ const ctx = React36.useContext(ToggleGroupContext);
6624
6739
  return /* @__PURE__ */ jsx(
6625
6740
  ToggleGroupPrimitive.Item,
6626
6741
  {
@@ -6639,7 +6754,7 @@ var Tooltip = ({ delayMs, delayDuration, children, ...props }) => {
6639
6754
  return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, { delayDuration: resolvedDelay, children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, { delayDuration: resolvedDelay, ...props, children }) });
6640
6755
  };
6641
6756
  Tooltip.displayName = "Tooltip";
6642
- var TooltipContent = React13.forwardRef(({ className, sideOffset = 6, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
6757
+ var TooltipContent = React36.forwardRef(({ className, sideOffset = 6, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
6643
6758
  TooltipPrimitive.Content,
6644
6759
  {
6645
6760
  ref,
@@ -6691,88 +6806,417 @@ var Content15 = forwardRef(function Content16({ padBottom, className, style, ...
6691
6806
  );
6692
6807
  });
6693
6808
  Content15.displayName = "Content";
6694
- var Sidebar = forwardRef(function Sidebar2({ className, ...props }, ref) {
6695
- return /* @__PURE__ */ jsx(
6696
- "aside",
6697
- {
6698
- ref,
6699
- className: cn(
6700
- "scrollbar-thin flex h-dvh w-[var(--shell-sidebar-w)] shrink-0 flex-col overflow-y-auto",
6701
- "border-rule bg-bg-2 border-r px-3 pt-4 pb-4",
6702
- className
6703
- ),
6704
- ...props
6809
+ var SidebarContext = React36.createContext(null);
6810
+ var NOOP_CONTEXT = {
6811
+ state: "expanded",
6812
+ setState: () => {
6813
+ },
6814
+ toggle: () => {
6815
+ },
6816
+ collapsible: false
6817
+ };
6818
+ function useSidebarState() {
6819
+ return React36.useContext(SidebarContext) ?? NOOP_CONTEXT;
6820
+ }
6821
+ var DEFAULT_SHORTCUT = "Mod+\\";
6822
+ function readStorage(key) {
6823
+ if (!key || typeof window === "undefined") return null;
6824
+ try {
6825
+ const v = window.localStorage.getItem(key);
6826
+ return v === "rail" || v === "expanded" ? v : null;
6827
+ } catch {
6828
+ return null;
6829
+ }
6830
+ }
6831
+ function SidebarProvider({
6832
+ children,
6833
+ state: controlled,
6834
+ defaultState = "expanded",
6835
+ onStateChange,
6836
+ storageKey,
6837
+ shortcut = DEFAULT_SHORTCUT
6838
+ }) {
6839
+ const [uncontrolled, setUncontrolled] = React36.useState(
6840
+ controlled ?? defaultState
6841
+ );
6842
+ React36.useEffect(() => {
6843
+ if (controlled !== void 0) return;
6844
+ const stored = readStorage(storageKey);
6845
+ if (stored && stored !== uncontrolled) setUncontrolled(stored);
6846
+ }, []);
6847
+ const state = controlled ?? uncontrolled;
6848
+ const setState = React36.useCallback(
6849
+ (next) => {
6850
+ if (controlled === void 0) setUncontrolled(next);
6851
+ onStateChange?.(next);
6852
+ if (storageKey && typeof window !== "undefined") {
6853
+ try {
6854
+ window.localStorage.setItem(storageKey, next);
6855
+ } catch {
6856
+ }
6857
+ }
6858
+ },
6859
+ [controlled, onStateChange, storageKey]
6860
+ );
6861
+ const toggle = React36.useCallback(() => {
6862
+ setState(state === "expanded" ? "rail" : "expanded");
6863
+ }, [state, setState]);
6864
+ React36.useEffect(() => {
6865
+ if (!shortcut) return;
6866
+ const parts = shortcut.split("+");
6867
+ const key = parts.pop() ?? "";
6868
+ const wantMod = parts.includes("Mod");
6869
+ const wantShift = parts.includes("Shift");
6870
+ const wantAlt = parts.includes("Alt");
6871
+ function onKey(e) {
6872
+ const isMac = typeof navigator !== "undefined" && /Mac|iPhone|iPad/.test(navigator.platform);
6873
+ const mod = isMac ? e.metaKey : e.ctrlKey;
6874
+ if (e.key.toLowerCase() !== key.toLowerCase()) return;
6875
+ if (wantMod !== mod) return;
6876
+ if (wantShift !== e.shiftKey) return;
6877
+ if (wantAlt !== e.altKey) return;
6878
+ e.preventDefault();
6879
+ toggle();
6880
+ }
6881
+ window.addEventListener("keydown", onKey);
6882
+ return () => window.removeEventListener("keydown", onKey);
6883
+ }, [shortcut, toggle]);
6884
+ const value = React36.useMemo(
6885
+ () => ({ state, setState, toggle, collapsible: true }),
6886
+ [state, setState, toggle]
6887
+ );
6888
+ return /* @__PURE__ */ jsx(SidebarContext.Provider, { value, children });
6889
+ }
6890
+ SidebarProvider.displayName = "SidebarProvider";
6891
+ var PEEK_ENTER_DELAY_MS = 100;
6892
+ var PEEK_LEAVE_DELAY_MS = 200;
6893
+ var Sidebar = React36.forwardRef(function Sidebar2({ className, collapsible = false, onMouseEnter, onMouseLeave, style, ...props }, ref) {
6894
+ const ctx = React36.useContext(SidebarContext);
6895
+ const state = collapsible && ctx ? ctx.state : "expanded";
6896
+ const [peek, setPeek] = React36.useState(false);
6897
+ const enterTimer = React36.useRef(null);
6898
+ const leaveTimer = React36.useRef(null);
6899
+ const clearTimers = React36.useCallback(() => {
6900
+ if (enterTimer.current != null) {
6901
+ window.clearTimeout(enterTimer.current);
6902
+ enterTimer.current = null;
6903
+ }
6904
+ if (leaveTimer.current != null) {
6905
+ window.clearTimeout(leaveTimer.current);
6906
+ leaveTimer.current = null;
6705
6907
  }
6908
+ }, []);
6909
+ React36.useEffect(() => () => clearTimers(), [clearTimers]);
6910
+ React36.useEffect(() => {
6911
+ if (state === "expanded") {
6912
+ clearTimers();
6913
+ setPeek(false);
6914
+ }
6915
+ }, [state, clearTimers]);
6916
+ const handleEnter = (e) => {
6917
+ onMouseEnter?.(e);
6918
+ if (!collapsible || state !== "rail") return;
6919
+ if (leaveTimer.current != null) {
6920
+ window.clearTimeout(leaveTimer.current);
6921
+ leaveTimer.current = null;
6922
+ }
6923
+ if (peek) return;
6924
+ enterTimer.current = window.setTimeout(() => setPeek(true), PEEK_ENTER_DELAY_MS);
6925
+ };
6926
+ const handleLeave = (e) => {
6927
+ onMouseLeave?.(e);
6928
+ if (!collapsible) return;
6929
+ if (enterTimer.current != null) {
6930
+ window.clearTimeout(enterTimer.current);
6931
+ enterTimer.current = null;
6932
+ }
6933
+ if (!peek) return;
6934
+ leaveTimer.current = window.setTimeout(() => setPeek(false), PEEK_LEAVE_DELAY_MS);
6935
+ };
6936
+ const labelsHidden = state === "rail" && !peek;
6937
+ const effectiveWidth = labelsHidden ? "var(--shell-sidebar-w-rail)" : "var(--shell-sidebar-w)";
6938
+ return (
6939
+ // Hover-peek is *enhancement only*: the canonical way to toggle the
6940
+ // sidebar is <SidebarTrigger> (button) or the Mod+\ shortcut, both
6941
+ // fully keyboard- and screen-reader-accessible. The mouse handlers
6942
+ // here exist to widen the column on pointer hover, which has no
6943
+ // keyboard analogue and intentionally so.
6944
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
6945
+ /* @__PURE__ */ jsx(
6946
+ "aside",
6947
+ {
6948
+ ref,
6949
+ "data-state": state,
6950
+ "data-peek": peek ? "true" : void 0,
6951
+ "data-labels": labelsHidden ? "hide" : "show",
6952
+ "data-collapsible": collapsible ? "true" : void 0,
6953
+ onMouseEnter: handleEnter,
6954
+ onMouseLeave: handleLeave,
6955
+ style: { width: effectiveWidth, ...style },
6956
+ className: cn(
6957
+ "group/sidebar scrollbar-thin flex h-dvh shrink-0 flex-col overflow-y-auto",
6958
+ "border-rule bg-bg-2 border-r px-3 pt-4 pb-4",
6959
+ // 220ms feels right for a ~192px width sweep — slower than the
6960
+ // 150ms `--duration-fast` (which reads as a snap on this size of
6961
+ // movement) but well short of `--duration-slow` (which feels
6962
+ // sluggish). `will-change` hints the compositor so the column
6963
+ // doesn't repaint every frame mid-transition.
6964
+ "transition-[width,box-shadow] duration-[220ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
6965
+ "[will-change:width]",
6966
+ // Peek overlay: float above the canvas without reflowing layout.
6967
+ "data-[peek=true]:fixed data-[peek=true]:top-0 data-[peek=true]:left-0",
6968
+ "data-[peek=true]:z-[var(--z-overlay)] data-[peek=true]:shadow-pop",
6969
+ // Padding is held constant across states so icons keep their
6970
+ // horizontal anchor when the column widens — peek expands the
6971
+ // labels rightward rather than shifting the icons leftward.
6972
+ className
6973
+ ),
6974
+ ...props
6975
+ }
6976
+ )
6706
6977
  );
6707
6978
  });
6708
6979
  Sidebar.displayName = "Sidebar";
6709
- var SidebarBrand = forwardRef(function SidebarBrand2({ className, ...props }, ref) {
6710
- return /* @__PURE__ */ jsx("div", { ref, className: cn("px-2 pt-1 pb-4", className), ...props });
6711
- });
6980
+ var SidebarTrigger = React36.forwardRef(
6981
+ function SidebarTrigger2({
6982
+ className,
6983
+ expandLabel = "Expand sidebar",
6984
+ collapseLabel = "Collapse sidebar",
6985
+ onClick,
6986
+ ...props
6987
+ }, ref) {
6988
+ const ctx = React36.useContext(SidebarContext);
6989
+ if (!ctx) return null;
6990
+ const { state, toggle } = ctx;
6991
+ const label = state === "expanded" ? collapseLabel : expandLabel;
6992
+ return /* @__PURE__ */ jsx(
6993
+ "button",
6994
+ {
6995
+ ref,
6996
+ type: "button",
6997
+ "aria-label": label,
6998
+ "aria-expanded": state === "expanded",
6999
+ onClick: (e) => {
7000
+ onClick?.(e);
7001
+ if (!e.defaultPrevented) toggle();
7002
+ },
7003
+ className: cn(
7004
+ "inline-flex size-7 shrink-0 items-center justify-center rounded-md",
7005
+ "text-fg-3 hover:bg-bg-3 hover:text-fg",
7006
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7007
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
7008
+ "[&_svg]:size-4",
7009
+ className
7010
+ ),
7011
+ ...props,
7012
+ children: state === "expanded" ? /* @__PURE__ */ jsx(PanelLeftCloseIcon, {}) : /* @__PURE__ */ jsx(PanelLeftIcon, {})
7013
+ }
7014
+ );
7015
+ }
7016
+ );
7017
+ SidebarTrigger.displayName = "SidebarTrigger";
7018
+ var SidebarBrand = React36.forwardRef(
7019
+ function SidebarBrand2({ className, ...props }, ref) {
7020
+ return /* @__PURE__ */ jsx(
7021
+ "div",
7022
+ {
7023
+ ref,
7024
+ className: cn(
7025
+ "flex min-w-0 items-center gap-2 px-2 pt-1 pb-4",
7026
+ className
7027
+ ),
7028
+ ...props
7029
+ }
7030
+ );
7031
+ }
7032
+ );
6712
7033
  SidebarBrand.displayName = "SidebarBrand";
6713
- var SidebarSection = forwardRef(
7034
+ var SidebarBrandText = React36.forwardRef(
7035
+ function SidebarBrandText2({ className, ...props }, ref) {
7036
+ return /* @__PURE__ */ jsx(
7037
+ "span",
7038
+ {
7039
+ ref,
7040
+ "aria-hidden": "false",
7041
+ className: cn(
7042
+ "min-w-0 truncate",
7043
+ // Smooth fade + width collapse on rail. Keeps the wordmark
7044
+ // legible up to the moment the column reaches rail width, then
7045
+ // fully drops out (visibility:hidden cuts hit-testing).
7046
+ "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7047
+ "max-w-[160px] opacity-100",
7048
+ "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible",
7049
+ className
7050
+ ),
7051
+ ...props
7052
+ }
7053
+ );
7054
+ }
7055
+ );
7056
+ SidebarBrandText.displayName = "SidebarBrandText";
7057
+ var SidebarGroupScopeContext = React36.createContext(null);
7058
+ var SidebarSection = React36.forwardRef(
6714
7059
  function SidebarSection2({ label, tone = "pro", className, children, ...props }, ref) {
6715
- return /* @__PURE__ */ jsxs("div", { ref, className: cn("mb-4", className), ...props, children: [
6716
- label != null && /* @__PURE__ */ jsx("div", { className: "mb-1 flex items-center justify-between px-2.5 py-1", children: /* @__PURE__ */ jsx(
6717
- "span",
6718
- {
6719
- className: cn(
6720
- "font-mono text-[11px] tracking-[0.14em] uppercase",
6721
- tone === "muted" ? "text-fg-3" : "text-pro-fg"
7060
+ const ariaLabel = typeof label === "string" ? label : typeof label === "number" ? String(label) : void 0;
7061
+ const [exclusiveId, setExclusiveIdState] = React36.useState(null);
7062
+ const setExclusive = React36.useCallback(
7063
+ (id) => setExclusiveIdState(id),
7064
+ []
7065
+ );
7066
+ const scope = React36.useMemo(
7067
+ () => ({ exclusiveId, setExclusive }),
7068
+ [exclusiveId, setExclusive]
7069
+ );
7070
+ return /* @__PURE__ */ jsx(SidebarGroupScopeContext.Provider, { value: scope, children: /* @__PURE__ */ jsxs(
7071
+ "div",
7072
+ {
7073
+ ref,
7074
+ role: ariaLabel ? "group" : void 0,
7075
+ "aria-label": ariaLabel,
7076
+ className: cn(
7077
+ "mb-4",
7078
+ // In rail, the visible section labels disappear and the only
7079
+ // grouping cue is a thin rule. No extra mb/pb — the border
7080
+ // itself separates groups, so inter-section spacing matches
7081
+ // intra-section spacing and the rail stays dense.
7082
+ "group-data-[labels=hide]/sidebar:mb-0 group-data-[labels=hide]/sidebar:border-b group-data-[labels=hide]/sidebar:border-rule group-data-[labels=hide]/sidebar:pb-0 group-data-[labels=hide]/sidebar:last:border-b-0",
7083
+ className
7084
+ ),
7085
+ ...props,
7086
+ children: [
7087
+ label != null && /* @__PURE__ */ jsx(
7088
+ "div",
7089
+ {
7090
+ className: cn(
7091
+ "mb-1 flex items-center justify-between px-2.5 py-1",
7092
+ "transition-opacity duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7093
+ "opacity-100",
7094
+ "group-data-[labels=hide]/sidebar:invisible group-data-[labels=hide]/sidebar:opacity-0"
7095
+ ),
7096
+ children: /* @__PURE__ */ jsx(
7097
+ "span",
7098
+ {
7099
+ className: cn(
7100
+ "font-mono text-[11px] tracking-[0.14em] uppercase",
7101
+ tone === "muted" ? "text-fg-3" : "text-pro-fg"
7102
+ ),
7103
+ children: label
7104
+ }
7105
+ )
7106
+ }
6722
7107
  ),
6723
- children: label
6724
- }
6725
- ) }),
6726
- children
6727
- ] });
7108
+ children
7109
+ ]
7110
+ }
7111
+ ) });
6728
7112
  }
6729
7113
  );
6730
7114
  SidebarSection.displayName = "SidebarSection";
6731
- var SidebarLink = forwardRef(function SidebarLink2({ href, icon, active = false, asChild, className, children, ...props }, ref) {
6732
- const Comp = asChild ? Slot : "a";
6733
- return /* @__PURE__ */ jsx(
6734
- Comp,
6735
- {
6736
- ref,
6737
- ...asChild ? {} : { href },
6738
- "data-active": active ? "true" : void 0,
6739
- "aria-current": active ? "page" : void 0,
6740
- className: cn(
6741
- "group relative mb-px flex items-center gap-2.5 rounded-md px-2.5 py-1.5",
6742
- "text-fg-2 text-[13px] font-normal no-underline",
6743
- "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
6744
- "motion-reduce:transition-none",
6745
- "hover:bg-bg-3 hover:text-fg",
6746
- "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
6747
- "data-[active=true]:bg-pro-bg data-[active=true]:text-pro-fg data-[active=true]:font-medium",
6748
- // Active rail: 2px wide, 16px tall, anchored to the link's own left
6749
- // edge (no parent-padding dependency fixes G12).
6750
- "data-[active=true]:before:absolute data-[active=true]:before:content-['']",
6751
- "data-[active=true]:before:top-1/2 data-[active=true]:before:left-0",
6752
- "data-[active=true]:before:h-4 data-[active=true]:before:w-[2px] data-[active=true]:before:-translate-y-1/2",
6753
- "data-[active=true]:before:bg-pro-fg data-[active=true]:before:rounded-r-full",
6754
- "motion-reduce:transition-none",
6755
- "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:opacity-85",
6756
- className
6757
- ),
6758
- ...props,
6759
- children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
6760
- icon,
6761
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children })
6762
- ] })
6763
- }
6764
- );
6765
- });
7115
+ var SidebarLink = React36.forwardRef(
7116
+ function SidebarLink2({ href, icon, active = false, asChild, className, children, ...props }, ref) {
7117
+ const Comp = asChild ? Slot : "a";
7118
+ return /* @__PURE__ */ jsx(
7119
+ Comp,
7120
+ {
7121
+ ref,
7122
+ ...asChild ? {} : { href },
7123
+ "data-active": active ? "true" : void 0,
7124
+ "aria-current": active ? "page" : void 0,
7125
+ className: cn(
7126
+ "group/link relative mb-px flex items-center gap-2.5 rounded-md px-2.5 py-1.5",
7127
+ "text-fg-2 text-[13px] font-normal no-underline",
7128
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
7129
+ "motion-reduce:transition-none",
7130
+ "hover:bg-bg-3 hover:text-fg",
7131
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
7132
+ "data-[active=true]:bg-pro-bg data-[active=true]:text-pro-fg data-[active=true]:font-medium",
7133
+ // In rail, the icon itself carries the active state rather
7134
+ // than just the rule bar — color is more legible than a 2px
7135
+ // vertical mark at the column's left edge when labels are
7136
+ // hidden. The full-opacity icon override (`opacity-100`)
7137
+ // counters the default `[&_svg]:opacity-85` so the active
7138
+ // icon doesn't read as "still inactive but darker".
7139
+ "group-data-[labels=hide]/sidebar:data-[active=true]:[&_svg]:text-pro-fg group-data-[labels=hide]/sidebar:data-[active=true]:[&_svg]:opacity-100",
7140
+ // Active rail: 2px wide, 16px tall, anchored to the link's
7141
+ // own left edge — no parent-padding dependency. Continues
7142
+ // working unchanged when the aside narrows to a rail.
7143
+ "data-[active=true]:before:absolute data-[active=true]:before:content-['']",
7144
+ "data-[active=true]:before:top-1/2 data-[active=true]:before:left-0",
7145
+ "data-[active=true]:before:h-4 data-[active=true]:before:w-[2px] data-[active=true]:before:-translate-y-1/2",
7146
+ "data-[active=true]:before:bg-pro-fg data-[active=true]:before:rounded-r-full",
7147
+ // Padding/gap stay constant so the icon stays under the cursor
7148
+ // when the column widens during peek. The label simply collapses
7149
+ // to width 0 via <SidebarLinkLabel>.
7150
+ "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:opacity-85",
7151
+ className
7152
+ ),
7153
+ ...props,
7154
+ children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
7155
+ icon,
7156
+ /* @__PURE__ */ jsx(
7157
+ "span",
7158
+ {
7159
+ className: cn(
7160
+ "min-w-0 flex-1 truncate",
7161
+ "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7162
+ "max-w-full opacity-100",
7163
+ "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
7164
+ ),
7165
+ children
7166
+ }
7167
+ )
7168
+ ] })
7169
+ }
7170
+ );
7171
+ }
7172
+ );
6766
7173
  SidebarLink.displayName = "SidebarLink";
7174
+ var SidebarLinkLabel = React36.forwardRef(
7175
+ function SidebarLinkLabel2({ className, ...props }, ref) {
7176
+ return /* @__PURE__ */ jsx(
7177
+ "span",
7178
+ {
7179
+ ref,
7180
+ className: cn(
7181
+ "min-w-0 flex-1 truncate",
7182
+ // Fade + collapse instead of hard display:none so a single
7183
+ // 180ms opacity tween covers all labels in lockstep with the
7184
+ // 220ms aside-width transition — no snap on the last frame.
7185
+ "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7186
+ "max-w-full opacity-100",
7187
+ "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible",
7188
+ className
7189
+ ),
7190
+ ...props
7191
+ }
7192
+ );
7193
+ }
7194
+ );
7195
+ SidebarLinkLabel.displayName = "SidebarLinkLabel";
7196
+ var SidebarLinkAction = React36.forwardRef(
7197
+ function SidebarLinkAction2({ className, ...props }, ref) {
7198
+ return /* @__PURE__ */ jsx(
7199
+ "span",
7200
+ {
7201
+ ref,
7202
+ className: cn(
7203
+ "transition-opacity duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7204
+ "opacity-100",
7205
+ "group-data-[labels=hide]/sidebar:invisible group-data-[labels=hide]/sidebar:opacity-0",
7206
+ className
7207
+ ),
7208
+ ...props
7209
+ }
7210
+ );
7211
+ }
7212
+ );
7213
+ SidebarLinkAction.displayName = "SidebarLinkAction";
6767
7214
  var sidebarLinkBadgeVariants = cva(
6768
- "ml-auto inline-flex shrink-0 items-center justify-center font-mono tabular-nums",
7215
+ "ml-auto inline-flex shrink-0 items-center justify-center font-mono tabular-nums group-data-[labels=hide]/sidebar:hidden",
6769
7216
  {
6770
7217
  variants: {
6771
7218
  tone: {
6772
- // Default: bare mono digit, picks up Pro fg on the active link.
6773
- default: "text-[10.5px] text-fg-4 group-data-[active=true]:text-pro-fg",
6774
- // Semantic pills — for nav items with action signals
6775
- // (unread messages, due tasks, blocked actions).
7219
+ default: "text-[10.5px] text-fg-4 group-data-[active=true]/link:text-pro-fg",
6776
7220
  danger: "rounded-pill bg-danger-bg px-1.5 py-0.5 text-[10.5px] text-danger-fg",
6777
7221
  warning: "rounded-pill bg-warning-bg px-1.5 py-0.5 text-[10.5px] text-warning-fg",
6778
7222
  neutral: "rounded-pill bg-bg-3 px-1.5 py-0.5 text-[10.5px] text-fg-2"
@@ -6781,34 +7225,176 @@ var sidebarLinkBadgeVariants = cva(
6781
7225
  defaultVariants: { tone: "default" }
6782
7226
  }
6783
7227
  );
6784
- var SidebarLinkBadge = forwardRef(
7228
+ var SidebarLinkBadge = React36.forwardRef(
6785
7229
  function SidebarLinkBadge2({ tone, className, ...props }, ref) {
6786
7230
  return /* @__PURE__ */ jsx("span", { ref, className: cn(sidebarLinkBadgeVariants({ tone }), className), ...props });
6787
7231
  }
6788
7232
  );
6789
7233
  SidebarLinkBadge.displayName = "SidebarLinkBadge";
6790
- var SidebarFooter = forwardRef(function SidebarFooter2({ className, ...props }, ref) {
6791
- return /* @__PURE__ */ jsx(
6792
- "div",
6793
- {
6794
- ref,
6795
- className: cn(
6796
- "border-rule mt-auto flex items-center gap-2.5 border-t px-2 pt-2.5 pb-1",
6797
- "text-fg-3 text-xs",
6798
- className
6799
- ),
6800
- ...props
6801
- }
6802
- );
6803
- });
7234
+ var SidebarLinkGroup = React36.forwardRef(
7235
+ function SidebarLinkGroup2({
7236
+ id: idProp,
7237
+ icon,
7238
+ label,
7239
+ href,
7240
+ active = false,
7241
+ defaultOpen = false,
7242
+ open: controlled,
7243
+ onOpenChange,
7244
+ onActivate,
7245
+ className,
7246
+ children,
7247
+ ...props
7248
+ }, ref) {
7249
+ const reactId = React36.useId();
7250
+ const id = idProp ?? reactId;
7251
+ const scope = React36.useContext(SidebarGroupScopeContext);
7252
+ const [uncontrolledOpen, setUncontrolledOpen] = React36.useState(defaultOpen);
7253
+ const open = controlled ?? uncontrolledOpen;
7254
+ const setOpen = React36.useCallback(
7255
+ (next) => {
7256
+ if (controlled === void 0) setUncontrolledOpen(next);
7257
+ onOpenChange?.(next);
7258
+ },
7259
+ [controlled, onOpenChange]
7260
+ );
7261
+ React36.useEffect(() => {
7262
+ if (scope?.exclusiveId && scope.exclusiveId !== id && open) {
7263
+ setOpen(false);
7264
+ }
7265
+ }, [scope?.exclusiveId, id, open, setOpen]);
7266
+ const handleBodyClick = (e) => {
7267
+ onActivate?.(e);
7268
+ if (e.defaultPrevented) return;
7269
+ scope?.setExclusive(id);
7270
+ setOpen(true);
7271
+ };
7272
+ const handleChevronClick = (e) => {
7273
+ e.preventDefault();
7274
+ e.stopPropagation();
7275
+ setOpen(!open);
7276
+ };
7277
+ const contentId = `${id}-content`;
7278
+ const bodyClassName = cn(
7279
+ "group/link relative flex flex-1 items-center gap-2.5 rounded-md px-2.5 py-1.5",
7280
+ "text-fg-2 text-[13px] font-normal no-underline",
7281
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
7282
+ "motion-reduce:transition-none",
7283
+ "hover:bg-bg-3 hover:text-fg",
7284
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
7285
+ "data-[active=true]:bg-pro-bg data-[active=true]:text-pro-fg data-[active=true]:font-medium",
7286
+ // In rail, color carries active state since the chevron is hidden.
7287
+ "group-data-[labels=hide]/sidebar:data-[active=true]:[&_svg]:text-pro-fg group-data-[labels=hide]/sidebar:data-[active=true]:[&_svg]:opacity-100",
7288
+ // Active rail mark — anchored to body row's left edge.
7289
+ "data-[active=true]:before:absolute data-[active=true]:before:content-['']",
7290
+ "data-[active=true]:before:top-1/2 data-[active=true]:before:left-0",
7291
+ "data-[active=true]:before:h-4 data-[active=true]:before:w-[2px] data-[active=true]:before:-translate-y-1/2",
7292
+ "data-[active=true]:before:bg-pro-fg data-[active=true]:before:rounded-r-full",
7293
+ "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:opacity-85"
7294
+ );
7295
+ const labelSpan = /* @__PURE__ */ jsx(
7296
+ "span",
7297
+ {
7298
+ className: cn(
7299
+ "min-w-0 flex-1 truncate",
7300
+ "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7301
+ "max-w-full opacity-100",
7302
+ "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
7303
+ ),
7304
+ children: label
7305
+ }
7306
+ );
7307
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("mb-px", className), ...props, children: /* @__PURE__ */ jsxs(Collapsible, { open, onOpenChange: setOpen, children: [
7308
+ /* @__PURE__ */ jsxs("div", { className: "flex items-stretch", children: [
7309
+ /* @__PURE__ */ jsxs(
7310
+ "a",
7311
+ {
7312
+ href,
7313
+ "data-active": active ? "true" : void 0,
7314
+ "aria-current": active ? "page" : void 0,
7315
+ onClick: handleBodyClick,
7316
+ className: bodyClassName,
7317
+ children: [
7318
+ icon,
7319
+ labelSpan
7320
+ ]
7321
+ }
7322
+ ),
7323
+ /* @__PURE__ */ jsx(
7324
+ "button",
7325
+ {
7326
+ type: "button",
7327
+ "aria-expanded": open,
7328
+ "aria-controls": contentId,
7329
+ "aria-label": open ? "Collapse section" : "Expand section",
7330
+ onClick: handleChevronClick,
7331
+ className: cn(
7332
+ "ml-px inline-flex size-7 shrink-0 items-center justify-center rounded-md",
7333
+ "text-fg-4 hover:bg-bg-3 hover:text-fg-2",
7334
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7335
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
7336
+ "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:transition-transform [&_svg]:duration-[var(--duration-fast)] [&_svg]:ease-[var(--ease-out-quart)] motion-reduce:[&_svg]:transition-none",
7337
+ // Hide in rail — content tree is hidden too, so the
7338
+ // affordance has nothing to control.
7339
+ "group-data-[labels=hide]/sidebar:hidden"
7340
+ ),
7341
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: open ? "" : "-rotate-90" })
7342
+ }
7343
+ )
7344
+ ] }),
7345
+ /* @__PURE__ */ jsx(
7346
+ CollapsibleContent,
7347
+ {
7348
+ id: contentId,
7349
+ className: cn(
7350
+ // Indent column + connecting rule. Children render as
7351
+ // standard <SidebarLink>s and keep their own active-rail
7352
+ // indicator, which lands flush at the indented column's
7353
+ // left edge.
7354
+ "group-data-[labels=hide]/sidebar:hidden"
7355
+ ),
7356
+ children: /* @__PURE__ */ jsx("div", { className: "border-rule mt-px ml-[18px] border-l pl-2", children })
7357
+ }
7358
+ )
7359
+ ] }) });
7360
+ }
7361
+ );
7362
+ SidebarLinkGroup.displayName = "SidebarLinkGroup";
7363
+ var SidebarFooter = React36.forwardRef(
7364
+ function SidebarFooter2({ className, ...props }, ref) {
7365
+ return /* @__PURE__ */ jsx(
7366
+ "div",
7367
+ {
7368
+ ref,
7369
+ className: cn(
7370
+ "border-rule mt-auto flex items-center gap-2.5 border-t px-2 pt-2.5 pb-1",
7371
+ "text-fg-3 text-xs",
7372
+ className
7373
+ ),
7374
+ ...props
7375
+ }
7376
+ );
7377
+ }
7378
+ );
6804
7379
  SidebarFooter.displayName = "SidebarFooter";
6805
- var SidebarUser = forwardRef(function SidebarUser2({ name, subtitle, avatarSrc, className, ...props }, ref) {
7380
+ var SidebarUser = React36.forwardRef(function SidebarUser2({ name, subtitle, avatarSrc, className, ...props }, ref) {
6806
7381
  return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex min-w-0 items-center gap-2.5", className), ...props, children: [
6807
7382
  /* @__PURE__ */ jsx(Avatar, { size: "sm", variant: "branded", name, src: avatarSrc ?? void 0 }),
6808
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 leading-tight", children: [
6809
- /* @__PURE__ */ jsx("div", { className: "text-fg truncate text-[13px] font-medium", children: name }),
6810
- subtitle != null && /* @__PURE__ */ jsx("div", { className: "text-fg-4 truncate font-mono text-[10.5px]", children: subtitle })
6811
- ] })
7383
+ /* @__PURE__ */ jsxs(
7384
+ "div",
7385
+ {
7386
+ className: cn(
7387
+ "min-w-0 leading-tight",
7388
+ "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7389
+ "max-w-full opacity-100",
7390
+ "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
7391
+ ),
7392
+ children: [
7393
+ /* @__PURE__ */ jsx("div", { className: "text-fg truncate text-[13px] font-medium", children: name }),
7394
+ subtitle != null && /* @__PURE__ */ jsx("div", { className: "text-fg-4 truncate font-mono text-[10.5px]", children: subtitle })
7395
+ ]
7396
+ }
7397
+ )
6812
7398
  ] });
6813
7399
  });
6814
7400
  SidebarUser.displayName = "SidebarUser";
@@ -6897,11 +7483,15 @@ var AppHeaderActions = forwardRef(
6897
7483
  }
6898
7484
  );
6899
7485
  AppHeaderActions.displayName = "AppHeaderActions";
6900
- var PageHeader = forwardRef(function PageHeader2({ eyebrow, title, meta, className, ...props }, ref) {
7486
+ var PageHeader = forwardRef(function PageHeader2({ eyebrow, title, description, actions, meta, className, ...props }, ref) {
6901
7487
  return /* @__PURE__ */ jsxs("header", { ref, className: cn("mb-7", className), ...props, children: [
6902
7488
  eyebrow && /* @__PURE__ */ jsx("div", { className: "mb-1.5", children: eyebrow }),
6903
- /* @__PURE__ */ jsx("h1", { className: "font-display text-fg text-[26px] leading-tight tracking-tight", children: title }),
6904
- meta && /* @__PURE__ */ jsx("div", { className: "text-fg-3 mt-2 flex items-center gap-2 text-sm", children: meta })
7489
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
7490
+ /* @__PURE__ */ jsx("h1", { className: "font-display text-fg text-[26px] leading-tight tracking-tight", children: title }),
7491
+ actions && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-2", children: actions })
7492
+ ] }),
7493
+ description && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-2 max-w-2xl text-sm leading-relaxed", children: description }),
7494
+ meta && /* @__PURE__ */ jsx("div", { className: "text-fg-3 mt-2 flex flex-wrap items-center gap-2 text-sm", children: meta })
6905
7495
  ] });
6906
7496
  });
6907
7497
  PageHeader.displayName = "PageHeader";
@@ -6933,6 +7523,83 @@ var PageHeaderSep = forwardRef(function PageHeaderSep2({ children, className, ..
6933
7523
  );
6934
7524
  });
6935
7525
  PageHeaderSep.displayName = "PageHeaderSep";
7526
+ var columnsToGridCols = {
7527
+ 1: "grid-cols-1",
7528
+ 2: "grid-cols-2",
7529
+ 3: "grid-cols-3",
7530
+ 4: "grid-cols-4"
7531
+ };
7532
+ var MetadataGrid = forwardRef(function MetadataGrid2({ columns = 2, gapX = "gap-x-6", gapY = "gap-y-3", className, children, ...props }, ref) {
7533
+ return /* @__PURE__ */ jsx(
7534
+ "dl",
7535
+ {
7536
+ ref,
7537
+ className: cn("grid", columnsToGridCols[columns], gapX, gapY, className),
7538
+ ...props,
7539
+ children
7540
+ }
7541
+ );
7542
+ });
7543
+ MetadataGrid.displayName = "MetadataGrid";
7544
+ var spanToColSpan = {
7545
+ 1: "col-span-1",
7546
+ 2: "col-span-2",
7547
+ 3: "col-span-3",
7548
+ 4: "col-span-4"
7549
+ };
7550
+ function DataItem({ label, value, span = 1, className }) {
7551
+ return /* @__PURE__ */ jsxs("div", { className: cn("min-w-0", spanToColSpan[span], className), children: [
7552
+ /* @__PURE__ */ jsx("dt", { className: "text-fg-4 text-[11px] font-medium uppercase tracking-wider", children: label }),
7553
+ /* @__PURE__ */ jsx("dd", { className: "text-fg mt-0.5 break-words text-sm", children: value })
7554
+ ] });
7555
+ }
7556
+ var toneToTile = {
7557
+ info: "bg-info/10 text-info",
7558
+ success: "bg-success-fg/10 text-success-fg",
7559
+ warning: "bg-warning-fg/10 text-warning-fg",
7560
+ destructive: "bg-danger-fg/10 text-danger-fg",
7561
+ accent: "bg-accent/10 text-accent",
7562
+ muted: "bg-bg-3 text-fg-3"
7563
+ };
7564
+ var toneToValue = {
7565
+ info: "text-info",
7566
+ success: "text-success-fg",
7567
+ warning: "text-warning-fg",
7568
+ destructive: "text-danger-fg",
7569
+ accent: "text-accent",
7570
+ muted: "text-fg"
7571
+ };
7572
+ var KpiCard = forwardRef(function KpiCard2({ label, value, icon, tone = "muted", hint, action, toneValue, className, ...props }, ref) {
7573
+ return /* @__PURE__ */ jsx(Card, { ref, className: cn("p-4", className), ...props, children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
7574
+ icon && /* @__PURE__ */ jsx(
7575
+ "div",
7576
+ {
7577
+ "aria-hidden": "true",
7578
+ className: cn(
7579
+ "flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg]:size-5",
7580
+ toneToTile[tone]
7581
+ ),
7582
+ children: icon
7583
+ }
7584
+ ),
7585
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
7586
+ /* @__PURE__ */ jsx(
7587
+ "p",
7588
+ {
7589
+ className: cn(
7590
+ "text-2xl font-bold tracking-tight tabular-nums",
7591
+ toneValue ? toneToValue[tone] : "text-fg"
7592
+ ),
7593
+ children: value
7594
+ }
7595
+ ),
7596
+ /* @__PURE__ */ jsx("p", { className: "text-fg-3 text-xs", children: label }),
7597
+ hint && /* @__PURE__ */ jsx("p", { className: "text-fg-4 mt-0.5 text-[11px]", children: hint })
7598
+ ] }),
7599
+ action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
7600
+ ] }) });
7601
+ });
7602
+ KpiCard.displayName = "KpiCard";
6936
7603
  var DataTable = forwardRef(function DataTable2({ withToolbar, className, children, ...props }, ref) {
6937
7604
  return /* @__PURE__ */ jsx(
6938
7605
  "div",
@@ -7532,6 +8199,6 @@ var KbdHint = forwardRef(function KbdHint2({ className, children, ...props }, re
7532
8199
  });
7533
8200
  KbdHint.displayName = "KbdHint";
7534
8201
 
7535
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityItem, ActivityList, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTriangleIcon, AppHeader, AppHeaderActions, AppHeaderBreadcrumb, AppHeaderSearch, AppHeaderTitle, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, AtSignIcon, Avatar, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BriefcaseIcon, Building2Icon, BuildingIcon, Button, Calendar, CalendarIcon, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChatBubbleIcon, CheckCircle2Icon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientSelect, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, CommandIcon, CommandPalette, ConfirmActionButton, Content15 as Content, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DatePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DocumentIcon, DollarSignIcon, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EyeIcon, EyeOffIcon, Eyebrow, FileIcon, FileReturnIcon, FileTextIcon, FileUpload, FilterChip, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FormError, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, InboxIcon, InfoIcon, Input, ItalicIcon, Kanban, KanbanCard, KanbanColumn, KanbanIcon, KbdHint, KeyIcon, KeyboardShortcutsDialog, Label4 as Label, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, MapPinIcon, MenuIcon, MessageCircleIcon, MessageCircleWarningIcon, MicrosoftBrandIcon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, Numeric, OTPInput, PageHeader, PageHeaderSep, PageHeaderSpec, Pagination, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PenSignIcon, PencilIcon, PhoneIcon, PhoneInput, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, ProgressBar, ProgressRing, RadioGroup3 as RadioGroup, RadioGroupItem, ReceiptIcon, ReplyIcon, RotateCcwIcon, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, SearchSelect, SecondaryAction, Section, SectionHead, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SendIcon, Separator4 as Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, SidebarFooter, SidebarLink, SidebarLinkBadge, SidebarSection, SidebarUser, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, StarIcon, StarRating, Stat, Stepper, StrikethroughIcon, SubmitButton, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TeamIcon, TeamMemberSelect, Textarea, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XIcon, ZoomInIcon, ZoomOutIcon, alertVariants, badgeVariants, buttonVariants, cardVariants, cn, colors, displayToIso, filterChipVariants, inputVariants, isoToDisplay, kanbanCardVariants, labelVariants, progressBarVariants, progressRingVariants, radii, reference, searchInputVariants, shadows, sidebarLinkBadgeVariants, spacing, starRatingVariants, surfaces, systemTokens, textareaVariants, typography, useToast };
8202
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityItem, ActivityList, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTriangleIcon, AppHeader, AppHeaderActions, AppHeaderBreadcrumb, AppHeaderSearch, AppHeaderTitle, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, AtSignIcon, Avatar, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BriefcaseIcon, Building2Icon, BuildingIcon, Button, Calendar, CalendarIcon, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChatBubbleIcon, CheckCircle2Icon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientSelect, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, CommandIcon, CommandPalette, ConfirmActionButton, Content15 as Content, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, DataItem, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DatePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DocumentIcon, DollarSignIcon, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EyeIcon, EyeOffIcon, Eyebrow, FileIcon, FileReturnIcon, FileTextIcon, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FormError, FormSection, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, InboxIcon, InfoIcon, Input, ItalicIcon, Kanban, KanbanCard, KanbanColumn, KanbanIcon, KbdHint, KeyIcon, KeyboardShortcutsDialog, KpiCard, Label4 as Label, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LoadingRows, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, MapPinIcon, MenuIcon, MessageCircleIcon, MessageCircleWarningIcon, MetadataGrid, MicrosoftBrandIcon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, Numeric, OTPInput, PageHeader, PageHeaderSep, PageHeaderSpec, Pagination, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PenSignIcon, PencilIcon, PhoneIcon, PhoneInput, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, ProgressBar, ProgressRing, RadioGroup3 as RadioGroup, RadioGroupItem, ReceiptIcon, ReplyIcon, RotateCcwIcon, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, SearchSelect, SecondaryAction, Section, SectionHead, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SendIcon, Separator4 as Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, SidebarBrandText, SidebarFooter, SidebarLink, SidebarLinkAction, SidebarLinkBadge, SidebarLinkGroup, SidebarLinkLabel, SidebarProvider, SidebarSection, SidebarTrigger, SidebarUser, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, StarIcon, StarRating, Stat, Stepper, StrikethroughIcon, SubmitButton, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TeamIcon, TeamMemberSelect, Textarea, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XIcon, ZoomInIcon, ZoomOutIcon, alertVariants, badgeVariants, buttonVariants, cardVariants, cn, colors, displayToIso, filterChipVariants, inputVariants, isoToDisplay, kanbanCardVariants, labelVariants, progressBarVariants, progressRingVariants, radii, reference, searchInputVariants, shadows, sidebarLinkBadgeVariants, spacing, starRatingVariants, surfaces, systemTokens, textareaVariants, typography, useSidebarState, useToast };
7536
8203
  //# sourceMappingURL=index.js.map
7537
8204
  //# sourceMappingURL=index.js.map