gridsmith-ui 0.7.0 → 0.9.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 CHANGED
@@ -2,12 +2,14 @@ import * as react from 'react';
2
2
  import { ButtonHTMLAttributes, ReactNode, InputHTMLAttributes, LabelHTMLAttributes, TextareaHTMLAttributes, Ref, CSSProperties, ReactElement, HTMLAttributes, AnchorHTMLAttributes, ComponentType } from 'react';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { IconName } from './icons.js';
5
- import { B as BreakpointKey } from './use-breakpoint-BfKzmkxx.js';
6
- export { a as BreakpointWidthProvider, u as useBreakpoint } from './use-breakpoint-BfKzmkxx.js';
5
+ import { C as ColumnKind, B as BreakpointKey } from './table-utils-GounRE6s.js';
6
+ export { a as BreakpointWidthProvider, u as useBreakpoint } from './table-utils-GounRE6s.js';
7
7
 
8
8
  type ButtonVariant = "default" | "secondary" | "tertiary" | "outline" | "ghost" | "destructive" | "success" | "warning" | "link";
9
9
  type ButtonSize = "xs" | "sm" | "md" | "lg" | "icon-xs" | "icon-sm" | "icon" | "icon-lg";
10
- declare const ButtonSizeContext: react.Context<ButtonSize | null>;
10
+ type ControlSize = "sm" | "md" | "lg";
11
+ declare const ControlSizeContext: react.Context<ControlSize | null>;
12
+ declare const ButtonSizeContext: react.Context<ControlSize | null>;
11
13
  interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
12
14
  variant?: ButtonVariant;
13
15
  size?: ButtonSize;
@@ -55,8 +57,8 @@ interface BulkActionBarProps {
55
57
  }
56
58
  declare function BulkActionBar({ selectedCount, actions, onClearSelection, className }: BulkActionBarProps): react_jsx_runtime.JSX.Element | null;
57
59
 
