@assure-one/design-system 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -149,13 +149,14 @@ declare const BreadcrumbSeparator: React$1.ForwardRefExoticComponent<BreadcrumbS
149
149
  * - outline → bordered surface (matches `.btn-ghost` from spec)
150
150
  * - link → text-accent (cyan) with underline-on-hover
151
151
  * - accent → bg-accent (cyan CTA per spec §6.2)
152
+ * - dashed → full-bleed "+ Add another" CTA, transparent fill + dashed border
152
153
  *
153
154
  * Sizes match shadcn convention; default `md` matches spec's 8px/14px padding.
154
155
  * Use `asChild` to render as a different element (e.g. an anchor / next/link).
155
156
  */
156
157
  declare const buttonVariants: (props?: ({
157
- variant?: "link" | "success" | "destructive" | "secondary" | "outline" | "primary" | "ghost" | "accent" | null | undefined;
158
- size?: "sm" | "md" | "lg" | "icon" | null | undefined;
158
+ variant?: "link" | "success" | "destructive" | "secondary" | "outline" | "primary" | "ghost" | "accent" | "dashed" | null | undefined;
159
+ size?: "sm" | "md" | "lg" | "icon" | "icon-xs" | "icon-sm" | null | undefined;
159
160
  } & class_variance_authority_types.ClassProp) | undefined) => string;
160
161
  interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
161
162
  /** Render as the child element via Radix `Slot` (shadcn pattern). */
@@ -464,6 +465,34 @@ interface FormSuccessProps extends React.HTMLAttributes<HTMLParagraphElement> {
464
465
  */
465
466
  declare function FormSuccess({ children, className, ...props }: FormSuccessProps): react_jsx_runtime.JSX.Element;
466
467
 
468
+ /**
469
+ * FormSection — a single grouped block inside a settings/profile form.
470
+ *
471
+ * Renders a real `<fieldset>` + `<legend>` so assistive tech announces the
472
+ * group, and gives consumers a consistent place to hang a title, helper
473
+ * description, and (optionally) an action button on the trailing edge of
474
+ * the heading row.
475
+ *
476
+ * Use inside a parent `<form>` — repeat one `<FormSection>` per logical
477
+ * group (Contact, Address, Notifications, etc.). Slot whatever fields you
478
+ * want into `children`; FormSection does not impose a grid.
479
+ *
480
+ * For marketing-style centered section heads, prefer `<SectionHeader>`.
481
+ * For lower-level title+description blocks that aren't part of a form,
482
+ * use `<SectionHead>` from `./section`.
483
+ */
484
+ interface FormSectionProps extends Omit<React.FieldsetHTMLAttributes<HTMLFieldSetElement>, "title"> {
485
+ /** The section heading (renders as `<legend>` text). */
486
+ title: React.ReactNode;
487
+ /** Optional helper text shown directly under the title. */
488
+ description?: React.ReactNode;
489
+ /** Optional trailing slot for an action button or status. */
490
+ action?: React.ReactNode;
491
+ /** Space between the heading block and the fields. Default `mt-4`. */
492
+ headSpacing?: string;
493
+ }
494
+ declare const FormSection: React$1.ForwardRefExoticComponent<FormSectionProps & React$1.RefAttributes<HTMLFieldSetElement>>;
495
+
467
496
  declare const HoverCard: React$1.FC<HoverCardPrimitive.HoverCardProps>;
468
497
  declare const HoverCardTrigger: React$1.ForwardRefExoticComponent<HoverCardPrimitive.HoverCardTriggerProps & React$1.RefAttributes<HTMLAnchorElement>>;
469
498
  declare const HoverCardPortal: React$1.FC<HoverCardPrimitive.HoverCardPortalProps>;
@@ -642,7 +671,7 @@ interface LabelProps extends React$1.ComponentPropsWithoutRef<typeof LabelPrimit
642
671
  }
643
672
  declare const Label: React$1.ForwardRefExoticComponent<LabelProps & React$1.RefAttributes<HTMLLabelElement>>;
644
673
 
645
- type ButtonVariant = "primary" | "secondary" | "destructive" | "success" | "ghost" | "outline" | "link" | "accent";
674
+ type ButtonVariant = "primary" | "secondary" | "destructive" | "success" | "ghost" | "outline" | "link" | "accent" | "dashed";
646
675
  type ButtonSize = "sm" | "md" | "lg";
647
676
  interface LinkButtonProps$1 extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href"> {
648
677
  href: string;
@@ -652,13 +681,56 @@ interface LinkButtonProps$1 extends Omit<React.AnchorHTMLAttributes<HTMLAnchorEl
652
681
  iconRight?: React.ReactNode;
653
682
  children: React.ReactNode;
654
683
  className?: string;
684
+ /**
685
+ * Render a native `<a>` instead of `next/link`. Use for:
686
+ * - cross-origin URLs (e.g. https://other-app.example/sign-in)
687
+ * - same-origin `/api/*` route handlers that 302-redirect off-app
688
+ * (next/link tries to client-route, which doesn't follow the 302)
689
+ * - mailto: / tel: schemes
690
+ *
691
+ * When `target="_blank"` is also set and no explicit `rel` was passed,
692
+ * `rel="noopener noreferrer"` is applied automatically.
693
+ */
694
+ external?: boolean;
655
695
  }
656
696
  /**
657
- * LinkButton — visually identical to `<Button>` but renders a `next/link`.
697
+ * LinkButton — visually identical to `<Button>` but renders a link.
658
698
  * Shares `buttonVariants` so styling stays in lock-step.
699
+ *
700
+ * - Default: renders `next/link` (client-routed internal navigation).
701
+ * - `external`: renders a native `<a>` so the browser handles the request
702
+ * end-to-end. Required for cross-origin URLs and same-origin `/api/*`
703
+ * handlers that 302 off-app.
659
704
  */
660
705
  declare const LinkButton: React$1.ForwardRefExoticComponent<LinkButtonProps$1 & React$1.RefAttributes<HTMLAnchorElement>>;
661
706
 
