@campfire-interactive/ui 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.d.ts +313 -3
  2. package/dist/index.js +396 -133
  3. package/package.json +56 -55
package/dist/index.d.ts CHANGED
@@ -29,6 +29,23 @@ type ButtonSize = 'sm' | 'md' | 'lg' | 'icon';
29
29
  interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
30
30
  variant?: ButtonVariant;
31
31
  size?: ButtonSize;
32
+ /**
33
+ * Renders the CHILD element with this button's styling, instead of a
34
+ * `button`.
35
+ *
36
+ * For the button that is really a link — "New part", "Import", "Back to
37
+ * Quotes". Those have to be anchors: an onClick navigation loses
38
+ * middle-click, open-in-new-tab, copy-link-address and the status bar, and
39
+ * a screen reader announces a destination as a button. Every app was
40
+ * choosing between correct markup and correct styling, and the router-based
41
+ * ones mostly chose styling. This is the spelling the fleet's vendored
42
+ * shadcn buttons already use, so it needs no explaining at a call site.
43
+ *
44
+ * The child must be a single element that accepts a ref. `leadingIcon`,
45
+ * `trailingIcon` and `loading` are ignored, because the child owns its own
46
+ * content — put the icon inside it.
47
+ */
48
+ asChild?: boolean;
32
49
  /**
33
50
  * Renders a spinner in place of any leading icon and blocks activation.
34
51
  * Kept distinct from `disabled` so the caller can tell "working" apart from
@@ -685,6 +702,29 @@ interface ComboboxProps<T extends string = string> {
685
702
  loading?: boolean;
686
703
  emptyLabel?: string;
687
704
  loadingLabel?: string;
705
+ /**
706
+ * How many rows the list renders at once. The rest are not dropped quietly —
707
+ * a notice takes the last row and says how many are shown, because a picker
708
+ * silently offering 20 of 200 is the same bug as a table silently paging.
709
+ * Pass `0` to render everything, which is right only for a list bounded by
710
+ * the domain rather than by the customer.
711
+ */
712
+ maxResults?: number;
713
+ /** Overrides the truncation notice. Receives how many rows are shown. */
714
+ truncatedLabel?: (shown: number) => string;
715
+ /**
716
+ * Fires as the list opens and closes. `Select` has had this since pm's
717
+ * click-to-edit cells needed it: those save on blur, and a portalled list
718
+ * moves focus off the trigger, so without knowing the list is open a cell
719
+ * closes itself the instant the user clicks into it.
720
+ */
721
+ onOpenChange?: (open: boolean) => void;
722
+ /**
723
+ * Forwarded to the trigger. Only useful alongside `onOpenChange`, which is
724
+ * what tells a commit-on-blur caller to ignore the blur the list itself
725
+ * caused.
726
+ */
727
+ onBlur?: React.FocusEventHandler<HTMLButtonElement>;
688
728
  /** Adds a "Clear" affordance to the trigger once something is selected. */
689
729
  clearable?: boolean;
690
730
  size?: 'sm' | 'md' | 'lg';
