@lessly/ui 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  cn,
20
20
  useIsMobile,
21
21
  useSidebar
22
- } from "./chunk-F5RMHSPS.js";
22
+ } from "./chunk-CEXND5YW.js";
23
23
 
24
24
  // src/components/auto-height.tsx
25
25
  import * as React from "react";
@@ -170,7 +170,7 @@ var DialogContent = React3.forwardRef(({ className, children, showClose = true,
170
170
  ...props,
171
171
  children: [
172
172
  children,
173
- showClose && /* @__PURE__ */ jsxs2(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm text-text-tertiary opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-border-focus disabled:pointer-events-none", children: [
173
+ showClose && /* @__PURE__ */ jsxs2(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm text-text-tertiary opacity-70 transition-opacity duration-fast hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-border-focus disabled:pointer-events-none", children: [
174
174
  /* @__PURE__ */ jsx3(X, { className: "h-4 w-4" }),
175
175
  /* @__PURE__ */ jsx3("span", { className: "sr-only", children: "Close" })
176
176
  ] })
@@ -291,7 +291,7 @@ var DropdownMenuItem = React4.forwardRef(({ className, inset, variant = "default
291
291
  {
292
292
  ref,
293
293
  className: cn(
294
- "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
294
+ "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
295
295
  inset && "pl-8",
296
296
  // Destructive reddens — wash and label — under the pointer or the keyboard, and drops the red
297
297
  // frame a destructive Button rests on, because a row repeated down a menu makes the whole menu
@@ -308,7 +308,7 @@ var DropdownMenuCheckboxItem = React4.forwardRef(({ className, children, checked
308
308
  {
309
309
  ref,
310
310
  className: cn(
311
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset focus:ring-border-selected data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
311
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset focus:ring-border-selected data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
312
312
  className
313
313
  ),
314
314
  checked,
@@ -325,7 +325,7 @@ var DropdownMenuRadioItem = React4.forwardRef(({ className, children, ...props }
325
325
  {
326
326
  ref,
327
327
  className: cn(
328
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset focus:ring-border-selected data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
328
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset focus:ring-border-selected data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
329
329
  className
330
330
  ),
331
331
  ...props,
@@ -349,7 +349,7 @@ var DropdownMenuSeparator = React4.forwardRef(({ className, ...props }, ref) =>
349
349
  DropdownMenuPrimitive.Separator,
350
350
  {
351
351
  ref,
352
- className: cn("-mx-1 my-1 h-px bg-border-default", className),
352
+ className: cn("-mx-1 my-1 h-px bg-border-subtle", className),
353
353
  ...props
354
354
  }
355
355
  ));
@@ -479,7 +479,7 @@ import { cva as cva2 } from "class-variance-authority";
479
479
  import { Check as Check2 } from "lucide-react";
480
480
  import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
481
481
  var optionCardVariants = cva2(
482
- "flex w-full items-center gap-3 rounded-lg border border-border-default p-3 text-left transition-colors hover:bg-bg-elevated focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
482
+ "flex w-full items-center gap-3 rounded-lg border border-border-default p-3 text-left transition-colors duration-fast hover:bg-bg-elevated focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
483
483
  {
484
484
  variants: {
485
485
  selected: {
@@ -724,18 +724,18 @@ function Switch({
724
724
  "data-testid": testId,
725
725
  disabled,
726
726
  onClick: () => onCheckedChange(!checked),
727
- className: `relative inline-flex h-6 w-10 shrink-0 cursor-pointer rounded-full transition-colors outline-none focus-visible:ring-2 focus-visible:ring-border-focus focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface ${checked ? "bg-text-brand" : "bg-bg-surface"} ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`,
727
+ className: `relative inline-flex h-6 w-10 shrink-0 cursor-pointer rounded-full transition-colors duration-fast outline-none focus-visible:ring-2 focus-visible:ring-border-focus focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface ${checked ? "bg-text-brand" : "bg-bg-surface"} ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`,
728
728
  children: [
729
729
  /* @__PURE__ */ jsx14(
730
730
  "span",
731
731
  {
732
- className: `pointer-events-none absolute inset-0 rounded-full border border-border-strong transition-opacity ${checked ? "opacity-0" : "opacity-100"}`
732
+ className: `pointer-events-none absolute inset-0 rounded-full border border-border-strong transition-opacity duration-fast ${checked ? "opacity-0" : "opacity-100"}`
733
733
  }
734
734
  ),
735
735
  /* @__PURE__ */ jsx14(
736
736
  "span",
737
737
  {
738
- className: `pointer-events-none absolute inset-y-0 left-0 flex w-6 items-center justify-center transition-opacity ${checked ? "opacity-100" : "opacity-0"}`,
738
+ className: `pointer-events-none absolute inset-y-0 left-0 flex w-6 items-center justify-center transition-opacity duration-fast ${checked ? "opacity-100" : "opacity-0"}`,
739
739
  children: /* @__PURE__ */ jsx14(Check3, { className: "size-3 text-white" })
740
740
  }
741
741
  ),
@@ -743,7 +743,7 @@ function Switch({
743
743
  "span",
744
744
  {
745
745
  "aria-hidden": "true",
746
- className: `pointer-events-none absolute top-1/2 left-0 h-4 w-4 -translate-y-1/2 rounded-full transition-transform ${checked ? "translate-x-5 bg-white" : "translate-x-1 bg-border-strong"}`
746
+ className: `pointer-events-none absolute top-1/2 left-0 h-4 w-4 -translate-y-1/2 rounded-full transition-transform duration-fast ${checked ? "translate-x-5 bg-white" : "translate-x-1 bg-border-strong"}`
747
747
  }
748
748
  )
749
749
  ]
@@ -832,7 +832,7 @@ var Slider = React14.forwardRef(({ className, ...props }, ref) => {
832
832
  Array.from({ length: thumbCount }).map((_, i) => /* @__PURE__ */ jsx18(
833
833
  SliderPrimitive.Thumb,
834
834
  {
835
- className: "block size-5 rounded-full border border-border-brand bg-bg-elevated shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
835
+ className: "block size-5 rounded-full border border-border-brand bg-bg-elevated shadow-sm transition-colors duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
836
836
  },
837
837
  i
838
838
  ))
@@ -848,7 +848,7 @@ import * as TogglePrimitive from "@radix-ui/react-toggle";
848
848
  import { cva as cva3 } from "class-variance-authority";
849
849
  import { jsx as jsx19 } from "react/jsx-runtime";
850
850
  var toggleVariants = cva3(
851
- "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium text-text-secondary transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
851
+ "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium data-[state=on]:font-semibold text-text-secondary transition-colors duration-fast focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
852
852
  {
853
853
  variants: {
854
854
  /**
@@ -857,7 +857,7 @@ var toggleVariants = cva3(
857
857
  */
858
858
  treatment: {
859
859
  frame: "ring-1 ring-inset ring-border-subtle hover:bg-bg-secondary hover:text-text-primary data-[state=on]:text-text-primary data-[state=on]:ring-border-strong",
860
- track: "data-[state=off]:hover:text-text-primary data-[state=on]:bg-bg-brand-subtle data-[state=on]:text-text-brand"
860
+ track: "data-[state=off]:hover:text-text-primary data-[state=on]:bg-bg-sunken data-[state=on]:text-text-primary"
861
861
  },
862
862
  variant: {
863
863
  default: "bg-transparent",
@@ -909,17 +909,18 @@ var SlidingThumb = ({ index, count }) => /* @__PURE__ */ jsx20(
909
909
  "span",
910
910
  {
911
911
  "aria-hidden": "true",
912
- className: "motion-segment-thumb pointer-events-none absolute inset-y-0 left-0 rounded-md bg-bg-brand-subtle",
912
+ className: "motion-segment-thumb pointer-events-none absolute inset-y-0 left-0 rounded-md bg-bg-sunken",
913
913
  style: { width: `calc(100% / ${count})`, transform: `translateX(${index * 100}%)` }
914
914
  }
915
915
  );
916
916
  var ToggleGroup = React16.forwardRef(({ className, variant, size, treatment, sliding, children, ...props }, ref) => {
917
- const resolved = treatment ?? (props.type === "single" ? "track" : "frame");
917
+ const slots = React16.Children.toArray(children).filter(React16.isValidElement);
918
+ const wordless = slots.length > 0 && slots.every((slot) => isIconOnly(slot.props.children));
919
+ const resolved = treatment ?? (props.type === "single" && !wordless ? "track" : "frame");
918
920
  const [mirror, setMirror] = React16.useState(
919
921
  () => typeof props.defaultValue === "string" ? props.defaultValue : void 0
920
922
  );
921
923
  const selected = typeof props.value === "string" ? props.value : mirror;
922
- const slots = React16.Children.toArray(children).filter(React16.isValidElement);
923
924
  const index = slots.findIndex((slot) => slot.props.value === selected);
924
925
  const rootProps = sliding && typeof props.value !== "string" ? {
925
926
  ...props,
@@ -940,10 +941,13 @@ var ToggleGroup = React16.forwardRef(({ className, variant, size, treatment, sli
940
941
  // what lets the thumb be exactly `100% / count` wide and travel in multiples of itself.
941
942
  "inline-flex w-fit items-center gap-0.5"
942
943
  ) : "flex items-center justify-center gap-1",
943
- // A sliding track is as wide as what holds it and its slots share that width equally, because
944
- // the thumb is one slot wide and travels in multiples of itself. The gap goes for the same
945
- // reason: a gap between slots is width the thumb's own step does not account for.
946
- sliding && "relative flex w-full gap-0",
944
+ // A sliding track's slots share its width equally, because the thumb is one slot wide and
945
+ // travels in multiples of itself. The gap goes for the same reason: a gap between slots is
946
+ // width the thumb's own step does not account for. The track sizes to those slots rather
947
+ // than to whatever holds it — given a parent and no width of its own it used to span the
948
+ // whole of it, and with no frame drawn the slots then read as loose words with a step
949
+ // somewhere in them (#754). A caller wanting full width writes one, as every call site did.
950
+ sliding && "relative flex w-fit gap-0",
947
951
  className
948
952
  ),
949
953
  ...rootProps,
@@ -968,11 +972,11 @@ var ToggleGroupItem = React16.forwardRef(({ className, children, variant, size,
968
972
  // the height its size declares. A slot is the one place this matters most — the items of a
969
973
  // group sit side by side, so one that is 8px wider than its neighbours is visible.
970
974
  isIconOnly(children) && ICON_ONLY_BOX,
971
- // Inside a track, the selected slot is also the heavier word: weight is the one channel that
972
- // survives hue removal, and the tint under it is 1.104:1 light / 1.144:1 dark on its own.
975
+ // Inside a track, the selected slot is also the heavier word: the surface step under it is
976
+ // 1.208:1 light / 1.109:1 dark on its own, which is a mark but not one on its own.
973
977
  context.treatment === "track" && "data-[state=on]:font-semibold",
974
- // Under a sliding thumb the tint belongs to the thumb, which is the one that travels; a second
975
- // copy on the slot would sit still while the first one moved. The word stays the slot's own.
978
+ // Under a sliding thumb the surface step belongs to the thumb, which is the one that travels; a
979
+ // second copy on the slot would sit still while the first one moved. The word stays the slot's own.
976
980
  context.sliding && "relative z-10 flex-1 data-[state=on]:bg-transparent"
977
981
  );
978
982
  if (inert) {
@@ -1012,7 +1016,7 @@ var InputOTPSlot = React17.forwardRef(({ index, className, ...props }, ref) => {
1012
1016
  {
1013
1017
  ref,
1014
1018
  className: cn(
1015
- "relative flex size-10 items-center justify-center border-y border-r text-sm text-text-primary transition-all first:rounded-l-md first:border-l last:rounded-r-md",
1019
+ "relative flex size-10 items-center justify-center border-y border-r text-sm text-text-primary transition-all duration-fast first:rounded-l-md first:border-l last:rounded-r-md",
1016
1020
  // A field takes the field border (`Guidelines/Look/Borders`, #417), and a slot is the other
1017
1021
  // control that can honestly paint the filled step — it holds its own character, so the step
1018
1022
  // is a literal class picked by a boolean and the code walks the ladder as you type.
@@ -1290,7 +1294,7 @@ var ContextMenuItem = React22.forwardRef(({ className, inset, ...props }, ref) =
1290
1294
  {
1291
1295
  ref,
1292
1296
  className: cn(
1293
- "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1297
+ "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1294
1298
  inset && "pl-8",
1295
1299
  className
1296
1300
  ),
@@ -1303,7 +1307,7 @@ var ContextMenuCheckboxItem = React22.forwardRef(({ className, children, checked
1303
1307
  {
1304
1308
  ref,
1305
1309
  className: cn(
1306
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1310
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1307
1311
  className
1308
1312
  ),
1309
1313
  checked,
@@ -1320,7 +1324,7 @@ var ContextMenuRadioItem = React22.forwardRef(({ className, children, ...props }
1320
1324
  {
1321
1325
  ref,
1322
1326
  className: cn(
1323
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1327
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1324
1328
  className
1325
1329
  ),
1326
1330
  ...props,
@@ -1438,7 +1442,7 @@ var MenubarItem = React23.forwardRef(({ className, inset, ...props }, ref) => /*
1438
1442
  {
1439
1443
  ref,
1440
1444
  className: cn(
1441
- "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1445
+ "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1442
1446
  inset && "pl-8",
1443
1447
  className
1444
1448
  ),
@@ -1451,7 +1455,7 @@ var MenubarCheckboxItem = React23.forwardRef(({ className, children, checked, ..
1451
1455
  {
1452
1456
  ref,
1453
1457
  className: cn(
1454
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1458
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1455
1459
  className
1456
1460
  ),
1457
1461
  checked,
@@ -1468,7 +1472,7 @@ var MenubarRadioItem = React23.forwardRef(({ className, children, ...props }, re
1468
1472
  {
1469
1473
  ref,
1470
1474
  className: cn(
1471
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1475
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1472
1476
  className
1473
1477
  ),
1474
1478
  ...props,
@@ -1507,7 +1511,7 @@ import * as React24 from "react";
1507
1511
  import { cva as cva4 } from "class-variance-authority";
1508
1512
  import { jsx as jsx28 } from "react/jsx-runtime";
1509
1513
  var badgeVariants = cva4(
1510
- "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
1514
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
1511
1515
  {
1512
1516
  variants: {
1513
1517
  variant: {
@@ -1567,7 +1571,7 @@ var TableRow = React25.forwardRef(
1567
1571
  {
1568
1572
  ref,
1569
1573
  className: cn(
1570
- "border-b border-border-subtle transition-colors hover:bg-bg-secondary-a50 data-[state=selected]:bg-bg-secondary",
1574
+ "border-b border-border-subtle transition-colors duration-fast hover:bg-bg-secondary-a50 data-[state=selected]:bg-bg-secondary",
1571
1575
  className
1572
1576
  ),
1573
1577
  ...props
@@ -1659,12 +1663,11 @@ var GLYPH_SIZE = {
1659
1663
  };
1660
1664
  var TONE = {
1661
1665
  neutral: "bg-bg-secondary text-text-secondary",
1662
- brand: "bg-bg-brand-subtle text-text-brand",
1663
1666
  teal: "bg-bg-teal-subtle text-text-teal",
1664
1667
  violet: "bg-bg-violet-subtle text-text-violet",
1665
1668
  rose: "bg-bg-rose-subtle text-text-rose"
1666
1669
  };
1667
- var TINT_FAMILIES = ["brand", "teal", "violet", "rose"];
1670
+ var TINT_FAMILIES = ["teal", "violet", "rose"];
1668
1671
  function initialsOf(name) {
1669
1672
  const parts = name.trim().split(/\s+/).filter(Boolean);
1670
1673
  if (parts.length === 0) return "?";
@@ -1676,9 +1679,17 @@ function initialOf(name) {
1676
1679
  return c ? c.toUpperCase() : "?";
1677
1680
  }
1678
1681
  function tintFor(seed) {
1679
- let h = 0;
1680
- for (let i = 0; i < seed.length; i++) h = h * 31 + seed.charCodeAt(i) >>> 0;
1681
- return TINT_FAMILIES[h % TINT_FAMILIES.length];
1682
+ return TINT_FAMILIES[hashSeed(seed) % TINT_FAMILIES.length];
1683
+ }
1684
+ function hashSeed(seed) {
1685
+ let h = 2166136261;
1686
+ for (let i = 0; i < seed.length; i++) h = Math.imul(h ^ seed.charCodeAt(i), 16777619);
1687
+ h ^= h >>> 16;
1688
+ h = Math.imul(h, 2246822507);
1689
+ h ^= h >>> 13;
1690
+ h = Math.imul(h, 3266489909);
1691
+ h ^= h >>> 16;
1692
+ return h >>> 0;
1682
1693
  }
1683
1694
  function Mark({ shape, size, tone, src, label, children }) {
1684
1695
  return /* @__PURE__ */ jsxs18(
@@ -1759,7 +1770,7 @@ var Progress = React30.forwardRef(({ className, value, ...props }, ref) => /* @_
1759
1770
  children: /* @__PURE__ */ jsx37(
1760
1771
  ProgressPrimitive.Indicator,
1761
1772
  {
1762
- className: "h-full w-full flex-1 bg-text-tertiary transition-all",
1773
+ className: "h-full w-full flex-1 bg-text-tertiary transition-all duration-slide",
1763
1774
  style: { transform: `translateX(-${100 - (value || 0)}%)` }
1764
1775
  }
1765
1776
  )
@@ -1781,7 +1792,7 @@ var TabsList = React31.forwardRef(({ className, ...props }, ref) => /* @__PURE__
1781
1792
  {
1782
1793
  ref,
1783
1794
  className: cn(
1784
- "inline-flex h-10 items-center justify-center rounded-md bg-bg-secondary p-1 text-text-secondary",
1795
+ "inline-flex h-10 items-center justify-center rounded-md bg-bg-surface p-1 text-text-secondary",
1785
1796
  className
1786
1797
  ),
1787
1798
  ...props
@@ -1793,7 +1804,7 @@ var TabsTrigger = React31.forwardRef(({ className, ...props }, ref) => /* @__PUR
1793
1804
  {
1794
1805
  ref,
1795
1806
  className: cn(
1796
- "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-bg-elevated data-[state=active]:text-text-primary data-[state=active]:shadow-sm",
1807
+ "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-bg-sunken data-[state=active]:font-semibold data-[state=active]:text-text-primary",
1797
1808
  className
1798
1809
  ),
1799
1810
  ...props
@@ -1833,7 +1844,7 @@ var AccordionTrigger = React32.forwardRef(({ className, children, ...props }, re
1833
1844
  {
1834
1845
  ref,
1835
1846
  className: cn(
1836
- "flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
1847
+ "flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all duration-fast hover:underline [&[data-state=open]>svg]:rotate-180",
1837
1848
  className
1838
1849
  ),
1839
1850
  ...props,
@@ -1900,7 +1911,7 @@ var ScrollBar = React34.forwardRef(({ className, orientation = "vertical", ...pr
1900
1911
  ref,
1901
1912
  orientation,
1902
1913
  className: cn(
1903
- "flex touch-none select-none transition-colors",
1914
+ "flex touch-none select-none transition-colors duration-fast",
1904
1915
  orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]",
1905
1916
  orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-[1px]",
1906
1917
  className
@@ -1998,7 +2009,7 @@ var BreadcrumbLink = React36.forwardRef(({ asChild, className, ...props }, ref)
1998
2009
  Comp,
1999
2010
  {
2000
2011
  ref,
2001
- className: cn("transition-colors hover:text-text-primary", className),
2012
+ className: cn("transition-colors duration-fast hover:text-text-primary", className),
2002
2013
  ...props
2003
2014
  }
2004
2015
  );
@@ -2257,7 +2268,7 @@ var NavigationMenuList = React39.forwardRef(({ className, ...props }, ref) => /*
2257
2268
  NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
2258
2269
  var NavigationMenuItem = NavigationMenuPrimitive.Item;
2259
2270
  var navigationMenuTriggerStyle = cva6(
2260
- "group inline-flex h-10 w-max items-center justify-center rounded-md bg-bg-elevated px-4 py-2 text-sm font-medium transition-colors hover:bg-bg-secondary hover:text-text-primary focus:bg-bg-secondary focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-bg-secondary"
2271
+ "group inline-flex h-10 w-max items-center justify-center rounded-md bg-bg-elevated px-4 py-2 text-sm font-medium transition-colors duration-fast hover:bg-bg-secondary hover:text-text-primary focus:bg-bg-secondary focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-bg-secondary"
2261
2272
  );
2262
2273
  var NavigationMenuTrigger = React39.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs25(
2263
2274
  NavigationMenuPrimitive.Trigger,
@@ -2413,7 +2424,7 @@ function ThemeToggle() {
2413
2424
  "button",
2414
2425
  {
2415
2426
  onClick: () => setTheme(next),
2416
- className: "p-2 rounded-lg text-text-secondary hover:bg-bg-secondary transition-colors",
2427
+ className: "p-2 rounded-lg text-text-secondary hover:bg-bg-secondary transition-colors duration-fast",
2417
2428
  "aria-label": label,
2418
2429
  title: label,
2419
2430
  children: /* @__PURE__ */ jsx48(Icon, { className: "w-4 h-4" })
@@ -2451,20 +2462,35 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
2451
2462
  week: "flex w-full mt-2",
2452
2463
  day: "relative p-0 text-center text-sm focus-within:relative focus-within:z-20",
2453
2464
  day_button: cn(
2454
- "inline-flex size-9 items-center justify-center rounded-md p-0 font-regular text-text-primary transition-colors",
2465
+ "inline-flex size-9 items-center justify-center rounded-md p-0 font-regular text-text-primary transition-colors duration-fast",
2455
2466
  "hover:bg-bg-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
2456
2467
  "aria-selected:opacity-100"
2457
2468
  ),
2458
- selected: "[&>button]:bg-blue-400 [&>button]:text-text-on-brand [&>button]:hover:bg-blue-350 [&>button]:hover:text-text-on-brand",
2459
- // Scope today's surface to non-selected buttons so a selected "today"
2460
- // keeps the brand fill (rdp sets aria-selected on the selected button)
2461
- // rather than colliding at equal specificity.
2462
- today: '[&>button:not([aria-selected="true"])]:bg-bg-secondary [&>button:not([aria-selected="true"])]:text-text-primary',
2469
+ // The console's selection mark, unchanged for a day: the surface step, the weight step, the
2470
+ // primary tone (Guidelines/Look/Selection weight). Hovering a chosen day holds the step —
2471
+ // `day_button`'s wash is the pointer's channel and would lighten the mark out from under it.
2472
+ selected: "[&>button]:bg-bg-sunken [&>button]:font-semibold [&>button]:text-text-primary [&>button]:hover:bg-bg-sunken",
2473
+ // Today moved off `bg-secondary` because the selection mark landed on `bg-sunken`, and in
2474
+ // dark those two measure 1.034:1 — today would have worn the chosen day's fill. A hairline
2475
+ // is the free channel: it rests at `border-default`, the kit's resting edge, where a
2476
+ // selection with no word to thicken steps to `border-strong`, so neither reads as the
2477
+ // other, and a day that is both wears the plate and the hairline at once. `border` rather
2478
+ // than a ring because the box is a fixed `size-9`, so the edge costs no layout here and
2479
+ // leaves the focus ring the one thing drawing a ring.
2480
+ today: "[&>button]:border [&>button]:border-border-default",
2463
2481
  outside: "[&>button]:text-text-tertiary [&>button]:opacity-50",
2464
2482
  disabled: "[&>button]:text-text-disabled [&>button]:opacity-50",
2465
- range_start: "[&>button]:bg-blue-400 [&>button]:text-text-on-brand rounded-l-md",
2466
- range_end: "[&>button]:bg-blue-400 [&>button]:text-text-on-brand rounded-r-md",
2467
- range_middle: "[&>button]:bg-bg-secondary [&>button]:text-text-primary [&>button]:rounded-none",
2483
+ // A range is one band, so the fill goes on the cell, which has no radius of its own to notch
2484
+ // the join with; the ends round their outer side and a one-day range rounds both. Every day
2485
+ // in a range also carries `selected`, so the band and each button's own plate are the same
2486
+ // step and meet without a seam.
2487
+ range_start: "bg-bg-sunken rounded-l-md",
2488
+ range_end: "bg-bg-sunken rounded-r-md",
2489
+ // Spanned, not chosen: the middle keeps the surface step and gives back the weight step and
2490
+ // the primary tone. `[&[data-selected]>button]` is the specificity that takes them back —
2491
+ // rdp writes `data-selected` on every cell of a range, so this beats `selected` by an
2492
+ // attribute rather than by whatever order Tailwind happens to emit two equal selectors in.
2493
+ range_middle: "bg-bg-sunken [&[data-selected]>button]:font-regular [&[data-selected]>button]:text-text-secondary",
2468
2494
  hidden: "invisible",
2469
2495
  ...classNames
2470
2496
  },
@@ -2892,7 +2918,7 @@ var DocsLink = React45.forwardRef(
2892
2918
  target: "_blank",
2893
2919
  rel: "noreferrer noopener",
2894
2920
  className: cn(
2895
- "inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 text-sm text-text-secondary transition-colors hover:bg-bg-secondary hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
2921
+ "inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 text-sm text-text-secondary transition-colors duration-fast hover:bg-bg-secondary hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
2896
2922
  className
2897
2923
  ),
2898
2924
  ...props,
@@ -3350,7 +3376,7 @@ function UserMenu({ user, items, collapsed = false, align = "start" }) {
3350
3376
  "button",
3351
3377
  {
3352
3378
  type: "button",
3353
- className: "flex w-full items-center gap-2.5 rounded-xl px-1.5 py-[5px] text-left transition-colors hover:bg-[var(--hov-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
3379
+ className: "flex w-full items-center gap-2.5 rounded-xl px-1.5 py-[5px] text-left transition-colors duration-fast hover:bg-[var(--hov-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
3354
3380
  children: [
3355
3381
  avatar,
3356
3382
  /* @__PURE__ */ jsxs36("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
@@ -3378,7 +3404,7 @@ function UserMenu({ user, items, collapsed = false, align = "start" }) {
3378
3404
  /* @__PURE__ */ jsx61("span", { className: "block truncate text-sm font-medium text-text-primary", children: user.name }),
3379
3405
  collapsed && secondLine && /* @__PURE__ */ jsx61("span", { className: "block truncate text-xs font-regular text-text-tertiary", children: secondLine })
3380
3406
  ] }),
3381
- /* @__PURE__ */ jsx61(DropdownMenuSeparator, { className: "mx-0 shrink-0 bg-border-subtle" }),
3407
+ /* @__PURE__ */ jsx61(DropdownMenuSeparator, { className: "mx-0 shrink-0" }),
3382
3408
  items.map((item, i) => {
3383
3409
  const Icon = item.icon;
3384
3410
  const content = /* @__PURE__ */ jsxs36(Fragment2, { children: [
@@ -4459,10 +4485,43 @@ var RemovableChip = React62.forwardRef(
4459
4485
  );
4460
4486
  RemovableChip.displayName = "RemovableChip";
4461
4487
 
4462
- // src/components/nav-section-label.tsx
4488
+ // src/hooks/use-fresh-highlight.ts
4463
4489
  import * as React63 from "react";
4490
+ var HOLD_MS = 3200;
4491
+ var CLEAR_MS = HOLD_MS + 900;
4492
+ function useFreshHighlight() {
4493
+ const [freshId, setFreshId] = React63.useState(null);
4494
+ const [message, setMessage] = React63.useState("");
4495
+ const timer = React63.useRef(void 0);
4496
+ React63.useEffect(() => () => clearTimeout(timer.current), []);
4497
+ const markFresh = React63.useCallback((id, announce) => {
4498
+ clearTimeout(timer.current);
4499
+ setFreshId(id);
4500
+ if (announce) setMessage(announce);
4501
+ timer.current = setTimeout(() => setFreshId(null), CLEAR_MS);
4502
+ }, []);
4503
+ const isFresh = React63.useCallback((id) => id === freshId, [freshId]);
4504
+ const freshRef = React63.useCallback((el) => {
4505
+ if (!el) return;
4506
+ const rect = el.getBoundingClientRect();
4507
+ const viewportH = window.innerHeight || document.documentElement.clientHeight;
4508
+ const offscreen = rect.top < 0 || rect.bottom > viewportH;
4509
+ if (!offscreen) return;
4510
+ const reduce = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
4511
+ el.scrollIntoView({ block: "nearest", behavior: reduce ? "auto" : "smooth" });
4512
+ }, []);
4513
+ const announcer = React63.createElement(
4514
+ "span",
4515
+ { role: "status", "aria-live": "polite", className: "sr-only" },
4516
+ message
4517
+ );
4518
+ return { isFresh, markFresh, freshRef, announcer };
4519
+ }
4520
+
4521
+ // src/components/nav-section-label.tsx
4522
+ import * as React64 from "react";
4464
4523
  import { jsx as jsx75 } from "react/jsx-runtime";
4465
- var NavSectionLabel = React63.forwardRef(
4524
+ var NavSectionLabel = React64.forwardRef(
4466
4525
  function NavSectionLabel2({ className, ...props }, ref) {
4467
4526
  return /* @__PURE__ */ jsx75(
4468
4527
  "div",
@@ -4477,7 +4536,7 @@ var NavSectionLabel = React63.forwardRef(
4477
4536
  NavSectionLabel.displayName = "NavSectionLabel";
4478
4537
 
4479
4538
  // src/components/menu-popup.tsx
4480
- import * as React64 from "react";
4539
+ import * as React65 from "react";
4481
4540
  import { jsx as jsx76, jsxs as jsxs49 } from "react/jsx-runtime";
4482
4541
  function MenuPopup({
4483
4542
  trigger,
@@ -4507,7 +4566,7 @@ function MenuPopup({
4507
4566
  )
4508
4567
  ] });
4509
4568
  }
4510
- var MenuDivider = React64.forwardRef(
4569
+ var MenuDivider = React65.forwardRef(
4511
4570
  function MenuDivider2({ className, ...props }, ref) {
4512
4571
  return /* @__PURE__ */ jsx76(
4513
4572
  "div",
@@ -4523,11 +4582,11 @@ var MenuDivider = React64.forwardRef(
4523
4582
  MenuDivider.displayName = "MenuDivider";
4524
4583
 
4525
4584
  // src/components/sidebar-product-header.tsx
4526
- import * as React65 from "react";
4585
+ import * as React66 from "react";
4527
4586
  import { Slot as Slot4 } from "@radix-ui/react-slot";
4528
4587
  import { ChevronsUpDown as ChevronsUpDown2 } from "lucide-react";
4529
4588
  import { Fragment as Fragment7, jsx as jsx77, jsxs as jsxs50 } from "react/jsx-runtime";
4530
- var SidebarProductHeader = React65.forwardRef(
4589
+ var SidebarProductHeader = React66.forwardRef(
4531
4590
  function SidebarProductHeader2({ name, icon, trailing, asChild = false, className, children, ...props }, ref) {
4532
4591
  const adornment = trailing === void 0 ? /* @__PURE__ */ jsx77(ChevronsUpDown2, { size: 14, "aria-hidden": "true", className: "shrink-0 text-text-tertiary" }) : trailing;
4533
4592
  const content = /* @__PURE__ */ jsxs50(Fragment7, { children: [
@@ -4537,8 +4596,8 @@ var SidebarProductHeader = React65.forwardRef(
4537
4596
  ] });
4538
4597
  const classes = cn("flex w-full items-center gap-2.5 rounded-xl px-1.5 py-0 text-left", className);
4539
4598
  if (asChild) {
4540
- const child = React65.Children.only(children);
4541
- return /* @__PURE__ */ jsx77(Slot4, { ref, className: classes, ...props, children: React65.cloneElement(child, void 0, content) });
4599
+ const child = React66.Children.only(children);
4600
+ return /* @__PURE__ */ jsx77(Slot4, { ref, className: classes, ...props, children: React66.cloneElement(child, void 0, content) });
4542
4601
  }
4543
4602
  return /* @__PURE__ */ jsx77("button", { ref, type: "button", className: classes, ...props, children: content });
4544
4603
  }
@@ -4548,7 +4607,7 @@ SidebarProductHeader.displayName = "SidebarProductHeader";
4548
4607
  // src/components/org-product-switcher.tsx
4549
4608
  import { ChevronsUpDown as ChevronsUpDown3, Check as Check9 } from "lucide-react";
4550
4609
  import { Fragment as Fragment8, jsx as jsx78, jsxs as jsxs51 } from "react/jsx-runtime";
4551
- var triggerBox = "flex w-full items-center gap-2.5 rounded-xl px-1.5 py-1 text-left transition-colors hover:bg-[var(--hov-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus";
4610
+ var triggerBox = "flex w-full items-center gap-2.5 rounded-xl px-1.5 py-1 text-left transition-colors duration-fast hover:bg-[var(--hov-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus";
4552
4611
  var menuItem = "gap-2 rounded-md px-2 py-1.5 text-sm font-medium text-text-secondary focus:bg-[var(--menu-hov)] focus:text-text-primary";
4553
4612
  var sectionLabel = "px-2 pt-1.5 pb-1 text-xs font-medium text-text-tertiary";
4554
4613
  var NO_ORG_LABEL = "Select an organization\u2026";
@@ -4639,7 +4698,7 @@ function OrgProductSwitcher({
4639
4698
  o.id === activeOrgId && /* @__PURE__ */ jsx78(Check9, { className: "size-4 shrink-0 text-text-secondary", "aria-hidden": "true" })
4640
4699
  ] }, o.id)),
4641
4700
  products.length > 0 && /* @__PURE__ */ jsxs51(Fragment8, { children: [
4642
- /* @__PURE__ */ jsx78(DropdownMenuSeparator, { className: "mx-0 shrink-0 bg-border-subtle" }),
4701
+ /* @__PURE__ */ jsx78(DropdownMenuSeparator, { className: "mx-0 shrink-0" }),
4643
4702
  /* @__PURE__ */ jsx78(DropdownMenuLabel, { className: sectionLabel, children: orgName ? `${orgName} \xB7 Products` : "Products" }),
4644
4703
  products.map((p) => /* @__PURE__ */ jsxs51(DropdownMenuItem, { className: menuItem, onSelect: () => onProductSelect?.(p.id), children: [
4645
4704
  /* @__PURE__ */ jsx78(Mark2, { item: p, size: "sm", reserve: true }),
@@ -4648,7 +4707,7 @@ function OrgProductSwitcher({
4648
4707
  ] }, p.id))
4649
4708
  ] }),
4650
4709
  actions && actions.length > 0 && /* @__PURE__ */ jsxs51(Fragment8, { children: [
4651
- /* @__PURE__ */ jsx78(DropdownMenuSeparator, { className: "mx-0 shrink-0 bg-border-subtle" }),
4710
+ /* @__PURE__ */ jsx78(DropdownMenuSeparator, { className: "mx-0 shrink-0" }),
4652
4711
  actions.map((a) => /* @__PURE__ */ jsx78(DropdownMenuItem, { className: menuItem, onSelect: a.onSelect, asChild: Boolean(a.href), children: a.href ? /* @__PURE__ */ jsxs51("a", { href: a.href, children: [
4653
4712
  a.icon,
4654
4713
  a.label
@@ -4668,7 +4727,7 @@ OrgProductSwitcher.displayName = "OrgProductSwitcher";
4668
4727
  import { ArrowLeft as ArrowLeft3 } from "lucide-react";
4669
4728
  import { jsx as jsx79, jsxs as jsxs52 } from "react/jsx-runtime";
4670
4729
  var focusRing = "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus";
4671
- var arrowPlate = "flex size-5 items-center justify-center rounded-md transition-colors hover:bg-[color-mix(in_srgb,var(--text-primary)_12%,transparent)] hover:text-text-primary";
4730
+ var arrowPlate = "flex size-5 items-center justify-center rounded-md transition-colors duration-fast hover:bg-[color-mix(in_srgb,var(--text-primary)_12%,transparent)] hover:text-text-primary";
4672
4731
  var arrowBox = "flex shrink-0 cursor-pointer items-center rounded-xl py-2 pr-0 pl-2.5 text-text-secondary";
4673
4732
  var titleBox = "min-w-0 flex-1 cursor-pointer truncate rounded-xl py-2 pr-2.5 pl-[14px] text-left text-sm font-semibold text-text-primary";
4674
4733
  var Arrow = () => /* @__PURE__ */ jsx79(ArrowLeft3, { size: 16, "aria-hidden": "true" });
@@ -4726,9 +4785,9 @@ function SidebarBackHeader({
4726
4785
  SidebarBackHeader.displayName = "SidebarBackHeader";
4727
4786
 
4728
4787
  // src/components/top-bar.tsx
4729
- import * as React66 from "react";
4788
+ import * as React67 from "react";
4730
4789
  import { jsx as jsx80, jsxs as jsxs53 } from "react/jsx-runtime";
4731
- var TopBar = React66.forwardRef(
4790
+ var TopBar = React67.forwardRef(
4732
4791
  ({ left, right, className, ...props }, ref) => /* @__PURE__ */ jsxs53("div", { ref, className: cn("flex w-full items-center gap-1", className), ...props, children: [
4733
4792
  left,
4734
4793
  right && /* @__PURE__ */ jsx80("div", { className: "ml-auto flex items-center gap-2", children: right })
@@ -4737,9 +4796,9 @@ var TopBar = React66.forwardRef(
4737
4796
  TopBar.displayName = "TopBar";
4738
4797
 
4739
4798
  // src/components/top-bar-utilities.tsx
4740
- import * as React67 from "react";
4799
+ import * as React68 from "react";
4741
4800
  import { jsx as jsx81, jsxs as jsxs54 } from "react/jsx-runtime";
4742
- var TopBarUtilities = React67.forwardRef(
4801
+ var TopBarUtilities = React68.forwardRef(
4743
4802
  ({ items, className, ...props }, ref) => /* @__PURE__ */ jsx81("div", { ref, className: cn("flex items-center gap-1", className), ...props, children: items.map(({ name, icon, onClick }) => /* @__PURE__ */ jsxs54(Tooltip, { children: [
4744
4803
  /* @__PURE__ */ jsx81(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx81(Button, { variant: "ghost", size: "sm", icon, "aria-label": name, onClick }) }),
4745
4804
  /* @__PURE__ */ jsx81(TooltipContent, { children: name })
@@ -4748,10 +4807,10 @@ var TopBarUtilities = React67.forwardRef(
4748
4807
  TopBarUtilities.displayName = "TopBarUtilities";
4749
4808
 
4750
4809
  // src/components/grid.tsx
4751
- import * as React68 from "react";
4810
+ import * as React69 from "react";
4752
4811
  import { Slot as Slot5 } from "@radix-ui/react-slot";
4753
4812
  import { jsx as jsx82 } from "react/jsx-runtime";
4754
- var Grid = React68.forwardRef(
4813
+ var Grid = React69.forwardRef(
4755
4814
  ({ fluid = false, asChild = false, className, ...props }, ref) => {
4756
4815
  const Comp = asChild ? Slot5 : "div";
4757
4816
  return /* @__PURE__ */ jsx82(
@@ -4772,7 +4831,7 @@ var Grid = React68.forwardRef(
4772
4831
  Grid.displayName = "Grid";
4773
4832
 
4774
4833
  // src/components/col.tsx
4775
- import * as React69 from "react";
4834
+ import * as React70 from "react";
4776
4835
  import { Slot as Slot6 } from "@radix-ui/react-slot";
4777
4836
  import { jsx as jsx83 } from "react/jsx-runtime";
4778
4837
  var TIER_MAX = { base: 4, md: 8, xl: 12 };
@@ -4894,7 +4953,7 @@ function responsiveClasses(span, offset) {
4894
4953
  }
4895
4954
  return cn(...spanClasses, ...startClasses);
4896
4955
  }
4897
- var Col = React69.forwardRef(
4956
+ var Col = React70.forwardRef(
4898
4957
  ({ span, offset, asChild = false, className, ...props }, ref) => {
4899
4958
  const Comp = asChild ? Slot6 : "div";
4900
4959
  return /* @__PURE__ */ jsx83(Comp, { ref, className: cn(responsiveClasses(span, offset), className), ...props });
@@ -4913,7 +4972,7 @@ function PageColumn({ className, width = "reading", ...props }) {
4913
4972
  }
4914
4973
 
4915
4974
  // src/components/code-block.tsx
4916
- import * as React70 from "react";
4975
+ import * as React71 from "react";
4917
4976
  import { jsx as jsx85, jsxs as jsxs55 } from "react/jsx-runtime";
4918
4977
  var TOKEN_CLASS = {
4919
4978
  comment: "text-text-tertiary italic",
@@ -5085,11 +5144,11 @@ function dropLeading(tokens, count) {
5085
5144
  }
5086
5145
  return out;
5087
5146
  }
5088
- var CodeBlock = React70.forwardRef(
5147
+ var CodeBlock = React71.forwardRef(
5089
5148
  ({ code, lang = "tsx", variant = "default", copy = false, filename, scroll = false, highlightLines, showLineNumbers = false, className, ...props }, ref) => {
5090
- const lines = React70.useMemo(() => tokenizeLines(code, lang), [code, lang]);
5091
- const rawLines = React70.useMemo(() => code.split("\n"), [code]);
5092
- const highlighted = React70.useMemo(() => parseHighlightLines(highlightLines), [highlightLines]);
5149
+ const lines = React71.useMemo(() => tokenizeLines(code, lang), [code, lang]);
5150
+ const rawLines = React71.useMemo(() => code.split("\n"), [code]);
5151
+ const highlighted = React71.useMemo(() => parseHighlightLines(highlightLines), [highlightLines]);
5093
5152
  const isDiff = variant === "diff";
5094
5153
  const isTerminal = variant === "terminal";
5095
5154
  const showCopy = copy && !isTerminal;
@@ -5164,7 +5223,7 @@ var CodeBlock = React70.forwardRef(
5164
5223
  }
5165
5224
  );
5166
5225
  CodeBlock.displayName = "CodeBlock";
5167
- var Code = React70.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx85(
5226
+ var Code = React71.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx85(
5168
5227
  "code",
5169
5228
  {
5170
5229
  ref,
@@ -5178,10 +5237,10 @@ var Code = React70.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
5178
5237
  Code.displayName = "Code";
5179
5238
 
5180
5239
  // src/components/grid-overlay.tsx
5181
- import * as React71 from "react";
5240
+ import * as React72 from "react";
5182
5241
  import { jsx as jsx86 } from "react/jsx-runtime";
5183
5242
  var BASELINE = "var(--grid-gutter) / 2";
5184
- var GridOverlay = React71.forwardRef(
5243
+ var GridOverlay = React72.forwardRef(
5185
5244
  ({ columns, baseline = false, className, style, ...props }, ref) => {
5186
5245
  const count = Number.isFinite(columns) ? Math.max(1, Math.floor(columns)) : 1;
5187
5246
  return /* @__PURE__ */ jsx86(
@@ -5209,7 +5268,7 @@ var GridOverlay = React71.forwardRef(
5209
5268
  GridOverlay.displayName = "GridOverlay";
5210
5269
 
5211
5270
  // src/components/attachment-chip.tsx
5212
- import * as React72 from "react";
5271
+ import * as React73 from "react";
5213
5272
  import { cva as cva8 } from "class-variance-authority";
5214
5273
  import { Link2, Clock, Plus as Plus2 } from "lucide-react";
5215
5274
  import { jsx as jsx87, jsxs as jsxs56 } from "react/jsx-runtime";
@@ -5231,7 +5290,7 @@ var stateIcons = {
5231
5290
  requested: Clock,
5232
5291
  available: Plus2
5233
5292
  };
5234
- var AttachmentChip = React72.forwardRef(
5293
+ var AttachmentChip = React73.forwardRef(
5235
5294
  ({ state, account, icon, hideIcon = false, className, ...props }, ref) => {
5236
5295
  const Icon = icon ?? stateIcons[state ?? "attached"];
5237
5296
  return /* @__PURE__ */ jsxs56("span", { ref, className: cn(attachmentChipVariants({ state }), className), ...props, children: [
@@ -5243,7 +5302,7 @@ var AttachmentChip = React72.forwardRef(
5243
5302
  AttachmentChip.displayName = "AttachmentChip";
5244
5303
 
5245
5304
  // src/components/connector-card.tsx
5246
- import * as React73 from "react";
5305
+ import * as React74 from "react";
5247
5306
  import { AlertTriangle, ChevronDown as ChevronDown6 } from "lucide-react";
5248
5307
  import { Fragment as Fragment9, jsx as jsx88, jsxs as jsxs57 } from "react/jsx-runtime";
5249
5308
  var originLabels = {
@@ -5258,7 +5317,7 @@ var statusLabels = {
5258
5317
  function monogram(name) {
5259
5318
  return name.replace(/[^a-zA-Z0-9 ]/g, " ").split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0].toUpperCase()).join("");
5260
5319
  }
5261
- var ConnectorCard = React73.forwardRef(
5320
+ var ConnectorCard = React74.forwardRef(
5262
5321
  ({
5263
5322
  name,
5264
5323
  kind,
@@ -5362,7 +5421,7 @@ var ConnectorCard = React73.forwardRef(
5362
5421
  ChevronDown6,
5363
5422
  {
5364
5423
  "aria-hidden": "true",
5365
- className: "size-4 shrink-0 text-text-tertiary transition-transform group-data-[state=open]:rotate-180"
5424
+ className: "size-4 shrink-0 text-text-tertiary transition-transform duration-fast group-data-[state=open]:rotate-180"
5366
5425
  }
5367
5426
  )
5368
5427
  ] })
@@ -5382,12 +5441,12 @@ var ConnectorCard = React73.forwardRef(
5382
5441
  ConnectorCard.displayName = "ConnectorCard";
5383
5442
 
5384
5443
  // src/components/request-row.tsx
5385
- import * as React74 from "react";
5444
+ import * as React75 from "react";
5386
5445
  import { Fragment as Fragment10, jsx as jsx89, jsxs as jsxs58 } from "react/jsx-runtime";
5387
5446
  function monogram2(name) {
5388
5447
  return name.replace(/[^a-zA-Z0-9 ]/g, " ").split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0].toUpperCase()).join("");
5389
5448
  }
5390
- var RequestRow = React74.forwardRef(
5449
+ var RequestRow = React75.forwardRef(
5391
5450
  ({ surface, name, state, glyph, subtitle, account, onApprove, onDeny, onRequest, onRevoke, action, className, ...props }, ref) => {
5392
5451
  let controls = action;
5393
5452
  if (controls === void 0) {
@@ -5439,7 +5498,7 @@ var RequestRow = React74.forwardRef(
5439
5498
  RequestRow.displayName = "RequestRow";
5440
5499
 
5441
5500
  // src/components/feedback-button.tsx
5442
- import * as React75 from "react";
5501
+ import * as React76 from "react";
5443
5502
  import { MessageSquare, Loader2 as Loader23, CheckCircle2 } from "lucide-react";
5444
5503
  import { jsx as jsx90, jsxs as jsxs59 } from "react/jsx-runtime";
5445
5504
  var TITLE_MAX = 256;
@@ -5455,15 +5514,15 @@ var DEFAULT_LABELS = {
5455
5514
  };
5456
5515
  function FeedbackButton({ onSubmit, labels, className }) {
5457
5516
  const l = { ...DEFAULT_LABELS, ...labels };
5458
- const uid = React75.useId();
5517
+ const uid = React76.useId();
5459
5518
  const titleId = `${uid}-title`;
5460
5519
  const detailsId = `${uid}-details`;
5461
5520
  const titleErrId = `${uid}-title-error`;
5462
5521
  const detailsErrId = `${uid}-details-error`;
5463
- const [open, setOpen] = React75.useState(false);
5464
- const [status, setStatus] = React75.useState("idle");
5465
- const [title, setTitle] = React75.useState("");
5466
- const [details, setDetails] = React75.useState("");
5522
+ const [open, setOpen] = React76.useState(false);
5523
+ const [status, setStatus] = React76.useState("idle");
5524
+ const [title, setTitle] = React76.useState("");
5525
+ const [details, setDetails] = React76.useState("");
5467
5526
  const titleTooLong = title.length > TITLE_MAX;
5468
5527
  const detailsTooLong = details.length > DETAILS_MAX;
5469
5528
  const titleEmpty = title.trim().length === 0;
@@ -5597,11 +5656,11 @@ function isNotificationSettled(item) {
5597
5656
  }
5598
5657
 
5599
5658
  // src/components/notification-bell.tsx
5600
- import * as React77 from "react";
5659
+ import * as React78 from "react";
5601
5660
  import { BellRing, Settings } from "lucide-react";
5602
5661
 
5603
5662
  // src/components/notification-row.tsx
5604
- import * as React76 from "react";
5663
+ import * as React77 from "react";
5605
5664
 
5606
5665
  // src/components/notification-parts.tsx
5607
5666
  import { Check as Check10 } from "lucide-react";
@@ -5636,7 +5695,7 @@ function DeepLinkControl({
5636
5695
 
5637
5696
  // src/components/notification-row.tsx
5638
5697
  import { jsx as jsx92, jsxs as jsxs60 } from "react/jsx-runtime";
5639
- var NotificationRow = React76.forwardRef(
5698
+ var NotificationRow = React77.forwardRef(
5640
5699
  ({ item, onItemClick, onActionClick, onMarkRead, formatAge, className, ...props }, ref) => {
5641
5700
  const settled = isNotificationSettled(item);
5642
5701
  const unread = !settled && !item.read;
@@ -5700,7 +5759,7 @@ var NotificationRow = React76.forwardRef(
5700
5759
  onClick: () => onActionClick?.(item, action),
5701
5760
  className: cn(
5702
5761
  rowControlHitArea,
5703
- chip ? "rounded-md px-2.5 py-1 text-xs font-medium transition-colors" : "text-xs font-semibold text-text-secondary transition-opacity hover:opacity-80",
5762
+ chip ? "rounded-md px-2.5 py-1 text-xs font-medium transition-colors duration-fast" : "text-xs font-semibold text-text-secondary transition-opacity duration-fast hover:opacity-80",
5704
5763
  action.variant === "primary" && "bg-bg-brand text-text-on-brand hover:bg-bg-brand-hover",
5705
5764
  action.variant === "destructive" && "bg-bg-elevated text-text-danger hover:bg-bg-sunken"
5706
5765
  ),
@@ -5717,7 +5776,7 @@ var NotificationRow = React76.forwardRef(
5717
5776
  onClick: () => onItemClick?.(item),
5718
5777
  className: cn(
5719
5778
  rowControlHitArea,
5720
- "text-xs font-semibold text-text-brand transition-opacity hover:opacity-80"
5779
+ "text-xs font-semibold text-text-brand transition-opacity duration-fast hover:opacity-80"
5721
5780
  )
5722
5781
  }
5723
5782
  )
@@ -5732,7 +5791,7 @@ NotificationRow.displayName = "NotificationRow";
5732
5791
 
5733
5792
  // src/components/notification-bell.tsx
5734
5793
  import { jsx as jsx93, jsxs as jsxs61 } from "react/jsx-runtime";
5735
- var NotificationBell = React77.forwardRef(
5794
+ var NotificationBell = React78.forwardRef(
5736
5795
  ({
5737
5796
  items,
5738
5797
  unreadCount,
@@ -5760,7 +5819,7 @@ var NotificationBell = React77.forwardRef(
5760
5819
  type: "button",
5761
5820
  "aria-label": "Notifications",
5762
5821
  className: cn(
5763
- "relative flex size-8 items-center justify-center rounded-lg text-text-secondary transition-colors hover:bg-bg-elevated hover:text-text-primary data-[state=open]:bg-bg-brand-subtle data-[state=open]:text-text-brand",
5822
+ "relative flex size-8 items-center justify-center rounded-lg text-text-secondary transition-colors duration-fast hover:bg-bg-elevated hover:text-text-primary data-[state=open]:bg-bg-elevated data-[state=open]:text-text-primary",
5764
5823
  className
5765
5824
  ),
5766
5825
  children: [
@@ -5785,7 +5844,7 @@ var NotificationBell = React77.forwardRef(
5785
5844
  {
5786
5845
  type: "button",
5787
5846
  onClick: () => onMarkAllRead?.(),
5788
- className: "text-sm font-medium text-text-tertiary transition-colors hover:text-text-primary",
5847
+ className: "text-sm font-medium text-text-tertiary transition-colors duration-fast hover:text-text-primary",
5789
5848
  children: "Mark all read"
5790
5849
  }
5791
5850
  ),
@@ -5795,7 +5854,7 @@ var NotificationBell = React77.forwardRef(
5795
5854
  type: "button",
5796
5855
  "aria-label": "Notification settings",
5797
5856
  onClick: () => onOpenSettings(),
5798
- className: "flex size-6 items-center justify-center rounded-md text-text-tertiary transition-colors hover:bg-bg-surface hover:text-text-primary",
5857
+ className: "flex size-6 items-center justify-center rounded-md text-text-tertiary transition-colors duration-fast hover:bg-bg-surface hover:text-text-primary",
5799
5858
  children: /* @__PURE__ */ jsx93(Settings, { className: "size-[15px]", "aria-hidden": "true" })
5800
5859
  }
5801
5860
  )
@@ -5818,7 +5877,7 @@ var NotificationBell = React77.forwardRef(
5818
5877
  {
5819
5878
  type: "button",
5820
5879
  onClick: () => onOpenArchive(),
5821
- className: "flex w-full shrink-0 items-center justify-center px-5 py-2.5 text-sm font-medium text-text-brand transition-colors hover:bg-bg-surface",
5880
+ className: "flex w-full shrink-0 items-center justify-center px-5 py-2.5 text-sm font-medium text-text-brand transition-colors duration-fast hover:bg-bg-surface",
5822
5881
  children: hidden > 0 ? `Open notifications archive, ${hidden} more` : "Open notifications archive"
5823
5882
  }
5824
5883
  )
@@ -5831,11 +5890,11 @@ var NotificationBell = React77.forwardRef(
5831
5890
  NotificationBell.displayName = "NotificationBell";
5832
5891
 
5833
5892
  // src/components/notification-center.tsx
5834
- import * as React78 from "react";
5893
+ import * as React79 from "react";
5835
5894
  import { Check as Check11, Search as Search2 } from "lucide-react";
5836
5895
  import { jsx as jsx94, jsxs as jsxs62 } from "react/jsx-runtime";
5837
- var chipBase = "rounded-lg px-3 py-1.5 text-sm font-medium transition-colors";
5838
- var chipOn = "bg-bg-brand-subtle text-text-brand";
5896
+ var chipBase = "rounded-md px-3 py-1.5 text-sm font-medium transition-colors duration-fast";
5897
+ var chipOn = "bg-bg-sunken font-semibold text-text-primary";
5839
5898
  var chipOff = "bg-bg-elevated text-text-secondary hover:text-text-primary";
5840
5899
  function CenterRow({
5841
5900
  item,
@@ -5890,14 +5949,14 @@ function CenterRow({
5890
5949
  onClick: () => onDeepLinkClick?.(item),
5891
5950
  className: cn(
5892
5951
  rowControlHitArea,
5893
- "inline-flex items-center gap-1 text-sm font-medium text-text-brand transition-colors hover:text-text-primary"
5952
+ "inline-flex items-center gap-1 text-sm font-medium text-text-brand transition-colors duration-fast hover:text-text-primary"
5894
5953
  )
5895
5954
  }
5896
5955
  )
5897
5956
  ] })
5898
5957
  ] });
5899
5958
  }
5900
- var NotificationCenter = React78.forwardRef(
5959
+ var NotificationCenter = React79.forwardRef(
5901
5960
  ({
5902
5961
  items,
5903
5962
  header = true,
@@ -5914,16 +5973,16 @@ var NotificationCenter = React78.forwardRef(
5914
5973
  formatAge,
5915
5974
  className
5916
5975
  }, ref) => {
5917
- const [status, setStatus] = React78.useState("all");
5918
- const [source, setSource] = React78.useState("all");
5919
- const [product, setProduct] = React78.useState("all");
5920
- const [query, setQuery] = React78.useState("");
5921
- const [limit, setLimit] = React78.useState(pageSize);
5922
- const age = React78.useCallback(
5976
+ const [status, setStatus] = React79.useState("all");
5977
+ const [source, setSource] = React79.useState("all");
5978
+ const [product, setProduct] = React79.useState("all");
5979
+ const [query, setQuery] = React79.useState("");
5980
+ const [limit, setLimit] = React79.useState(pageSize);
5981
+ const age = React79.useCallback(
5923
5982
  (createdAt) => formatAge ? formatAge(createdAt) : formatRelativeAge(createdAt),
5924
5983
  [formatAge]
5925
5984
  );
5926
- const sourceChips = React78.useMemo(
5985
+ const sourceChips = React79.useMemo(
5927
5986
  () => sources ?? Array.from(new Set(items.map((n) => n.source))),
5928
5987
  [sources, items]
5929
5988
  );
@@ -5945,7 +6004,7 @@ var NotificationCenter = React78.forwardRef(
5945
6004
  {
5946
6005
  type: "button",
5947
6006
  onClick: () => onMarkAllRead(),
5948
- className: "shrink-0 rounded-md px-2.5 py-1 text-sm font-medium text-text-tertiary transition-colors hover:text-text-primary",
6007
+ className: "shrink-0 rounded-md px-2.5 py-1 text-sm font-medium text-text-tertiary transition-colors duration-fast hover:text-text-primary",
5949
6008
  children: "Read all"
5950
6009
  }
5951
6010
  )
@@ -6042,7 +6101,7 @@ var NotificationCenter = React78.forwardRef(
6042
6101
  {
6043
6102
  type: "button",
6044
6103
  onClick: () => setLimit((l) => l + pageSize),
6045
- className: "mt-1 rounded-lg bg-bg-elevated px-4 py-2.5 text-sm font-medium text-text-secondary transition-colors hover:bg-bg-surface hover:text-text-primary",
6104
+ className: "mt-1 rounded-lg bg-bg-elevated px-4 py-2.5 text-sm font-medium text-text-secondary transition-colors duration-fast hover:bg-bg-surface hover:text-text-primary",
6046
6105
  children: [
6047
6106
  "Load ",
6048
6107
  remaining,
@@ -6057,7 +6116,7 @@ var NotificationCenter = React78.forwardRef(
6057
6116
  NotificationCenter.displayName = "NotificationCenter";
6058
6117
 
6059
6118
  // src/components/notification-settings.tsx
6060
- import * as React79 from "react";
6119
+ import * as React80 from "react";
6061
6120
  import { Moon as Moon2, Plus as Plus3, Volume2 } from "lucide-react";
6062
6121
  import { Fragment as Fragment11, jsx as jsx95, jsxs as jsxs63 } from "react/jsx-runtime";
6063
6122
  var THRESHOLDS = [
@@ -6084,7 +6143,7 @@ function ThresholdControl({
6084
6143
  }
6085
6144
  );
6086
6145
  }
6087
- var NotificationSettings = React79.forwardRef(
6146
+ var NotificationSettings = React80.forwardRef(
6088
6147
  ({
6089
6148
  subscriptions,
6090
6149
  value,
@@ -6097,7 +6156,7 @@ var NotificationSettings = React79.forwardRef(
6097
6156
  pushSlot,
6098
6157
  className
6099
6158
  }, ref) => {
6100
- const [tab, setTab] = React79.useState(DEFAULT_KEY);
6159
+ const [tab, setTab] = React80.useState(DEFAULT_KEY);
6101
6160
  const isDefault = tab === DEFAULT_KEY;
6102
6161
  const defaults = value[DEFAULT_KEY] ?? { thresholds: {} };
6103
6162
  const customized = !isDefault && Object.prototype.hasOwnProperty.call(value, tab);
@@ -6179,7 +6238,7 @@ var NotificationSettings = React79.forwardRef(
6179
6238
  {
6180
6239
  type: "button",
6181
6240
  onClick: () => onUnmute?.(m.source),
6182
- className: "rounded-md px-2.5 py-1 text-sm font-medium text-text-brand transition-colors hover:bg-bg-surface",
6241
+ className: "rounded-md px-2.5 py-1 text-sm font-medium text-text-brand transition-colors duration-fast hover:bg-bg-surface",
6183
6242
  children: "Unmute"
6184
6243
  }
6185
6244
  )
@@ -6213,7 +6272,7 @@ var NotificationSettings = React79.forwardRef(
6213
6272
  {
6214
6273
  type: "button",
6215
6274
  onClick: customize,
6216
- className: "mt-5 inline-flex items-center gap-1.5 rounded-lg bg-bg-brand px-3.5 py-2 text-sm font-semibold text-text-on-brand transition-colors hover:bg-bg-brand-hover",
6275
+ className: "mt-5 inline-flex items-center gap-1.5 rounded-lg bg-bg-brand px-3.5 py-2 text-sm font-semibold text-text-on-brand transition-colors duration-fast hover:bg-bg-brand-hover",
6217
6276
  children: [
6218
6277
  /* @__PURE__ */ jsx95(Plus3, { className: "size-4", "aria-hidden": "true" }),
6219
6278
  " Customize for ",
@@ -6235,7 +6294,7 @@ var NotificationSettings = React79.forwardRef(
6235
6294
  {
6236
6295
  type: "button",
6237
6296
  onClick: resetToDefault,
6238
- className: "shrink-0 rounded-md px-2.5 py-1 text-sm font-medium text-text-tertiary transition-colors hover:text-text-danger",
6297
+ className: "shrink-0 rounded-md px-2.5 py-1 text-sm font-medium text-text-tertiary transition-colors duration-fast hover:text-text-danger",
6239
6298
  children: "Reset to Default"
6240
6299
  }
6241
6300
  )
@@ -6248,14 +6307,14 @@ var NotificationSettings = React79.forwardRef(
6248
6307
  NotificationSettings.displayName = "NotificationSettings";
6249
6308
 
6250
6309
  // src/components/notification-toast.tsx
6251
- import * as React80 from "react";
6310
+ import * as React81 from "react";
6252
6311
  import { X as X4 } from "lucide-react";
6253
6312
  import { jsx as jsx96, jsxs as jsxs64 } from "react/jsx-runtime";
6254
- var chipBase2 = "rounded-lg px-2.5 py-1 text-sm font-medium transition-colors";
6313
+ var chipBase2 = "rounded-lg px-2.5 py-1 text-sm font-medium transition-colors duration-fast";
6255
6314
  var chipPrimary = "bg-bg-brand text-text-on-brand hover:bg-bg-brand-hover";
6256
6315
  var chipDestructive = "bg-bg-elevated text-text-danger hover:bg-bg-surface";
6257
- var linkAction = "text-sm font-semibold text-text-brand transition-colors hover:text-text-primary";
6258
- var NotificationToast = React80.forwardRef(
6316
+ var linkAction = "text-sm font-semibold text-text-brand transition-colors duration-fast hover:text-text-primary";
6317
+ var NotificationToast = React81.forwardRef(
6259
6318
  ({
6260
6319
  item,
6261
6320
  showSource = true,
@@ -6272,7 +6331,7 @@ var NotificationToast = React80.forwardRef(
6272
6331
  const actions = item.actions ?? [];
6273
6332
  const percent = progress === void 0 || !Number.isFinite(progress) ? void 0 : Math.min(100, Math.max(0, progress));
6274
6333
  const progressLine = progressLabel === void 0 && percent !== void 0 ? `live, ${Math.round(percent)}%` : progressLabel;
6275
- const barId = React80.useId();
6334
+ const barId = React81.useId();
6276
6335
  const hasProgressLine = progressLine !== null && progressLine !== void 0;
6277
6336
  return /* @__PURE__ */ jsxs64(
6278
6337
  "div",
@@ -6296,7 +6355,7 @@ var NotificationToast = React80.forwardRef(
6296
6355
  type: "button",
6297
6356
  "aria-label": dismissLabel,
6298
6357
  onClick: () => onDismiss(item),
6299
- className: "flex size-5 shrink-0 items-center justify-center rounded-md text-text-tertiary transition-colors hover:bg-bg-surface hover:text-text-primary",
6358
+ className: "flex size-5 shrink-0 items-center justify-center rounded-md text-text-tertiary transition-colors duration-fast hover:bg-bg-surface hover:text-text-primary",
6300
6359
  children: /* @__PURE__ */ jsx96(X4, { className: "size-3.5", "aria-hidden": "true" })
6301
6360
  }
6302
6361
  )
@@ -6350,7 +6409,7 @@ var NotificationToast = React80.forwardRef(
6350
6409
  NotificationToast.displayName = "NotificationToast";
6351
6410
 
6352
6411
  // src/components/notification-toaster.tsx
6353
- import * as React81 from "react";
6412
+ import * as React82 from "react";
6354
6413
  import { jsx as jsx97 } from "react/jsx-runtime";
6355
6414
  var positions = {
6356
6415
  "bottom-right": "bottom-6 right-6 flex-col",
@@ -6358,7 +6417,7 @@ var positions = {
6358
6417
  "top-right": "top-6 right-6 flex-col-reverse",
6359
6418
  "top-left": "top-6 left-6 flex-col-reverse"
6360
6419
  };
6361
- var NotificationToaster = React81.forwardRef(
6420
+ var NotificationToaster = React82.forwardRef(
6362
6421
  ({
6363
6422
  items,
6364
6423
  dwell,
@@ -6375,15 +6434,15 @@ var NotificationToaster = React81.forwardRef(
6375
6434
  className
6376
6435
  }, ref) => {
6377
6436
  const shown = items.slice(0, max);
6378
- const [paused, setPaused] = React81.useState(false);
6379
- const onDismissRef = React81.useRef(onDismiss);
6437
+ const [paused, setPaused] = React82.useState(false);
6438
+ const onDismissRef = React82.useRef(onDismiss);
6380
6439
  onDismissRef.current = onDismiss;
6381
6440
  const fyiDwell = dwell?.fyi;
6382
6441
  const importantDwell = dwell?.important;
6383
6442
  const criticalDwell = dwell?.critical;
6384
- const remaining = React81.useRef(/* @__PURE__ */ new Map());
6443
+ const remaining = React82.useRef(/* @__PURE__ */ new Map());
6385
6444
  const liveIds = shown.map((item) => `${item.id}:${item.severity}`).join(" ");
6386
- React81.useEffect(() => {
6445
+ React82.useEffect(() => {
6387
6446
  const owedById = remaining.current;
6388
6447
  const dwellSeconds = {
6389
6448
  fyi: fyiDwell ?? TOAST_DWELL.fyi,
@@ -6711,11 +6770,11 @@ var COUNTRY_OPTIONS = [
6711
6770
  ];
6712
6771
 
6713
6772
  // src/components/organization-onboarding-form.tsx
6714
- import * as React82 from "react";
6773
+ import * as React83 from "react";
6715
6774
 
6716
6775
  // src/lib/auth-surface.ts
6717
- var AUTH_FILLED_BUTTON = "flex h-[46px] w-full items-center justify-center gap-[11px] rounded-[10px] border border-transparent bg-text-primary px-[14px] text-[14.5px] font-semibold tracking-[-0.005em] text-bg-sunken transition-opacity hover:opacity-[0.92] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand active:translate-y-px disabled:cursor-not-allowed disabled:opacity-[0.55]";
6718
- var AUTH_QUIET_BUTTON = "flex h-[46px] w-full items-center justify-center gap-[11px] rounded-[10px] border border-border-default bg-transparent px-[14px] text-[14.5px] font-medium tracking-[-0.005em] text-text-secondary transition-colors hover:bg-bg-secondary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand";
6776
+ var AUTH_FILLED_BUTTON = "flex h-[46px] w-full items-center justify-center gap-[11px] rounded-[10px] border border-transparent bg-text-primary px-[14px] text-[14.5px] font-semibold tracking-[-0.005em] text-bg-sunken transition-opacity duration-fast hover:opacity-[0.92] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand active:translate-y-px disabled:cursor-not-allowed disabled:opacity-[0.55]";
6777
+ var AUTH_QUIET_BUTTON = "flex h-[46px] w-full items-center justify-center gap-[11px] rounded-[10px] border border-border-default bg-transparent px-[14px] text-[14.5px] font-medium tracking-[-0.005em] text-text-secondary transition-colors duration-fast hover:bg-bg-secondary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand";
6719
6778
  var AUTH_BUTTON_SHADOW = "var(--auth-btn-shadow)";
6720
6779
 
6721
6780
  // src/components/organization-onboarding-form.tsx
@@ -6754,22 +6813,22 @@ function OrganizationOnboardingForm({
6754
6813
  onCancel,
6755
6814
  className
6756
6815
  }) {
6757
- const [name, setName] = React82.useState(defaultValues?.name ?? "");
6758
- const [legalName, setLegalName] = React82.useState(defaultValues?.legal_name ?? "");
6759
- const [ownerName, setOwnerName] = React82.useState(defaultValues?.owner_name ?? "");
6760
- const [countryOfIncorporation, setCountryOfIncorporation] = React82.useState(
6816
+ const [name, setName] = React83.useState(defaultValues?.name ?? "");
6817
+ const [legalName, setLegalName] = React83.useState(defaultValues?.legal_name ?? "");
6818
+ const [ownerName, setOwnerName] = React83.useState(defaultValues?.owner_name ?? "");
6819
+ const [countryOfIncorporation, setCountryOfIncorporation] = React83.useState(
6761
6820
  defaultValues?.country_of_incorporation ?? ""
6762
6821
  );
6763
- const [residencyCountry, setResidencyCountry] = React82.useState(
6822
+ const [residencyCountry, setResidencyCountry] = React83.useState(
6764
6823
  defaultValues?.residency_country ?? ""
6765
6824
  );
6766
- const [owners, setOwners] = React82.useState(
6825
+ const [owners, setOwners] = React83.useState(
6767
6826
  () => initialRows(defaultValues?.beneficial_owners)
6768
6827
  );
6769
- const [ownershipConfirmed, setOwnershipConfirmed] = React82.useState(false);
6770
- const [confirmationAttempted, setConfirmationAttempted] = React82.useState(false);
6771
- const nextKeyRef = React82.useRef(owners.length);
6772
- const submittingRef = React82.useRef(false);
6828
+ const [ownershipConfirmed, setOwnershipConfirmed] = React83.useState(false);
6829
+ const [confirmationAttempted, setConfirmationAttempted] = React83.useState(false);
6830
+ const nextKeyRef = React83.useRef(owners.length);
6831
+ const submittingRef = React83.useRef(false);
6773
6832
  const trimmed = name.trim();
6774
6833
  const filledOwners = owners.filter((row) => !isRowBlank(row));
6775
6834
  const ownerShares = filledOwners.map((row) => parseShare(row.share));
@@ -6823,7 +6882,7 @@ function OrganizationOnboardingForm({
6823
6882
  ...needsOwnershipConfirmation ? { ownership_confirmed: ownershipConfirmed } : {}
6824
6883
  });
6825
6884
  };
6826
- React82.useEffect(() => {
6885
+ React83.useEffect(() => {
6827
6886
  submittingRef.current = false;
6828
6887
  }, [
6829
6888
  name,
@@ -7049,7 +7108,7 @@ function OrganizationOnboardingForm({
7049
7108
  }
7050
7109
 
7051
7110
  // src/components/list-columns.tsx
7052
- import * as React83 from "react";
7111
+ import * as React84 from "react";
7053
7112
  import { jsx as jsx99, jsxs as jsxs66 } from "react/jsx-runtime";
7054
7113
  var CELL_WIDTH = { 20: "w-20", 24: "w-24", 28: "w-28", 32: "w-32" };
7055
7114
  var headerClass = "flex items-center gap-3 border-b border-border-subtle bg-bg-secondary px-4 py-1.5 text-xs text-text-tertiary";
@@ -7068,7 +7127,7 @@ function warnDuplicateKeys(columns, where) {
7068
7127
  seen.add(c.key);
7069
7128
  }
7070
7129
  }
7071
- var ListHeader = React83.forwardRef(function ListHeader2({ lead, columns, mark = true, trailing = true, className, ...props }, ref) {
7130
+ var ListHeader = React84.forwardRef(function ListHeader2({ lead, columns, mark = true, trailing = true, className, ...props }, ref) {
7072
7131
  warnDuplicateKeys(columns, "ListHeader");
7073
7132
  return /* @__PURE__ */ jsxs66("div", { ref, className: cn(headerClass, className), ...props, children: [
7074
7133
  mark && /* @__PURE__ */ jsx99("span", { className: "size-8 shrink-0", "aria-hidden": true }),
@@ -7082,7 +7141,7 @@ function cellValue(values, column) {
7082
7141
  const value = values[column.key];
7083
7142
  return value === void 0 || value === null || value === "" ? column.fallback : value;
7084
7143
  }
7085
- var ListCells = React83.forwardRef(function ListCells2({ columns, values, className, ...props }, ref) {
7144
+ var ListCells = React84.forwardRef(function ListCells2({ columns, values, className, ...props }, ref) {
7086
7145
  warnDuplicateKeys(columns, "ListCells");
7087
7146
  return /* @__PURE__ */ jsx99("span", { ref, className: cn(cellsClass, className), ...props, children: columns.map((c) => /* @__PURE__ */ jsx99(
7088
7147
  "span",
@@ -7097,7 +7156,7 @@ ListHeader.displayName = "ListHeader";
7097
7156
  ListCells.displayName = "ListCells";
7098
7157
 
7099
7158
  // src/components/theme-picker.tsx
7100
- import * as React84 from "react";
7159
+ import * as React85 from "react";
7101
7160
  import { Check as Check12, Monitor } from "lucide-react";
7102
7161
  import { jsx as jsx100, jsxs as jsxs67 } from "react/jsx-runtime";
7103
7162
  var THEME_SWATCHES = {
@@ -7146,11 +7205,11 @@ function Panels({ palette }) {
7146
7205
  )
7147
7206
  ] });
7148
7207
  }
7149
- var autoPlateClass = "flex h-full items-center justify-center bg-bg-secondary";
7208
+ var autoPlateClass = "flex h-full items-center justify-center bg-bg-surface";
7150
7209
  var previewClass = "block h-28 overflow-hidden rounded-lg border border-border-default";
7151
- var cardClass = "grid gap-2 rounded-lg p-1.5 text-left transition-colors hover:bg-bg-elevated focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus";
7210
+ var cardClass = "grid gap-2 rounded-lg p-1.5 text-left transition-colors duration-fast hover:bg-bg-elevated focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus";
7152
7211
  var TRACK = { gridTemplateColumns: "repeat(auto-fit, minmax(8rem, 1fr))" };
7153
- var Picker = React84.forwardRef(function Picker2({ value, onValueChange, className, ...props }, ref) {
7212
+ var Picker = React85.forwardRef(function Picker2({ value, onValueChange, className, ...props }, ref) {
7154
7213
  return /* @__PURE__ */ jsx100("div", { role: "group", "aria-label": "Theme", ...props, ref, className: cn("grid gap-4", className), style: { ...TRACK, ...props.style }, children: OPTIONS.map((o) => {
7155
7214
  const selected = o.value === value;
7156
7215
  return (
@@ -7165,7 +7224,7 @@ var Picker = React84.forwardRef(function Picker2({ value, onValueChange, classNa
7165
7224
  onClick: () => onValueChange(o.value),
7166
7225
  className: cardClass,
7167
7226
  children: [
7168
- /* @__PURE__ */ jsx100("span", { className: cn(previewClass, selected && "ring-2 ring-border-strong"), "aria-hidden": true, children: o.value === "system" ? /* @__PURE__ */ jsx100("span", { className: autoPlateClass, children: /* @__PURE__ */ jsx100(Monitor, { className: "size-8 text-text-tertiary" }) }) : /* @__PURE__ */ jsx100(Panels, { palette: THEME_SWATCHES[o.value] }) }),
7227
+ /* @__PURE__ */ jsx100("span", { className: cn(previewClass, selected && "border-border-strong"), "aria-hidden": true, children: o.value === "system" ? /* @__PURE__ */ jsx100("span", { className: autoPlateClass, children: /* @__PURE__ */ jsx100(Monitor, { className: "size-8 text-text-tertiary" }) }) : /* @__PURE__ */ jsx100(Panels, { palette: THEME_SWATCHES[o.value] }) }),
7169
7228
  /* @__PURE__ */ jsxs67(
7170
7229
  "span",
7171
7230
  {
@@ -7186,7 +7245,7 @@ var Picker = React84.forwardRef(function Picker2({ value, onValueChange, classNa
7186
7245
  );
7187
7246
  }) });
7188
7247
  });
7189
- var WiredPicker = React84.forwardRef(function WiredPicker2({ onValueChange, ...props }, ref) {
7248
+ var WiredPicker = React85.forwardRef(function WiredPicker2({ onValueChange, ...props }, ref) {
7190
7249
  const { theme, setTheme } = useTheme();
7191
7250
  return /* @__PURE__ */ jsx100(
7192
7251
  Picker,
@@ -7201,8 +7260,8 @@ var WiredPicker = React84.forwardRef(function WiredPicker2({ onValueChange, ...p
7201
7260
  }
7202
7261
  );
7203
7262
  });
7204
- var ThemePicker = React84.forwardRef(function ThemePicker2({ value, onValueChange, ...props }, ref) {
7205
- const controlled = React84.useRef(value !== void 0);
7263
+ var ThemePicker = React85.forwardRef(function ThemePicker2({ value, onValueChange, ...props }, ref) {
7264
+ const controlled = React85.useRef(value !== void 0);
7206
7265
  if (process.env.NODE_ENV !== "production" && controlled.current !== (value !== void 0)) {
7207
7266
  console.warn(
7208
7267
  "[ThemePicker] `value` went from " + (controlled.current ? "set to missing" : "missing to set") + " after mount. The picker stays " + (controlled.current ? "controlled" : "wired to the console theme") + " for its whole life: render it once its value is known, or leave `value` off entirely."
@@ -7214,7 +7273,7 @@ var ThemePicker = React84.forwardRef(function ThemePicker2({ value, onValueChang
7214
7273
  ThemePicker.displayName = "ThemePicker";
7215
7274
 
7216
7275
  // src/components/secret-reveal.tsx
7217
- import * as React85 from "react";
7276
+ import * as React86 from "react";
7218
7277
  import { Copy as Copy2, Download } from "lucide-react";
7219
7278
  import { jsx as jsx101, jsxs as jsxs68 } from "react/jsx-runtime";
7220
7279
  var asText = (value) => Array.isArray(value) ? value.join("\n") : value;
@@ -7232,7 +7291,7 @@ function SecretValue({ value }) {
7232
7291
  }
7233
7292
  return /* @__PURE__ */ jsx101("code", { className: "block break-all font-mono text-sm font-medium text-text-primary", children: value });
7234
7293
  }
7235
- var SecretReveal = React85.forwardRef(
7294
+ var SecretReveal = React86.forwardRef(
7236
7295
  ({
7237
7296
  value,
7238
7297
  caption,
@@ -7249,18 +7308,18 @@ var SecretReveal = React85.forwardRef(
7249
7308
  className,
7250
7309
  ...props
7251
7310
  }, ref) => {
7252
- const [takenText, setTakenText] = React85.useState(null);
7253
- const [refusedText, setRefusedText] = React85.useState(null);
7254
- const [announcedFor, setAnnouncedFor] = React85.useState(null);
7255
- const copyRef = React85.useRef(null);
7256
- const captionId = React85.useId();
7311
+ const [takenText, setTakenText] = React86.useState(null);
7312
+ const [refusedText, setRefusedText] = React86.useState(null);
7313
+ const [announcedFor, setAnnouncedFor] = React86.useState(null);
7314
+ const copyRef = React86.useRef(null);
7315
+ const captionId = React86.useId();
7257
7316
  const text = asText(value);
7258
7317
  const empty = text.length === 0;
7259
7318
  const taken = takenText === text;
7260
7319
  const refused = refusedText === text;
7261
- React85.useEffect(() => setAnnouncedFor(text), [text]);
7320
+ React86.useEffect(() => setAnnouncedFor(text), [text]);
7262
7321
  const announced = announcedFor === text ? REVEALED : "";
7263
- React85.useEffect(() => {
7322
+ React86.useEffect(() => {
7264
7323
  if (autoFocus) copyRef.current?.focus();
7265
7324
  }, [autoFocus]);
7266
7325
  const reportTaken = () => {
@@ -7320,6 +7379,212 @@ var SecretReveal = React85.forwardRef(
7320
7379
  }
7321
7380
  );
7322
7381
  SecretReveal.displayName = "SecretReveal";
7382
+
7383
+ // src/components/star-rating.tsx
7384
+ import * as React87 from "react";
7385
+ import * as RadioGroupPrimitive2 from "@radix-ui/react-radio-group";
7386
+ import { Star } from "lucide-react";
7387
+ import { jsx as jsx102 } from "react/jsx-runtime";
7388
+ var STAR_BOX = {
7389
+ sm: "size-4",
7390
+ md: "size-5",
7391
+ lg: "size-6"
7392
+ };
7393
+ var ROW_GAP = {
7394
+ sm: "gap-0.5",
7395
+ md: "gap-1",
7396
+ lg: "gap-1.5"
7397
+ };
7398
+ var defaultItemLabel = (value, max) => `${value} out of ${max} stars`;
7399
+ var StarGlyph = ({ filled, size }) => /* @__PURE__ */ jsx102(
7400
+ Star,
7401
+ {
7402
+ "aria-hidden": "true",
7403
+ className: cn(
7404
+ STAR_BOX[size],
7405
+ "shrink-0 transition-colors duration-fast",
7406
+ filled ? "fill-current text-text-primary" : "text-text-tertiary"
7407
+ )
7408
+ }
7409
+ );
7410
+ var StarRating = React87.forwardRef(
7411
+ ({
7412
+ className,
7413
+ value,
7414
+ defaultValue,
7415
+ onValueChange,
7416
+ max = 5,
7417
+ min = 1,
7418
+ size = "md",
7419
+ readOnly,
7420
+ disabled,
7421
+ itemLabel = defaultItemLabel,
7422
+ ...props
7423
+ }, ref) => {
7424
+ const stars = Array.from({ length: max }, (_, index) => index + 1);
7425
+ const [mirror, setMirror] = React87.useState(defaultValue ?? 0);
7426
+ const selected = value ?? mirror;
7427
+ const [preview, setPreview] = React87.useState(null);
7428
+ const shown = preview ?? selected;
7429
+ const commit = (next) => {
7430
+ setMirror(next);
7431
+ onValueChange?.(next);
7432
+ };
7433
+ if (readOnly) {
7434
+ return /* @__PURE__ */ jsx102(
7435
+ "div",
7436
+ {
7437
+ ref,
7438
+ role: "img",
7439
+ "aria-label": props["aria-label"] ?? itemLabel(selected, max),
7440
+ className: cn("inline-flex items-center", ROW_GAP[size], className),
7441
+ children: stars.map((star) => /* @__PURE__ */ jsx102(StarGlyph, { filled: star <= selected, size }, star))
7442
+ }
7443
+ );
7444
+ }
7445
+ return /* @__PURE__ */ jsx102(
7446
+ RadioGroupPrimitive2.Root,
7447
+ {
7448
+ ref,
7449
+ ...props,
7450
+ disabled,
7451
+ value: String(selected),
7452
+ onValueChange: (next) => commit(Number(next)),
7453
+ onKeyDown: (event) => {
7454
+ if (min === 0 && (event.key === "Backspace" || event.key === "Delete")) {
7455
+ event.preventDefault();
7456
+ commit(0);
7457
+ }
7458
+ },
7459
+ orientation: "horizontal",
7460
+ loop: false,
7461
+ className: cn("inline-flex items-center", ROW_GAP[size], className),
7462
+ children: stars.map((star) => /* @__PURE__ */ jsx102(
7463
+ RadioGroupPrimitive2.Item,
7464
+ {
7465
+ value: String(star),
7466
+ "aria-label": itemLabel(star, max),
7467
+ onPointerEnter: () => setPreview(star),
7468
+ onPointerLeave: () => setPreview((current) => current === star ? null : current),
7469
+ onClick: () => {
7470
+ if (min === 0 && star === selected) commit(0);
7471
+ },
7472
+ className: cn(
7473
+ // Focus is an outline held off the box, never a flush ring (`Guidelines/Look/Borders`).
7474
+ "rounded-md p-0.5 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
7475
+ "disabled:pointer-events-none disabled:opacity-50"
7476
+ ),
7477
+ children: /* @__PURE__ */ jsx102(StarGlyph, { filled: star <= shown, size })
7478
+ },
7479
+ star
7480
+ ))
7481
+ }
7482
+ );
7483
+ }
7484
+ );
7485
+ StarRating.displayName = "StarRating";
7486
+
7487
+ // src/components/rating-scale.tsx
7488
+ import * as React88 from "react";
7489
+ import * as RadioGroupPrimitive3 from "@radix-ui/react-radio-group";
7490
+ import { jsx as jsx103, jsxs as jsxs69 } from "react/jsx-runtime";
7491
+ var SLOT_BOX = {
7492
+ sm: "h-8 min-w-8 px-2 text-xs",
7493
+ md: "h-9 min-w-9 px-2 text-sm",
7494
+ lg: "h-11 min-w-11 px-3 text-base"
7495
+ };
7496
+ var defaultItemLabel2 = (value, _min, max) => `${value} out of ${max}`;
7497
+ var RatingScale = React88.forwardRef(
7498
+ ({
7499
+ className,
7500
+ value,
7501
+ defaultValue,
7502
+ onValueChange,
7503
+ min = 0,
7504
+ max = 10,
7505
+ size = "md",
7506
+ readOnly,
7507
+ disabled,
7508
+ endLabels,
7509
+ itemLabel = defaultItemLabel2,
7510
+ ...props
7511
+ }, ref) => {
7512
+ const slots = Array.from({ length: Math.max(0, max - min + 1) }, (_, index) => min + index);
7513
+ const [mirror, setMirror] = React88.useState(defaultValue);
7514
+ const selected = value ?? mirror;
7515
+ const row = /* @__PURE__ */ jsx103("div", { className: cn("flex flex-wrap items-center gap-1.5", !endLabels && className), children: slots.map((slot) => {
7516
+ const isSelected = slot === selected;
7517
+ const box = cn(
7518
+ "inline-flex items-center justify-center rounded-md border tabular-nums transition-colors duration-fast",
7519
+ SLOT_BOX[size],
7520
+ isSelected ? "border-border-strong font-semibold text-text-primary" : "border-field-border font-medium text-text-secondary"
7521
+ );
7522
+ if (readOnly) {
7523
+ return /* @__PURE__ */ jsx103("span", { className: box, "aria-hidden": "true", children: slot }, slot);
7524
+ }
7525
+ return /* @__PURE__ */ jsx103(
7526
+ RadioGroupPrimitive3.Item,
7527
+ {
7528
+ value: String(slot),
7529
+ "aria-label": itemLabel(slot, min, max),
7530
+ className: cn(
7531
+ box,
7532
+ // The hover step is the same channel the mark uses, one rung short of it, so the
7533
+ // pointer never promises a mark it is not making.
7534
+ "hover:border-field-border-hover hover:text-text-primary",
7535
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
7536
+ "disabled:pointer-events-none disabled:opacity-50"
7537
+ ),
7538
+ children: slot
7539
+ },
7540
+ slot
7541
+ );
7542
+ }) });
7543
+ const ends = endLabels ? /* @__PURE__ */ jsxs69("div", { className: "flex items-center justify-between text-xs text-text-tertiary", children: [
7544
+ /* @__PURE__ */ jsx103("span", { children: endLabels.low }),
7545
+ /* @__PURE__ */ jsx103("span", { children: endLabels.high })
7546
+ ] }) : null;
7547
+ if (readOnly) {
7548
+ return /* @__PURE__ */ jsxs69(
7549
+ "div",
7550
+ {
7551
+ ref,
7552
+ role: "img",
7553
+ "aria-label": props["aria-label"] ?? (selected === void 0 ? "Not answered" : itemLabel(selected, min, max)),
7554
+ className: cn(endLabels && cn("flex flex-col gap-1.5", className)),
7555
+ children: [
7556
+ row,
7557
+ ends
7558
+ ]
7559
+ }
7560
+ );
7561
+ }
7562
+ const group = /* @__PURE__ */ jsx103(
7563
+ RadioGroupPrimitive3.Root,
7564
+ {
7565
+ ref,
7566
+ ...props,
7567
+ disabled,
7568
+ value: selected === void 0 ? "" : String(selected),
7569
+ onValueChange: (next) => {
7570
+ const parsed = Number(next);
7571
+ setMirror(parsed);
7572
+ onValueChange?.(parsed);
7573
+ },
7574
+ orientation: "horizontal",
7575
+ loop: false,
7576
+ asChild: true,
7577
+ children: row
7578
+ }
7579
+ );
7580
+ if (!endLabels) return group;
7581
+ return /* @__PURE__ */ jsxs69("div", { className: cn("flex flex-col gap-1.5", className), children: [
7582
+ group,
7583
+ ends
7584
+ ] });
7585
+ }
7586
+ );
7587
+ RatingScale.displayName = "RatingScale";
7323
7588
  export {
7324
7589
  Accordion,
7325
7590
  AccordionContent,
@@ -7534,6 +7799,7 @@ export {
7534
7799
  Progress,
7535
7800
  RadioGroup2 as RadioGroup,
7536
7801
  RadioGroupItem,
7802
+ RatingScale,
7537
7803
  RemovableChip,
7538
7804
  RemoveButton,
7539
7805
  RequestRow,
@@ -7558,6 +7824,7 @@ export {
7558
7824
  SidebarProductHeader,
7559
7825
  Skeleton,
7560
7826
  Slider,
7827
+ StarRating,
7561
7828
  StatCard,
7562
7829
  StatusDot,
7563
7830
  StepUpChallenge,
@@ -7607,6 +7874,7 @@ export {
7607
7874
  toggleVariants,
7608
7875
  useCarousel,
7609
7876
  useFormField,
7877
+ useFreshHighlight,
7610
7878
  useIsMobile,
7611
7879
  useSidebar,
7612
7880
  useTheme