707
+ /**
708
+ * LoadingRows — N repeating skeleton bars stacked vertically.
709
+ *
710
+ * Replaces the recurring `Array.from({length:N}).map((_, i) => <Skeleton/>)`
711
+ * snippet that surfaces in inboxes, document lists, settings tables, and
712
+ * any other list-shaped loading state. The primitive owns the `aria-busy`
713
+ * + `aria-label` semantics so each consumer doesn't reinvent them.
714
+ *
715
+ * For richer per-row composition (avatar + two text lines, table cells,
716
+ * card grids) keep using `<Skeleton>` / `<SkeletonCircle>` / `<SkeletonText>`
717
+ * directly inside your own list renderer. `LoadingRows` is the *uniform*
718
+ * row case.
719
+ */
720
+ interface LoadingRowsProps extends React.HTMLAttributes<HTMLDivElement> {
721
+ /** How many skeleton rows to render. */
722
+ count?: number;
723
+ /** Height of each row. Accepts any Tailwind height utility (`h-14`, `h-3.5`). Default `h-14`. */
724
+ rowHeight?: string;
725
+ /** Vertical gap between rows. Default `gap-2`. */
726
+ gap?: string;
727
+ /** Override the row Skeleton className (radius, width, etc). */
728
+ rowClassName?: string;
729
+ /** Accessible label announced to screen readers. */
730
+ label?: string;
731
+ }
732
+ declare const LoadingRows: React$1.ForwardRefExoticComponent<LoadingRowsProps & React$1.RefAttributes<HTMLDivElement>>;
733
+
662
734
  /**
663
735
  * Logo — Assure Pro wordmark. Per spec §4 and §6.2, the firm-app brand is
664
736
  * "Assure Pro": "Assure" in fg + "Pro" in pro-fg purple, set in Geist
@@ -1460,20 +1532,35 @@ type AppHeaderActionsProps = React.HTMLAttributes<HTMLDivElement>;
1460
1532
  declare const AppHeaderActions: React$1.ForwardRefExoticComponent<AppHeaderActionsProps & React$1.RefAttributes<HTMLDivElement>>;
1461
1533
 
1462
1534
  /**
1463
- * PageHeader — top-of-page title block: eyebrow → headline → meta row.
1464
- * Ports `.page-header` rules from `_shared.css` (lines 486-498).
1535
+ * PageHeader — top-of-page title block: eyebrow → headline + actions row → description → meta row.
1536
+ * Ports `.page-header` rules from `_shared.css` (lines 486-498) and
1537
+ * absorbs the trailing-edge `actions` slot pattern that 100+ consumer
1538
+ * files reinvent via `flex items-center justify-between`.
1465
1539
  *
1466
1540
  * `title` is a string per the consumer-side contract (see
1467
1541
  * `assure-pro-spec/from-lighttaxes-claude.md`, "Page header" section).
1468
1542
  * If a consumer needs richer markup in the headline they should compose
1469
1543
  * around PageHeader rather than via this prop.
1544
+ *
1545
+ * Layout rules:
1546
+ * - `eyebrow` sits above the title with a 6px gap.
1547
+ * - `actions` sits to the trailing edge of the title row. On viewports
1548
+ * below `sm`, the actions wrap underneath; consumers can override via
1549
+ * className.
1550
+ * - `description` is a fg-3 subtitle line under the title.
1551
+ * - `meta` is the existing pills/spec/separator slot, still rendered
1552
+ * below the description.
1470
1553
  */
1471
1554
  interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
1472
1555
  /** Slot above the title — usually `<Eyebrow numeric>`. */
1473
1556
  eyebrow?: React.ReactNode;
1474
1557
  /** Page title text. */
1475
1558
  title: string;
1476
- /** Slot below the title for pills, specs, separators. */
1559
+ /** Subtitle line under the title (e.g. one-sentence purpose statement). */
1560
+ description?: React.ReactNode;
1561
+ /** Trailing-edge slot for actions (Button, ButtonGroup, etc.). */
1562
+ actions?: React.ReactNode;
1563
+ /** Slot below the description for pills, specs, separators. */
1477
1564
  meta?: React.ReactNode;
1478
1565
  }
1479
1566
  declare const PageHeader: React$1.ForwardRefExoticComponent<PageHeaderProps & React$1.RefAttributes<HTMLElement>>;
@@ -1488,6 +1575,86 @@ type PageHeaderSepProps = React.HTMLAttributes<HTMLSpanElement>;
1488
1575
  /** PageHeaderSep — the `·` dot separator used between meta items. */
1489
1576
  declare const PageHeaderSep: React$1.ForwardRefExoticComponent<PageHeaderSepProps & React$1.RefAttributes<HTMLSpanElement>>;
1490
1577
 
