@sableui/react 0.7.0 → 0.8.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 (77) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +115 -0
  3. package/README.md +2 -0
  4. package/bin/sable.mjs +34 -0
  5. package/dist/blocks/traffic-sources-block.js +1 -1
  6. package/dist/blocks/traffic-trend-block.js +3 -3
  7. package/dist/components/breadcrumbs/breadcrumbs.js +10 -9
  8. package/dist/components/breadcrumbs/breadcrumbs.meta.js +2 -2
  9. package/dist/components/button/button.meta.js +4 -0
  10. package/dist/components/card/card.js +7 -4
  11. package/dist/components/chat-composer/chat-composer.js +4 -2
  12. package/dist/components/chat-composer/chat-composer.meta.js +8 -2
  13. package/dist/components/command-menu/command-menu.js +9 -2
  14. package/dist/components/command-menu/command-menu.meta.js +3 -3
  15. package/dist/components/data-table/data-table.js +117 -64
  16. package/dist/components/data-table/data-table.meta.js +27 -1
  17. package/dist/components/form/form.js +30 -9
  18. package/dist/components/form/form.meta.js +17 -3
  19. package/dist/components/message-scroller/message-scroller.meta.js +1 -1
  20. package/dist/components/page-header/page-header.js +1 -0
  21. package/dist/components/page-header/page-header.meta.js +1 -1
  22. package/dist/components/pie-chart/pie-chart.js +3 -3
  23. package/dist/components/pie-chart/pie-chart.meta.js +3 -3
  24. package/dist/components/radial-chart/radial-chart.js +3 -3
  25. package/dist/components/radial-chart/radial-chart.meta.js +2 -2
  26. package/dist/components/settings-menu/settings-menu.js +10 -1
  27. package/dist/components/settings-menu/settings-menu.meta.js +1 -1
  28. package/dist/components/side-nav/side-nav.variants.js +3 -2
  29. package/dist/components/sidebar/sidebar.js +1 -1
  30. package/dist/components/sidebar/sidebar.meta.js +5 -0
  31. package/dist/components/switch/switch.js +1 -1
  32. package/dist/components/switch/switch.meta.js +2 -2
  33. package/dist/components/table/table.js +1 -1
  34. package/dist/components/toggle/toggle.js +2 -1
  35. package/dist/file-hashes.json +603 -0
  36. package/dist/icon-sets/reicon.js +13 -1
  37. package/dist/index.d.ts +88 -15
  38. package/dist/index.js +1 -1
  39. package/dist/layout/index.d.ts +5 -2
  40. package/dist/lib/chart/format.js +5 -0
  41. package/dist/lib/component-guidance.js +7 -2
  42. package/dist/lib/heading-row.js +3 -2
  43. package/dist/lib/trim-label.js +17 -4
  44. package/dist/presets/index.d.ts +7 -1
  45. package/dist/presets/index.js +10 -0
  46. package/dist/styles.css +27 -2
  47. package/llms/blocks/traffic-sources-block.md +1 -1
  48. package/llms/blocks/traffic-trend-block.md +5 -3
  49. package/llms/components/breadcrumbs.md +1 -1
  50. package/llms/components/button.md +1 -0
  51. package/llms/components/chat-composer.md +3 -2
  52. package/llms/components/command-menu.md +2 -2
  53. package/llms/components/data-table.md +33 -1
  54. package/llms/components/form.md +19 -2
  55. package/llms/components/message-scroller.md +1 -1
  56. package/llms/components/page-header.md +1 -1
  57. package/llms/components/pie-chart.md +2 -2
  58. package/llms/components/radial-chart.md +1 -1
  59. package/llms/components/settings-menu.md +1 -1
  60. package/llms/components/sidebar.md +1 -0
  61. package/llms/components/switch.md +2 -2
  62. package/llms/layout/region.md +16 -3
  63. package/llms/tasks/building-a-page.md +34 -3
  64. package/llms/tasks/creating-a-preset.md +4 -1
  65. package/llms/tasks/patching-a-component.md +48 -0
  66. package/llms/tasks/reviewing-a-design.md +9 -0
  67. package/llms/tasks/using-presets.md +19 -0
  68. package/llms-full.txt +207 -27
  69. package/llms.txt +1 -1
  70. package/package.json +4 -2
  71. package/registry.json +132 -30
  72. package/scripts/design-memory.mjs +7 -2
  73. package/scripts/design-presets.mjs +15 -4
  74. package/scripts/lint-rules.mjs +32 -1
  75. package/scripts/patches.mjs +219 -0
  76. package/scripts/sources.mjs +247 -0
  77. package/skills/sable/SKILL.md +16 -4
@@ -1,5 +1,10 @@
1
1
  // src/icon-sets/reicon.tsx
2
2
  import { Pipette } from "reicon-react/icons/Pipette";
3
+ import { AtSign } from "reicon-react/icons/AtSign";
4
+ import { ChartBar } from "reicon-react/icons/ChartBar";
5
+ import { Flag } from "reicon-react/icons/Flag";
6
+ import { Paperclip } from "reicon-react/icons/Paperclip";
7
+ import { Tag } from "reicon-react/icons/Tag";
3
8
  import { Key } from "reicon-react/icons/Key";
4
9
  import { Stop } from "reicon-react/icons/Stop";
5
10
  import { ThumbsDown } from "reicon-react/icons/ThumbsDown";
@@ -167,7 +172,14 @@ var ICONS = {
167
172
  "volume-low": VolumeLow2,
168
173
  "volume-off": VolumeCross,
169
174
  queue: Playlist,
170
- music: MusicNote
175
+ music: MusicNote,
176
+ // Added when a support inbox had no glyph for labels, attachments, reports,
177
+ // priority or mentions, and stood in `layout` and `list` for them.
178
+ tag: Tag,
179
+ paperclip: Paperclip,
180
+ chart: ChartBar,
181
+ flag: Flag,
182
+ "at-sign": AtSign
171
183
  };
172
184
  var WEIGHTS = {
173
185
  regular: "Outline",
package/dist/index.d.ts CHANGED
@@ -1926,7 +1926,11 @@ type ChartCategories = Record<string, {
1926
1926
  }>;
1927
1927
  /** A big number with a caption in the middle of a donut or radial chart. */
1928
1928
  interface ChartCenterLabel {
1929
- value: string;
1929
+ /**
1930
+ * The number. Pass a number to have it formatted: in full up to 9,999,
1931
+ * compact from 10,000 ("10.2K"). Pass a string for units or your own wording.
1932
+ */
1933
+ value: string | number;
1930
1934
  label?: string;
1931
1935
  }
1932
1936
  /** How the tooltip marks each row. */
@@ -2898,7 +2902,9 @@ declare namespace TableFooter {
2898
2902
  var displayName: string;
2899
2903
  }
2900
2904
  /**
2901
- * A table row. Hover-lifts; mark the selected row with `data-selected`.
2905
+ * A table row. Body rows hover-lift; header and footer rows stay still, since
2906
+ * nothing there responds to a click on the row. Mark the selected row with
2907
+ * `data-selected`.
2902
2908
  *
2903
2909
  * The selected fill is painted by the cells, each spilling 1px into the next
2904
2910
  * (a box-shadow, so layout does not move). A row's own background is painted
@@ -2961,6 +2967,7 @@ interface DataTableColumn<Row> {
2961
2967
  /** Extra classes for this column's header + cells. */
2962
2968
  className?: string;
2963
2969
  }
