@ai-matrx/design-system 0.11.6 → 0.12.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/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.1 — 2026-09-09
4
+
5
+ Dialog, AlertDialog, Drawer, Sheet, and BottomSheet footer actions now carry a
6
+ 44px minimum touch height on coarse pointers and viewports below 1024px. Named
7
+ icon actions also receive a 44px minimum width. Portaled footers cannot inherit
8
+ a host page's touch-target subtree, which left default buttons at 36px in the
9
+ Accounts message dialog. The structural stylesheet owns this floor, including
10
+ nested action wrappers; fine-pointer desktop density, compact state controls,
11
+ prose links, and explicit `data-touch-exempt` controls retain their sizing.
12
+
13
+ ### Consumer action
14
+
15
+ Update the package and retain the existing `@ai-matrx/design-system/styles.css`
16
+ import. No call-site changes are required.
17
+
18
+ ## 0.12.0 — 2026-09-08
19
+
20
+ ### `OrganizationPicker` — the ONE "which organization am I acting in" control
21
+
22
+ Three surfaces, three UIs for one fact: matrx-frontend had the full picker
23
+ (list with abbreviation tile, Personal badge, default star, active check, the
24
+ "Set as my default" switch, and the sentence naming the working organization);
25
+ Workflow Studio's sidebar and the admin dashboard's settings each had a bare
26
+ `<Select>` with different copy, different placement and no default control.
27
+ `OrganizationPicker` is the matrx-frontend panel ported verbatim
28
+ (`OrganizationPickerPanel` + `UserMenuOrgSection` + `DefaultOrgSwitch`), made
29
+ presentational: the host supplies memberships, the active id, the default id,
30
+ `onSelect` and (optionally) `onSetDefault`; it owns no fetch, storage or
31
+ resolution. Omit `onSetDefault` and the switch is not rendered — a host with no
32
+ write path must not show a control that does nothing. `OrganizationAbbreviation`
33
+ ships alongside (falls back to the name's first letter, so a tile is never
34
+ empty). Icons are package SVGs (C19: `StarIcon`, `Building2Icon` added
35
+ internally); the loading rows are this package's `Skeleton`; the default star
36
+ uses the semantic `warning` token — both caught by the package's own guards on
37
+ the first attempt. Adopted in the same session by matrx-frontend (user menu +
38
+ header nudge), workflow-studio (sidebar popover) and the admin dashboard
39
+ (Settings → Organization).
40
+
3
41
  ## 0.11.6 — 2026-09-08
4
42
 
5
43
  **THE PATCH TO TAKE.** 0.11.3, 0.11.4 and 0.11.5 are all superseded; the