1578
+ /**
1579
+ * MetadataGrid + DataItem — label / value pair grid.
1580
+ *
1581
+ * Used inside detail surfaces (Client > Overview, Engagement > Header,
1582
+ * Invoice > Summary) where the page needs to lay out a list of facts:
1583
+ *
1584
+ * EIN 12-3456789
1585
+ * Joined Aug 2022
1586
+ * Primary contact Liz Chen <liz@acme.test>
1587
+ * Tier Annual
1588
+ *
1589
+ * Replaces the recurring `<div className="grid grid-cols-2 gap-x-6 gap-y-3">`
1590
+ * + per-row `<div>label</div><div>value</div>` shape.
1591
+ *
1592
+ * `MetadataGrid` provides the grid; `DataItem` owns the label/value
1593
+ * typography. Both compose: a `DataItem` can take `span={2}` to occupy
1594
+ * a full row in a 2-column grid.
1595
+ */
1596
+ interface MetadataGridProps extends React.HTMLAttributes<HTMLDListElement> {
1597
+ /** Number of columns. Default 2. Use 1 for narrow surfaces (mobile cards). */
1598
+ columns?: 1 | 2 | 3 | 4;
1599
+ /** Horizontal gap between cells. Default `gap-x-6`. */
1600
+ gapX?: string;
1601
+ /** Vertical gap between rows. Default `gap-y-3`. */
1602
+ gapY?: string;
1603
+ }
1604
+ declare const MetadataGrid: React$1.ForwardRefExoticComponent<MetadataGridProps & React$1.RefAttributes<HTMLDListElement>>;
1605
+ interface DataItemProps {
1606
+ /** Label rendered as `<dt>`. Should be a noun phrase, sentence case. */
1607
+ label: React.ReactNode;
1608
+ /** Value rendered as `<dd>`. */
1609
+ value: React.ReactNode;
1610
+ /** Span this many grid columns. Useful for long string values inside a 2-col grid. */
1611
+ span?: 1 | 2 | 3 | 4;
1612
+ className?: string;
1613
+ }
1614
+ declare function DataItem({ label, value, span, className }: DataItemProps): react_jsx_runtime.JSX.Element;
1615
+
1616
+ /**
1617
+ * KpiCard — single-stat tile: label + value + optional tone + optional hint.
1618
+ *
1619
+ * Replaces the three different KPI / stat-card shapes that recur across
1620
+ * the dashboard, billing, and attention-queue surfaces:
1621
+ *
1622
+ * ┌──────────────┐
1623
+ * │ 🔵 247 │
1624
+ * │ Clients │
1625
+ * └──────────────┘
1626
+ *
1627
+ * - `value` is the big-typography figure (count, currency).
1628
+ * - `label` is the small caption.
1629
+ * - `tone` colors the icon tile / value via semantic tokens (info,
1630
+ * success, warning, destructive, accent, muted). Default `muted`.
1631
+ * - `icon` slot accepts any node; rendered inside a rounded tile.
1632
+ * - `hint` is an optional `text-xs text-fg-3` line under the value
1633
+ * ("+18 this month", "vs. last quarter").
1634
+ * - `action` is an optional trailing slot for a button or link.
1635
+ *
1636
+ * Renders as a `<Card>`. Wrap in a `<Link>` from the consumer side if
1637
+ * the tile should navigate.
1638
+ */
1639
+ type KpiTone = "info" | "success" | "warning" | "destructive" | "accent" | "muted";
1640
+ interface KpiCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
1641
+ /** Small caption above (or below, depending on layout) the value. */
1642
+ label: React.ReactNode;
1643
+ /** Main figure — count, currency, percentage. Renders as a 2xl bold. */
1644
+ value: React.ReactNode;
1645
+ /** Optional leading icon, rendered inside a colored tile. */
1646
+ icon?: React.ReactNode;
1647
+ /** Color family for the icon tile + (optional) the value. Default `muted`. */
1648
+ tone?: KpiTone;
1649
+ /** Optional subline below the value (e.g. `"+18 this month"`). */
1650
+ hint?: React.ReactNode;
1651
+ /** Optional trailing-edge slot for a button or link. */
1652
+ action?: React.ReactNode;
1653
+ /** When `true`, the value text picks up the tone color. Default `false` (value stays fg). */
1654
+ toneValue?: boolean;
1655
+ }
1656
+ declare const KpiCard: React$1.ForwardRefExoticComponent<KpiCardProps & React$1.RefAttributes<HTMLDivElement>>;
1657
+
1491
1658
  interface DataTableProps extends React.HTMLAttributes<HTMLDivElement> {
1492
1659
  /** When true, renders the table card with a flat top edge so it
1493
1660
  * visually attaches to a `<DataTableToolbar>` above it. */
@@ -1789,4 +1956,4 @@ declare const KbdHint: React$1.ForwardRefExoticComponent<KbdHintProps & React$1.
1789
1956
 
1790
1957
  declare function cn(...inputs: ClassValue[]): string;
1791
1958
 
1792
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, type ActivityDotVariant, ActivityItem, type ActivityItemProps, ActivityList, type ActivityListProps, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, type AlertProps, AlertTitle, AlertTriangleIcon, AppHeader, AppHeaderActions, type AppHeaderActionsProps, AppHeaderBreadcrumb, type AppHeaderBreadcrumbProps, type AppHeaderProps, AppHeaderSearch, type AppHeaderSearchProps, AppHeaderTitle, type AppHeaderTitleProps, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, AtSignIcon, Avatar, Badge, type BadgeProps, BarChartIcon, BellIcon, Blockquote, BoldIcon, Breadcrumb, BreadcrumbItem, type BreadcrumbItemProps, BreadcrumbLink, type BreadcrumbLinkProps, BreadcrumbList, type BreadcrumbListProps, BreadcrumbPage, type BreadcrumbPageProps, type BreadcrumbProps, BreadcrumbSeparator, type BreadcrumbSeparatorProps, BriefcaseIcon, Building2Icon, BuildingIcon, Button, type ButtonProps, Calendar, type CalendarHighlight, type CalendarHighlightColor, CalendarIcon, type CalendarProps, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, type CardVariants, ChatBubbleIcon, CheckCircle2Icon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientSelect, type ClientSelectOption, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, type ComingSoonProps, CommandIcon, type CommandItem, CommandPalette, ConfirmActionButton, type ConfirmActionButtonProps, Content, type ContentProps, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, type DangerActionProps, DataTable, DataTableBody, type DataTableBodyProps, DataTableCell, DataTableCellDue, type DataTableCellDueProps, DataTableCellId, DataTableCellMono, DataTableCellName, type DataTableCellProps, DataTableCheckbox, type DataTableCheckboxProps, DataTableHead, type DataTableHeadProps, DataTableHeader, type DataTableHeaderProps, DataTablePagination, type DataTablePaginationProps, type DataTableProps, DataTableResultsCount, type DataTableResultsCountProps, DataTableRow, type DataTableRowProps, DataTableSearch, type DataTableSearchProps, DataTableSpacer, type DataTableSpacerProps, DataTableToolbar, type DataTableToolbarProps, DatePicker, DetailGrid, type DetailGridProps, DetailMain, type DetailMainProps, DetailSpine, DetailSpineHeader, type DetailSpineHeaderProps, type DetailSpineProps, DetailSpineSection, type DetailSpineSectionProps, DetailSpineStats, type DetailSpineStatsProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DocumentIcon, DollarSignIcon, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, EyeIcon, EyeOffIcon, Eyebrow, type EyebrowProps, FileIcon, FileReturnIcon, FileTextIcon, FileUpload, FilterChip, type FilterChipProps, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FormError, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, type IconActionProps, InboxIcon, InfoIcon, Input, type InputVariants, ItalicIcon, Kanban, KanbanCard, type KanbanCardProps, KanbanColumn, type KanbanColumnProps, KanbanIcon, type KanbanProps, KbdHint, type KbdHintProps, KeyIcon, KeyboardShortcutsDialog, Label, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, type LinkActionProps, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, type MainProps, MapPinIcon, MenuIcon, MessageCircleIcon, MessageCircleWarningIcon, MicrosoftBrandIcon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, type MutedSpecProps, Numeric, type NumericProps, OTPInput, PageHeader, type PageHeaderProps, PageHeaderSep, type PageHeaderSepProps, PageHeaderSpec, type PageHeaderSpecProps, Pagination, type PaginationProps, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PenSignIcon, PencilIcon, PhoneIcon, PhoneInput, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, type PrimaryActionProps, ProgressBar, type ProgressBarProps, ProgressRing, type ProgressRingProps, RadioGroup, RadioGroupItem, ReceiptIcon, ReplyIcon, RotateCcwIcon, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, type SearchInputVariants, SearchSelect, type SearchSelectOption, SecondaryAction, type SecondaryActionProps, Section, SectionHead, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, type SelectOption, type SelectProps, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SendIcon, Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, type ShellProps, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, type SidebarBrandProps, SidebarBrandText, type SidebarBrandTextProps, SidebarFooter, type SidebarFooterProps, SidebarLink, SidebarLinkAction, type SidebarLinkActionProps, SidebarLinkBadge, type SidebarLinkBadgeProps, type SidebarLinkBadgeVariants, SidebarLinkGroup, type SidebarLinkGroupProps, SidebarLinkLabel, type SidebarLinkLabelProps, type SidebarLinkProps, type SidebarProps, SidebarProvider, type SidebarProviderProps, SidebarSection, type SidebarSectionProps, type SidebarState, SidebarTrigger, type SidebarTriggerProps, SidebarUser, type SidebarUserProps, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, type SortDirection, SparkleIcon, SparklesIcon, StarIcon, StarRating, type StarRatingProps, Stat, type Step, Stepper, type StepperProps, StrikethroughIcon, SubmitButton, SunIcon, Switch, Table, TableBody, type TableBodyProps, TableCaption, type TableCaptionProps, TableCell, type TableCellProps, TableFooter, type TableFooterProps, TableHead, type TableHeadProps, TableHeader, type TableHeaderProps, TableIcon, type TableProps, TableRow, type TableRowProps, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TeamIcon, TeamMemberSelect, Textarea, type TextareaVariants, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, type ToolbarProps, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XIcon, ZoomInIcon, ZoomOutIcon, alertVariants, badgeVariants, buttonVariants, cardVariants, cn, displayToIso, filterChipVariants, inputVariants, isoToDisplay, kanbanCardVariants, labelVariants, progressBarVariants, progressRingVariants, searchInputVariants, sidebarLinkBadgeVariants, starRatingVariants, textareaVariants, useSidebarState, useToast };
1959
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, type ActivityDotVariant, ActivityItem, type ActivityItemProps, ActivityList, type ActivityListProps, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, type AlertProps, AlertTitle, AlertTriangleIcon, AppHeader, AppHeaderActions, type AppHeaderActionsProps, AppHeaderBreadcrumb, type AppHeaderBreadcrumbProps, type AppHeaderProps, AppHeaderSearch, type AppHeaderSearchProps, AppHeaderTitle, type AppHeaderTitleProps, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, AtSignIcon, Avatar, Badge, type BadgeProps, BarChartIcon, BellIcon, Blockquote, BoldIcon, Breadcrumb, BreadcrumbItem, type BreadcrumbItemProps, BreadcrumbLink, type BreadcrumbLinkProps, BreadcrumbList, type BreadcrumbListProps, BreadcrumbPage, type BreadcrumbPageProps, type BreadcrumbProps, BreadcrumbSeparator, type BreadcrumbSeparatorProps, BriefcaseIcon, Building2Icon, BuildingIcon, Button, type ButtonProps, Calendar, type CalendarHighlight, type CalendarHighlightColor, CalendarIcon, type CalendarProps, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, type CardVariants, ChatBubbleIcon, CheckCircle2Icon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientSelect, type ClientSelectOption, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, type ComingSoonProps, CommandIcon, type CommandItem, CommandPalette, ConfirmActionButton, type ConfirmActionButtonProps, Content, type ContentProps, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, type DangerActionProps, DataItem, DataTable, DataTableBody, type DataTableBodyProps, DataTableCell, DataTableCellDue, type DataTableCellDueProps, DataTableCellId, DataTableCellMono, DataTableCellName, type DataTableCellProps, DataTableCheckbox, type DataTableCheckboxProps, DataTableHead, type DataTableHeadProps, DataTableHeader, type DataTableHeaderProps, DataTablePagination, type DataTablePaginationProps, type DataTableProps, DataTableResultsCount, type DataTableResultsCountProps, DataTableRow, type DataTableRowProps, DataTableSearch, type DataTableSearchProps, DataTableSpacer, type DataTableSpacerProps, DataTableToolbar, type DataTableToolbarProps, DatePicker, DetailGrid, type DetailGridProps, DetailMain, type DetailMainProps, DetailSpine, DetailSpineHeader, type DetailSpineHeaderProps, type DetailSpineProps, DetailSpineSection, type DetailSpineSectionProps, DetailSpineStats, type DetailSpineStatsProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DocumentIcon, DollarSignIcon, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, EyeIcon, EyeOffIcon, Eyebrow, type EyebrowProps, FileIcon, FileReturnIcon, FileTextIcon, FileUpload, FilterChip, type FilterChipProps, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FormError, FormSection, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, type IconActionProps, InboxIcon, InfoIcon, Input, type InputVariants, ItalicIcon, Kanban, KanbanCard, type KanbanCardProps, KanbanColumn, type KanbanColumnProps, KanbanIcon, type KanbanProps, KbdHint, type KbdHintProps, KeyIcon, KeyboardShortcutsDialog, KpiCard, Label, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, type LinkActionProps, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LoadingRows, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, type MainProps, MapPinIcon, MenuIcon, MessageCircleIcon, MessageCircleWarningIcon, MetadataGrid, MicrosoftBrandIcon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, type MutedSpecProps, Numeric, type NumericProps, OTPInput, PageHeader, type PageHeaderProps, PageHeaderSep, type PageHeaderSepProps, PageHeaderSpec, type PageHeaderSpecProps, Pagination, type PaginationProps, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PenSignIcon, PencilIcon, PhoneIcon, PhoneInput, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, type PrimaryActionProps, ProgressBar, type ProgressBarProps, ProgressRing, type ProgressRingProps, RadioGroup, RadioGroupItem, ReceiptIcon, ReplyIcon, RotateCcwIcon, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, type SearchInputVariants, SearchSelect, type SearchSelectOption, SecondaryAction, type SecondaryActionProps, Section, SectionHead, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, type SelectOption, type SelectProps, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SendIcon, Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, type ShellProps, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, type SidebarBrandProps, SidebarBrandText, type SidebarBrandTextProps, SidebarFooter, type SidebarFooterProps, SidebarLink, SidebarLinkAction, type SidebarLinkActionProps, SidebarLinkBadge, type SidebarLinkBadgeProps, type SidebarLinkBadgeVariants, SidebarLinkGroup, type SidebarLinkGroupProps, SidebarLinkLabel, type SidebarLinkLabelProps, type SidebarLinkProps, type SidebarProps, SidebarProvider, type SidebarProviderProps, SidebarSection, type SidebarSectionProps, type SidebarState, SidebarTrigger, type SidebarTriggerProps, SidebarUser, type SidebarUserProps, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, type SortDirection, SparkleIcon, SparklesIcon, StarIcon, StarRating, type StarRatingProps, Stat, type Step, Stepper, type StepperProps, StrikethroughIcon, SubmitButton, SunIcon, Switch, Table, TableBody, type TableBodyProps, TableCaption, type TableCaptionProps, TableCell, type TableCellProps, TableFooter, type TableFooterProps, TableHead, type TableHeadProps, TableHeader, type TableHeaderProps, TableIcon, type TableProps, TableRow, type TableRowProps, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TeamIcon, TeamMemberSelect, Textarea, type TextareaVariants, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, type ToolbarProps, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XIcon, ZoomInIcon, ZoomOutIcon, alertVariants, badgeVariants, buttonVariants, cardVariants, cn, displayToIso, filterChipVariants, inputVariants, isoToDisplay, kanbanCardVariants, labelVariants, progressBarVariants, progressRingVariants, searchInputVariants, sidebarLinkBadgeVariants, starRatingVariants, textareaVariants, useSidebarState, useToast };
package/dist/index.js CHANGED
@@ -2622,12 +2622,18 @@ var buttonVariants = cva(
2622
2622
  ghost: "bg-transparent text-fg-2 hover:bg-bg-2 hover:text-fg",
2623
2623
  outline: "border border-rule-strong bg-bg text-fg-2 hover:bg-bg-2 hover:border-fg-4",
2624
2624
  link: "bg-transparent text-accent underline-offset-4 hover:underline p-0 h-auto",
2625
- accent: "bg-accent text-fg-on-accent hover:bg-accent-hover active:bg-accent-active"
2625
+ accent: "bg-accent text-fg-on-accent hover:bg-accent-hover active:bg-accent-active",
2626
+ dashed: "border-2 border-dashed border-rule bg-transparent text-fg-3 hover:border-fg-4 hover:bg-bg-2 hover:text-fg"
2626
2627
  },