@@ -692,6 +732,17 @@ interface ComboboxProps<T extends string = string> {
692
732
  disabled?: boolean;
693
733
  id?: string;
694
734
  name?: string;
735
+ /**
736
+ * Labelling, forwarded to the trigger.
737
+ *
738
+ * `Select` grew these when pm found 33 call sites labelling a control by its
739
+ * table column header; `Combobox` was written later and did not get them,
740
+ * which left every picker whose label is a column heading or a filter-bar
741
+ * position announcing only its placeholder. master-data's plant and scope
742
+ * pickers are both that shape.
743
+ */
744
+ 'aria-label'?: string;
745
+ 'aria-labelledby'?: string;
695
746
  'aria-describedby'?: string;
696
747
  className?: string;
697
748
  /**
@@ -717,11 +768,15 @@ interface ComboboxProps<T extends string = string> {
717
768
  * typing a part number finds a row whose label is a description. Pass
718
769
  * `onSearchChange` to filter on the server instead.
719
770
  *
771
+ * `maxResults` caps what is rendered (50 by default) and says so in the last
772
+ * row. Options carrying a `group` are rendered under a heading, in the order
773
+ * the caller gives them — which is how a picker puts RECENTS above SEARCH.
774
+ *
720
775
  * Keyboard: ArrowUp/ArrowDown move, Home/End jump, Enter selects, Escape
721
776
  * closes. The list is `aria-activedescendant`-driven, so focus stays in the
722
777
  * search field and a screen reader announces each row as it is highlighted.
723
778
  */
724
- declare function Combobox<T extends string = string>({ options, value, onValueChange, placeholder, searchPlaceholder, onSearchChange, loading, emptyLabel, loadingLabel, clearable, size, invalid, disabled, id, name, className, style, fullWidth, ...aria }: ComboboxProps<T>): react.JSX.Element;
779
+ declare function Combobox<T extends string = string>({ options, value, onValueChange, placeholder, searchPlaceholder, onSearchChange, loading, emptyLabel, loadingLabel, maxResults, truncatedLabel, onOpenChange, onBlur, clearable, size, invalid, disabled, id, name, className, style, fullWidth, ...aria }: ComboboxProps<T>): react.JSX.Element;
725
780
 
726
781
  declare const TooltipProvider: react.FC<RadixTooltip.TooltipProviderProps>;
727
782
  declare const TooltipRoot: react.FC<RadixTooltip.TooltipProps>;
@@ -897,6 +952,118 @@ interface CountBadgeProps extends Omit<BadgeProps, 'children' | 'dot' | 'icon'>
897
952
  /** A numeric count — unread items, filters applied, rows selected. */
898
953
  declare const CountBadge: react.ForwardRefExoticComponent<CountBadgeProps & react.RefAttributes<HTMLSpanElement>>;
899
954
 
955
+ type AlertTone = 'info' | 'success' | 'warning' | 'error' | 'neutral';
956
+ interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
957
+ tone?: AlertTone;
958
+ /** Bold first line. Omit it for a one-sentence alert — a title that merely restates the body is noise. */
959
+ title?: ReactNode;
960
+ /**
961
+ * Replaces the tone's default icon. Pass `null` to render no icon at all —
962
+ * worth it in a dense form where a row of icons is more decoration than signal.
963
+ */
964
+ icon?: ReactNode | null;
965
+ /** Trailing controls — a retry, a "Create it", a link out. */
966
+ actions?: ReactNode;
967
+ /** Renders a close button. The caller owns the dismissed state. */
968
+ onDismiss?: () => void;
969
+ dismissLabel?: string;
970
+ /** `subtle` drops the fill and keeps a left rule — for an alert inside a card that already has a ground. */
971
+ variant?: 'soft' | 'subtle';
972
+ }
973
+ /**
974
+ * AN INLINE MESSAGE ABOUT THE THING ON THE SCREEN.
975
+ *
976
+ * ── Why this exists ───────────────────────────────────────────────────────
977
+ *
978
+ * This package shipped `PageState` (the screen is loading / failed / empty)
979
+ * and `Toast` (something just happened, elsewhere) and nothing for the case
980
+ * between them: a message that belongs to a region of a page and stays there.
981
+ * Seven apps hand-rolled it — `CampfireSeedBanner`, `OwnershipBanner`, two
982
+ * vendored shadcn `alert`s, and a spread of one-off `<div>`s — and the
983
+ * one-offs are where the contrast defects were: the fleet's common pattern is
984
+ * a mid-tone on a 10%-alpha wash of itself, which lands near 2:1.
985
+ *
986
+ * ── The distinction to get right ──────────────────────────────────────────
987
+ *
988
+ * Use `Alert` when the message is ABOUT something the user can see and should
989
+ * persist while that remains true — "SAP is the source of truth for Plants",
990
+ * "this quote is awarded and can no longer be edited". Use `Toast` for the
991
+ * result of an action the user just took. Use `ErrorState` when the message
992
+ * REPLACES the content because there is no content to show.
993
+ *
994
+ * ── Accessibility ─────────────────────────────────────────────────────────
995
+ *
996
+ * `error` and `warning` announce as `role="alert"`; the quieter tones use
997
+ * `role="status"`. Both are live regions, so an alert that appears in
998
+ * response to a save is heard, not just seen. Tone is never carried by color
999
+ * alone — every tone has its own icon, which survives greyscale and every
1000
+ * color vision deficiency.
1001
+ */
1002
+ declare function Alert({ tone, title, icon, actions, onDismiss, dismissLabel, variant, className, children, ...rest }: AlertProps): react.JSX.Element;
1003
+
1004
+ interface DataListProps extends Omit<React.HTMLAttributes<HTMLDListElement>, 'children'> {
1005
+ /**
1006
+ * `label` — label left, value right, in a two-column grid. The scanning
1007
+ * layout for a record's own fields.
1008
+ * `stack` — label above value. Right when the values are long (an address,
1009
+ * a description) or when the list sits in a narrow column.
1010
+ * `inline` — label and value on one line, wrapping as a run. For a meta
1011
+ * strip under a page title, not for a record's fields.
1012
+ */
1013
+ layout?: 'label' | 'stack' | 'inline';
1014
+ /** Columns of pairs. `label` layout only; ignored otherwise. */
1015
+ columns?: 1 | 2 | 3;
1016
+ /** Width of the label column in `label` layout. Default `12rem`. */
1017
+ labelWidth?: string;
1018
+ /** Rules between rows. Worth it past about eight pairs, where the eye loses the row. */
1019
+ divided?: boolean;
1020
+ size?: 'sm' | 'md';
1021
+ children?: ReactNode;
1022
+ }
1023
+ /**
1024
+ * A RECORD'S FIELDS: the label/value grid every detail page in the suite draws.
1025
+ *
1026
+ * ── Why this exists ───────────────────────────────────────────────────────
1027
+ *
1028
+ * Nine of the twelve frontends have their own `__label` / `__value` pair CSS,
1029
+ * and they disagree about nearly everything: four render a real `<dl>` and
1030
+ * five use nested `<div>`s, the label column is 140px / 180px / 200px / 40%,
1031
+ * and the empty value is `—`, `-`, `N/A`, an empty string, or the literal
1032
+ * `null`. That last one is not cosmetic — a blank cell and a missing field
1033
+ * look identical, so a reader cannot tell "we don't know" from "nothing here".
1034
+ *
1035
+ * ── The decisions this makes ──────────────────────────────────────────────
1036
+ *
1037
+ * A real `<dl>`, so the pairing is in the accessibility tree and not only in
1038
+ * the visual grid. One empty marker — an em dash, with the pair still rendered
1039
+ * and still announced, because a field that vanishes when empty makes two
1040
+ * records with different data look like the same record. And the label column
1041
+ * collapses to stacked at phone width, where a 200px label beside a value
1042
+ * leaves the value about forty pixels.
1043
+ *
1044
+ * ── Empty values ─────────────────────────────────────────────────────────
1045
+ *
1046
+ * `DataListItem` renders `—` for `null`, `undefined` and `''`. It does NOT do
1047
+ * that for `0` or `false`, which are answers. Pass `empty` to say something
1048
+ * more specific ("Not set", "Inherited from the part type") — a screen where
1049
+ * the reason is knowable should say the reason.
1050
+ */
1051
+ declare function DataList({ layout, columns, labelWidth, divided, size, className, style, children, ...rest }: DataListProps): react.JSX.Element;
1052
+ interface DataListItemProps {
1053
+ label: ReactNode;
1054
+ /** `null`, `undefined` and `''` all render the empty marker. `0` and `false` do not. */
1055
+ children?: ReactNode;
1056
+ /** What to show when the value is empty. Defaults to an em dash. */
1057
+ empty?: ReactNode;
1058
+ /** Spans every column in a multi-column list — for the one long field among short ones. */
1059
+ full?: boolean;
1060
+ /** Renders the value in the mono face. For ids, codes, SKUs. */
1061
+ mono?: boolean;
1062
+ className?: string;
1063
+ }
1064
+ /** One label/value pair. Always renders, empty or not — see `DataList`. */
1065
+ declare function DataListItem({ label, children, empty, full, mono, className, }: DataListItemProps): react.JSX.Element;
1066
+
900
1067
  interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {
901
1068
  /** Tightens row height for dense data screens. */
902
1069
  density?: 'comfortable' | 'compact';
@@ -970,8 +1137,20 @@ interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {
970
1137
  numeric?: boolean;
971
1138
  /** Truncates with an ellipsis instead of wrapping. Pair it with a `title`. */
972
1139
  truncate?: boolean;
1140
+ /**
1141
+ * Renders the cell in the mono face.
1142
+ *
1143
+ * For an identifier rather than a word — a part number, a plant code, an
1144
+ * external system's id. It is not decoration: in the proportional face the
1145
+ * digit 1, lowercase l and capital I are near-identical, and a column of
1146
+ * codes is exactly where someone reads a character at a time and copies it
1147
+ * somewhere that has to match. master-data's reference lists are the case
1148
+ * that forced it; every app with a code column had wrapped the value in a
1149
+ * `<code>` by hand and picked its own size.
1150
+ */
1151
+ mono?: boolean;
973
1152
  }
974
- declare function TableCell({ numeric, truncate, className, ...rest }: TableCellProps): react.JSX.Element;
1153
+ declare function TableCell({ numeric, truncate, mono, className, ...rest }: TableCellProps): react.JSX.Element;
975
1154
  interface TableEmptyProps {
976
1155
  /** Must match the table's column count, or the message will not span the width. */
977
1156
  colSpan: number;
@@ -1398,6 +1577,137 @@ interface ListToolbarProps {
1398
1577
  */
1399
1578
  declare function ListToolbar({ search, filters, actions, className }: ListToolbarProps): react.JSX.Element;
1400
1579
 
1580
+ interface Breadcrumb {
1581
+ label: ReactNode;
1582
+ /**
1583
+ * Rendered as an `<a href>`. In a router app pass `render` instead — an
1584
+ * anchor inside a SPA reloads the document and throws away the client state
1585
+ * the crumb was supposed to return you to.
1586
+ */
1587
+ href?: string;
1588
+ /** Wraps the crumb's label — `(node) => <Link to="/parts">{node}</Link>`. */
1589
+ render?: (label: ReactNode) => ReactNode;
1590
+ }
1591
+ interface PageHeaderProps {
1592
+ title: ReactNode;
1593
+ /**
1594
+ * The line under the title. Named `description` because it is what the
1595
+ * majority of the fleet's copies called it; `subtitle` and `subhead` were
1596
+ * the same prop under other names.
1597
+ */
1598
+ description?: ReactNode;
1599
+ /** Right-aligned page actions. Never wraps under the title. */
1600
+ actions?: ReactNode;
1601
+ /** Trail above the title. Omit it on a top-level list — a one-crumb trail is noise. */
1602
+ breadcrumbs?: Breadcrumb[];
1603
+ /**
1604
+ * Renders a back control above the title. Router-free by construction: this
1605
+ * package takes no router dependency, so the caller supplies the navigation.
1606
+ */
1607
+ onBack?: () => void;
1608
+ backLabel?: ReactNode;
1609
+ /**
1610
+ * The heading level. `1` is right for a page; drop to `2` when the header
1611
+ * sits inside a page that already has an `<h1>` (a tab panel, a wizard step).
1612
+ * The rendered SIZE does not change with it — level is document structure,
1613
+ * not typography.
1614
+ */
1615
+ level?: 1 | 2 | 3;
1616
+ /** A meta row under the title — status badges, an id, a last-updated stamp. */
1617
+ children?: ReactNode;
1618
+ /** Draws the rule under the header. Off by default. */
1619
+ bordered?: boolean;
1620
+ className?: string;
1621
+ }
1622
+ /**
1623
+ * THE FIRST THING A USER SEES ON EVERY SCREEN, and the fleet had seven of it.
1624
+ *
1625
+ * ── Why this exists ───────────────────────────────────────────────────────
1626
+ *
1627
+ * The cross-repo audit found `PageHeader` implemented separately in six apps
1628
+ * plus an inline copy in a seventh, with **three different prop names for the
1629
+ * same subtitle** (`subtitle` / `description` / `rightSlot`), three heading
1630
+ * levels, four type sizes and three font weights. Two of them also portalled
1631
+ * their actions into the shell toolbar and two rendered them beside the title,
1632
+ * so "the actions" meant different places in different apps.
1633
+ *
1634
+ * Nothing about a title row is app-specific. It drifted because it was never
1635
+ * anybody's to own.
1636
+ *
1637
+ * ── The decisions this makes for a caller ─────────────────────────────────
1638
+ *
1639
+ * One size (`--cfi-ui-text-xl`, semibold), one description treatment, actions
1640
+ * right and `flex: none` so a long title never squeezes them onto a second
1641
+ * line, and the heading level decoupled from the size — a header inside a tab
1642
+ * panel should be an `<h2>` in the document outline and still look like the
1643
+ * page title, which is exactly the tradeoff the per-app copies got wrong in
1644
+ * both directions.
1645
+ *
1646
+ * ── What it deliberately does not do ──────────────────────────────────────
1647
+ *
1648
+ * It does not navigate. `onBack` is a callback and a breadcrumb takes a
1649
+ * `render` wrapper, because `ui` has no router dependency and should not
1650
+ * acquire one to draw a link. It does not portal: analytics and cpq teleport
1651
+ * their actions into the shell header, which is a shell concern and belongs in
1652
+ * whatever Tier 3 eventually owns `AppShell`, not in a title row.
1653
+ */
1654
+ declare function PageHeader({ title, description, actions, breadcrumbs, onBack, backLabel, level, children, bordered, className, }: PageHeaderProps): react.JSX.Element;
1655
+
1656
+ interface SelectionBarProps {
1657
+ /** How many rows are selected. At `0` the bar renders nothing — see below. */
1658
+ count: number;
1659
+ /**
1660
+ * The bulk actions. Normally `Button`s at `size="sm"`, left at the default
1661
+ * `variant="secondary"`; a destructive one takes `variant="danger"`.
1662
+ */
1663
+ children?: ReactNode;
1664
+ /** Clears the selection. The bar always offers this, on the right. */
1665
+ onClear?: () => void;
1666
+ clearLabel?: string;
1667
+ /**
1668
+ * How the count reads. Defaults to "{n} selected". Pass a function in an
1669
+ * i18n app, or to name the thing — `(n) => \`${n} parts selected\``.
1670
+ */
1671
+ label?: (count: number) => ReactNode;
1672
+ /** Greys out the whole bar while a bulk action is in flight. */
1673
+ busy?: boolean;
1674
+ /** `bar` sits inline above the table. `floating` docks at the bottom of the viewport. */
1675
+ variant?: 'bar' | 'floating';
1676
+ className?: string;
1677
+ }
1678
+ /**
1679
+ * WHAT YOU CAN DO WITH THE ROWS YOU TICKED.
1680
+ *
1681
+ * ── Why this exists ───────────────────────────────────────────────────────
1682
+ *
1683
+ * Six apps grew one: `BulkArchiveBar`, `BulkActions`, an inline
1684
+ * `{selected.size} selected` strip, and three variants that only appear once
1685
+ * the selection is non-empty but each decide that differently. The count
1686
+ * phrasing, the position of Clear, and whether the bar pushes the table down
1687
+ * or floats over it were all separate guesses.
1688
+ *
1689
+ * ── Self-hiding, deliberately ─────────────────────────────────────────────
1690
+ *
1691
+ * `count === 0` renders `null`, so a page mounts it unconditionally instead of
1692
+ * writing `{selected.size > 0 && <Bar/>}` on every list. That is not just
1693
+ * terser: the conditional is what drifts. Two of the six apps rendered an
1694
+ * empty bar at zero and reserved its height, so the table jumped by 44px the
1695
+ * first time anyone ticked a box.
1696
+ *
1697
+ * ── Clear is not an action ────────────────────────────────────────────────
1698
+ *
1699
+ * It sits apart from the bulk actions, on the right, because it is the only
1700
+ * control here that changes what is selected rather than what happens to it —
1701
+ * and because a Clear adjacent to Archive is a mis-click that is not undoable.
1702
+ *
1703
+ * ── Announcing ────────────────────────────────────────────────────────────
1704
+ *
1705
+ * `role="status"` with `aria-live="polite"`: a selection count that only
1706
+ * updates visually leaves a screen-reader user ticking boxes with no feedback
1707
+ * that anything is accumulating.
1708
+ */
1709
+ declare function SelectionBar({ count, children, onClear, clearLabel, label, busy, variant, className, }: SelectionBarProps): react.JSX.Element | null;
1710
+
1401
1711
  interface PagedRows<T> {
1402
1712
  /** The slice to render. */
1403
1713
  rows: T[];
@@ -1480,4 +1790,4 @@ declare function formatNumber(value: number | null | undefined, decimals?: numbe
1480
1790
  */
1481
1791
  declare function formatPercent(value: number | null | undefined, decimals?: number): string;
1482
1792
 
1483
- export { Accordion, AccordionContent, AccordionItem, type AccordionProps, AccordionRoot, type AccordionSection, AccordionTrigger, type AccordionTriggerProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, Badge, type BadgeProps, type BadgeTone, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, Card, CardBody, CardDescription, CardFooter, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardTitleProps, Checkbox, type CheckboxProps, type ClassValue, Combobox, type ComboboxOption, type ComboboxProps, ComingSoon, type ComingSoonProps, ConfirmDialog, type ConfirmDialogProps, CountBadge, type CountBadgeProps, CreatableSelect, type CreatableSelectProps, Dialog, DialogBody, DialogClose, DialogContent, type DialogContentProps, DialogDescription, DialogFooter, DialogHeader, DialogPortal, DialogRoot, type DialogSize, DialogTitle, DialogTrigger, EmptyState, type EmptyStateProps, ErrorState, type ErrorStateProps, Field, type FieldProps, Fieldset, type FieldsetProps, FilterBar, type FilterBarProps, type FilterSelect, type FilterToggle, type FilterValue, IconButton, type IconButtonProps, Input, type InputProps, type InputSize, Label, type LabelProps, ListToolbar, type ListToolbarProps, LoadingState, type LoadingStateProps, Menu, type MenuAction, MenuCheckboxItem, MenuContent, MenuGroup, MenuItem, type MenuItemProps, MenuLabel, type MenuProps, MenuRadioGroup, MenuRadioItem, MenuRoot, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, type ModalProps, type MoneyOptions, type PagedRows, Pagination, type PaginationProps, Popover, PopoverAnchor, PopoverClose, PopoverContent, type PopoverContentProps, type PopoverProps, PopoverRoot, PopoverTrigger, Progress, type ProgressProps, ScrollArea, type ScrollAreaProps, SearchInput, type SearchInputProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, type SelectOption, type SelectProps, SelectRoot, SelectSeparator, SelectTrigger, type SelectTriggerProps, SelectValue, Separator, type SeparatorProps, Sheet, SheetBody, SheetClose, SheetContent, type SheetContentProps, SheetDescription, SheetFooter, SheetHeader, SheetPortal, SheetTitle, SheetTrigger, SideModal, Skeleton, type SkeletonProps, Slider, type SliderProps, type SortDirection, type SortState, SplitButton, type SplitButtonProps, Switch, type SwitchProps, type TabDefinition, TabSet, type TabSetProps, Table, TableBody, TableCaption, TableCell, type TableCellProps, TableEmpty, TableFoot, TableFooter, TableHead, type TableHeadProps, TableHeader, type TableProps, TableRow, type TableRowProps, TableScroller, Tabs, TabsContent, TabsList, type TabsListProps, TabsRoot, TabsTrigger, type TabsTriggerProps, Textarea, type TextareaProps, type ToastOptions, ToastProvider, type ToastProviderProps, type ToastTone, ToggleGroup, type ToggleGroupProps, type ToggleOption, Tooltip, TooltipContent, type TooltipContentProps, type TooltipProps, TooltipProvider, TooltipRoot, TooltipTrigger, type UseSortStateResult, cn, formatDate, formatDateTime, formatMoney, formatNumber, formatPercent, useFieldControl, usePagedRows, useSortState, useToast };
1793
+ export { Accordion, AccordionContent, AccordionItem, type AccordionProps, AccordionRoot, type AccordionSection, AccordionTrigger, type AccordionTriggerProps, Alert, type AlertProps, type AlertTone, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, Badge, type BadgeProps, type BadgeTone, type Breadcrumb, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, Card, CardBody, CardDescription, CardFooter, CardHeader, type CardHeaderProps, type CardProps, CardTitle, type CardTitleProps, Checkbox, type CheckboxProps, type ClassValue, Combobox, type ComboboxOption, type ComboboxProps, ComingSoon, type ComingSoonProps, ConfirmDialog, type ConfirmDialogProps, CountBadge, type CountBadgeProps, CreatableSelect, type CreatableSelectProps, DataList, DataListItem, type DataListItemProps, type DataListProps, Dialog, DialogBody, DialogClose, DialogContent, type DialogContentProps, DialogDescription, DialogFooter, DialogHeader, DialogPortal, DialogRoot, type DialogSize, DialogTitle, DialogTrigger, EmptyState, type EmptyStateProps, ErrorState, type ErrorStateProps, Field, type FieldProps, Fieldset, type FieldsetProps, FilterBar, type FilterBarProps, type FilterSelect, type FilterToggle, type FilterValue, IconButton, type IconButtonProps, Input, type InputProps, type InputSize, Label, type LabelProps, ListToolbar, type ListToolbarProps, LoadingState, type LoadingStateProps, Menu, type MenuAction, MenuCheckboxItem, MenuContent, MenuGroup, MenuItem, type MenuItemProps, MenuLabel, type MenuProps, MenuRadioGroup, MenuRadioItem, MenuRoot, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, type ModalProps, type MoneyOptions, PageHeader, type PageHeaderProps, type PagedRows, Pagination, type PaginationProps, Popover, PopoverAnchor, PopoverClose, PopoverContent, type PopoverContentProps, type PopoverProps, PopoverRoot, PopoverTrigger, Progress, type ProgressProps, ScrollArea, type ScrollAreaProps, SearchInput, type SearchInputProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, type SelectOption, type SelectProps, SelectRoot, SelectSeparator, SelectTrigger, type SelectTriggerProps, SelectValue, SelectionBar, type SelectionBarProps, Separator, type SeparatorProps, Sheet, SheetBody, SheetClose, SheetContent, type SheetContentProps, SheetDescription, SheetFooter, SheetHeader, SheetPortal, SheetTitle, SheetTrigger, SideModal, Skeleton, type SkeletonProps, Slider, type SliderProps, type SortDirection, type SortState, SplitButton, type SplitButtonProps, Switch, type SwitchProps, type TabDefinition, TabSet, type TabSetProps, Table, TableBody, TableCaption, TableCell, type TableCellProps, TableEmpty, TableFoot, TableFooter, TableHead, type TableHeadProps, TableHeader, type TableProps, TableRow, type TableRowProps, TableScroller, Tabs, TabsContent, TabsList, type TabsListProps, TabsRoot, TabsTrigger, type TabsTriggerProps, Textarea, type TextareaProps, type ToastOptions, ToastProvider, type ToastProviderProps, type ToastTone, ToggleGroup, type ToggleGroupProps, type ToggleOption, Tooltip, TooltipContent, type TooltipContentProps, type TooltipProps, TooltipProvider, TooltipRoot, TooltipTrigger, type UseSortStateResult, cn, formatDate, formatDateTime, formatMoney, formatNumber, formatPercent, useFieldControl, usePagedRows, useSortState, useToast };