package/README.md CHANGED
@@ -27,6 +27,8 @@ if (!(await confirm({
27
27
 
28
28
  Use the declarative `<ConfirmDialog open … busy />` inline instead when the dialog must stay open with a spinner while async work finishes. Name the consequence: a confirmation that says only "Are you sure?" does not satisfy the platform's destructive-and-expensive-actions law.
29
29
 
30
+ **Footer actions stay touch-sized through portals.** Dialog, AlertDialog, Drawer, Sheet, and BottomSheet footers apply a 44px action floor on coarse pointers or below 1024px. Import the package stylesheet; no host subtree class is required. Fine-pointer desktop keeps its declared density. State controls and prose links retain their sizing; exceptional compact actions can use `data-touch-exempt` with a call-site reason.
31
+
30
32
  **The Tooltip lives here, and only here.** `@ai-matrx/tap-target` used to ship its own copy; since design-system 0.7.0 / tap-target 0.2.0 it consumes this one and re-exports nothing.
31
33
 
32
34
  Where hosts had forked a primitive over DENSITY, density is a prop, not a fork: `Card size="sm|md|lg"`, `Table size="sm|md"`, `Accordion size="sm|md"`, `Switch`/`Avatar`/`Checkbox`/`Slider`/`RadioGroup`/`Toggle` `size`, `ResizableHandle size="xs".."4xl"`. It is declared once on the root and every item reads it from context, so a card cannot mix paddings and a radio group cannot mix control sizes.
package/dist/index.cjs CHANGED
@@ -157,6 +157,8 @@ __export(src_exports, {
157
157
  MOTION_PULSE: () => MOTION_PULSE,
158
158
  MOTION_SHEET: () => MOTION_SHEET,
159
159
  MOTION_SPIN: () => MOTION_SPIN,
160
+ OrganizationAbbreviation: () => OrganizationAbbreviation,
161
+ OrganizationPicker: () => OrganizationPicker,
160
162
  OverflowToolbar: () => OverflowToolbar,
161
163
  POPPER_OFFSET: () => POPPER_OFFSET,
162
164
  Popover: () => Popover,
@@ -437,6 +439,9 @@ function DragHandleDots2Icon(props) {
437
439
  }
438
440
  ) });
439
441
  }
442
+ function StarIcon(props) {
443
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { ...lucideProps(props), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z" }) });
444
+ }
440
445
 
441
446
  // src/accordion.tsx
442
447
  var import_jsx_runtime2 = require("react/jsx-runtime");
@@ -810,6 +815,7 @@ function BottomSheetFooter({
810
815
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
811
816
  "div",
812
817
  {
818
+ "data-slot": "bottom-sheet-footer",
813
819
  className: cn(
814
820
  "flex-shrink-0 px-4 py-3 pb-safe border-t border-[var(--matrx-sheet-divider)]",
815
821
  className
@@ -3438,6 +3444,7 @@ var SheetFooter = ({
3438
3444
  }) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3439
3445
  "div",
3440
3446
  {
3447
+ "data-slot": "sheet-footer",
3441
3448
  className: cn(
3442
3449
  "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
3443
3450
  className
@@ -3512,9 +3519,145 @@ var Switch = React27.forwardRef(({ className, size = "md", ...props }, ref) => /
3512
3519
  ));
3513
3520
  Switch.displayName = SwitchPrimitives.Root.displayName;
3514
3521
 
3522
+ // src/organization-picker.tsx
3523
+ var import_jsx_runtime36 = require("react/jsx-runtime");
3524
+ function OrganizationAbbreviation({
3525
+ abbreviation,
3526
+ name,
3527
+ className
3528
+ }) {
3529
+ const mark = abbreviation && abbreviation.trim() || name.trim().slice(0, 1) || "?";
3530
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3531
+ "span",
3532
+ {
3533
+ className: cn(
3534
+ "inline-flex shrink-0 items-center justify-center font-bold uppercase tracking-wide",
3535
+ className
3536
+ ),
3537
+ "aria-label": `Organization abbreviation ${mark}`,
3538
+ title: mark,
3539
+ children: mark
3540
+ }
3541
+ );
3542
+ }
3543
+ function OrganizationPicker({
3544
+ organizations,
3545
+ activeOrganizationId,
3546
+ defaultOrganizationId = null,
3547
+ loading = false,
3548
+ loadFailed = false,
3549
+ onSelect,
3550
+ onSetDefault,
3551
+ hideHeading = false,
3552
+ itemClassName,
3553
+ className
3554
+ }) {
3555
+ const active = organizations.find((o) => o.id === activeOrganizationId) ?? null;
3556
+ const isDefault = (id) => !!defaultOrganizationId && id === defaultOrganizationId;
3557
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: cn("flex flex-col", className), "data-slot": "organization-picker", children: [
3558
+ !hideHeading && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "px-2 py-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground", children: "Organization" }),
3559
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "space-y-1 px-1 py-1", "aria-busy": "true", "aria-label": "Loading organizations", children: [
3560
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Skeleton, { className: "h-7 rounded-md" }),
3561
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Skeleton, { className: "h-7 rounded-md" })
3562
+ ] }) : loadFailed ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "px-2 py-2 text-xs text-destructive", role: "alert", children: "Could not load organizations." }) : organizations.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "px-2 py-2 text-xs text-muted-foreground", children: "Your account is not a member of any organization. Ask an administrator to add you to one." }) : /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
3563
+ active ? /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("p", { className: "px-2 pb-1 text-[11px] text-muted-foreground", "data-slot": "organization-picker-status", children: [
3564
+ "Working in",
3565
+ " ",
3566
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "font-medium text-foreground", children: active.name })
3567
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "px-2 pb-1 text-[11px] text-destructive", "data-slot": "organization-picker-status", children: "No organization selected \u2014 pick one below." }),
3568
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("ul", { className: "max-h-72 overflow-y-auto", role: "listbox", "aria-label": "Organizations", children: organizations.map((org) => {
3569
+ const isActive = org.id === activeOrganizationId;
3570
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("li", { role: "none", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
3571
+ "button",
3572
+ {
3573
+ type: "button",
3574
+ role: "option",
3575
+ "aria-selected": isActive,
3576
+ "aria-pressed": isActive,
3577
+ onClick: (event) => {
3578
+ event.stopPropagation();
3579
+ onSelect(org);
3580
+ },
3581
+ className: cn(
3582
+ "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-foreground transition-colors hover:bg-accent",
3583
+ isActive && "bg-primary/10 font-medium text-primary",
3584
+ itemClassName
3585
+ ),
3586
+ children: [
3587
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3588
+ OrganizationAbbreviation,
3589
+ {
3590
+ abbreviation: org.abbreviation,
3591
+ name: org.name,
3592
+ className: cn(
3593
+ "h-5 min-w-8 rounded border border-border bg-muted px-1 text-[9px]",
3594
+ isActive ? "text-primary" : "text-muted-foreground"
3595
+ )
3596
+ }
3597
+ ),
3598
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "min-w-0 flex-1 truncate", children: org.name }),
3599
+ org.isPersonal && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground", children: "Personal" }),
3600
+ isDefault(org.id) && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3601
+ StarIcon,
3602
+ {
3603
+ className: "h-[13px] w-[13px] shrink-0 fill-warning text-warning",
3604
+ "aria-hidden": false,
3605
+ "aria-label": "Default organization",
3606
+ role: "img"
3607
+ }
3608
+ ),
3609
+ isActive && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(LucideCheckIcon, { className: "h-[15px] w-[15px] shrink-0 text-primary" })
3610
+ ]
3611
+ }
3612
+ ) }, org.id);
3613
+ }) }),
3614
+ onSetDefault && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
3615
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "my-1 border-t border-border" }),
3616
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3617
+ DefaultOrganizationSwitch,
3618
+ {
3619
+ active,
3620
+ checked: !!active && isDefault(active.id),
3621
+ onChange: (on) => onSetDefault(on && active ? active.id : null)
3622
+ }
3623
+ )
3624
+ ] })
3625
+ ] })
3626
+ ] });
3627
+ }
3628
+ function DefaultOrganizationSwitch({
3629
+ active,
3630
+ checked,
3631
+ onChange
3632
+ }) {
3633
+ const disabled = !active;
3634
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
3635
+ "div",
3636
+ {
3637
+ className: "flex items-center justify-between gap-3 rounded-md px-2 py-1.5",
3638
+ "data-slot": "organization-picker-default",
3639
+ children: [
3640
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "min-w-0", children: [
3641
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "text-xs font-medium text-foreground", children: "Set as my default" }),
3642
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "truncate text-[11px] text-muted-foreground", children: disabled ? "Select an organization first" : checked ? `Next startup opens ${active.name}` : "Auto-select this at startup" })
3643
+ ] }),
3644
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3645
+ Switch,
3646
+ {
3647
+ checked,
3648
+ disabled,
3649
+ onCheckedChange: onChange,
3650
+ "aria-label": "Set this organization as my default"
3651
+ }
3652
+ )
3653
+ ]
3654
+ }
3655
+ );
3656
+ }
3657
+
3515
3658
  // src/tabbed-bottom-sheet.tsx