2627
2628
  size: {
2628
2629
  sm: "h-8 px-3 text-sm gap-1.5",
2629
2630
  md: "h-10 px-4 text-sm gap-2",
2630
2631
  lg: "h-12 px-6 text-base gap-2",
2632
+ // Icon-only sizes. Hit target ≥ 24px (WCAG 2.5.5 floor).
2633
+ // `icon-xs` / `icon-sm` are for dense in-row action stacks where
2634
+ // `size="icon"` (40×40) would visually crowd the row.
2635
+ "icon-xs": "size-6 [&_svg]:size-3.5",
2636
+ "icon-sm": "size-7 [&_svg]:size-4",
2631
2637
  icon: "size-10"
2632
2638
  }
2633
2639
  },
@@ -4276,6 +4282,19 @@ function FormSuccess({ children, className, ...props }) {
4276
4282
  }
4277
4283
  );
4278
4284
  }
4285
+ var FormSection = forwardRef(function FormSection2({ title, description, action, headSpacing = "mt-4", className, children, ...props }, ref) {
4286
+ return /* @__PURE__ */ jsxs("fieldset", { ref, className: cn("min-w-0", className), ...props, children: [
4287
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
4288
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
4289
+ /* @__PURE__ */ jsx("legend", { className: "text-fg text-sm font-semibold", children: title }),
4290
+ description && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-0.5 text-xs leading-relaxed", children: description })
4291
+ ] }),
4292
+ action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
4293
+ ] }),
4294
+ /* @__PURE__ */ jsx("div", { className: headSpacing, children })
4295
+ ] });
4296
+ });
4297
+ FormSection.displayName = "FormSection";
4279
4298
  var HoverCard = HoverCardPrimitive.Root;