2970
+ type DataTableRowKey = string | number;
2964
2971
  interface DataTableProps<Row> {
2965
2972
  /** Column definitions, left to right. */
2966
2973
  columns: DataTableColumn<Row>[];
@@ -2970,8 +2977,21 @@ interface DataTableProps<Row> {
2970
2977
  rowKey?: (row: Row, index: number) => string | number;
2971
2978
  /** Row click handler — makes rows pointer-interactive. */
2972
2979
  onRowClick?: (row: Row) => void;
2973
- /** Mark a row visually selected (`data-selected`). */
2980
+ /** Mark a row visually selected (`data-selected`), e.g. the one open in a detail pane. */
2974
2981
  isRowSelected?: (row: Row) => boolean;
2982
+ /**
2983
+ * The checked rows, by `rowKey`, for bulk actions. With `onSelectedKeysChange`
2984
+ * it adds a checkbox column and a select-all box in the header. Controlled:
2985
+ * when the rows shown change (a filter, another view), set the keys you want
2986
+ * kept — usually none.
2987
+ */
2988
+ selectedKeys?: ReadonlySet<DataTableRowKey>;
2989
+ /** Called with the new set of checked keys. Its presence turns selection on. */
2990
+ onSelectedKeysChange?: (keys: Set<DataTableRowKey>) => void;
2991
+ /** A row checkbox's accessible name. Name the row: `(t) => \`Select ${t.subject}\``. @default "Select row" */
2992
+ rowSelectionLabel?: (row: Row) => string;
2993
+ /** The select-all checkbox's accessible name. @default (count) => `Select all ${count} shown` */
2994
+ selectAllLabel?: (count: number) => string;
2975
2995
  /** Initial sort. */
2976
2996
  defaultSort?: {
2977
2997
  key: string;
@@ -2986,7 +3006,8 @@ interface DataTableProps<Row> {
2986
3006
  /**
2987
3007
  * DataTable — a data-driven table over the Table primitives: a `columns` def + a
2988
3008
  * `data` array, with built-in client-side sorting (click a `sortable` header to
2989
- * cycle asc → desc → none), optional row click / selection, and an empty state.
3009
+ * cycle asc → desc → none), optional row click, checkbox selection for bulk
3010
+ * actions (`selectedKeys` + `onSelectedKeysChange`), and an empty state.
2990
3011
  * For server-side data or paging, sort/page the `data` you pass in and pair it
2991
3012
  * with `Pagination`.
2992
3013
  *
@@ -3000,7 +3021,7 @@ interface DataTableProps<Row> {
3000
3021
  * ]}
3001
3022
  * />
3002
3023
  */
3003
- declare function DataTable<Row>({ columns, data, rowKey, onRowClick, isRowSelected, defaultSort, empty, caption, className, }: DataTableProps<Row>): react.JSX.Element;
3024
+ declare function DataTable<Row>({ columns, data, rowKey, onRowClick, isRowSelected, selectedKeys, onSelectedKeysChange, rowSelectionLabel, selectAllLabel, defaultSort, empty, caption, className, }: DataTableProps<Row>): react.JSX.Element;
3004
3025
  declare namespace DataTable {
3005
3026
  var displayName: string;
3006
3027
  }
@@ -3995,9 +4016,14 @@ declare namespace BreadcrumbItem {
3995
4016
  var displayName: string;
3996
4017
  }
3997
4018
  interface BreadcrumbLinkProps extends ComponentPropsWithRef<"a"> {
4019
+ /**
4020
+ * Render another element, such as a router link, so navigating stays in the
4021
+ * app: `render={<Link to="/library" />}`. Keeps the crumb's styling.
4022
+ */
4023
+ render?: useRender.RenderProp;
3998
4024
  }
3999
4025
  /** An interactive ancestor crumb — muted, brightening to foreground on hover. */
4000
- declare function BreadcrumbLink({ className, ref, ...props }: BreadcrumbLinkProps): react.JSX.Element;
4026
+ declare function BreadcrumbLink({ className, render, ...props }: BreadcrumbLinkProps): react.ReactElement<unknown, string | react.JSXElementConstructor<any>>;
4001
4027
  declare namespace BreadcrumbLink {
4002
4028
  var displayName: string;
4003
4029
  }
@@ -5094,7 +5120,12 @@ declare function Sidebar({ collapsed, icons, variant, className, children, ...pr
5094
5120
  declare namespace Sidebar {
5095
5121
  var displayName: string;
5096
5122
  }
5097
- /** Brand/logo row pinned to the top of the rail. */
5123
+ /**
5124
+ * Brand/logo row pinned to the top of the rail. At least 64px tall, not exactly:
5125
+ * a second row under the brand (a search field, a notifications button) wraps
5126
+ * onto its own line and the header grows to hold it, where a fixed height
5127
+ * clipped it. Give that row `basis-full` (or `w-full`) to put it on its own line.
5128
+ */
5098
5129
  declare function SidebarHeader({ className, ...props }: ComponentPropsWithRef<"div">): react.JSX.Element;
5099
5130
  declare namespace SidebarHeader {
5100
5131
  var displayName: string;
@@ -5510,6 +5541,14 @@ interface FormProps extends ComponentPropsWithRef<"form"> {
5510
5541
  onFormSubmit?: Form$1.Props["onFormSubmit"];
5511
5542
  /** Imperative actions: `actionsRef.current.validate(name?)`. */
5512
5543
  actionsRef?: Form$1.Props["actionsRef"];
5544
+ /**
5545
+ * Your code owns validation: `onSubmit` always runs, and each Field shows its
5546
+ * `error`. Nothing is checked first, neither the Fields nor the browser, so a
5547
+ * `required` Field keeps its asterisk and `aria-required` without blocking the
5548
+ * submit. `validationMode`, `errors`, `onFormSubmit` and `actionsRef` do
5549
+ * nothing here: they drive Sable's own validation.
5550
+ */
5551
+ noValidate?: boolean;
5513
5552
  }
5514
5553
  /**
5515
5554
  * Form — a styled `<form>` that lays its fields out in a vertical column with
@@ -5522,14 +5561,22 @@ interface FormProps extends ComponentPropsWithRef<"form"> {
5522
5561
  * and pass each `Field` an `error` string. Library-agnostic by design.
5523
5562
  *
5524
5563
  * <Form onSubmit={handleSubmit}>
5525
- * <Field label="Email" error={errors.email}><Input type="email" /></Field>
5564
+ * <Field label="Email" required messages={{ valueMissing: "Enter your email." }}>
5565
+ * <Input type="email" />
5566
+ * </Field>
5526
5567
  * <Button type="submit">Save</Button>
5527
5568
  * </Form>
5569
+ *
5570
+ * Validating in your own code instead? Pass `noValidate`: `onSubmit` always
5571
+ * runs, and each Field shows the `error` you give it. Without it, an empty
5572
+ * `required` Field stops the submit before your handler could set that error.
5528
5573
  */
5529
- declare function Form({ className, onSubmit, onFormSubmit, noValidate, ...props }: FormProps): react.JSX.Element;
5574
+ declare function Form({ className, onSubmit, onFormSubmit, noValidate, validationMode, errors, actionsRef, ...props }: FormProps): react.JSX.Element;
5530
5575
  declare namespace Form {
5531
5576
  var displayName: string;
5532
5577
  }
5578
+ /** The native constraint flags of `ValidityState` a Field can word itself. */
5579
+ type ConstraintFlag = "valueMissing" | "typeMismatch" | "patternMismatch" | "tooShort" | "tooLong" | "rangeUnderflow" | "rangeOverflow" | "stepMismatch" | "badInput";
5533
5580
  interface FieldProps {
5534
5581
  /** Field label (wired to the control via htmlFor). */
5535
5582
  label?: ReactNode;
@@ -5542,6 +5589,13 @@ interface FieldProps {
5542
5589
  error?: ReactNode;
5543
5590
  /** Marks the field required: adds the control's `required` + a visual asterisk. */
5544
5591
  required?: boolean;
5592
+ /**
5593
+ * Your wording for a failed native constraint, by the `ValidityState` flag it
5594
+ * sets: `{ valueMissing: "Enter a subject.", typeMismatch: "That isn't an
5595
+ * email address." }`. A constraint without one shows the browser's message.
5596
+ * `error` still wins over both.
5597
+ */
5598
+ messages?: Partial<Record<ConstraintFlag, ReactNode>>;
5545
5599
  /**
5546
5600
  * Disables the control (and any Base UI control inside) and dims the label.
5547
5601
  * @default false
@@ -5590,7 +5644,7 @@ interface FieldProps {
5590
5644
  * </Field>
5591
5645
  * <Field label="Subscribe" orientation="horizontal"><Checkbox /></Field>
5592
5646
  */
5593
- declare function Field({ label, description, error, required, disabled, name, validate, validationMode, validationDebounceTime, orientation, className, children, }: FieldProps): react.JSX.Element;
5647
+ declare function Field({ label, description, error, required, messages, disabled, name, validate, validationMode, validationDebounceTime, orientation, className, children, }: FieldProps): react.JSX.Element;
5594
5648
  declare namespace Field {
5595
5649
  var displayName: string;
5596
5650
  }
@@ -6367,6 +6421,12 @@ interface CommandItem {
6367
6421
  icon?: string;
6368
6422
  /** Secondary text after the label — a destination, a type, an owner. */
6369
6423
  detail?: ReactNode;
6424
+ /**
6425
+ * Put `detail` on its own line under the label instead of after it. For
6426
+ * results that only their detail tells apart (two tickets with one subject):
6427
+ * beside a long label the detail truncates first.
6428
+ */
6429
+ stacked?: boolean;
6370
6430
  /**
6371
6431
  * End-aligned trailing slot: a shortcut (`<Kbd>`), a count — or, when the row
6372
6432
  * is `disabled`, the reason it is.
@@ -6538,6 +6598,8 @@ interface CommandMenuItemProps extends Omit<ComponentPropsWithRef<"div">, "title
6538
6598
  icon?: string;
6539
6599
  /** Secondary text after the label. */
6540
6600
  detail?: ReactNode;
6601
+ /** Put `detail` on its own line under the label, so it never truncates away first. */
6602
+ stacked?: boolean;
6541
6603
  /** End-aligned trailing slot: a shortcut, a count, or a disabled row's reason. */
6542
6604
  hint?: ReactNode;
6543
6605
  /**
@@ -6554,7 +6616,7 @@ interface CommandMenuItemProps extends Omit<ComponentPropsWithRef<"div">, "title
6554
6616
  * combobox: keyboard focus stays in the input and Enter clicks the highlighted
6555
6617
  * row, so the row itself is not in the tab order.
6556
6618
  */
6557
- declare function CommandMenuItem({ onSelect, icon, detail, hint, id: idProp, className, children, disabled, ...props }: CommandMenuItemProps): react.JSX.Element | null;
6619
+ declare function CommandMenuItem({ onSelect, icon, detail, stacked, hint, id: idProp, className, children, disabled, ...props }: CommandMenuItemProps): react.JSX.Element | null;
6558
6620
 
6559
6621
  /**
6560
6622
  * Listens for the platform's palette shortcut — ⌘K on macOS, Ctrl+K elsewhere —
@@ -7507,6 +7569,13 @@ interface ChatComposerProps extends Omit<ComponentPropsWithRef<"form">, "onSubmi
7507
7569
  onSend?: (value: string) => void;
7508
7570
  /** Placeholder for the field. @default "Send a message…" */
7509
7571
  placeholder?: string;
7572
+ /**
7573
+ * Which key sends. `enter` for chat: Enter sends, Shift+Enter breaks the line.
7574
+ * `mod-enter` for long-form replies (an email, a support answer): Enter breaks
7575
+ * the line and ⌘/Ctrl+Enter sends, so a paragraph break never mails a draft.
7576
+ * @default "enter"
7577
+ */
7578
+ sendOn?: "enter" | "mod-enter";
7510
7579
  /**
7511
7580
  * A reply is streaming. Disables send, and swaps it for a stop control when
7512
7581
  * `onStop` is supplied.
@@ -7553,7 +7622,8 @@ interface ChatComposerProps extends Omit<ComponentPropsWithRef<"form">, "onSubmi
7553
7622
  *
7554
7623
  * The three details that are the whole job:
7555
7624
  *
7556
- * - **Enter sends, Shift+Enter breaks the line** — and neither fires mid-IME.
7625
+ * - **Enter sends, Shift+Enter breaks the line** (or, with `sendOn="mod-enter"`,
7626
+ * Enter breaks it and ⌘/Ctrl+Enter sends) — and neither fires mid-IME.
7557
7627
  * A Japanese, Chinese, or Korean reader confirming a candidate in the
7558
7628
  * composition popup presses Enter to *choose a word*, and a composer that
7559
7629
  * reads that as "send" mails half a sentence. `event.nativeEvent.isComposing`
@@ -7564,7 +7634,7 @@ interface ChatComposerProps extends Omit<ComponentPropsWithRef<"form">, "onSubmi
7564
7634
  * Interrupting a long generation is the most common thing a reader wants
7565
7635
  * during one, and it belongs where their cursor already is.
7566
7636
  */
7567
- declare function ChatComposer({ value, defaultValue, onValueChange, onSend, placeholder, busy, onStop, disabled, invalid, attachments, leading, actions, onAttach, label, sendLabel, stopLabel, footer, fieldRef, className, children, ...props }: ChatComposerProps): react.JSX.Element;
7637
+ declare function ChatComposer({ value, defaultValue, onValueChange, onSend, placeholder, sendOn, busy, onStop, disabled, invalid, attachments, leading, actions, onAttach, label, sendLabel, stopLabel, footer, fieldRef, className, children, ...props }: ChatComposerProps): react.JSX.Element;
7568
7638
  declare namespace ChatComposer {
7569
7639
  var displayName: string;
7570
7640
  }
@@ -7626,6 +7696,9 @@ interface SettingsMenuProps extends Omit<ComponentProps<typeof Menu>, "children"
7626
7696
  *
7627
7697
  * Opens upward and end-aligned by default, because its home is the bottom-right
7628
7698
  * of a composer or a toolbar — where a downward menu would open off-screen.
7699
+ *
7700
+ * One setting opens straight to its options, under the row's label: a lone row
7701
+ * that then opens a submenu is two clicks for one choice.
7629
7702
  */
7630
7703
  declare function SettingsMenu({ summary, label, variant, size, side, align, disabled, className, children, ...props }: SettingsMenuProps): react.JSX.Element;
7631
7704
  declare namespace SettingsMenu {
@@ -8218,6 +8291,6 @@ interface UseCopyResult {
8218
8291
  */
8219
8292
  declare function useCopy(text: string, { timeout }?: UseCopyOptions): UseCopyResult;
8220
8293
 
8221
- declare const SABLE_UI_VERSION: "0.7.0";
8294
+ declare const SABLE_UI_VERSION: "0.8.0";
8222
8295
 
8223
- export { Accordion, AccordionItem, AccordionPanel, AccordionTrigger, AlertDialog, AlertDialogClose, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, AppHeader, type AppHeaderProps, AppShell, type AppShellProps, AreaChart, type AreaChartProps, type ArtTone, Attachment, type AttachmentProps, Avatar, AvatarFallback, AvatarGroup, AvatarGroupCount, type AvatarGroupCountProps, type AvatarGroupProps, AvatarImage, type AvatarProps, AvatarRoot, BADGE_APPEARANCES, BADGE_TONES, Badge, type BadgeAppearance, type BadgeProps, type BadgeTone, Banner, type BannerProps, BarChart, type BarChartProps, BottomNav, BottomNavItem, type BottomNavItemProps, BreadcrumbItem, type BreadcrumbItemProps, BreadcrumbLink, type BreadcrumbLinkProps, BreadcrumbPage, type BreadcrumbPageProps, BreadcrumbSeparator, type BreadcrumbSeparatorProps, Breadcrumbs, type BreadcrumbsProps, Browser, type BrowserProps, Bubble, type BubbleProps, BubbleReaction, type BubbleReactionProps, BubbleReactions, type BubbleReactionsProps, Button, type ButtonBleed, type ButtonProps, CHART_SERIES_COUNT, COMPONENT_GROUPS, COMPONENT_TAXONOMY, Calendar, type CalendarProps, Card, CardAction, CardContent, type CardContentProps, CardDescription, CardFooter, type CardFooterProps, CardHeader, CardList, type CardProps, CardTitle, type CardTitleProps, Carousel, type CarouselProps, type CarouselSlidesToShow, type ChartCategories, type ChartCenterLabel, type ChartCurve, type ChartDatum, type ChartSeries, type ChartTone, type ChartTooltipIndicator, type ChartTooltipOptions, type ChartValueFormatter, ChatComposer, type ChatComposerProps, Checkbox, CheckboxCard, type CheckboxCardProps, type CheckboxCardTone, CheckboxGroup, type CheckboxGroupProps, Code, CodeBlock, type CodeBlockProps, CodeHighlightProvider, type CodeHighlighter, type CodeProps, Collapsible, CollapsibleIndicator, CollapsiblePanel, CollapsibleTrigger, ColorField, type ColorFieldProps, Combobox, ComboboxChips, ComboboxClear, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, type ComboboxItemGroup, ComboboxItemIndicator, ComboboxList, ComboboxPortal, type ComboboxProps, ComboboxValue, ComboboxVirtualList, type ComboboxVirtualListProps, type CommandFilter, type CommandItem, CommandMenu, CommandMenuGroup, type CommandMenuGroupProps, CommandMenuItem, type CommandMenuItemProps, CommandMenuPanel, type CommandMenuPanelProps, type CommandMenuProps, CommandMenuTrigger, type CommandMenuTriggerProps, type ComponentGroup, type ComponentGuidance, ComponentMeta, type ComponentRegister, ContextCard, ContextCardArrow, ContextCardContent, ContextCardPortal, ContextCardTrigger, ContextMenu, ContextMenuContent, ContextMenuGroup, ContextMenuGroupLabel, ContextMenuItem, ContextMenuPortal, ContextMenuSeparator, ContextMenuTrigger, DataTable, type DataTableColumn, type DataTableProps, DatePicker, type DatePickerProps, DateTile, type DateTileProps, Density, DensityProvider, Density as DensityValue, DestructiveActionModal, type DestructiveActionModalProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, type DialogSize, DialogTitle, DialogTrigger, DisclosurePicker, DisclosurePickerEmpty, DisclosurePickerList, type DisclosurePickerListProps, DisclosurePickerOption, type DisclosurePickerOptionProps, DisclosurePickerPanel, type DisclosurePickerPanelProps, type DisclosurePickerProps, type DisclosurePickerSearch, DisclosurePickerTrigger, type DisclosurePickerTriggerProps, EmptyState, type EmptyStateProps, Entity, type EntityProps, Feedback, type FeedbackData, type FeedbackProps, type FeedbackRating, Field, type FieldProps, Fieldset, FieldsetContent, FieldsetDescription, FieldsetFooter, FieldsetLegend, FileDropzone, type FileDropzoneProps, type FileRejection, type FileRejectionCode, FontPicker, type FontPickerFont, type FontPickerOption, type FontPickerProps, Form, type FormProps, GlidingHighlight, type GlidingHighlightProps, GradientArt, type GradientArtProps, type Hsv, InlineStatus, type InlineStatusProps, type StatusTone as InlineTone, Input, type InputProps$1 as InputProps, Kbd, KbdGroup, type KbdGroupProps, type KbdProps, Label, type LabelProps$2 as LabelProps, LineChart, type LineChartProps, Marker, type MarkerProps, Marquee, type MarqueeProps, MediaImage, type MediaImageProps, MediaTile, type MediaTileProps, Menu, MenuCheckboxItem, MenuContent, MenuGroup, MenuGroupLabel, MenuItem, MenuPortal, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger, Message, type MessageProps, MessageScroller, type MessageScrollerHandle, type MessageScrollerProps, Meter, MeterIndicator, MeterLabel, type MeterSize, type MeterTone, MeterTrack, MeterValue, MiddleTruncate, type MiddleTruncateProps, type MotionPolicy, MotionProvider, type MotionProviderProps, Note, type NoteAction, type NoteProps, NotificationBadge, type NotificationBadgeProps, NumberField, type NumberFieldProps, type OrbMode, type OrbSize, OtpField, type OtpFieldProps, OverflowMenu, type OverflowMenuProps, PageHeader, type PageHeaderProps, PageLoader, type PageLoaderProps, Pagination, type PaginationProps, Panel, PanelGroup, PanelResizer, type PanelResizerProps, PanelSection, type PanelWidthBounds, Phone, type PhoneProps, PieChart, type PieChartProps, Pill, type PillProps, Popover, PopoverArrow, PopoverClose, PopoverContent, PopoverDescription, PopoverPortal, PopoverTitle, PopoverTrigger, Presence, type PresenceProps, type Presentation, PresentationProvider, Progress, ProgressIndicator, ProgressLabel, type ProgressSize, ProgressTrack, ProgressValue, PropertyPair, PropertyRow, RadarChart, type RadarChartProps, RadialChart, type RadialChartProps, Radio, RadioCard, type RadioCardProps, type RadioCardTone, RadioGroup, RelativeTime, type RelativeTimeProps, Reveal, type RevealProps, type Rgb, SABLE_UI_VERSION, SEGMENTED_BAR_TONES, STATUS_TONES, STATUS_TONE_ICON, type ScrollCommandOptions, Scroller, type ScrollerProps, ScrubField, type ScrubFieldProps, SearchInput, type SearchInputProps, SectionHeader, type SectionHeaderProps, SegmentedBar, type SegmentedBarProps, type SegmentedBarSegment, type SegmentedBarTone, Select, SelectContent, SelectGroup, SelectGroupLabel, SelectItem, SelectPortal, SelectSeparator, SelectTrigger, SelectValue, Separator, type SeparatorProps$3 as SeparatorProps, SettingsMenu, type SettingsMenuProps, SettingsRow, type SettingsRowProps, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetList, SheetPortal, SheetTitle, SheetTrigger, ShowMore, type ShowMoreProps, SideNav, type SideNavActiveVariant, SideNavGroup, type SideNavGroupProps, SideNavItem, type SideNavItemProps, type SideNavProps, type SideNavSize, Sidebar, SidebarBrand, type SidebarBrandProps, SidebarFooter, SidebarHeader, SidebarItem, type SidebarItemProps, SidebarNav, type SidebarProps, SimpleTooltip, Skeleton, Slider, SliderControl, SliderIndicator, SliderRoot, SliderThumb, SliderTrack, SliderValue, Sparkline, type SparklineProps, Spinner, type SpinnerProps, StatusBar, StatusBarGroup, StatusBarSeparator, StatusDot, type StatusDotProps, type StatusTone, type StepStatus, Stepper, StepperItem, type StepperItemProps, type StepperOrientation, type StepperProps, StreamingText, type StreamingTextProps, Switch, TRANSPARENT, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsPanel as TabsContent, TabsList, TabsPanel, TabsTrigger, TextReveal, type TextRevealProps, Textarea, type TextareaProps, ThemeId, ThemeManifest, ThemeMode$1 as ThemeManifestMode, type ThemeMode, ThemePreview, type ThemePreviewProps, ThemeSelector, type ThemeSelectorProps, ThemeSwitcher, type ThemeSwitcherProps, ThinkingOrb, type ThinkingOrbProps, ToastAction, type ToastApi, ToastClose, ToastContent, ToastDescription, type ToastManagerApi, type ToastOptions, type ToastPosition, ToastProvider, type ToastProviderProps, ToastRoot, ToastTitle, type ToastType, ToastViewport, Toggle, ToggleGroup, type ToggleGroupAppearance, Toggle as ToggleGroupItem, Toolbar, ToolbarButton, type ToolbarButtonProps, ToolbarGroup, type ToolbarGroupProps, ToolbarInput, type ToolbarInputProps, ToolbarLink, type ToolbarLinkProps, type ToolbarProps, ToolbarSeparator, type ToolbarSeparatorProps, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Tree, TreeAddRow, TreeEmpty, TreeRow, TreeSection, type UseCopyOptions, type UseCopyResult, type UseInViewOptions, type UsePanelWidthOptions, Video, type VideoProps, ViewTransitionName, type ViewTransitionNameProps, Workspace, WorkspaceBar, WorkspaceCanvas, accordionMeta, appHeaderMeta, appShellMeta, areaChartMeta, attachmentMeta, avatarGroupVariants, avatarMeta, avatarVariants, badgeMeta, badgeVariants, bannerMeta, bannerVariants, barChartMeta, bottomNavMeta, breadcrumbsMeta, browserMeta, bubbleMeta, buttonMeta, buttonVariants, calendarMeta, cardMeta, carouselMeta, chartColor, toneColor as chartToneColor, chatComposerMeta, checkboxCardMeta, checkboxMeta, cn, codeBlockMeta, codeMeta, collapsibleMeta, colorFieldMeta, comboboxMeta, commandMenuMeta, componentGuidance, componentLabel, componentSlug, componentsInGroup, contextCardMeta, contextMenuMeta, dataTableMeta, datePickerMeta, dateTileMeta, destructiveActionModalMeta, dialogMeta, disclosurePickerMeta, emptyStateMeta, entityMeta, feedbackMeta, fieldsetMeta, fileDropzoneMeta, fileDropzoneVariants, fontPickerMeta, formMeta, formatFileSize, formatHex, glidingHighlightMeta, gradientArtMeta, hsvToRgb, hueColor, inlineStatusMeta, inputMeta, isTransparent, kbdMeta, labelMeta, lineChartMeta, markerMeta, marqueeMeta, mediaImageMeta, mediaTileMeta, menuMeta, messageMeta, messageScrollerMeta, meterIndicatorVariants, meterMeta, meterTrackVariants, middleTruncateMeta, noteMeta, noteVariants, notificationBadgeMeta, notificationCountVariants, notificationDotVariants, numberFieldMeta, otpFieldMeta, overflowMenuMeta, pageHeaderMeta, pageLoaderMeta, paginationMeta, panelGroupMeta, panelSectionMeta, parseHex, phoneMeta, pieChartMeta, pillMeta, pillVariants, popoverMeta, progressMeta, progressTrackVariants, radarChartMeta, radialChartMeta, radioCardMeta, radioMeta, relativeTimeMeta, rgbToHsv, scrollerMeta, scrubFieldMeta, searchInputMeta, sectionHeaderMeta, segmentedBarMeta, segmentedBarSegmentVariants, segmentedBarVariants, selectMeta, separatorMeta, settingsMenuMeta, sheetMeta, sheetVariants, showMoreMeta, sideNavMeta, sidebarMeta, skeletonMeta, sliderMeta, sparklineMeta, spinnerMeta, startViewTransition, statusBarMeta, statusDotMeta, statusDotVariants, stepperConnectorVariants, stepperIndicatorVariants, stepperMeta, streamingTextMeta, supportsViewTransitions, switchMeta, tableMeta, tabsMeta, textareaMeta, themeSelectorMeta, themeSwitcherMeta, thinkingOrbMeta, toast, toastMeta, toggleMeta, toolbarGroupVariants, toolbarMeta, toolbarSeparatorVariants, toolbarVariants, tooltipMeta, treeIndent, treeMeta, useAnchoredDensity, useComboboxFilteredItems, useCommandMenuShortcut, useCopy, useDensity, useDisclosurePicker, useInView, useMotion, usePanelWidth, usePresentation, useReducedMotion, useScrollActivity, useSidebar, useToast, useToastManager, useTypeTier, videoMeta, workspaceMeta };
8296
+ export { Accordion, AccordionItem, AccordionPanel, AccordionTrigger, AlertDialog, AlertDialogClose, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, AppHeader, type AppHeaderProps, AppShell, type AppShellProps, AreaChart, type AreaChartProps, type ArtTone, Attachment, type AttachmentProps, Avatar, AvatarFallback, AvatarGroup, AvatarGroupCount, type AvatarGroupCountProps, type AvatarGroupProps, AvatarImage, type AvatarProps, AvatarRoot, BADGE_APPEARANCES, BADGE_TONES, Badge, type BadgeAppearance, type BadgeProps, type BadgeTone, Banner, type BannerProps, BarChart, type BarChartProps, BottomNav, BottomNavItem, type BottomNavItemProps, BreadcrumbItem, type BreadcrumbItemProps, BreadcrumbLink, type BreadcrumbLinkProps, BreadcrumbPage, type BreadcrumbPageProps, BreadcrumbSeparator, type BreadcrumbSeparatorProps, Breadcrumbs, type BreadcrumbsProps, Browser, type BrowserProps, Bubble, type BubbleProps, BubbleReaction, type BubbleReactionProps, BubbleReactions, type BubbleReactionsProps, Button, type ButtonBleed, type ButtonProps, CHART_SERIES_COUNT, COMPONENT_GROUPS, COMPONENT_TAXONOMY, Calendar, type CalendarProps, Card, CardAction, CardContent, type CardContentProps, CardDescription, CardFooter, type CardFooterProps, CardHeader, CardList, type CardProps, CardTitle, type CardTitleProps, Carousel, type CarouselProps, type CarouselSlidesToShow, type ChartCategories, type ChartCenterLabel, type ChartCurve, type ChartDatum, type ChartSeries, type ChartTone, type ChartTooltipIndicator, type ChartTooltipOptions, type ChartValueFormatter, ChatComposer, type ChatComposerProps, Checkbox, CheckboxCard, type CheckboxCardProps, type CheckboxCardTone, CheckboxGroup, type CheckboxGroupProps, Code, CodeBlock, type CodeBlockProps, CodeHighlightProvider, type CodeHighlighter, type CodeProps, Collapsible, CollapsibleIndicator, CollapsiblePanel, CollapsibleTrigger, ColorField, type ColorFieldProps, Combobox, ComboboxChips, ComboboxClear, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, type ComboboxItemGroup, ComboboxItemIndicator, ComboboxList, ComboboxPortal, type ComboboxProps, ComboboxValue, ComboboxVirtualList, type ComboboxVirtualListProps, type CommandFilter, type CommandItem, CommandMenu, CommandMenuGroup, type CommandMenuGroupProps, CommandMenuItem, type CommandMenuItemProps, CommandMenuPanel, type CommandMenuPanelProps, type CommandMenuProps, CommandMenuTrigger, type CommandMenuTriggerProps, type ComponentGroup, type ComponentGuidance, ComponentMeta, type ComponentRegister, type ConstraintFlag, ContextCard, ContextCardArrow, ContextCardContent, ContextCardPortal, ContextCardTrigger, ContextMenu, ContextMenuContent, ContextMenuGroup, ContextMenuGroupLabel, ContextMenuItem, ContextMenuPortal, ContextMenuSeparator, ContextMenuTrigger, DataTable, type DataTableColumn, type DataTableProps, type DataTableRowKey, DatePicker, type DatePickerProps, DateTile, type DateTileProps, Density, DensityProvider, Density as DensityValue, DestructiveActionModal, type DestructiveActionModalProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, type DialogSize, DialogTitle, DialogTrigger, DisclosurePicker, DisclosurePickerEmpty, DisclosurePickerList, type DisclosurePickerListProps, DisclosurePickerOption, type DisclosurePickerOptionProps, DisclosurePickerPanel, type DisclosurePickerPanelProps, type DisclosurePickerProps, type DisclosurePickerSearch, DisclosurePickerTrigger, type DisclosurePickerTriggerProps, EmptyState, type EmptyStateProps, Entity, type EntityProps, Feedback, type FeedbackData, type FeedbackProps, type FeedbackRating, Field, type FieldProps, Fieldset, FieldsetContent, FieldsetDescription, FieldsetFooter, FieldsetLegend, FileDropzone, type FileDropzoneProps, type FileRejection, type FileRejectionCode, FontPicker, type FontPickerFont, type FontPickerOption, type FontPickerProps, Form, type FormProps, GlidingHighlight, type GlidingHighlightProps, GradientArt, type GradientArtProps, type Hsv, InlineStatus, type InlineStatusProps, type StatusTone as InlineTone, Input, type InputProps$1 as InputProps, Kbd, KbdGroup, type KbdGroupProps, type KbdProps, Label, type LabelProps$2 as LabelProps, LineChart, type LineChartProps, Marker, type MarkerProps, Marquee, type MarqueeProps, MediaImage, type MediaImageProps, MediaTile, type MediaTileProps, Menu, MenuCheckboxItem, MenuContent, MenuGroup, MenuGroupLabel, MenuItem, MenuPortal, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger, Message, type MessageProps, MessageScroller, type MessageScrollerHandle, type MessageScrollerProps, Meter, MeterIndicator, MeterLabel, type MeterSize, type MeterTone, MeterTrack, MeterValue, MiddleTruncate, type MiddleTruncateProps, type MotionPolicy, MotionProvider, type MotionProviderProps, Note, type NoteAction, type NoteProps, NotificationBadge, type NotificationBadgeProps, NumberField, type NumberFieldProps, type OrbMode, type OrbSize, OtpField, type OtpFieldProps, OverflowMenu, type OverflowMenuProps, PageHeader, type PageHeaderProps, PageLoader, type PageLoaderProps, Pagination, type PaginationProps, Panel, PanelGroup, PanelResizer, type PanelResizerProps, PanelSection, type PanelWidthBounds, Phone, type PhoneProps, PieChart, type PieChartProps, Pill, type PillProps, Popover, PopoverArrow, PopoverClose, PopoverContent, PopoverDescription, PopoverPortal, PopoverTitle, PopoverTrigger, Presence, type PresenceProps, type Presentation, PresentationProvider, Progress, ProgressIndicator, ProgressLabel, type ProgressSize, ProgressTrack, ProgressValue, PropertyPair, PropertyRow, RadarChart, type RadarChartProps, RadialChart, type RadialChartProps, Radio, RadioCard, type RadioCardProps, type RadioCardTone, RadioGroup, RelativeTime, type RelativeTimeProps, Reveal, type RevealProps, type Rgb, SABLE_UI_VERSION, SEGMENTED_BAR_TONES, STATUS_TONES, STATUS_TONE_ICON, type ScrollCommandOptions, Scroller, type ScrollerProps, ScrubField, type ScrubFieldProps, SearchInput, type SearchInputProps, SectionHeader, type SectionHeaderProps, SegmentedBar, type SegmentedBarProps, type SegmentedBarSegment, type SegmentedBarTone, Select, SelectContent, SelectGroup, SelectGroupLabel, SelectItem, SelectPortal, SelectSeparator, SelectTrigger, SelectValue, Separator, type SeparatorProps$3 as SeparatorProps, SettingsMenu, type SettingsMenuProps, SettingsRow, type SettingsRowProps, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetList, SheetPortal, SheetTitle, SheetTrigger, ShowMore, type ShowMoreProps, SideNav, type SideNavActiveVariant, SideNavGroup, type SideNavGroupProps, SideNavItem, type SideNavItemProps, type SideNavProps, type SideNavSize, Sidebar, SidebarBrand, type SidebarBrandProps, SidebarFooter, SidebarHeader, SidebarItem, type SidebarItemProps, SidebarNav, type SidebarProps, SimpleTooltip, Skeleton, Slider, SliderControl, SliderIndicator, SliderRoot, SliderThumb, SliderTrack, SliderValue, Sparkline, type SparklineProps, Spinner, type SpinnerProps, StatusBar, StatusBarGroup, StatusBarSeparator, StatusDot, type StatusDotProps, type StatusTone, type StepStatus, Stepper, StepperItem, type StepperItemProps, type StepperOrientation, type StepperProps, StreamingText, type StreamingTextProps, Switch, TRANSPARENT, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsPanel as TabsContent, TabsList, TabsPanel, TabsTrigger, TextReveal, type TextRevealProps, Textarea, type TextareaProps, ThemeId, ThemeManifest, ThemeMode$1 as ThemeManifestMode, type ThemeMode, ThemePreview, type ThemePreviewProps, ThemeSelector, type ThemeSelectorProps, ThemeSwitcher, type ThemeSwitcherProps, ThinkingOrb, type ThinkingOrbProps, ToastAction, type ToastApi, ToastClose, ToastContent, ToastDescription, type ToastManagerApi, type ToastOptions, type ToastPosition, ToastProvider, type ToastProviderProps, ToastRoot, ToastTitle, type ToastType, ToastViewport, Toggle, ToggleGroup, type ToggleGroupAppearance, Toggle as ToggleGroupItem, Toolbar, ToolbarButton, type ToolbarButtonProps, ToolbarGroup, type ToolbarGroupProps, ToolbarInput, type ToolbarInputProps, ToolbarLink, type ToolbarLinkProps, type ToolbarProps, ToolbarSeparator, type ToolbarSeparatorProps, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Tree, TreeAddRow, TreeEmpty, TreeRow, TreeSection, type UseCopyOptions, type UseCopyResult, type UseInViewOptions, type UsePanelWidthOptions, Video, type VideoProps, ViewTransitionName, type ViewTransitionNameProps, Workspace, WorkspaceBar, WorkspaceCanvas, accordionMeta, appHeaderMeta, appShellMeta, areaChartMeta, attachmentMeta, avatarGroupVariants, avatarMeta, avatarVariants, badgeMeta, badgeVariants, bannerMeta, bannerVariants, barChartMeta, bottomNavMeta, breadcrumbsMeta, browserMeta, bubbleMeta, buttonMeta, buttonVariants, calendarMeta, cardMeta, carouselMeta, chartColor, toneColor as chartToneColor, chatComposerMeta, checkboxCardMeta, checkboxMeta, cn, codeBlockMeta, codeMeta, collapsibleMeta, colorFieldMeta, comboboxMeta, commandMenuMeta, componentGuidance, componentLabel, componentSlug, componentsInGroup, contextCardMeta, contextMenuMeta, dataTableMeta, datePickerMeta, dateTileMeta, destructiveActionModalMeta, dialogMeta, disclosurePickerMeta, emptyStateMeta, entityMeta, feedbackMeta, fieldsetMeta, fileDropzoneMeta, fileDropzoneVariants, fontPickerMeta, formMeta, formatFileSize, formatHex, glidingHighlightMeta, gradientArtMeta, hsvToRgb, hueColor, inlineStatusMeta, inputMeta, isTransparent, kbdMeta, labelMeta, lineChartMeta, markerMeta, marqueeMeta, mediaImageMeta, mediaTileMeta, menuMeta, messageMeta, messageScrollerMeta, meterIndicatorVariants, meterMeta, meterTrackVariants, middleTruncateMeta, noteMeta, noteVariants, notificationBadgeMeta, notificationCountVariants, notificationDotVariants, numberFieldMeta, otpFieldMeta, overflowMenuMeta, pageHeaderMeta, pageLoaderMeta, paginationMeta, panelGroupMeta, panelSectionMeta, parseHex, phoneMeta, pieChartMeta, pillMeta, pillVariants, popoverMeta, progressMeta, progressTrackVariants, radarChartMeta, radialChartMeta, radioCardMeta, radioMeta, relativeTimeMeta, rgbToHsv, scrollerMeta, scrubFieldMeta, searchInputMeta, sectionHeaderMeta, segmentedBarMeta, segmentedBarSegmentVariants, segmentedBarVariants, selectMeta, separatorMeta, settingsMenuMeta, sheetMeta, sheetVariants, showMoreMeta, sideNavMeta, sidebarMeta, skeletonMeta, sliderMeta, sparklineMeta, spinnerMeta, startViewTransition, statusBarMeta, statusDotMeta, statusDotVariants, stepperConnectorVariants, stepperIndicatorVariants, stepperMeta, streamingTextMeta, supportsViewTransitions, switchMeta, tableMeta, tabsMeta, textareaMeta, themeSelectorMeta, themeSwitcherMeta, thinkingOrbMeta, toast, toastMeta, toggleMeta, toolbarGroupVariants, toolbarMeta, toolbarSeparatorVariants, toolbarVariants, tooltipMeta, treeIndent, treeMeta, useAnchoredDensity, useComboboxFilteredItems, useCommandMenuShortcut, useCopy, useDensity, useDisclosurePicker, useInView, useMotion, usePanelWidth, usePresentation, useReducedMotion, useScrollActivity, useSidebar, useToast, useToastManager, useTypeTier, videoMeta, workspaceMeta };
package/dist/index.js CHANGED
@@ -160,7 +160,7 @@ import { PresentationProvider, usePresentation } from "./lib/presentation.js";
160
160
  import { useScrollActivity } from "./lib/use-scroll-activity.js";
161
161
  import { useCopy } from "./lib/use-copy.js";
162
162
  import { STATUS_TONES, STATUS_TONE_ICON } from "./lib/status-tone.js";
163
- var SABLE_UI_VERSION = "0.7.0";
163
+ var SABLE_UI_VERSION = "0.8.0";
164
164
  export {
165
165
  ART_TOKENS,
166
166
  CHART_SERIES_COUNT,
@@ -12,7 +12,10 @@ type Edge = "top" | "bottom" | "left" | "right";
12
12
  * - `feed` 640px — single-column timeline / reading feed
13
13
  * - `content` 896px — general content + settings/admin panes (some 2-up fields)
14
14
  * - `wide` 1280px — dashboards, tables, multi-column grids
15
- * - `full` 1536px — full-bleed safety ceiling
15
+ * - `full` 1536px — the largest cap; keeps the inset (edge to edge is `bleed`)
16
+ *
17
+ * Omit `max` for fluid: work views whose panes, board or canvas use the space.
18
+ * A cap is a ceiling, reached only when the viewport minus app chrome exceeds it.
16
19
  * - `ultrawide` 1800px — legacy; prefer `full`
17
20
  */
18
21
  type RegionMax = "prose" | "form" | "feed" | "content" | "wide" | "full" | "ultrawide";
@@ -24,7 +27,7 @@ interface RegionProps extends ComponentPropsWithRef<"div"> {
24
27
  /**
25
28
  * Opt-in centered max-width cap: a purpose-named region ("prose" | "form" |
26
29
  * "feed" | "content" | "wide" | "full") or any raw CSS length (e.g. "56rem").
27
- * Omit for fully fluid, edge-to-edge (the default).
30
+ * Omit for fluid (the default): full width inside the page inset.
28
31
  */
29
32
  max?: RegionMax | (string & {});
30
33
  /** Full-bleed: edge to edge with no inset. Overrides `inset`. */
@@ -12,8 +12,13 @@ function categoryText(v, locale) {
12
12
  function approxTextWidth(text) {
13
13
  return text.length * 6.6 + 4;
14
14
  }
15
+ function centerValueText(value, locale) {
16
+ if (typeof value === "string") return value;
17
+ return Math.abs(value) < 1e4 ? new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value) : new Intl.NumberFormat(locale, { notation: "compact", maximumFractionDigits: 1 }).format(value);
18
+ }
15
19
  export {
16
20
  approxTextWidth,
17
21
  categoryText,
22
+ centerValueText,
18
23
  chartFormatters
19
24
  };
@@ -45,11 +45,16 @@ var componentGuidance = {
45
45
  keywords: ["region", "page width", "container", "layout"],
46
46
  description: "Use Region as the page-width primitive that applies fluid page inset and an optional purpose-named max width.",
47
47
  dos: [
48
- "Choose the max value by content role, such as prose, form, feed, content, wide, or full.",
48
+ "Choose the max value by what the person does on the page: read (prose), fill in a form (form), scroll one stream (feed), review one record or settings (content), scan and compare rows or cards (wide).",
49
+ "Omit max (fluid) for work across panes, a board, an editor or a map, where a flexible part uses the extra width; cap text inside it with --measure-prose.",
50
+ "Give sibling routes in one nav the same width so the header does not jump between them.",
51
+ "Review a capped or fluid route at 1920px and 2560px: a cap is a ceiling, so below the cap plus app chrome every choice looks the same.",
49
52
  "Use Region near the route or section boundary so inner layout stays intentional."
50
53
  ],
51
54
  donts: [
52
- "Do not use Region as a global wrapper that forces every page into the same max width."
55
+ "Do not use Region as a global wrapper that forces every page into the same max width.",
56
+ "Do not go fluid when the extra width only widens the gaps between fixed columns; cap it.",
57
+ "Do not read full as edge to edge: it is the largest cap and keeps the page inset. Use bleed for edge to edge."
53
58
  ],
54
59
  related: { components: ["Page", "Grid", "Columns"] }
55
60
  }),
@@ -9,11 +9,12 @@ function HeadingRow({
9
9
  titleClassName,
10
10
  band,
11
11
  leading,
12
- actions
12
+ actions,
13
+ titleBasis = "basis-48"
13
14
  }) {
14
15
  const hasControls = Boolean(leading || actions);
15
16
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-x-3 gap-y-2", children: [
16
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 basis-48 items-start gap-2", children: [
17
+ /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-1 items-start gap-2", titleBasis), children: [
17
18
  leading ? /* @__PURE__ */ jsx("div", { className: cn("shrink-0", BLEED_FIRST_START), children: leading }) : null,
18
19
  title ? /* @__PURE__ */ jsx(
19
20
  Title,
@@ -7,12 +7,25 @@ function trimLabel(children) {
7
7
  }
8
8
  if (children == null || typeof children === "boolean") return children;
9
9
  if (isValidElement(children)) return children;
10
+ const out = [];
11
+ let run = [];
10
12
  let wrapped = false;
11
- const out = Children.map(children, (child, i) => {
12
- if (typeof child !== "string" && typeof child !== "number") return child;
13
+ const flush = () => {
14
+ if (!run.length) return;
13
15
  wrapped = true;
14
- return /* @__PURE__ */ jsx("span", { className: "sable-label-trim", children: child }, `label-${i}`);
15
- });
16
+ out.push(
17
+ /* @__PURE__ */ jsx("span", { className: "sable-label-trim", children: run.join("") }, `label-${out.length}`)
18
+ );
19
+ run = [];
20
+ };
21
+ for (const child of Children.toArray(children)) {
22
+ if (typeof child === "string" || typeof child === "number") run.push(child);
23
+ else {
24
+ flush();
25
+ out.push(child);
26
+ }
27
+ }
28
+ flush();
16
29
  return wrapped ? out : children;
17
30
  }
18
31
  export {
@@ -77,6 +77,12 @@ declare function checkLabelledFills(tokens: {
77
77
  unmeasured: string[];
78
78
  };
79
79
 
80
+ /**
81
+ * Page widths: the inset and the role caps. A product sets their values, keeping
82
+ * the role names; bundled themes already do. Opt-in, so a template or snapshot
83
+ * leaves them out rather than copying defaults over widths an app set itself.
84
+ */
85
+ declare const PAGE_WIDTH_TOKENS: readonly ["page-inset", "region-form", "region-feed", "region-content", "region-wide", "region-full"];
80
86
  /** The public theme vocabulary. Presets never need component overrides. */
81
87
  declare const PRESET_TOKEN_NAMES: readonly string[];
82
88
  interface SablePreset {
@@ -137,4 +143,4 @@ declare function presetLabelContrast(input: SablePreset): {
137
143
  unmeasured: string[];
138
144
  };
139
145
 
140
- export { BRAND_FILLS, LABELLED_FILLS, LABEL_CONTRAST_RULE, type LabelFinding, type OklchColor, PRESET_TOKEN_NAMES, type PresetException, STATUS_FILLS, type SablePreset, checkLabelledFills, fitFillToInk, inkFor, inkPolarity, labelContrast, parsePreset, presetCss, presetLabelContrast, presetManifest, validatePreset };
146
+ export { BRAND_FILLS, LABELLED_FILLS, LABEL_CONTRAST_RULE, type LabelFinding, type OklchColor, PAGE_WIDTH_TOKENS, PRESET_TOKEN_NAMES, type PresetException, STATUS_FILLS, type SablePreset, checkLabelledFills, fitFillToInk, inkFor, inkPolarity, labelContrast, parsePreset, presetCss, presetLabelContrast, presetManifest, validatePreset };
@@ -25,6 +25,14 @@ import {
25
25
  inkPolarity,
26
26
  labelContrast
27
27
  } from "../themes/contrast.js";
28
+ var PAGE_WIDTH_TOKENS = [
29
+ "page-inset",
30
+ "region-form",
31
+ "region-feed",
32
+ "region-content",
33
+ "region-wide",
34
+ "region-full"
35
+ ];
28
36
  var PRESET_TOKEN_NAMES = [.../* @__PURE__ */ new Set([
29
37
  ...SEMANTIC_TOKENS,
30
38
  ...WORKSPACE_SURFACE_TOKENS.map((name) => `theme-${name}`),
@@ -45,6 +53,7 @@ var PRESET_TOKEN_NAMES = [.../* @__PURE__ */ new Set([
45
53
  "font-mono",
46
54
  "font-display",
47
55
  "spacing",
56
+ ...PAGE_WIDTH_TOKENS,
48
57
  "theme-shadow-sm",
49
58
  "theme-shadow",
50
59
  "theme-shadow-md",
@@ -202,6 +211,7 @@ export {
202
211
  BRAND_FILLS,
203
212
  LABELLED_FILLS2 as LABELLED_FILLS,
204
213
  LABEL_CONTRAST_RULE2 as LABEL_CONTRAST_RULE,
214
+ PAGE_WIDTH_TOKENS,
205
215
  PRESET_TOKEN_NAMES,
206
216
  STATUS_FILLS,
207
217
  checkLabelledFills2 as checkLabelledFills,
package/dist/styles.css CHANGED
@@ -375,9 +375,15 @@
375
375
 
376
376
  /* The Switch knob when OFF: light in BOTH modes, like every physical toggle.
377
377
  It used to be `--background`, which in a dark theme is a near-black knob on
378
- a dark track (well under 3:1). When ON the knob takes `--primary-foreground`,
379
- the ink every theme already tunes against its primary fill. */
378
+ a dark track (well under 3:1). */
380
379
  --switch-thumb: var(--theme-switch-thumb, oklch(99% 0.002 90));
380
+ /* ON, the knob stays white too. It used to take `--primary-foreground`, the
381
+ ink tuned for LABELS on the primary fill, so a mid-light brand colour that
382
+ needs dark text gave a dark knob, which no switch has. A knob is a shape, not
383
+ text: the track carries the state, and the knob only has to separate from
384
+ it, which white does on any track short of near-white. So it turns dark
385
+ only on a track lighter than L 0.9 (the near-white primary of a dark mode). */
386
+ --switch-thumb-on: var(--theme-switch-thumb-on, oklch(from var(--primary) clamp(0.25, calc((0.9 - l) * 1000), 0.99) 0.002 90));
381
387
 
382
388
  /* The contact shadow under a knob: the Switch thumb, the Slider thumb, the
383
389
  ColorField handle. NOT the elevation ladder. `shadow-sm` is a surface's
@@ -1522,6 +1528,25 @@
1522
1528
  visibility utilities the app-shell components already use.
1523
1529
  ========================================================================== */
1524
1530
 
1531
+ /* Each element owns its breakpoint values. Custom properties inherit, so a
1532
+ breakpoint a nested Grid or Col leaves unset read its ancestor's: a `cols={2}`
1533
+ Grid inside `Columns count={{ lg: 12 }}` drew 12 tracks at lg. Resetting
1534
+ them here makes an unset one invalid, so the fallback chain below runs on the
1535
+ element itself; the values it was given are inline and win over this. */
1536
+ [data-sable-col] {
1537
+ --col-span-base: initial; --col-span-sm: initial; --col-span-md: initial;
1538
+ --col-span-lg: initial; --col-span-xl: initial; --col-span-2xl: initial;
1539
+ --col-start-base: initial; --col-start-sm: initial; --col-start-md: initial;
1540
+ --col-start-lg: initial; --col-start-xl: initial; --col-start-2xl: initial;
1541
+ }
1542
+ [data-sable-grid-cols] {
1543
+ --cols-base: initial; --cols-sm: initial; --cols-md: initial;
1544
+ --cols-lg: initial; --cols-xl: initial; --cols-2xl: initial;
1545
+ }
1546
+ [data-sable-split] {
1547
+ --split-gap: initial;
1548
+ }
1549
+
1525
1550
  /* `Col span={{ base, md, lg }}` / `start={…}` — each breakpoint resolves to the
1526
1551
  most specific value defined at or below it (mobile-first cascade). */
1527
1552
  [data-sable-col] {
@@ -51,7 +51,7 @@ export function TrafficSourcesBlock({ className, framed = true }: TrafficSources
51
51
  index="source"
52
52
  valueKey="visitors"
53
53
  donut
54
- centerLabel={{ value: total.toLocaleString("en-US"), label: "Visitors" }}
54
+ centerLabel={{ value: total, label: "Visitors" }}
55
55
  />
56
56
  </CardContent>
57
57
  <CardFooter className="text-body-sm text-muted-foreground">
@@ -56,11 +56,13 @@ export function TrafficTrendBlock({ className, framed = true }: TrafficTrendBloc
56
56
  const [range, setRange] = useState("90d")
57
57
  const shown = days.slice(-(ranges.find((r) => r.id === range)?.days ?? 90))
58
58
  return (
59
- <Card variant={framed ? "default" : "flat"} className={cn("w-full max-w-3xl", className)}>
60
- <CardHeader>
59
+ <Card variant={framed ? "default" : "flat"} className={cn("@container/trend w-full max-w-3xl", className)}>
60
+ <CardHeader className="@max-sm/trend:has-data-[slot=card-action]:grid-cols-1">
61
61
  <CardTitle render={<h2 />}>Visitors</CardTitle>
62
62
  <CardDescription>Desktop and mobile, by day.</CardDescription>
63
- <CardAction>
63
+ {/* Beside the title on a wide card; under it on a narrow one, where three
64
+ ranges would squeeze the title and description into a sliver. */}
65
+ <CardAction className="@max-sm/trend:col-start-1 @max-sm/trend:row-span-1 @max-sm/trend:row-start-auto @max-sm/trend:mt-2 @max-sm/trend:justify-self-start">
64
66
  <ToggleGroup value={[range]} onValueChange={(v: unknown[]) => v[0] && setRange(String(v[0]))} aria-label="Time range">
65
67
  {ranges.map((r) => (
66
68
  <Toggle key={r.id} value={r.id}>
@@ -31,7 +31,7 @@ Use Breadcrumbs to show the user's location inside a hierarchy and provide light
31
31
  | Name | Type | Description |
32
32
  | --- | --- | --- |
33
33
  | BreadcrumbItem | ComponentPropsWithRef<'li'> | A single crumb slot (<li>) holding a link or the current page. |
34
- | BreadcrumbLink | ComponentPropsWithRef<'a'> | An interactive ancestor crumb (<a>). Muted by default, brightens to foreground on hover/focus. |
34
+ | BreadcrumbLink | ComponentPropsWithRef<'a'> & { render?: useRender.RenderProp } | An interactive ancestor crumb (<a>). Muted by default, brightens to foreground on hover/focus. render composes another element with the crumb's styling, e.g. a router link: render={<Link to="/library" />}, so navigating stays in the app. |
35
35
  | BreadcrumbPage | ComponentPropsWithRef<'span'> | The current-page crumb (<span aria-current="page">). Non-interactive, full-contrast. |
36
36
  | BreadcrumbSeparator | ComponentPropsWithRef<'li'> + { children? } | Decorative divider (<li aria-hidden>) between crumbs. Defaults to a chevron-right icon; pass children to swap the glyph. |
37
37
 
@@ -13,6 +13,7 @@ Use Button when the user commits an action, submits a form, opens UI, or confirm
13
13
  ### Best practices
14
14
 
15
15
  - Do: Use a single primary button in a view or dense panel so the action hierarchy stays obvious.
16
+ - Do: For a copy control, pair an icon Button with `useCopy(text, { timeout? })`. It takes the text when the hook is called and returns `{ copy, copied }`; `copy()` takes no argument, so pass the value the button copies to the hook, not to `copy`.
16
17
  - Do: Write labels as actions, such as "Save changes" or "Delete draft", instead of vague labels like "OK".
17
18
  - Do: Use loading with loadingLabel for async work so the action cannot double-fire and the state is announced.
18
19
  - Do: Put icons in iconStart / iconEnd rather than as children, so the button applies its optical padding. Start icons say what the action is (plus, share); end icons say where it goes (chevron-right, external).
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Status:** stable
4
4
 
5
- The input half of a conversation: one surface holding attachments, an auto-growing field, and its controls. Enter sends, Shift+Enter breaks the line, and send becomes stop while a reply streams.
5
+ The input half of a conversation: one surface holding attachments, an auto-growing field, and its controls. Enter sends, Shift+Enter breaks the line (sendOn="mod-enter" swaps them for long-form replies), and send becomes stop while a reply streams.
6
6
 
7
7
  **Keywords:** chat input, composer, message input, prompt input, send message, ai chat, support chat, textarea
8
8
 
@@ -19,7 +19,7 @@ Pairs with MessageScroller to make a working chat. A single surface rather than
19
19
  - Do: Building a docked agent panel inside a tool? Wrap the whole conversation — scroller, messages and composer — in `<Density value="compact">`. The entire set follows the workspace register from there: prose drops a tier, the rhythm tightens, and the controls come off the compact ladder. Do not hand-size it at the call site.
20
20
  - Don't: Do not clear a controlled composer for the user on send. Only the caller knows whether the send succeeded, and clearing on their behalf loses the message when it did not.
21
21
  - Don't: Do not add your own Enter-to-send handler on top. The built-in one already guards against firing mid-IME-composition, which is the line hand-rolled chat inputs miss.
22
- - Don't: Do not use it as a general multi-line input. That is `Textarea` — this one submits on Enter, which is wrong for any field inside a larger form.
22
+ - Don't: Do not use it as a general multi-line input inside a larger form. That is `Textarea`. A standalone reply box that sends multi-paragraph messages (email, support replies) is this one with sendOn="mod-enter".
23
23
  - Don't: Do not override the field's type utility to make it match your transcript. The field and `Bubble` both read the same tier already, which is what stops a message changing size the moment it is sent — overriding one breaks that pairing.
24
24
  - Don't: Do not remove the height cap to let the field grow without limit. A pasted essay would push the conversation off the screen; past the cap it scrolls.
25
25
 
@@ -41,6 +41,7 @@ Pairs with MessageScroller to make a working chat. A single surface rather than
41
41
  | onValueChange | (value: string) => void | — | Notified on every keystroke. Required when `value` is supplied. |
42
42
  | onSend | (value: string) => void | — | Called with the trimmed message. An uncontrolled composer clears itself afterwards; a controlled one is the caller's to clear. |
43
43
  | placeholder | string | "Send a message…" | Placeholder for the field. |
44
+ | sendOn | "enter" \| "mod-enter" | "enter" | Which key sends. enter for chat (Shift+Enter breaks the line). mod-enter for long-form replies such as an email or a support answer: Enter breaks the line and Cmd/Ctrl+Enter sends, so a paragraph break never mails a draft. Say so in footer ("Cmd+Enter to send"). |
44
45
  | busy | boolean | false | A reply is streaming. Disables send, and swaps it for a stop control when `onStop` is supplied. |
45
46
  | onStop | () => void | — | Interrupt the in-flight reply. Supplying it turns send into stop while busy. |
46
47
  | disabled | boolean | false | Block sending entirely — over a limit, disconnected, read-only thread. Distinct from `busy`, which is temporary and offers a way out (stop). |