58
- type InputSize = "sm" | "md";
59
- declare function Input({ className, size, error, prefix, suffix, ...props }: Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "prefix"> & {
60
+ type InputSize = "sm" | "md" | "lg";
61
+ declare function Input({ className, size: sizeProp, error, prefix, suffix, ...props }: Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "prefix"> & {
60
62
  size?: InputSize;
61
63
  error?: boolean;
62
64
  prefix?: ReactNode;
@@ -88,7 +90,7 @@ interface Option {
88
90
  label: string;
89
91
  group?: string;
90
92
  }
91
- type DropdownSize = "sm" | "md";
93
+ type DropdownSize = "sm" | "md" | "lg";
92
94
  interface DropdownProps {
93
95
  options: Option[];
94
96
  value: string | string[];
@@ -108,7 +110,7 @@ interface DropdownProps {
108
110
  /** Accessible name for the trigger, for when there is no visible `label` (e.g. in a toolbar). */
109
111
  "aria-label"?: string;
110
112
  }
111
- declare function Dropdown({ options, value, onChange, label, disabled, placeholder, multiple, searchable, size, className, ref, container, error, showChips, "aria-label": ariaLabel, }: DropdownProps): react_jsx_runtime.JSX.Element;
113
+ declare function Dropdown({ options, value, onChange, label, disabled, placeholder, multiple, searchable, size: sizeProp, className, ref, container, error, showChips, "aria-label": ariaLabel, }: DropdownProps): react_jsx_runtime.JSX.Element;
112
114
 
113
115
  interface ComboboxOption {
114
116
  value: string;
@@ -126,8 +128,9 @@ interface ComboboxProps {
126
128
  ref?: Ref<HTMLDivElement>;
127
129
  container?: Element | DocumentFragment;
128
130
  error?: boolean;
131
+ size?: ControlSize;
129
132
  }
130
- declare function Combobox({ value, onChange, options, placeholder, disabled, loading, className, ref, container, error }: ComboboxProps): react_jsx_runtime.JSX.Element;
133
+ declare function Combobox({ value, onChange, options, placeholder, disabled, loading, className, ref, container, error, size: sizeProp }: ComboboxProps): react_jsx_runtime.JSX.Element;
131
134
 
132
135
  type CheckboxSize = "sm" | "md";
133
136
  interface CheckboxProps {
@@ -186,6 +189,7 @@ interface DatePickerProps {
186
189
  label?: string;
187
190
  /** Forwarded to the trigger button so an external Label htmlFor can be associated. Defaults to a generated id used by the built-in label. */
188
191
  id?: string;
192
+ size?: ControlSize;
189
193
  /** Earliest / latest selectable day (inclusive). Days outside are disabled. */
190
194
  min?: Date;
191
195
  max?: Date;
@@ -200,7 +204,7 @@ interface DatePickerProps {
200
204
  end?: Date | null;
201
205
  };
202
206
  }
203
- declare function DatePicker({ value, onChange, placeholder, disabled, className, ref, container, error, label, id, min, max, range }: DatePickerProps): react_jsx_runtime.JSX.Element;
207
+ declare function DatePicker({ value, onChange, placeholder, disabled, className, ref, container, error, label, id, size: sizeProp, min, max, range }: DatePickerProps): react_jsx_runtime.JSX.Element;
204
208
 
205
209
  interface DateRange {
206
210
  start: Date | null;
@@ -230,6 +234,7 @@ interface DateRangePickerProps {
230
234
  presets?: DateRangePreset[];
231
235
  /** First day of the week. Default 0 (Sunday). */
232
236
  weekStartsOn?: 0 | 1;
237
+ size?: ControlSize;
233
238
  }
234
239
  declare const DEFAULT_DATE_RANGE_PRESETS: DateRangePreset[];
235
240
  /**
@@ -238,7 +243,7 @@ declare const DEFAULT_DATE_RANGE_PRESETS: DateRangePreset[];
238
243
  * the end (clicking before the start restarts the selection). Closes on
239
244
  * Escape or outside click. Pair with <Field> for label/hint/error wiring.
240
245
  */
241
- declare function DateRangePicker({ value, onChange, placeholder, disabled, error, label, id, className, ref, container, min, max, presets, weekStartsOn, }: DateRangePickerProps): react_jsx_runtime.JSX.Element;
246
+ declare function DateRangePicker({ value, onChange, placeholder, disabled, error, label, id, className, ref, container, min, max, presets, weekStartsOn, size: sizeProp, }: DateRangePickerProps): react_jsx_runtime.JSX.Element;
242
247
 
243
248
  interface FileUploadProps {
244
249
  onFiles: (files: File[]) => void;
@@ -284,8 +289,9 @@ interface TimePickerProps {
284
289
  error?: boolean;
285
290
  /** Forwarded to the trigger button so a Label htmlFor can be associated. */
286
291
  id?: string;
292
+ size?: ControlSize;
287
293
  }
288
- declare function TimePicker({ value, onChange, use24Hour, minuteStep, disabled, className, ref, container, error, id, }: TimePickerProps): react_jsx_runtime.JSX.Element;
294
+ declare function TimePicker({ value, onChange, use24Hour, minuteStep, disabled, className, ref, container, error, id, size: sizeProp, }: TimePickerProps): react_jsx_runtime.JSX.Element;
289
295
 
290
296
  interface NumberInputProps {
291
297
  value: number;
@@ -305,7 +311,7 @@ interface NumberInputProps {
305
311
  /** Forwarded to the inner input element so a Label htmlFor can be associated. */
306
312
  id?: string;
307
313
  }
308
- declare function NumberInput({ value, onChange, min, max, step, disabled, placeholder, prefix, suffix, size, className, error, allowDecimals, id, }: NumberInputProps): react_jsx_runtime.JSX.Element;
314
+ declare function NumberInput({ value, onChange, min, max, step, disabled, placeholder, prefix, suffix, size: sizeProp, className, error, allowDecimals, id, }: NumberInputProps): react_jsx_runtime.JSX.Element;
309
315
 
310
316
  interface TagInputProps {
311
317
  value: string[];
@@ -334,7 +340,7 @@ interface PinInputProps {
334
340
  /** Forwarded to the first pin box so a Label htmlFor can be associated. */
335
341
  id?: string;
336
342
  }
337
- declare function PinInput({ value, onChange, length, mask, disabled, size, className, error, id, }: PinInputProps): react_jsx_runtime.JSX.Element;
343
+ declare function PinInput({ value, onChange, length, mask, disabled, size: sizeProp, className, error, id, }: PinInputProps): react_jsx_runtime.JSX.Element;
338
344
 
339
345
  interface RatingProps {
340
346
  value: number;
@@ -411,14 +417,33 @@ interface FormContextValue {
411
417
  submitted: boolean;
412
418
  }
413
419
  declare function useFormContext(): FormContextValue;
420
+ /** An invalid field as the form finds it in its own DOM after a submit. */
421
+ interface FormFieldError {
422
+ id: string;
423
+ label: string;
424
+ message: string;
425
+ }
414
426
  interface FormWrapperProps {
415
427
  onSubmit: (errors: FormErrors) => void;
416
428
  validationMode?: ValidationMode;
417
429
  children: ReactNode;
430
+ /**
431
+ * The buttons row (submit, cancel) with a clear gap above the last field — never a hand-rolled flex row under it
432
+ * (bench round 3, R12). Right-aligned like CardFooter and the overlay footers; `actionsAlign="start"` for a narrow form.
433
+ */
434
+ actions?: ReactNode;
435
+ actionsAlign?: "start" | "end";
436
+ /** After a failed submit, scroll to and focus the first invalid field (default on). */
437
+ focusFirstError?: boolean;
438
+ /**
439
+ * When two or more fields are invalid after a submit, an error summary above the form links to each (default on).
440
+ * A function renders your own from the list.
441
+ */
442
+ errorSummary?: boolean | ((errors: FormFieldError[]) => ReactNode);
418
443
  className?: string;
419
444
  ref?: React.Ref<HTMLFormElement>;
420
445
  }
421
- declare function FormWrapper({ onSubmit, validationMode, children, className, ref }: FormWrapperProps): react_jsx_runtime.JSX.Element;
446
+ declare function FormWrapper({ onSubmit, validationMode, children, actions, actionsAlign, focusFirstError, errorSummary, className, ref }: FormWrapperProps): react_jsx_runtime.JSX.Element;
422
447
 
423
448
  interface TransferItem {
424
449
  id: string;
@@ -476,7 +501,11 @@ interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {
476
501
  menuItems?: DropdownMenuEntry[];
477
502
  }
478
503
  declare const CardHeader: react.ForwardRefExoticComponent<CardHeaderProps & react.RefAttributes<HTMLDivElement>>;
479
- declare const CardTitle: react.ForwardRefExoticComponent<HTMLAttributes<HTMLHeadingElement> & react.RefAttributes<HTMLHeadingElement>>;
504
+ interface CardTitleProps extends HTMLAttributes<HTMLHeadingElement> {
505
+ /** Max lines before clamping (with the full title on hover). Default 2, like CardDescription; 1 truncates on one line; 0 = no limit. */
506
+ lines?: number;
507
+ }
508
+ declare const CardTitle: react.ForwardRefExoticComponent<CardTitleProps & react.RefAttributes<HTMLHeadingElement>>;
480
509
  interface CardDescriptionProps extends HTMLAttributes<HTMLParagraphElement> {
481
510
  /** Max lines before clamping. Default 2. Set to 0 for no limit. */
482
511
  lines?: number;
@@ -488,6 +517,8 @@ declare const CardFooter: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDiv
488
517
  interface Trend {
489
518
  direction: "up" | "down" | "flat";
490
519
  value: string;
520
+ /** Whether the change is good news. Default: up = positive, down = negative, flat = neutral. Pass "positive" for a falling cost or overdue count, "negative" for rising churn or errors. */
521
+ sentiment?: "positive" | "negative" | "neutral";
491
522
  }
492
523
  interface StatsCardProps {
493
524
  value: string | number;
@@ -528,7 +559,8 @@ interface DescriptionListProps {
528
559
  columns?: 1 | 2 | 3 | 4;
529
560
  size?: DescriptionListSize;
530
561
  dividers?: boolean;
531
- stackBelow?: "sm" | "md" | "lg";
562
+ /** Below this breakpoint a multi-column list becomes one column. Default "sm" when columns > 1 (a phone never shows two columns of pairs); "none" keeps the columns at every width. */
563
+ stackBelow?: "sm" | "md" | "lg" | "none";
532
564
  className?: string;
533
565
  }
534
566
  declare const DescriptionList: react.ForwardRefExoticComponent<DescriptionListProps & react.RefAttributes<HTMLDListElement>>;
@@ -567,6 +599,8 @@ interface Column {
567
599
  };
568
600
  /** CSS max-width for the column (e.g. "200px", "30ch"). Helps constrain wide text columns. */
569
601
  maxWidth?: string;
602
+ /** Explicit column kind. When omitted the Table infers it from data values. */
603
+ kind?: ColumnKind;
570
604
  }
571
605
  type SortDir = "asc" | "desc" | null;
572
606
  type TableDensity = "default" | "compact";
@@ -636,8 +670,11 @@ declare function Calendar({ events, view: controlledView, defaultView, onViewCha
636
670
  type BadgeVariant = "default" | "neutral" | "subtle" | "success" | "success-soft" | "warning" | "warning-soft" | "error" | "error-soft" | "outline";
637
671
  type BadgeSize = "xs" | "sm" | "md";
638
672
  type BadgePaletteColor = 1 | 2 | 3 | 4 | 5;
673
+ type BadgeSeverity = "info" | "low" | "medium" | "high" | "critical";
639
674
  interface BadgeProps {
640
675
  variant?: BadgeVariant;
676
+ /** Severity shorthand — maps to a variant. When set, overrides `variant`. */
677
+ severity?: BadgeSeverity;
641
678
  size?: BadgeSize;
642
679
  /** Palette colour (1-5). Overrides variant colour with decorative palette tokens. */
643
680
  color?: BadgePaletteColor;
@@ -650,7 +687,7 @@ interface BadgeProps {
650
687
  className?: string;
651
688
  children?: ReactNode;
652
689
  }
653
- declare function Badge({ variant, size, color, iconLeft, iconRight, maxWidth, className, children }: BadgeProps): react_jsx_runtime.JSX.Element;
690
+ declare function Badge({ variant, severity, size, color, iconLeft, iconRight, maxWidth, className, children }: BadgeProps): react_jsx_runtime.JSX.Element;
654
691
 
655
692
  type TagVariant = "default" | "subtle" | "success" | "warning" | "error" | "outline";
656
693
  type TagPaletteColor = 1 | 2 | 3 | 4 | 5;
@@ -736,6 +773,16 @@ interface EmptyStateProps {
736
773
  }
737
774
  declare function EmptyState({ icon, iconFrame, title, description, action, variant, bordered, className }: EmptyStateProps): react_jsx_runtime.JSX.Element;
738
775
 
776
+ interface EntityCellProps {
777
+ /** Image URL (creates an Avatar) or a pre-built ReactNode. */
778
+ avatar: string | ReactNode;
779
+ primary: string;
780
+ secondary?: string;
781
+ size?: "sm" | "md";
782
+ className?: string;
783
+ }
784
+ declare function EntityCell({ avatar, primary, secondary, size, className }: EntityCellProps): react_jsx_runtime.JSX.Element;
785
+
739
786
  interface SkipLinkProps {
740
787
  /** The id of the main region (AppShell names its <main> "main"). */
741
788
  href?: string;
@@ -812,19 +859,24 @@ interface TimelineItem {
812
859
  }
813
860
  interface TimelineProps {
814
861
  items: TimelineItem[];
862
+ /** "responsive" lays the items out horizontally only when they fit at minItemWidth each, else vertically. */
815
863
  orientation?: "vertical" | "horizontal" | "responsive";
864
+ /** The least width a horizontal item gets before the row scrolls (a structural size, not a design value). */
865
+ minItemWidth?: number;
816
866
  className?: string;
817
867
  ref?: Ref<HTMLDivElement>;
818
868
  }
819
- declare function Timeline({ items, orientation, className, ref }: TimelineProps): react_jsx_runtime.JSX.Element;
869
+ declare function Timeline({ items, orientation, minItemWidth, className, ref }: TimelineProps): react_jsx_runtime.JSX.Element;
820
870
 
821
871
  interface CodeBlockProps {
822
872
  code: string;
823
873
  language?: string;
824
874
  showLineNumbers?: boolean;
875
+ /** Wrap long lines instead of scrolling sideways. Default: on for a single-line snippet (a tracking tag, a command), off for multi-line code. */
876
+ wrap?: boolean;
825
877
  className?: string;
826
878
  }
827
- declare function CodeBlock({ code, language, showLineNumbers, className, }: CodeBlockProps): react_jsx_runtime.JSX.Element;
879
+ declare function CodeBlock({ code, language, showLineNumbers, wrap, className, }: CodeBlockProps): react_jsx_runtime.JSX.Element;
828
880
 
829
881
  interface CollapsibleProps {
830
882
  open?: boolean;
@@ -1115,6 +1167,8 @@ interface StackedListProps {
1115
1167
  flush?: boolean;
1116
1168
  /** The current row in a master-detail list. Its treatment follows the theme's in-page vertical active style (rail, tint or pill), like Tabs. */
1117
1169
  selectedId?: string | number;
1170
+ /** How an interactive row answers the pointer: "tint" (default) shades the row; "title" colours the title, for article lists (a knowledge base, a changelog). */
1171
+ hover?: "tint" | "title";
1118
1172
  className?: string;
1119
1173
  }
1120
1174
  declare const StackedList: react.ForwardRefExoticComponent<StackedListProps & react.RefAttributes<HTMLUListElement>>;
@@ -1253,6 +1307,142 @@ declare const Tabs: typeof TabsRoot & {
1253
1307
  Content: typeof TabsContent;
1254
1308
  };
1255
1309
 
1310
+ /**
1311
+ * The theme's shell-level decisions, carried once by AppShell so that
1312
+ * PageHeader and PageContainer can render a page the way the builder preview
1313
+ * renders it without the page passing a single flag (Sprint 25, 14 Sep 2026).
1314
+ *
1315
+ * The generated shell passes the object the template emits; the builder
1316
+ * preview passes the same values from the theme state. Every field is
1317
+ * optional: a page's own props always win over the theme, and a header
1318
+ * outside any shell falls back to the component defaults it always had.
1319
+ */
1320
+ type ChromePosition = "flush" | "floating";
1321
+ type ThemePageHeaderVariant = "default" | "colourful" | "minimal" | "tabs-integrated";
1322
+ type ThemePageHeaderBehavior = "static" | "snapping";
1323
+ type ThemePageHeaderIntensity = "subtle" | "bold";
1324
+ type ThemeBreadcrumbPosition = "inline" | "contained";
1325
+ type ThemeBreadcrumbStyle = "default" | "pill";
1326
+ type ThemeBreadcrumbSeparator = "chevron" | "slash" | "dot" | "arrow";
1327
+ type ThemeSettingsLayout = "sidebar" | "tabs";
1328
+ interface AppShellTheme {
1329
+ /** Where the navbar sits; a floating navbar's gutter is the gap above a floating header. Confirmed by the rendered Navbar. */
1330
+ navbarPosition?: ChromePosition;
1331
+ /** Where the sidebar sits; a floating sidebar's gutter is the gap beside a floating header. Confirmed by the rendered Sidebar. */
1332
+ sidebarPosition?: ChromePosition;
1333
+ pageHeader?: {
1334
+ variant?: ThemePageHeaderVariant;
1335
+ behavior?: ThemePageHeaderBehavior;
1336
+ position?: ChromePosition;
1337
+ /** Colourful only. */
1338
+ intensity?: ThemePageHeaderIntensity;
1339
+ /** Colourful on the home page only; other pages take `otherPagesVariant`. The shell decides which page is home. */
1340
+ colourfulHomeOnly?: boolean;
1341
+ otherPagesVariant?: "default" | "minimal";
1342
+ /** Colourful: the container derives the overlap from the first content element and pulls it up. */
1343
+ overlap?: boolean;
1344
+ };
1345
+ breadcrumbs?: {
1346
+ /** Inline in the header, or a contained strip the container renders above it. */
1347
+ position?: ThemeBreadcrumbPosition;
1348
+ style?: ThemeBreadcrumbStyle;
1349
+ separator?: ThemeBreadcrumbSeparator;
1350
+ };
1351
+ /** The customer's settings.layout preference: a rail of sections beside the panel, or horizontal tabs above it. SettingsLayout reads it. */
1352
+ settingsLayout?: ThemeSettingsLayout;
1353
+ }
1354
+
1355
+ interface SettingsSection {
1356
+ id: string;
1357
+ label: string;
1358
+ icon?: IconName;
1359
+ /** Heading above this section in the rail; the option group in the collapsed Dropdown. */
1360
+ group?: string;
1361
+ disabled?: boolean;
1362
+ }
1363
+ interface SettingsLayoutProps {
1364
+ sections: SettingsSection[];
1365
+ /** The selected section id. */
1366
+ value: string;
1367
+ onChange: (id: string) => void;
1368
+ /**
1369
+ * 'sidebar': a rail of sections beside the panel; 'tabs': horizontal tabs above it.
1370
+ * Default: the shell theme's settings.layout preference, else 'sidebar'. A page passes nothing.
1371
+ */
1372
+ layout?: ThemeSettingsLayout;
1373
+ /** Width of the rail in px (sidebar layout). */
1374
+ railWidth?: number;
1375
+ /**
1376
+ * Below this width of the layout itself (not the viewport) the rail becomes a Dropdown. Default: the rail plus a
1377
+ * usable panel (railWidth + 480). Measured on the layout, so a narrow PageContainer or a sidebar shell counts.
1378
+ */
1379
+ collapseBelow?: number;
1380
+ /** Accessible name of the section navigation. */
1381
+ "aria-label"?: string;
1382
+ /** The panel: the selected section's content. */
1383
+ children: ReactNode;
1384
+ className?: string;
1385
+ }
1386
+ /**
1387
+ * The settings page composition (Sprint 25.2, R8): a rail of sections beside
1388
+ * the panel, sticky while the page scrolls, or horizontal tabs above it — the
1389
+ * customer's settings.layout preference decides which, the component decides
1390
+ * the breakpoints. The collapse is measured on the layout's own width (a narrow
1391
+ * PageContainer, a sidebar shell): when the rail would leave too little for the
1392
+ * panel it becomes a Dropdown above the panel; a vertical rail never sits above
1393
+ * the content (settings#10).
1394
+ *
1395
+ * The rail is a Tabs (vertical) styled by the theme's in-page vertical style;
1396
+ * the page assembles the sections' contents and nothing else.
1397
+ */
1398
+ declare function SettingsLayout({ sections, value, onChange, layout: layoutProp, railWidth, collapseBelow, "aria-label": ariaLabel, children, className, }: SettingsLayoutProps): react_jsx_runtime.JSX.Element;
1399
+
1400
+ type SplitViewFrame = "fill" | "page";
1401
+ interface SplitViewProps {
1402
+ /** The list (an inbox, a queue): it scrolls on its own. */
1403
+ list: ReactNode;
1404
+ /** The selected item (a thread, a record): it fills the height and scrolls on its own. */
1405
+ detail: ReactNode;
1406
+ /** Context beside the detail (a contact, properties). Collapses to a toggle that opens it in a Drawer when the layout is narrower than `asideCollapseBelow`. */
1407
+ aside?: ReactNode;
1408
+ /** Names the aside's toggle and Drawer. */
1409
+ asideTitle?: string;
1410
+ /**
1411
+ * Below `collapseBelow` the list shows alone; with `detailOpen` the detail replaces it, with a Back button that calls
1412
+ * `onDetailClose` (detailMode "stack"). The page owns the selection, so it owns this flag.
1413
+ */
1414
+ detailOpen?: boolean;
1415
+ onDetailClose?: () => void;
1416
+ /** "stack" (default): the detail stacks over the list below the collapse width. "route": the app navigates to the detail's own route instead, and this renders the list alone there. */
1417
+ detailMode?: "stack" | "route";
1418
+ backLabel?: string;
1419
+ /** Percent of the width the list takes; the divider is draggable. */
1420
+ listWidth?: number;
1421
+ listMinWidth?: number;
1422
+ asideWidth?: number;
1423
+ /** Below this width of the layout itself (px) the list and detail stop sitting side by side. */
1424
+ collapseBelow?: number;
1425
+ /** Below this width of the layout itself (px) the aside becomes a toggle. */
1426
+ asideCollapseBelow?: number;
1427
+ /** A bordered, rounded surface (inside a page with padding) instead of edge to edge (filling <main>). */
1428
+ bordered?: boolean;
1429
+ /** "fill": the page root, flush to the shell, h-full against main, each pane owns its inset. "page" (default): inside a PageContainer under a PageHeader. */
1430
+ frame?: SplitViewFrame;
1431
+ "aria-label"?: string;
1432
+ className?: string;
1433
+ }
1434
+ /**
1435
+ * The reading-pane composition (Sprint 25.2, R3): one surface with dividers —
1436
+ * list, detail and an optional aside — that fills the height it is given (an
1437
+ * AppShell's <main> already gives it) and never three cards with gaps. The
1438
+ * panels compose ResizablePanelGroup, so the dividers drag. Below the collapse
1439
+ * width, measured on the layout itself, the list shows alone and the detail
1440
+ * stacks over it (or the app routes to it); the aside collapses to a toggle.
1441
+ * The page owns the selection and assembles the contents; keyboard movement
1442
+ * through the list is the list's job (StackedList selectedId).
1443
+ */
1444
+ declare function SplitView({ list, detail, aside, asideTitle, detailOpen, onDetailClose, detailMode, backLabel, listWidth, listMinWidth, asideWidth, collapseBelow, asideCollapseBelow, bordered, frame, "aria-label": ariaLabel, className, }: SplitViewProps): react_jsx_runtime.JSX.Element;
1445
+
1256
1446
  interface BreadcrumbItem$1 {
1257
1447
  label: string;
1258
1448
  href?: string;
@@ -1408,8 +1598,13 @@ interface SegmentedControlProps {
1408
1598
  className?: string;
1409
1599
  /** Accessible name for the radiogroup, for when there is no visible label (e.g. in a toolbar). */
1410
1600
  "aria-label"?: string;
1601
+ /**
1602
+ * Above this many options the control renders a Dropdown with the same value, onChange and options — a row of
1603
+ * eleven segments runs off the page (bench round 3). Default 6; raise it only where the row is known to fit.
1604
+ */
1605
+ maxOptions?: number;
1411
1606
  }
1412
- declare function SegmentedControl({ value, onChange, options, size, variant, fullWidth, onHoverChange, className, "aria-label": ariaLabel, }: SegmentedControlProps): react_jsx_runtime.JSX.Element;
1607
+ declare function SegmentedControl({ value, onChange, options, size: sizeProp, variant, fullWidth, onHoverChange, className, "aria-label": ariaLabel, maxOptions, }: SegmentedControlProps): react_jsx_runtime.JSX.Element;
1413
1608
 
1414
1609
  interface BottomNavItem {
1415
1610
  label: string;
@@ -1454,8 +1649,6 @@ interface PageHeaderProps {
1454
1649
  intensity?: PageHeaderIntensity;
1455
1650
  /** Colourful: background image URL — overlaid with accent colour */
1456
1651
  backgroundImage?: string;
1457
- /** Colourful: extra bottom padding (px) for content overlap. Content below should use -mt-[value] to pull up. */
1458
- overlapHeight?: number;
1459
1652
  /** Snapping: content shown only when expanded */
1460
1653
  expandedContent?: ReactNode;
1461
1654
  /** Snapping: scroll offset before collapse (px) */
@@ -1593,6 +1786,10 @@ interface DialogProps {
1593
1786
  description?: string;
1594
1787
  children?: ReactNode;
1595
1788
  footer?: ReactNode;
1789
+ /** The content has unsaved changes: Escape, the backdrop and the close control ask before discarding, inside the dialog (Sprint 25.2, C1). */
1790
+ dirty?: boolean;
1791
+ /** Called when the user chooses to discard, before onClose. */
1792
+ onDiscard?: () => void;
1596
1793
  variant?: "default" | "destructive";
1597
1794
  size?: DialogSize;
1598
1795
  alert?: boolean;
@@ -1608,7 +1805,7 @@ interface DialogProps {
1608
1805
  */
1609
1806
  onSubmit?: () => void;
1610
1807
  }
1611
- declare function Dialog({ open, onClose, title, description, children, footer, variant, size, alert, container, onSubmit }: DialogProps): react.ReactPortal | null;
1808
+ declare function Dialog({ open, onClose: onCloseProp, title, description, children, footer, variant, size, alert, container, onSubmit, dirty, onDiscard }: DialogProps): react.ReactPortal | null;
1612
1809
 
1613
1810
  interface DrawerProps {
1614
1811
  open: boolean;
@@ -1658,6 +1855,10 @@ interface DrawerProps {
1658
1855
  */
1659
1856
  resizable?: boolean;
1660
1857
  maxWidth?: string;
1858
+ /** The content has unsaved changes: every close path asks before discarding, inside the drawer (Sprint 25.2, C1). */
1859
+ dirty?: boolean;
1860
+ /** Called when the user chooses to discard, before onClose. */
1861
+ onDiscard?: () => void;
1661
1862
  }
1662
1863
  declare function Drawer(props: DrawerProps): react_jsx_runtime.JSX.Element;
1663
1864
 
@@ -1746,6 +1947,8 @@ interface SheetProps {
1746
1947
  title?: ReactNode;
1747
1948
  children: ReactNode;
1748
1949
  footer?: ReactNode;
1950
+ /** A strip between the content and the footer (the Drawer's unsaved-changes question). */
1951
+ confirm?: ReactNode;
1749
1952
  /** Heights the sheet snaps to, as fractions of the viewport (or container). Default [0.5, 0.92]. */
1750
1953
  snapPoints?: number[];
1751
1954
  /** Render inside this element (absolute positioning, no body scroll lock) instead of document.body. */
@@ -1759,7 +1962,7 @@ interface SheetProps {
1759
1962
  /** id of the element that names the dialog when no title is rendered. */
1760
1963
  labelledBy?: string;
1761
1964
  }
1762
- declare function Sheet({ open, onClose, title, children, footer, snapPoints, container, flush, keepMounted, id, labelledBy }: SheetProps): react.ReactPortal | null;
1965
+ declare function Sheet({ open, onClose, title, children, footer, confirm, snapPoints, container, flush, keepMounted, id, labelledBy }: SheetProps): react.ReactPortal | null;
1763
1966
 
1764
1967
  interface Notification {
1765
1968
  id: string;
@@ -1943,46 +2146,6 @@ interface ScrollAreaProps {
1943
2146
  }
1944
2147
  declare function ScrollArea({ children, className, orientation, maxHeight, maxWidth, }: ScrollAreaProps): react_jsx_runtime.JSX.Element;
1945
2148
 
1946
- /**
1947
- * The theme's shell-level decisions, carried once by AppShell so that
1948
- * PageHeader and PageContainer can render a page the way the builder preview
1949
- * renders it without the page passing a single flag (Sprint 25, 14 Sep 2026).
1950
- *
1951
- * The generated shell passes the object the template emits; the builder
1952
- * preview passes the same values from the theme state. Every field is
1953
- * optional: a page's own props always win over the theme, and a header
1954
- * outside any shell falls back to the component defaults it always had.
1955
- */
1956
- type ChromePosition = "flush" | "floating";
1957
- type ThemePageHeaderVariant = "default" | "colourful" | "minimal" | "tabs-integrated";
1958
- type ThemePageHeaderBehavior = "static" | "snapping";
1959
- type ThemePageHeaderIntensity = "subtle" | "bold";
1960
- type ThemeBreadcrumbPosition = "inline" | "contained";
1961
- type ThemeBreadcrumbStyle = "default" | "pill";
1962
- type ThemeBreadcrumbSeparator = "chevron" | "slash" | "dot" | "arrow";
1963
- interface AppShellTheme {
1964
- /** Where the navbar sits; a floating navbar's gutter is the gap above a floating header. Confirmed by the rendered Navbar. */
1965
- navbarPosition?: ChromePosition;
1966
- /** Where the sidebar sits; a floating sidebar's gutter is the gap beside a floating header. Confirmed by the rendered Sidebar. */
1967
- sidebarPosition?: ChromePosition;
1968
- pageHeader?: {
1969
- variant?: ThemePageHeaderVariant;
1970
- behavior?: ThemePageHeaderBehavior;
1971
- position?: ChromePosition;
1972
- /** Colourful only. */
1973
- intensity?: ThemePageHeaderIntensity;
1974
- /** Colourful on the home page only; other pages take `otherPagesVariant`. The shell decides which page is home. */
1975
- colourfulHomeOnly?: boolean;
1976
- otherPagesVariant?: "default" | "minimal";
1977
- };
1978
- breadcrumbs?: {
1979
- /** Inline in the header, or a contained strip the container renders above it. */
1980
- position?: ThemeBreadcrumbPosition;
1981
- style?: ThemeBreadcrumbStyle;
1982
- separator?: ThemeBreadcrumbSeparator;
1983
- };
1984
- }
1985
-
1986
2149
  interface AppShellContextValue {
1987
2150
  hasSidebar: boolean;
1988
2151
  hasMobileMenu: boolean;
@@ -2028,6 +2191,13 @@ interface AppShellContextValue {
2028
2191
  sidebarFloating: boolean;
2029
2192
  /** Called by Sidebar and Navbar so the shell knows the chrome that is actually rendered. Returns the unregister. */
2030
2193
  registerChrome: (kind: "navbar" | "sidebar", position: ChromePosition) => () => void;
2194
+ /** True when the shell renders a Launcher above sm — PageContainer adjusts its bottom padding to clear the launcher. */
2195
+ hasLauncher: boolean;
2196
+ /** The bottom corner that launcher occupies (a ribbon occupies none), so the container reads that corner's inset variable. */
2197
+ launcherCorner: "bottom-right" | "bottom-left" | null;
2198
+ /** The shell renders an app footer under the page. Its children sit in a wrapper whose height is not definite, so a
2199
+ * `fill` SplitView reads `--ds-main-height` (published on the shell element) instead of `h-full`. */
2200
+ hasFooter: boolean;
2031
2201
  }
2032
2202
  declare function useAppShell(): AppShellContextValue | null;
2033
2203
  type AppShellLayout = "sidebar" | "stacked" | "sidebar-header" | "multi-column";
@@ -2179,4 +2349,4 @@ interface UseTextOverflowResult {
2179
2349
  */
2180
2350
  declare function useTextOverflow(options?: UseTextOverflowOptions): UseTextOverflowResult;
2181
2351
 
2182
- export { Accordion, ActionPanel, ActionPanelGroup, Alert, type AlertPlacement, AppShell, type AppShellContextValue, type AppShellTheme, AsidePanel, type AsidePanelProps, type AsidePanelSide, Avatar, AvatarGroup, type AvatarGroupItem, type AvatarGroupProps, type AvatarStatus, Badge, type BadgePaletteColor, type BadgeSize, type BadgeVariant, BottomNav, type BottomNavItem, type BreadcrumbItem$1 as BreadcrumbItem, Breadcrumbs, type BreadcrumbsSeparator, type BreadcrumbsSize, type BreadcrumbsVariant, BreakpointKey, BulkActionBar, Button, ButtonSizeContext, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, type CardSelectType, CardTitle, type CardVariant, Carousel, type ChatMessage, type ChatMessageAction, type ChatMessageLayout, ChatMessageList, type ChatMessageSender, type ChatMessageSource, type ChatMessageStatus, ChatPanel, type ChatPanelProps, type ChatPanelStatusTone, Checkbox, CheckboxGroup, CheckboxGroupItem, CodeBlock, Collapsible, ColorPicker, type Column, Combobox, CommandPalette, ContextMenu, CornerPanel, type CornerPanelEdge, type CornerPanelProps, DEFAULT_DATE_RANGE_PRESETS, DataList, DatePicker, type DateRange, DateRangePicker, type DateRangePickerProps, type DateRangePreset, type DescriptionItem, DescriptionList, type DescriptionListOrientation, type DescriptionListSize, Dialog, Divider, Dock, Drawer, Dropdown, DropdownMenu, type DropdownMenuDivider, type DropdownMenuEntry, type DropdownMenuItem, EmptyState, Field, type FieldControlProps, type FieldProps, FileUpload, FormWrapper, HoverCard, InlineFieldError, Input, Kbd, Label, Launcher, type LauncherEdge, type LauncherProps, type LauncherVariant, type LauncherWhenOpen, Link, type LinkProps, MentionInput, MobileHeaderMenu, type MobileHeaderMenuItemData, type MobileHeaderMenuType, NavItem, type NavItemProps, type NavItemType, NavMenu, type NavMenuItem, Navbar, type NavbarSize, type NavbarType, type NavbarVariant, NotificationCenter, NumberInput, PageContainer, type PageContainerWidth, PageHeader, type PageHeaderBehavior, type PageHeaderIntensity, type PageHeaderProps, type PageHeaderVariant, Pagination, PinInput, Popover, Progress, type PromiseToastMessages, RadioGroup, Rating, ScrollArea, SectionHeading, SegmentedControl, Sheet, Sidebar, type SidebarContextValue, type SidebarItem, SidebarNav, type SidebarNavSize, type SidebarPosition, type SidebarSection, type SidebarType, Skeleton, SkipLink, SliderRange, Spinner, StackedList, StatsCard, StatusDot, type StatusDotVariant, Stepper, type Tab, Table, type TableDensity, type TableProps, TableToolbar, type TableToolbarActiveFilter, type TableToolbarFilterOption, Tabs, Tag, TagInput, type TagPaletteColor, type TagVariant, TextOverflow, type TextOverflowProps, Textarea, TimePicker, Timeline, Toast, type ToastAction, type ToastApi, type ToastOptions, type ToastPosition, ToastProvider, type ToastVariant, Toggle, Tooltip, Tour, TransferList, TreeView, type UseTextOverflowOptions, type UseTextOverflowResult, useAppShell, useFormContext, useSidebar, useTextOverflow, useToast };
2352
+ export { Accordion, ActionPanel, ActionPanelGroup, Alert, type AlertPlacement, AppShell, type AppShellContextValue, type AppShellTheme, AsidePanel, type AsidePanelProps, type AsidePanelSide, Avatar, AvatarGroup, type AvatarGroupItem, type AvatarGroupProps, type AvatarStatus, Badge, type BadgePaletteColor, type BadgeSeverity, type BadgeSize, type BadgeVariant, BottomNav, type BottomNavItem, type BreadcrumbItem$1 as BreadcrumbItem, Breadcrumbs, type BreadcrumbsSeparator, type BreadcrumbsSize, type BreadcrumbsVariant, BreakpointKey, BulkActionBar, Button, ButtonSizeContext, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, type CardSelectType, CardTitle, type CardVariant, Carousel, type ChatMessage, type ChatMessageAction, type ChatMessageLayout, ChatMessageList, type ChatMessageSender, type ChatMessageSource, type ChatMessageStatus, ChatPanel, type ChatPanelProps, type ChatPanelStatusTone, Checkbox, CheckboxGroup, CheckboxGroupItem, CodeBlock, Collapsible, ColorPicker, type Column, Combobox, CommandPalette, ContextMenu, type ControlSize, ControlSizeContext, CornerPanel, type CornerPanelEdge, type CornerPanelProps, DEFAULT_DATE_RANGE_PRESETS, DataList, DatePicker, type DateRange, DateRangePicker, type DateRangePickerProps, type DateRangePreset, type DescriptionItem, DescriptionList, type DescriptionListOrientation, type DescriptionListSize, Dialog, Divider, Dock, Drawer, Dropdown, DropdownMenu, type DropdownMenuDivider, type DropdownMenuEntry, type DropdownMenuItem, EmptyState, EntityCell, Field, type FieldControlProps, type FieldProps, FileUpload, FormWrapper, HoverCard, InlineFieldError, Input, Kbd, Label, Launcher, type LauncherEdge, type LauncherProps, type LauncherVariant, type LauncherWhenOpen, Link, type LinkProps, MentionInput, MobileHeaderMenu, type MobileHeaderMenuItemData, type MobileHeaderMenuType, NavItem, type NavItemProps, type NavItemType, NavMenu, type NavMenuItem, Navbar, type NavbarSize, type NavbarType, type NavbarVariant, NotificationCenter, NumberInput, PageContainer, type PageContainerWidth, PageHeader, type PageHeaderBehavior, type PageHeaderIntensity, type PageHeaderProps, type PageHeaderVariant, Pagination, PinInput, Popover, Progress, type PromiseToastMessages, RadioGroup, Rating, ScrollArea, SectionHeading, SegmentedControl, SettingsLayout, type SettingsLayoutProps, type SettingsSection, Sheet, Sidebar, type SidebarContextValue, type SidebarItem, SidebarNav, type SidebarNavSize, type SidebarPosition, type SidebarSection, type SidebarType, Skeleton, SkipLink, SliderRange, Spinner, SplitView, type SplitViewFrame, type SplitViewProps, StackedList, StatsCard, StatusDot, type StatusDotVariant, Stepper, type Tab, Table, type TableDensity, type TableProps, TableToolbar, type TableToolbarActiveFilter, type TableToolbarFilterOption, Tabs, Tag, TagInput, type TagPaletteColor, type TagVariant, TextOverflow, type TextOverflowProps, Textarea, TimePicker, Timeline, Toast, type ToastAction, type ToastApi, type ToastOptions, type ToastPosition, ToastProvider, type ToastVariant, Toggle, Tooltip, Tour, TransferList, TreeView, type Trend, type UseTextOverflowOptions, type UseTextOverflowResult, useAppShell, useFormContext, useSidebar, useTextOverflow, useToast };