4280
4299
  var HoverCardTrigger = HoverCardPrimitive.Trigger;
4281
4300
  var HoverCardPortal = HoverCardPrimitive.Portal;
@@ -4506,23 +4525,106 @@ var Label4 = React36.forwardRef(
4506
4525
  }
4507
4526
  );
4508
4527
  Label4.displayName = LabelPrimitive.Root.displayName;
4509
- var LinkButton = forwardRef(function LinkButton2({ href, variant = "primary", size = "md", iconLeft, iconRight, children, className, ...props }, ref) {
4510
- return /* @__PURE__ */ jsxs(
4511
- Link,
4528
+ var LinkButton = forwardRef(function LinkButton2({
4529
+ href,
4530
+ variant = "primary",
4531
+ size = "md",
4532
+ iconLeft,
4533
+ iconRight,
4534
+ children,
4535
+ className,
4536
+ external,
4537
+ target,
4538
+ rel,
4539
+ ...props
4540
+ }, ref) {
4541
+ const classes = cn(buttonVariants({ variant, size }), className);
4542
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
4543
+ iconLeft && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconLeft }),
4544
+ children,
4545
+ iconRight && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconRight })
4546
+ ] });
4547
+ if (external) {
4548
+ const safeRel = rel ?? (target === "_blank" ? "noopener noreferrer" : void 0);
4549
+ return /* @__PURE__ */ jsx(
4550
+ "a",
4551
+ {
4552
+ ref,
4553
+ href,
4554
+ className: classes,
4555
+ target,
4556
+ rel: safeRel,
4557
+ ...props,
4558
+ children: content
4559
+ }
4560
+ );
4561
+ }
4562
+ return /* @__PURE__ */ jsx(Link, { ref, href, className: classes, target, rel, ...props, children: content });
4563
+ });
4564
+ LinkButton.displayName = "LinkButton";
4565
+ var Skeleton = forwardRef(function Skeleton2({ className, ...props }, ref) {
4566
+ return /* @__PURE__ */ jsx(
4567
+ "div",
4512
4568
  {
4513
4569
  ref,
4514
- href,
4515
- className: cn(buttonVariants({ variant, size }), className),
4570
+ className: cn("skeleton bg-bg-3 rounded-icon animate-pulse", className),
4571
+ "aria-hidden": "true",
4572
+ ...props
4573
+ }
4574
+ );
4575
+ });
4576
+ Skeleton.displayName = "Skeleton";
4577
+ var SkeletonText = forwardRef(function SkeletonText2({ lines = 3, className, ...props }, ref) {
4578
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("space-y-2", className), "aria-hidden": "true", ...props, children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx(
4579
+ "div",
4580
+ {
4581
+ className: cn(
4582
+ "skeleton bg-bg-3 rounded-icon h-4 animate-pulse",
4583
+ i === lines - 1 && "w-3/4"
4584
+ )
4585
+ },
4586
+ i
4587
+ )) });
4588
+ });
4589
+ SkeletonText.displayName = "SkeletonText";
4590
+ var SkeletonCircle = forwardRef(
4591
+ function SkeletonCircle2({ size = 40, className, ...props }, ref) {
4592
+ return /* @__PURE__ */ jsx(
4593
+ "div",
4594
+ {
4595
+ ref,
4596
+ className: cn("skeleton bg-bg-3 animate-pulse rounded-full", className),
4597
+ style: { width: size, height: size },
4598
+ "aria-hidden": "true",
4599
+ ...props
4600
+ }
4601
+ );
4602
+ }
4603
+ );
4604
+ SkeletonCircle.displayName = "SkeletonCircle";
4605
+ var LoadingRows = forwardRef(function LoadingRows2({
4606
+ count = 3,
4607
+ rowHeight = "h-14",
4608
+ gap = "gap-2",
4609
+ rowClassName,
4610
+ label = "Loading",
4611
+ className,
4612
+ ...props
4613
+ }, ref) {
4614
+ return /* @__PURE__ */ jsx(
4615
+ "div",
4616
+ {
4617
+ ref,
4618
+ role: "status",
4619
+ "aria-busy": "true",
4620
+ "aria-label": label,
4621
+ className: cn("flex flex-col", gap, className),
4516
4622
  ...props,
4517
- children: [
4518
- iconLeft && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconLeft }),
4519
- children,
4520
- iconRight && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconRight })
4521
- ]
4623
+ children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsx(Skeleton, { className: cn(rowHeight, "w-full", rowClassName) }, i))
4522
4624
  }
