@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.
- package/dist/index.d.ts +313 -3
- package/dist/index.js +396 -133
- 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 };
|