3516
3659
  var import_react4 = require("react");
3517
- var import_jsx_runtime36 = require("react/jsx-runtime");
3660
+ var import_jsx_runtime37 = require("react/jsx-runtime");
3518
3661
  function TabbedBottomSheet({
3519
3662
  open,
3520
3663
  onOpenChange,
@@ -3528,15 +3671,15 @@ function TabbedBottomSheet({
3528
3671
  if (open) setSelectedTabId(null);
3529
3672
  }
3530
3673
  const selectedTab = selectedTabId ? tabs.find((tab) => tab.id === selectedTabId) : null;
3531
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3674
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3532
3675
  BottomSheet,
3533
3676
  {
3534
3677
  open,
3535
3678
  onOpenChange,
3536
3679
  title,
3537
3680
  size: "full",
3538
- children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "matrx-mobile-sheet flex min-h-0 flex-1 flex-col", children: [
3539
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3681
+ children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "matrx-mobile-sheet flex min-h-0 flex-1 flex-col", children: [
3682
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3540
3683
  BottomSheetHeader,
3541
3684
  {
3542
3685
  title: selectedTab ? selectedTab.label : title,
@@ -3544,19 +3687,19 @@ function TabbedBottomSheet({
3544
3687
  onBack: () => setSelectedTabId(null)
3545
3688
  }
3546
3689
  ),
3547
- selectedTab ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden pb-safe", children: selectedTab.content }) : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(BottomSheetBody, { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("ul", { className: "divide-y divide-border", children: tabs.map((tab) => {
3690
+ selectedTab ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden pb-safe", children: selectedTab.content }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(BottomSheetBody, { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("ul", { className: "divide-y divide-border", children: tabs.map((tab) => {
3548
3691
  const Icon2 = tab.icon;
3549
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
3692
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
3550
3693
  "button",
3551
3694
  {
3552
3695
  type: "button",
3553
3696
  onClick: () => setSelectedTabId(tab.id),
3554
3697
  className: "flex w-full items-center gap-3 px-4 py-3.5 text-left transition-colors hover:bg-muted/60 active:bg-muted",
3555
3698
  children: [
3556
- Icon2 ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Icon2, { className: "h-5 w-5 shrink-0 text-muted-foreground" }) : null,
3557
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "min-w-0 flex-1 text-base text-foreground", children: tab.label }),
3699
+ Icon2 ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Icon2, { className: "h-5 w-5 shrink-0 text-muted-foreground" }) : null,
3700
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "min-w-0 flex-1 text-base text-foreground", children: tab.label }),
3558
3701
  tab.trailing,
3559
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(ChevronRightIcon, { className: "h-5 w-5 shrink-0 text-muted-foreground" })
3702
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(ChevronRightIcon, { className: "h-5 w-5 shrink-0 text-muted-foreground" })
3560
3703
  ]
3561
3704
  }
3562
3705
  ) }, tab.id);