4523
4625
  );
4524
4626
  });
4525
- LinkButton.displayName = "LinkButton";
4627
+ LoadingRows.displayName = "LoadingRows";
4526
4628
  var sizeStyles = {
4527
4629
  sm: { icon: 20, text: "text-sm", gap: "gap-2" },
4528
4630
  md: { icon: 24, text: "text-[17px]", gap: "gap-2.5" },
@@ -5829,46 +5931,6 @@ function SideDrawerFooter({ children, className }) {
5829
5931
  SideDrawer.Header = SideDrawerHeader;
5830
5932
  SideDrawer.Body = SideDrawerBody;
5831
5933
  SideDrawer.Footer = SideDrawerFooter;
5832
- var Skeleton = forwardRef(function Skeleton2({ className, ...props }, ref) {
5833
- return /* @__PURE__ */ jsx(
5834
- "div",
5835
- {
5836
- ref,
5837
- className: cn("skeleton bg-bg-3 rounded-icon animate-pulse", className),
5838
- "aria-hidden": "true",
5839
- ...props
5840
- }
5841
- );
5842
- });
5843
- Skeleton.displayName = "Skeleton";
5844
- var SkeletonText = forwardRef(function SkeletonText2({ lines = 3, className, ...props }, ref) {
5845
- return /* @__PURE__ */ jsx("div", { ref, className: cn("space-y-2", className), "aria-hidden": "true", ...props, children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx(
5846
- "div",
5847
- {
5848
- className: cn(
5849
- "skeleton bg-bg-3 rounded-icon h-4 animate-pulse",
5850
- i === lines - 1 && "w-3/4"
5851
- )
5852
- },
5853
- i
5854
- )) });
5855
- });
5856
- SkeletonText.displayName = "SkeletonText";
5857
- var SkeletonCircle = forwardRef(
5858
- function SkeletonCircle2({ size = 40, className, ...props }, ref) {
5859
- return /* @__PURE__ */ jsx(
5860
- "div",
5861
- {
5862
- ref,
5863
- className: cn("skeleton bg-bg-3 animate-pulse rounded-full", className),
5864
- style: { width: size, height: size },
5865
- "aria-hidden": "true",
5866
- ...props
5867
- }
5868
- );
5869
- }
5870
- );
5871
- SkeletonCircle.displayName = "SkeletonCircle";
5872
5934
  var Slider = React36.forwardRef(
5873
5935
  function Slider2({
5874
5936
  className,
@@ -6774,11 +6836,9 @@ function SidebarProvider({
6774
6836
  storageKey,
6775
6837
  shortcut = DEFAULT_SHORTCUT
6776
6838
  }) {
6777
- const [uncontrolled, setUncontrolled] = React36.useState(() => {
6778
- if (controlled !== void 0) return controlled;
6779
- const stored = readStorage(storageKey);
6780
- return stored ?? defaultState;
6781
- });
6839
+ const [uncontrolled, setUncontrolled] = React36.useState(
6840
+ controlled ?? defaultState
6841
+ );
6782
6842
  React36.useEffect(() => {
6783
6843
  if (controlled !== void 0) return;
6784
6844
  const stored = readStorage(storageKey);
@@ -6890,7 +6950,6 @@ var Sidebar = React36.forwardRef(function Sidebar2({ className, collapsible = fa
6890
6950
  "data-peek": peek ? "true" : void 0,
6891
6951
  "data-labels": labelsHidden ? "hide" : "show",
6892
6952
  "data-collapsible": collapsible ? "true" : void 0,
6893
- suppressHydrationWarning: true,
6894
6953
  onMouseEnter: handleEnter,
6895
6954
  onMouseLeave: handleLeave,
6896
6955
  style: { width: effectiveWidth, ...style },
@@ -7424,11 +7483,15 @@ var AppHeaderActions = forwardRef(
7424
7483
  }
7425
7484
  );
7426
7485
  AppHeaderActions.displayName = "AppHeaderActions";
7427
- var PageHeader = forwardRef(function PageHeader2({ eyebrow, title, meta, className, ...props }, ref) {
7486
+ var PageHeader = forwardRef(function PageHeader2({ eyebrow, title, description, actions, meta, className, ...props }, ref) {
7428
7487
  return /* @__PURE__ */ jsxs("header", { ref, className: cn("mb-7", className), ...props, children: [
7429
7488
  eyebrow && /* @__PURE__ */ jsx("div", { className: "mb-1.5", children: eyebrow }),
7430
- /* @__PURE__ */ jsx("h1", { className: "font-display text-fg text-[26px] leading-tight tracking-tight", children: title }),
7431
- meta && /* @__PURE__ */ jsx("div", { className: "text-fg-3 mt-2 flex items-center gap-2 text-sm", children: meta })
7489
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
7490
+ /* @__PURE__ */ jsx("h1", { className: "font-display text-fg text-[26px] leading-tight tracking-tight", children: title }),
7491
+ actions && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-2", children: actions })
7492
+ ] }),
7493
+ description && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-2 max-w-2xl text-sm leading-relaxed", children: description }),
7494
+ meta && /* @__PURE__ */ jsx("div", { className: "text-fg-3 mt-2 flex flex-wrap items-center gap-2 text-sm", children: meta })
7432
7495
  ] });
7433
7496
  });
7434
7497
  PageHeader.displayName = "PageHeader";
@@ -7460,6 +7523,83 @@ var PageHeaderSep = forwardRef(function PageHeaderSep2({ children, className, ..
7460
7523
  );
7461
7524
  });
7462
7525
  PageHeaderSep.displayName = "PageHeaderSep";
7526
+ var columnsToGridCols = {
7527
+ 1: "grid-cols-1",
7528
+ 2: "grid-cols-2",
7529
+ 3: "grid-cols-3",
7530
+ 4: "grid-cols-4"
7531
+ };
7532
+ var MetadataGrid = forwardRef(function MetadataGrid2({ columns = 2, gapX = "gap-x-6", gapY = "gap-y-3", className, children, ...props }, ref) {
7533
+ return /* @__PURE__ */ jsx(
7534
+ "dl",
7535
+ {
7536
+ ref,
7537
+ className: cn("grid", columnsToGridCols[columns], gapX, gapY, className),
7538
+ ...props,
7539
+ children
7540
+ }
7541
+ );
7542
+ });
7543
+ MetadataGrid.displayName = "MetadataGrid";
7544
+ var spanToColSpan = {
7545
+ 1: "col-span-1",
7546
+ 2: "col-span-2",
7547
+ 3: "col-span-3",
7548
+ 4: "col-span-4"
7549
+ };
7550
+ function DataItem({ label, value, span = 1, className }) {
7551
+ return /* @__PURE__ */ jsxs("div", { className: cn("min-w-0", spanToColSpan[span], className), children: [
7552
+ /* @__PURE__ */ jsx("dt", { className: "text-fg-4 text-[11px] font-medium uppercase tracking-wider", children: label }),
7553
+ /* @__PURE__ */ jsx("dd", { className: "text-fg mt-0.5 break-words text-sm", children: value })
7554
+ ] });
7555
+ }
7556
+ var toneToTile = {
7557
+ info: "bg-info/10 text-info",
7558
+ success: "bg-success-fg/10 text-success-fg",
7559
+ warning: "bg-warning-fg/10 text-warning-fg",
7560
+ destructive: "bg-danger-fg/10 text-danger-fg",
7561
+ accent: "bg-accent/10 text-accent",
7562
+ muted: "bg-bg-3 text-fg-3"
7563
+ };
7564
+ var toneToValue = {
7565
+ info: "text-info",
7566
+ success: "text-success-fg",
7567
+ warning: "text-warning-fg",
7568
+ destructive: "text-danger-fg",
7569
+ accent: "text-accent",
7570
+ muted: "text-fg"
7571
+ };
7572
+ var KpiCard = forwardRef(function KpiCard2({ label, value, icon, tone = "muted", hint, action, toneValue, className, ...props }, ref) {
7573
+ return /* @__PURE__ */ jsx(Card, { ref, className: cn("p-4", className), ...props, children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
7574
+ icon && /* @__PURE__ */ jsx(
7575
+ "div",
7576
+ {
7577
+ "aria-hidden": "true",
7578
+ className: cn(
7579
+ "flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg]:size-5",
7580
+ toneToTile[tone]
7581
+ ),
7582
+ children: icon
7583
+ }
7584
+ ),
7585
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
7586
+ /* @__PURE__ */ jsx(
7587
+ "p",
7588
+ {
7589
+ className: cn(
7590
+ "text-2xl font-bold tracking-tight tabular-nums",
7591
+ toneValue ? toneToValue[tone] : "text-fg"
7592
+ ),
7593
+ children: value
7594
+ }
7595
+ ),
7596
+ /* @__PURE__ */ jsx("p", { className: "text-fg-3 text-xs", children: label }),
7597
+ hint && /* @__PURE__ */ jsx("p", { className: "text-fg-4 mt-0.5 text-[11px]", children: hint })
7598
+ ] }),
7599
+ action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
7600
+ ] }) });
7601
+ });
7602
+ KpiCard.displayName = "KpiCard";
7463
7603
  var DataTable = forwardRef(function DataTable2({ withToolbar, className, children, ...props }, ref) {
7464
7604
  return /* @__PURE__ */ jsx(
7465
7605
  "div",
@@ -8059,6 +8199,6 @@ var KbdHint = forwardRef(function KbdHint2({ className, children, ...props }, re
8059
8199
  });
8060
8200
  KbdHint.displayName = "KbdHint";
8061
8201
 
8062
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityItem, ActivityList, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTriangleIcon, AppHeader, AppHeaderActions, AppHeaderBreadcrumb, AppHeaderSearch, AppHeaderTitle, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, AtSignIcon, Avatar, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BriefcaseIcon, Building2Icon, BuildingIcon, Button, Calendar, CalendarIcon, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChatBubbleIcon, CheckCircle2Icon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientSelect, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, CommandIcon, CommandPalette, ConfirmActionButton, Content15 as Content, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DatePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DocumentIcon, DollarSignIcon, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EyeIcon, EyeOffIcon, Eyebrow, FileIcon, FileReturnIcon, FileTextIcon, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FormError, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, InboxIcon, InfoIcon, Input, ItalicIcon, Kanban, KanbanCard, KanbanColumn, KanbanIcon, KbdHint, KeyIcon, KeyboardShortcutsDialog, Label4 as Label, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, MapPinIcon, MenuIcon, MessageCircleIcon, MessageCircleWarningIcon, MicrosoftBrandIcon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, Numeric, OTPInput, PageHeader, PageHeaderSep, PageHeaderSpec, Pagination, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PenSignIcon, PencilIcon, PhoneIcon, PhoneInput, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, ProgressBar, ProgressRing, RadioGroup3 as RadioGroup, RadioGroupItem, ReceiptIcon, ReplyIcon, RotateCcwIcon, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, SearchSelect, SecondaryAction, Section, SectionHead, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SendIcon, Separator4 as Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, SidebarBrandText, SidebarFooter, SidebarLink, SidebarLinkAction, SidebarLinkBadge, SidebarLinkGroup, SidebarLinkLabel, SidebarProvider, SidebarSection, SidebarTrigger, SidebarUser, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, StarIcon, StarRating, Stat, Stepper, StrikethroughIcon, SubmitButton, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TeamIcon, TeamMemberSelect, Textarea, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XIcon, ZoomInIcon, ZoomOutIcon, alertVariants, badgeVariants, buttonVariants, cardVariants, cn, colors, displayToIso, filterChipVariants, inputVariants, isoToDisplay, kanbanCardVariants, labelVariants, progressBarVariants, progressRingVariants, radii, reference, searchInputVariants, shadows, sidebarLinkBadgeVariants, spacing, starRatingVariants, surfaces, systemTokens, textareaVariants, typography, useSidebarState, useToast };
8202
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityItem, ActivityList, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTriangleIcon, AppHeader, AppHeaderActions, AppHeaderBreadcrumb, AppHeaderSearch, AppHeaderTitle, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, AtSignIcon, Avatar, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BriefcaseIcon, Building2Icon, BuildingIcon, Button, Calendar, CalendarIcon, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChatBubbleIcon, CheckCircle2Icon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientSelect, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, CommandIcon, CommandPalette, ConfirmActionButton, Content15 as Content, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, DataItem, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DatePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DocumentIcon, DollarSignIcon, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EyeIcon, EyeOffIcon, Eyebrow, FileIcon, FileReturnIcon, FileTextIcon, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FormError, FormSection, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, InboxIcon, InfoIcon, Input, ItalicIcon, Kanban, KanbanCard, KanbanColumn, KanbanIcon, KbdHint, KeyIcon, KeyboardShortcutsDialog, KpiCard, Label4 as Label, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LoadingRows, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, MapPinIcon, MenuIcon, MessageCircleIcon, MessageCircleWarningIcon, MetadataGrid, MicrosoftBrandIcon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, Numeric, OTPInput, PageHeader, PageHeaderSep, PageHeaderSpec, Pagination, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PenSignIcon, PencilIcon, PhoneIcon, PhoneInput, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, ProgressBar, ProgressRing, RadioGroup3 as RadioGroup, RadioGroupItem, ReceiptIcon, ReplyIcon, RotateCcwIcon, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, SearchSelect, SecondaryAction, Section, SectionHead, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SendIcon, Separator4 as Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, SidebarBrandText, SidebarFooter, SidebarLink, SidebarLinkAction, SidebarLinkBadge, SidebarLinkGroup, SidebarLinkLabel, SidebarProvider, SidebarSection, SidebarTrigger, SidebarUser, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, StarIcon, StarRating, Stat, Stepper, StrikethroughIcon, SubmitButton, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TeamIcon, TeamMemberSelect, Textarea, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XIcon, ZoomInIcon, ZoomOutIcon, alertVariants, badgeVariants, buttonVariants, cardVariants, cn, colors, displayToIso, filterChipVariants, inputVariants, isoToDisplay, kanbanCardVariants, labelVariants, progressBarVariants, progressRingVariants, radii, reference, searchInputVariants, shadows, sidebarLinkBadgeVariants, spacing, starRatingVariants, surfaces, systemTokens, textareaVariants, typography, useSidebarState, useToast };
8063
8203
  //# sourceMappingURL=index.js.map
8064
8204
  //# sourceMappingURL=index.js.map