@@ -3568,7 +3711,7 @@ function TabbedBottomSheet({
3568
3711
 
3569
3712
  // src/table.tsx
3570
3713
  var React28 = __toESM(require("react"), 1);
3571
- var import_jsx_runtime37 = require("react/jsx-runtime");
3714
+ var import_jsx_runtime38 = require("react/jsx-runtime");
3572
3715
  var TABLE_SIZES = {
3573
3716
  sm: { head: "px-2", cell: "p-2" },
3574
3717
  md: { head: "px-3", cell: "p-3" }
@@ -3579,7 +3722,7 @@ function useTableSize() {
3579
3722
  }
3580
3723
  var Table = React28.forwardRef(
3581
3724
  ({ className, size = "md", wrap = true, wrapperClassName, ...props }, ref) => {
3582
- const table = /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3725
+ const table = /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3583
3726
  "table",
3584
3727
  {
3585
3728
  ref,
@@ -3589,7 +3732,7 @@ var Table = React28.forwardRef(
3589
3732
  ...props
3590
3733
  }
3591
3734
  );
3592
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TableSizeContext.Provider, { value: size, children: wrap ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3735
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TableSizeContext.Provider, { value: size, children: wrap ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3593
3736
  "div",
3594
3737
  {
3595
3738
  "data-slot": "table-wrapper",
@@ -3600,7 +3743,7 @@ var Table = React28.forwardRef(
3600
3743
  }
3601
3744
  );
3602
3745
  Table.displayName = "Table";
3603
- var TableHeader = React28.forwardRef(({ className, sticky = false, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3746
+ var TableHeader = React28.forwardRef(({ className, sticky = false, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3604
3747
  "thead",
3605
3748
  {
3606
3749
  ref,
@@ -3614,7 +3757,7 @@ var TableHeader = React28.forwardRef(({ className, sticky = false, ...props }, r
3614
3757
  }
3615
3758
  ));
3616
3759
  TableHeader.displayName = "TableHeader";
3617
- var TableBody = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3760
+ var TableBody = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3618
3761
  "tbody",
3619
3762
  {
3620
3763
  ref,
@@ -3624,7 +3767,7 @@ var TableBody = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE_
3624
3767
  }
3625
3768
  ));
3626
3769
  TableBody.displayName = "TableBody";
3627
- var TableFooter = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3770
+ var TableFooter = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3628
3771
  "tfoot",
3629
3772
  {
3630
3773
  ref,
@@ -3637,7 +3780,7 @@ var TableFooter = React28.forwardRef(({ className, ...props }, ref) => /* @__PUR
3637
3780
  }
3638
3781
  ));
3639
3782
  TableFooter.displayName = "TableFooter";
3640
- var TableRow = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3783
+ var TableRow = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3641
3784
  "tr",
3642
3785
  {
3643
3786
  ref,
@@ -3652,7 +3795,7 @@ var TableRow = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__
3652
3795
  TableRow.displayName = "TableRow";
3653
3796
  var TableHead = React28.forwardRef(({ className, ...props }, ref) => {
3654
3797
  const size = useTableSize();
3655
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3798
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3656
3799
  "th",
3657
3800
  {
3658
3801
  ref,
@@ -3669,7 +3812,7 @@ var TableHead = React28.forwardRef(({ className, ...props }, ref) => {
3669
3812
  TableHead.displayName = "TableHead";
3670
3813
  var TableCell = React28.forwardRef(({ className, ...props }, ref) => {
3671
3814
  const size = useTableSize();
3672
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3815
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3673
3816
  "td",
3674
3817
  {
3675
3818
  ref,
@@ -3684,7 +3827,7 @@ var TableCell = React28.forwardRef(({ className, ...props }, ref) => {
3684
3827
  );
3685
3828
  });
3686
3829
  TableCell.displayName = "TableCell";
3687
- var TableCaption = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3830
+ var TableCaption = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3688
3831
  "caption",
3689
3832
  {
3690
3833
  ref,
@@ -3698,10 +3841,10 @@ TableCaption.displayName = "TableCaption";
3698
3841
  // src/tabs.tsx
3699
3842
  var TabsPrimitive = __toESM(require("@radix-ui/react-tabs"), 1);
3700
3843
  var React29 = __toESM(require("react"), 1);
3701
- var import_jsx_runtime38 = require("react/jsx-runtime");
3844
+ var import_jsx_runtime39 = require("react/jsx-runtime");
3702
3845
  var Tabs = TabsPrimitive.Root;
3703
3846
  var TABS_TRIGGER_BASE = "inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm";
3704
- var TabsList = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3847
+ var TabsList = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
3705
3848
  TabsPrimitive.List,
3706
3849
  {
3707
3850
  ref,
@@ -3714,7 +3857,7 @@ var TabsList = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__
3714
3857
  }
3715
3858
  ));
3716
3859
  TabsList.displayName = TabsPrimitive.List.displayName;
3717
- var TabsTrigger = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3860
+ var TabsTrigger = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
3718
3861
  TabsPrimitive.Trigger,
3719
3862
  {
3720
3863
  ref,
@@ -3728,7 +3871,7 @@ var TabsTrigger = React29.forwardRef(({ className, ...props }, ref) => /* @__PUR
3728
3871
  }
3729
3872
  ));
3730
3873
  TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
3731
- var TabsTriggerCore = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3874
+ var TabsTriggerCore = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
3732
3875
  TabsPrimitive.Trigger,
3733
3876
  {
3734
3877
  ref,
@@ -3738,7 +3881,7 @@ var TabsTriggerCore = React29.forwardRef(({ className, ...props }, ref) => /* @_
3738
3881
  }
3739
3882
  ));
3740
3883
  TabsTriggerCore.displayName = TabsPrimitive.Trigger.displayName;
3741
- var TabsContent = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3884
+ var TabsContent = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
3742
3885
  TabsPrimitive.Content,
3743
3886
  {
3744
3887
  ref,
@@ -3755,7 +3898,7 @@ TabsContent.displayName = TabsPrimitive.Content.displayName;
3755
3898
 
3756
3899
  // src/textarea.tsx
3757
3900
  var React30 = __toESM(require("react"), 1);
3758
- var import_jsx_runtime39 = require("react/jsx-runtime");
3901
+ var import_jsx_runtime40 = require("react/jsx-runtime");
3759
3902
  var FILL_HEIGHT_REGEX = /(?:^|\s)(h-full|h-dvh|flex-1|grow)(?:\s|$)/;
3760
3903
  var FILL_WIDTH_REGEX = /(?:^|\s)(w-full|w-screen)(?:\s|$)/;
3761
3904
  function getStretchClasses(className) {
@@ -3808,7 +3951,7 @@ var Textarea = React30.forwardRef(
3808
3951
  const stretchClasses = getStretchClasses(className);
3809
3952
  const needsWrapper = Boolean(wrapperClassName || stretchClasses);
3810
3953
  useAutoGrow(ref, props.value, autoGrow, minHeight, maxHeight);
3811
- const textarea = /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
3954
+ const textarea = /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
3812
3955
  "textarea",
3813
3956
  {
3814
3957
  ref: callback,
@@ -3824,7 +3967,7 @@ var Textarea = React30.forwardRef(
3824
3967
  }
3825
3968
  );
3826
3969
  if (!needsWrapper) return textarea;
3827
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: cn(stretchClasses, wrapperClassName), children: textarea });
3970
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: cn(stretchClasses, wrapperClassName), children: textarea });
3828
3971
  }
3829
3972
  );
3830
3973
  Textarea.displayName = "Textarea";
@@ -3832,7 +3975,7 @@ var BasicTextarea = React30.forwardRef(
3832
3975
  ({ className, autoGrow, minHeight, maxHeight, ...props }, forwarded) => {
3833
3976
  const { ref, callback } = useMergedTextareaRef(forwarded);
3834
3977
  useAutoGrow(ref, props.value, autoGrow, minHeight, maxHeight);
3835
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
3978
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
3836
3979
  "textarea",
3837
3980
  {
3838
3981
  ref: callback,
@@ -3862,13 +4005,13 @@ var TextareaWithPrefix = React30.forwardRef(
3862
4005
  }, forwarded) => {
3863
4006
  const { ref, callback } = useMergedTextareaRef(forwarded);
3864
4007
  useAutoGrow(ref, props.value, autoGrow, minHeight, maxHeight);
3865
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(
4008
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
3866
4009
  "div",
3867
4010
  {
3868
4011
  className: cn("relative", getStretchClasses(className), wrapperClassName),
3869
4012
  children: [
3870
- prefix ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "pointer-events-none absolute left-3 top-3 z-10 text-muted-foreground", children: prefix }) : null,
3871
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
4013
+ prefix ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "pointer-events-none absolute left-3 top-3 z-10 text-muted-foreground", children: prefix }) : null,
4014
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
3872
4015
  "textarea",
3873
4016
  {
3874
4017
  ref: callback,
@@ -3948,13 +4091,13 @@ function useScrollFade() {
3948
4091
  // src/hover-card.tsx
3949
4092
  var HoverCardPrimitive = __toESM(require("@radix-ui/react-hover-card"), 1);
3950
4093
  var React31 = __toESM(require("react"), 1);
3951
- var import_jsx_runtime40 = require("react/jsx-runtime");
4094
+ var import_jsx_runtime41 = require("react/jsx-runtime");
3952
4095
  var HoverCard = HoverCardPrimitive.Root;
3953
4096
  var HoverCardTrigger = HoverCardPrimitive.Trigger;
3954
4097
  var HoverCardContent = React31.forwardRef(
3955
4098
  ({ className, align = "center", sideOffset = 4, container, animated = true, ...props }, ref) => {
3956
4099
  const resolved = usePortalContainer(container);
3957
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(HoverCardPrimitive.Portal, { container: resolved ?? null, children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
4100
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(HoverCardPrimitive.Portal, { container: resolved ?? null, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
3958
4101
  HoverCardPrimitive.Content,
3959
4102
  {
3960
4103
  ref,
@@ -3976,7 +4119,7 @@ HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
3976
4119
  // src/radio-group.tsx
3977
4120
  var RadioGroupPrimitive = __toESM(require("@radix-ui/react-radio-group"), 1);
3978
4121
  var React32 = __toESM(require("react"), 1);
3979
- var import_jsx_runtime41 = require("react/jsx-runtime");
4122
+ var import_jsx_runtime42 = require("react/jsx-runtime");
3980
4123
  var RadioGroupSizeContext = React32.createContext("md");
3981
4124
  var CONTROL_CLASSES = {
3982
4125
  sm: "h-3.5 w-3.5",
@@ -3988,7 +4131,7 @@ var DOT_CLASSES = {
3988
4131
  md: "h-1.5 w-1.5",
3989
4132
  lg: "h-2 w-2"
3990
4133
  };
3991
- var RadioGroup3 = React32.forwardRef(({ className, size = "md", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(RadioGroupSizeContext.Provider, { value: size, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
4134
+ var RadioGroup3 = React32.forwardRef(({ className, size = "md", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(RadioGroupSizeContext.Provider, { value: size, children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3992
4135
  RadioGroupPrimitive.Root,
3993
4136
  {
3994
4137
  ref,
@@ -4001,7 +4144,7 @@ RadioGroup3.displayName = RadioGroupPrimitive.Root.displayName;
4001
4144
  var RadioGroupItem = React32.forwardRef(({ className, size, ...props }, ref) => {
4002
4145
  const groupSize = React32.useContext(RadioGroupSizeContext);
4003
4146
  const resolved = size ?? groupSize;
4004
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
4147
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4005
4148
  RadioGroupPrimitive.Item,
4006
4149
  {
4007
4150
  ref,
@@ -4018,7 +4161,7 @@ var RadioGroupItem = React32.forwardRef(({ className, size, ...props }, ref) =>
4018
4161
  className
4019
4162
  ),
4020
4163
  ...props,
4021
- children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
4164
+ children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4022
4165
  "div",
4023
4166
  {
4024
4167
  className: cn("rounded-full bg-primary-foreground", DOT_CLASSES[resolved])
@@ -4031,7 +4174,7 @@ RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
4031
4174
 
4032
4175
  // src/resizable.tsx
4033
4176
  var import_react_resizable_panels = require("react-resizable-panels");
4034
- var import_jsx_runtime42 = require("react/jsx-runtime");
4177
+ var import_jsx_runtime43 = require("react/jsx-runtime");
4035
4178
  var HANDLE_SIZES = {
4036
4179
  xs: "w-0.5 [&[aria-orientation=horizontal]]:h-0.5 [&[aria-orientation=horizontal]]:w-full",
4037
4180
  sm: "w-1 [&[aria-orientation=horizontal]]:h-1 [&[aria-orientation=horizontal]]:w-full",
@@ -4045,7 +4188,7 @@ var HANDLE_SIZES = {
4045
4188
  var ResizablePanelGroup = ({
4046
4189
  className,
4047
4190
  ...props
4048
- }) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4191
+ }) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
4049
4192
  import_react_resizable_panels.Group,
4050
4193
  {
4051
4194
  "data-slot": "resizable-group",
@@ -4060,7 +4203,7 @@ var ResizableHandle = ({
4060
4203
  size = "xs",
4061
4204
  className,
4062
4205
  ...props
4063
- }) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4206
+ }) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
4064
4207
  import_react_resizable_panels.Separator,
4065
4208
  {
4066
4209
  "data-slot": "resizable-handle",
@@ -4080,7 +4223,7 @@ var ResizableHandle = ({
4080
4223
  className
4081
4224
  ),
4082
4225
  ...props,
4083
- children: withHandle ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "z-10 flex h-8 w-4 items-center justify-center rounded-sm border bg-border group-aria-[orientation=horizontal]/handle:h-4 group-aria-[orientation=horizontal]/handle:w-8", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(DragHandleDots2Icon, { className: "h-2.5 w-2.5 group-aria-[orientation=horizontal]/handle:rotate-90" }) }) : null
4226
+ children: withHandle ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: "z-10 flex h-8 w-4 items-center justify-center rounded-sm border bg-border group-aria-[orientation=horizontal]/handle:h-4 group-aria-[orientation=horizontal]/handle:w-8", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(DragHandleDots2Icon, { className: "h-2.5 w-2.5 group-aria-[orientation=horizontal]/handle:rotate-90" }) }) : null
4084
4227
  }
4085
4228
  );
4086
4229
  ResizableHandle.displayName = "ResizableHandle";
@@ -4088,7 +4231,7 @@ ResizableHandle.displayName = "ResizableHandle";
4088
4231
  // src/slider.tsx
4089
4232
  var SliderPrimitive = __toESM(require("@radix-ui/react-slider"), 1);
4090
4233
  var React33 = __toESM(require("react"), 1);
4091
- var import_jsx_runtime43 = require("react/jsx-runtime");
4234
+ var import_jsx_runtime44 = require("react/jsx-runtime");
4092
4235
  var TRACK_CLASSES = {
4093
4236
  sm: "h-1",
4094
4237
  md: "h-1.5",
@@ -4104,7 +4247,7 @@ var Slider = React33.forwardRef(({ className, size = "md", ...props }, ref) => {
4104
4247
  1,
4105
4248
  (props.value ?? props.defaultValue ?? [0]).length
4106
4249
  );
4107
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
4250
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
4108
4251
  SliderPrimitive.Root,
4109
4252
  {
4110
4253
  ref,
@@ -4116,7 +4259,7 @@ var Slider = React33.forwardRef(({ className, size = "md", ...props }, ref) => {
4116
4259
  ),
4117
4260
  ...props,
4118
4261
  children: [
4119
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
4262
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4120
4263
  SliderPrimitive.Track,
4121
4264
  {
4122
4265
  "data-slot": "slider-track",
@@ -4125,7 +4268,7 @@ var Slider = React33.forwardRef(({ className, size = "md", ...props }, ref) => {
4125
4268
  TRACK_CLASSES[size],
4126
4269
  "data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5"
4127
4270
  ),
4128
- children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
4271
+ children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4129
4272
  SliderPrimitive.Range,
4130
4273
  {
4131
4274
  "data-slot": "slider-range",
@@ -4134,7 +4277,7 @@ var Slider = React33.forwardRef(({ className, size = "md", ...props }, ref) => {
4134
4277
  )
4135
4278
  }
4136
4279
  ),
4137
- Array.from({ length: thumbCount }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
4280
+ Array.from({ length: thumbCount }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4138
4281
  SliderPrimitive.Thumb,
4139
4282
  {
4140
4283
  "data-slot": "slider-thumb",
@@ -4162,7 +4305,7 @@ var ToggleGroupPrimitive = __toESM(require("@radix-ui/react-toggle-group"), 1);
4162
4305
  var TogglePrimitive = __toESM(require("@radix-ui/react-toggle"), 1);
4163
4306
  var import_class_variance_authority6 = require("class-variance-authority");
4164
4307
  var React34 = __toESM(require("react"), 1);
4165
- var import_jsx_runtime44 = require("react/jsx-runtime");
4308
+ var import_jsx_runtime45 = require("react/jsx-runtime");
4166
4309
  var toggleVariants = (0, import_class_variance_authority6.cva)(
4167
4310
  "inline-flex cursor-pointer items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
4168
4311
  {
@@ -4183,7 +4326,7 @@ var toggleVariants = (0, import_class_variance_authority6.cva)(
4183
4326
  }
4184
4327
  }
4185
4328
  );
4186
- var Toggle = React34.forwardRef(({ className, variant, size, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4329
+ var Toggle = React34.forwardRef(({ className, variant, size, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
4187
4330
  TogglePrimitive.Root,
4188
4331
  {
4189
4332
  ref,
@@ -4194,20 +4337,20 @@ var Toggle = React34.forwardRef(({ className, variant, size, ...props }, ref) =>
4194
4337
  ));
4195
4338
  Toggle.displayName = TogglePrimitive.Root.displayName;
4196
4339
  var ToggleGroupContext = React34.createContext({ size: "default", variant: "default" });
4197
- var ToggleGroup = React34.forwardRef(({ className, variant, size, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4340
+ var ToggleGroup = React34.forwardRef(({ className, variant, size, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
4198
4341
  ToggleGroupPrimitive.Root,
4199
4342
  {
4200
4343
  ref,
4201
4344
  "data-slot": "toggle-group",
4202
4345
  className: cn("flex items-center justify-center gap-1", className),
4203
4346
  ...props,
4204
- children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(ToggleGroupContext.Provider, { value: { variant, size }, children })
4347
+ children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(ToggleGroupContext.Provider, { value: { variant, size }, children })
4205
4348
  }
4206
4349
  ));
4207
4350
  ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
4208
4351
  var ToggleGroupItem = React34.forwardRef(({ className, children, variant, size, ...props }, ref) => {
4209
4352
  const context = React34.useContext(ToggleGroupContext);
4210
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4353
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
4211
4354
  ToggleGroupPrimitive.Item,
4212
4355
  {
4213
4356
  ref,
@@ -4229,13 +4372,13 @@ ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
4229
4372
  // src/tooltip.tsx
4230
4373
  var TooltipPrimitive = __toESM(require("@radix-ui/react-tooltip"), 1);
4231
4374
  var React35 = __toESM(require("react"), 1);
4232
- var import_jsx_runtime45 = require("react/jsx-runtime");
4375
+ var import_jsx_runtime46 = require("react/jsx-runtime");
4233
4376
  var TooltipProvider = TooltipPrimitive.Provider;
4234
4377
  var Tooltip = TooltipPrimitive.Root;
4235
4378
  var TooltipTrigger = TooltipPrimitive.Trigger;
4236
4379
  var TooltipContent = React35.forwardRef(({ className, sideOffset = 4, container, animated = true, ...props }, ref) => {
4237
4380
  const resolved = usePortalContainer(container);
4238
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(TooltipPrimitive.Portal, { container: resolved ?? null, children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
4381
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(TooltipPrimitive.Portal, { container: resolved ?? null, children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
4239
4382
  TooltipPrimitive.Content,
4240
4383
  {
4241
4384
  ref,