gridsmith-ui 0.22.0 → 0.24.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 (43) hide show
  1. package/dist/Breadcrumbs-CGS8GKl-.d.ts +33 -0
  2. package/dist/chat.js +1 -1
  3. package/dist/chunk-2PWGJ4PK.js +45 -0
  4. package/dist/chunk-2PWGJ4PK.js.map +1 -0
  5. package/dist/chunk-2YSEME33.js +118 -0
  6. package/dist/chunk-2YSEME33.js.map +1 -0
  7. package/dist/chunk-3BRQRKDO.js +72 -0
  8. package/dist/chunk-3BRQRKDO.js.map +1 -0
  9. package/dist/{chunk-2RV23OBK.js → chunk-6XAU44U4.js} +25 -10
  10. package/dist/chunk-6XAU44U4.js.map +1 -0
  11. package/dist/{chunk-RT7RYGC3.js → chunk-JXANCXK6.js} +4 -39
  12. package/dist/chunk-JXANCXK6.js.map +1 -0
  13. package/dist/{chunk-AAYCQXZQ.js → chunk-MV7JXWXK.js} +630 -411
  14. package/dist/chunk-MV7JXWXK.js.map +1 -0
  15. package/dist/{chunk-EYMGLK4M.js → chunk-SVP2IG4S.js} +2 -2
  16. package/dist/{chunk-EYMGLK4M.js.map → chunk-SVP2IG4S.js.map} +1 -1
  17. package/dist/chunk-WOVYHFUD.js +50 -0
  18. package/dist/chunk-WOVYHFUD.js.map +1 -0
  19. package/dist/chunk-XVB55M3N.js +42 -0
  20. package/dist/chunk-XVB55M3N.js.map +1 -0
  21. package/dist/data-grid.js +5 -3
  22. package/dist/data-grid.js.map +1 -1
  23. package/dist/editor.js +11 -3
  24. package/dist/editor.js.map +1 -1
  25. package/dist/index.d.ts +227 -45
  26. package/dist/index.js +843 -586
  27. package/dist/index.js.map +1 -1
  28. package/dist/kanban.js +23 -4
  29. package/dist/kanban.js.map +1 -1
  30. package/dist/resizable.d.ts +17 -2
  31. package/dist/resizable.js +102 -24
  32. package/dist/resizable.js.map +1 -1
  33. package/dist/roots.css +19 -4
  34. package/dist/tokens.css +20 -3
  35. package/dist/virtualized.js +5 -2
  36. package/dist/virtualized.js.map +1 -1
  37. package/dist-static/tokens.css +20 -3
  38. package/package.json +1 -1
  39. package/dist/chunk-2RV23OBK.js.map +0 -1
  40. package/dist/chunk-AAYCQXZQ.js.map +0 -1
  41. package/dist/chunk-RG4KUCRS.js +0 -9
  42. package/dist/chunk-RG4KUCRS.js.map +0 -1
  43. package/dist/chunk-RT7RYGC3.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  import * as react from 'react';
2
- import { ButtonHTMLAttributes, ReactNode, InputHTMLAttributes, LabelHTMLAttributes, TextareaHTMLAttributes, Ref, ReactElement, CSSProperties, HTMLAttributes, RefObject, KeyboardEvent, AnchorHTMLAttributes, ComponentType } from 'react';
2
+ import { ButtonHTMLAttributes, ReactNode, InputHTMLAttributes, LabelHTMLAttributes, TextareaHTMLAttributes, Ref, ReactElement, CSSProperties, HTMLAttributes, RefObject, KeyboardEvent, AnchorHTMLAttributes, ElementType } from 'react';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { IconName } from './icons.js';
5
5
  import { C as ColumnKind, B as BreakpointKey } from './table-utils-BkjNEWts.js';
6
6
  export { a as BreakpointWidthProvider, u as useBreakpoint } from './table-utils-BkjNEWts.js';
7
7
  import { P as Pager, A as AppShellPreferences } from './use-pagination-DiJo0aW5.js';
8
8
  export { a as PaginationOptions, b as PreferencesContext, R as ResolvedPreferences, p as preferenceActionKey, u as usePagination, c as usePreferences } from './use-pagination-DiJo0aW5.js';
9
+ export { B as BreadcrumbItem, a as Breadcrumbs, b as BreadcrumbsSeparator, c as BreadcrumbsSize, d as BreadcrumbsVariant } from './Breadcrumbs-CGS8GKl-.js';
9
10
 
10
11
  type ButtonVariant = "default" | "secondary" | "tertiary" | "outline" | "ghost" | "destructive" | "success" | "warning" | "link";
11
12
  type ButtonSize = "xs" | "sm" | "md" | "lg" | "icon-xs" | "icon-sm" | "icon" | "icon-lg";
@@ -594,13 +595,19 @@ interface FormWrapperProps {
594
595
  */
595
596
  errorSummary?: boolean | ((errors: FormFieldError[]) => ReactNode);
596
597
  /**
597
- * Classes for the form. In a SettingsLayout panel the form keeps the narrow page's reading width however wide the
598
- * page is (the panel's --ds-form-max, Sprint 25.9); a `max-w-*` class here wins.
598
+ * The form takes the full width it is given, for the rare form whose fields need it: several columns side by side,
599
+ * line items. Without it the form, its buttons with it, keeps the narrow reading width wherever it sits.
600
+ */
601
+ fullWidth?: boolean;
602
+ /**
603
+ * Classes for the form. Wherever it sits — a page of its own, a card, beside a list, under a tab, a settings panel —
604
+ * the form keeps the narrow page's reading width however wide its box is (--ds-form-max, Sprint 25.9 A4; everywhere
605
+ * since Sprint 25.16 A8); in a Drawer or a Dialog it takes the overlay's width. A `max-w-*` class here wins.
599
606
  */
600
607
  className?: string;
601
608
  ref?: React.Ref<HTMLFormElement>;
602
609
  }
603
- declare function FormWrapper({ onSubmit, validationMode: validationModeProp, children, actions: actionsProp, actionsAlign: actionsAlignProp, onCancel, cancelLabel, focusFirstError, errorSummary, className, ref }: FormWrapperProps): react_jsx_runtime.JSX.Element;
610
+ declare function FormWrapper({ onSubmit, validationMode: validationModeProp, children, actions: actionsProp, actionsAlign: actionsAlignProp, onCancel, cancelLabel, focusFirstError, errorSummary, fullWidth, className, ref }: FormWrapperProps): react_jsx_runtime.JSX.Element;
604
611
 
605
612
  interface AddAnotherProps<T> {
606
613
  /** The rows. Each keeps its own id (`getId`), never its index, so its values, field ids and errors stay with it when another row goes. */
@@ -1060,6 +1067,10 @@ interface AvatarGroupItem {
1060
1067
  initials?: string;
1061
1068
  src?: string;
1062
1069
  alt?: string;
1070
+ /**
1071
+ * @deprecated Ignored: a group draws no status (the owner, 30 September 2026: dots on overlapping avatars read as
1072
+ * broken). Show someone's status with a single Avatar.
1073
+ */
1063
1074
  status?: AvatarStatus;
1064
1075
  color?: AvatarColor;
1065
1076
  }
@@ -1077,7 +1088,8 @@ interface AvatarGroupProps {
1077
1088
  /**
1078
1089
  * Overlapping row of avatars with a "+N" counter for the rest. Use for
1079
1090
  * members, assignees, participants — anywhere several people share one
1080
- * slot. Do not hand-roll this with -space-x and ring classes.
1091
+ * slot. Do not hand-roll this with -space-x and ring classes. A group shows
1092
+ * no status; a single Avatar does.
1081
1093
  */
1082
1094
  declare function AvatarGroup({ items, max, size, ring, onOverflowClick, className }: AvatarGroupProps): react_jsx_runtime.JSX.Element;
1083
1095
 
@@ -1304,12 +1316,18 @@ interface TreeViewProps {
1304
1316
  checkable?: boolean;
1305
1317
  defaultExpanded?: string[];
1306
1318
  defaultSelected?: string[];
1319
+ /**
1320
+ * The selected ids, when the app holds the selection: the address names the open item, or a crumb of its path
1321
+ * selects a folder (Sprint 25.16 A19). `onSelect` reports a click and the app passes the new selection back.
1322
+ * Without it the tree keeps its own, starting from `defaultSelected`.
1323
+ */
1324
+ selected?: string[];
1307
1325
  defaultChecked?: string[];
1308
1326
  onSelect?: (ids: string[]) => void;
1309
1327
  onCheck?: (ids: string[]) => void;
1310
1328
  className?: string;
1311
1329
  }
1312
- declare function TreeView({ nodes, selectable, multiSelect, checkable, defaultExpanded, defaultSelected, defaultChecked, onSelect, onCheck, className, }: TreeViewProps): react_jsx_runtime.JSX.Element;
1330
+ declare function TreeView({ nodes, selectable, multiSelect, checkable, defaultExpanded, defaultSelected, selected: selectedProp, defaultChecked, onSelect, onCheck, className, }: TreeViewProps): react_jsx_runtime.JSX.Element;
1313
1331
 
1314
1332
  interface CarouselProps {
1315
1333
  children: ReactNode[];
@@ -2060,9 +2078,11 @@ interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
2060
2078
  * Render through a router link component instead of a plain anchor
2061
2079
  * (e.g. `component={RouterLink}` from react-router or next/link). The
2062
2080
  * component receives the same props; `href` is also passed as `to` for
2063
- * react-router compatibility.
2081
+ * react-router compatibility. Any element type: a router's Link requires
2082
+ * its own props (react-router's `to`), which a narrower type refused under
2083
+ * strict TypeScript (Sprint 25.16 A19).
2064
2084
  */
2065
- component?: ComponentType<Record<string, unknown>>;
2085
+ component?: ElementType;
2066
2086
  iconLeft?: ReactNode;
2067
2087
  iconRight?: ReactNode;
2068
2088
  }
@@ -2271,33 +2291,6 @@ interface SettingsLayoutProps {
2271
2291
  */
2272
2292
  declare function SettingsLayout({ sections, value, onChange, layout: layoutProp, railWidth, collapseBelow: collapseBelowProp, "aria-label": ariaLabel, children, className, }: SettingsLayoutProps): react_jsx_runtime.JSX.Element;
2273
2293
 
2274
- interface BreadcrumbItem$1 {
2275
- label: string;
2276
- href?: string;
2277
- onClick?: () => void;
2278
- icon?: IconName;
2279
- }
2280
- type BreadcrumbsVariant = "inline" | "contained" | "pill";
2281
- type BreadcrumbsSeparator = "slash" | "chevron" | "dot" | "arrow";
2282
- type BreadcrumbsSize = "sm" | "md";
2283
- interface BreadcrumbsProps {
2284
- items: BreadcrumbItem$1[];
2285
- separator?: BreadcrumbsSeparator;
2286
- variant?: BreadcrumbsVariant;
2287
- /** Visual treatment of individual breadcrumb items — independent of layout variant. */
2288
- itemVariant?: "default" | "pill";
2289
- size?: BreadcrumbsSize;
2290
- showIcons?: boolean;
2291
- maxItems?: number;
2292
- /** Full-bleed: contained background extends edge-to-edge, breaking out of parent padding. Text stays aligned with sibling content. */
2293
- bleed?: boolean;
2294
- /** Max-width for bleed content alignment. Defaults to --ds-bp-xl. */
2295
- contentMaxWidth?: string;
2296
- className?: string;
2297
- container?: Element | DocumentFragment;
2298
- }
2299
- declare const Breadcrumbs: react.ForwardRefExoticComponent<BreadcrumbsProps & react.RefAttributes<HTMLElement>>;
2300
-
2301
2294
  interface PaginationProps {
2302
2295
  currentPage: number;
2303
2296
  totalPages: number;
@@ -2327,6 +2320,8 @@ interface Step {
2327
2320
  label: string;
2328
2321
  description?: string;
2329
2322
  status?: "complete" | "error" | "loading";
2323
+ /** Not reached yet, so it can't be gone to: its circle can't be pressed (Sprint 25.16 A30, useFlowSteps' stepper). */
2324
+ disabled?: boolean;
2330
2325
  }
2331
2326
  interface StepperProps {
2332
2327
  steps: Step[];
@@ -2490,6 +2485,11 @@ interface PageHeaderProps {
2490
2485
  onBack?: () => void;
2491
2486
  actions?: ReactNode;
2492
2487
  avatar?: ReactNode;
2488
+ /**
2489
+ * Controls that filter the page (Dropdown, DatePicker, SegmentedControl, Input), in one row at the small size; a text
2490
+ * field takes a search field's width, not a line of its own. On a bold colourful header the row sits on a strip drawn
2491
+ * as the cards are, that hugs its controls, as the tab row does.
2492
+ */
2493
2493
  filters?: ReactNode;
2494
2494
  bannerImage?: string;
2495
2495
  as?: HeadingLevel;
@@ -2611,12 +2611,12 @@ interface NavMenuProps {
2611
2611
  items: NavMenuItem[];
2612
2612
  /** Whether any child route is currently active (highlights the trigger) */
2613
2613
  active?: boolean;
2614
- /** Matches the parent Navbar type for consistent styling (`default` is the deprecated name for `tint`) */
2614
+ /** The navbar's style; by default the one the Navbar gives its items (`default` is the deprecated name for `tint`) */
2615
2615
  type?: NavbarType;
2616
2616
  onItemClick?: (item: NavMenuItem) => void;
2617
2617
  className?: string;
2618
2618
  }
2619
- declare function NavMenu({ label, items, active, type, onItemClick, className, }: NavMenuProps): react_jsx_runtime.JSX.Element;
2619
+ declare function NavMenu({ label, items, active, type: typeProp, onItemClick, className, }: NavMenuProps): react_jsx_runtime.JSX.Element;
2620
2620
 
2621
2621
  /** Mirrors NavbarType. `default` is the deprecated pre-20.8 name for `tint`. */
2622
2622
  type MobileHeaderMenuType = "tint" | "underline" | "minimal" | "pill" | "default";
@@ -2667,6 +2667,7 @@ interface DrawerProps {
2667
2667
  open: boolean;
2668
2668
  onClose: () => void;
2669
2669
  position?: "left" | "right" | "bottom";
2670
+ /** Pass none: the Drawer takes the app's width, which the shell carries (AppShell's drawerWidth, 520 px by default; 400 px outside a shell). For a deliberate wide or narrow drawer only. A non-modal side panel (modal={false}, such as the shell's assistant) keeps the width it is given. */
2670
2671
  width?: string;
2671
2672
  title?: ReactNode;
2672
2673
  children: ReactNode;
@@ -2691,7 +2692,8 @@ interface DrawerProps {
2691
2692
  * Default true. false makes the drawer a persistent, non-modal panel the user works alongside
2692
2693
  * (an assistant, help): no backdrop, no scroll lock, no focus trap — the page stays operable.
2693
2694
  * It closes only on Escape while focus is inside it, its close control, or onClose from the
2694
- * consumer; an outside click does nothing. At phone width the Sheet is always modal.
2695
+ * consumer; an outside click does nothing. At phone width the sheet it becomes is modal: a backdrop, the focus trap,
2696
+ * the scroll lock and Escape from anywhere, and focus moves in if the window narrows while it is open.
2695
2697
  */
2696
2698
  modal?: boolean;
2697
2699
  /**
@@ -2809,8 +2811,6 @@ interface SheetProps {
2809
2811
  title?: ReactNode;
2810
2812
  children: ReactNode;
2811
2813
  footer?: ReactNode;
2812
- /** A strip between the content and the footer (the Drawer's unsaved-changes question). */
2813
- confirm?: ReactNode;
2814
2814
  /**
2815
2815
  * The content has unsaved changes: every close path — Escape, the backdrop, dragging it down, the close control and a
2816
2816
  * FormWrapper's Cancel — asks before discarding them, inside the sheet, as a Drawer and a Dialog do (the review of
@@ -2832,7 +2832,11 @@ interface SheetProps {
2832
2832
  /** id of the element that names the dialog when no title is rendered. */
2833
2833
  labelledBy?: string;
2834
2834
  }
2835
- declare function Sheet({ open, onClose: onCloseProp, title, children, footer, confirm, dirty, onDiscard, snapPoints, container, flush, keepMounted, id, labelledBy }: SheetProps): react.ReactPortal | null;
2835
+ /**
2836
+ * A bottom sheet with snap heights. It is the Drawer's phone form, drawn by the same panel (Sprint 25.14 A50), so a
2837
+ * sheet and a drawer share their inset, their drag and their focus handling.
2838
+ */
2839
+ declare function Sheet({ open, onClose: onCloseProp, title, children, footer, dirty, onDiscard, snapPoints, container, flush, keepMounted, id, labelledBy }: SheetProps): react_jsx_runtime.JSX.Element;
2836
2840
 
2837
2841
  interface Notification {
2838
2842
  id: string;
@@ -3119,6 +3123,16 @@ interface AppShellContextValue {
3119
3123
  hasUnsavedChanges: boolean;
3120
3124
  /** Set by useUnsavedChanges; not for pages to call. Returns the release. */
3121
3125
  addUnsavedChanges: () => () => void;
3126
+ /** The width every Drawer in the app takes when it is given none (Sprint 25.14 A24): AppShell's drawerWidth, 520 px by default. */
3127
+ drawerWidth: string;
3128
+ /** The app's router (AppShell's `navigate`), or null: the library's links in the shell (a breadcrumb's crumb) and a flow's steps go through it. */
3129
+ navigate: ((href: string, options?: {
3130
+ replace?: boolean;
3131
+ }) => void) | null;
3132
+ /** A page that has left the flow is showing (<FlowSaved>, Sprint 25.16 A30): focus mode draws no exit control. */
3133
+ flowLeft: boolean;
3134
+ /** Set by FlowSaved; not for pages to call. Returns the release. */
3135
+ markFlowLeft: () => () => void;
3122
3136
  }
3123
3137
  /**
3124
3138
  * Focus mode (Sprint 25.7, C1): a task flow the user completes before or outside the app — setup, onboarding,
@@ -3181,10 +3195,25 @@ interface AppShellProps {
3181
3195
  theme?: AppShellTheme;
3182
3196
  /** The customer's UX preferences, passed once by the generated shell so pages and components carry nothing (Sprint 25.6). */
3183
3197
  preferences?: AppShellPreferences;
3198
+ /**
3199
+ * The width of every Drawer in the app that is given none (Sprint 25.14 A24): pages pass no width, so the app's
3200
+ * drawers share one. Default "520px". A Drawer's own width prop still wins, for a deliberate wide or narrow one.
3201
+ */
3202
+ drawerWidth?: string;
3184
3203
  /** The current route's path, so the shell knows which page is home. */
3185
3204
  currentPath?: string;
3186
3205
  /** The home page's path. Default "/". */
3187
3206
  homePath?: string;
3207
+ /**
3208
+ * The app's router: `(href, options) => navigate(href, options)` with React Router, `(href, options) =>
3209
+ * (options?.replace ? router.replace(href) : router.push(href))` with Next.js. The library's links in the shell — a
3210
+ * breadcrumb's crumb, a SplitView's path — go through it on a plain click, so the page changes with no reload, and so
3211
+ * do a flow's steps (useFlowSteps), which replace an address that isn't a step reached (Sprint 25.16 A19, A30).
3212
+ * Without it they are ordinary links. The generated layout passes it.
3213
+ */
3214
+ navigate?: (href: string, options?: {
3215
+ replace?: boolean;
3216
+ }) => void;
3188
3217
  /**
3189
3218
  * Focus mode for a flow outside the navigation (setup, onboarding, checkout). The sidebar, mobile menu and bottom
3190
3219
  * nav are not rendered, and the Navbar drops its links and search; the logo, the assistant (its launcher and its
@@ -3195,6 +3224,139 @@ interface AppShellProps {
3195
3224
  }
3196
3225
  declare const AppShell: react.ForwardRefExoticComponent<AppShellProps & react.RefAttributes<HTMLDivElement>>;
3197
3226
 
3227
+ interface FlowStep<A> {
3228
+ /** The step's name in the Stepper ("Team size"). */
3229
+ label: string;
3230
+ /** The page's title on this step ("How big is your team?"). */
3231
+ title: string;
3232
+ /** The step is shown only while this holds, so the total follows the answers ("Just me" leaves out the team's step). */
3233
+ when?: (answers: A) => boolean;
3234
+ }
3235
+ /**
3236
+ * What a flow keeps between visits: the furthest step reached, the step the user was on, and the answers so far. The
3237
+ * answers are kept as JSON: strings, numbers, booleans, arrays and plain objects (a Date comes back as its string).
3238
+ */
3239
+ interface FlowProgress<A> {
3240
+ furthest: number;
3241
+ current?: number;
3242
+ answers: A;
3243
+ }
3244
+ type FlowNavigate = (href: string, options?: {
3245
+ replace?: boolean;
3246
+ }) => void;
3247
+ interface UseFlowStepsOptions<A, S extends FlowStep<A>> {
3248
+ /** Every step, in order; a step with `when` is shown only while it holds. */
3249
+ steps: readonly S[];
3250
+ /** The step the address names: the flow's one `:step` route parameter ("3"). */
3251
+ at: string | undefined;
3252
+ /** Step n's address, counting the steps shown from 1: (n) => `/setup/${n}`. */
3253
+ href: (step: number) => string;
3254
+ /**
3255
+ * The flow's name in the browser's storage, where its progress and answers are kept between visits. With sign-in,
3256
+ * name it for the user (`setup:${userId}`), so the next person on the browser starts afresh; pass undefined until the
3257
+ * user is known, and the flow waits (draws nothing, moves nothing, writes nothing).
3258
+ */
3259
+ storageKey: string | undefined;
3260
+ /** The answers before the user has given any. */
3261
+ initialAnswers: A;
3262
+ /**
3263
+ * Where saveAndExit goes with no sign-in: a page drawing <FlowSaved> (the shell's exit, "Save and continue later",
3264
+ * goes there too). An app with sign-in leaves through the shell's "Save and log out" instead, and resumes on return.
3265
+ */
3266
+ exitTo: string;
3267
+ /** Where Finish goes once the flow is done: the app's home. */
3268
+ finishTo: string;
3269
+ /** The app's router. Left out, the shell's (AppShell's navigate); with neither, a page load. */
3270
+ navigate?: FlowNavigate;
3271
+ }
3272
+ interface FlowSteps<A, S extends FlowStep<A>> {
3273
+ /**
3274
+ * False until the flow's progress has been read and the address names a step reached. Draw nothing until then: an
3275
+ * address not reached yet, past the last step or not a step at all is being moved to the furthest step reached.
3276
+ */
3277
+ ready: boolean;
3278
+ /** This step, counting the steps shown from 1. */
3279
+ step: number;
3280
+ /** How many steps are shown, which follows the answers. */
3281
+ total: number;
3282
+ /** This step's own entry in `steps`: pick its form from it. */
3283
+ current: S;
3284
+ /** "Step 2 of 6": PageHeader's caption. */
3285
+ caption: string;
3286
+ /** This step's title: PageHeader's title. The browser tab's title follows it. */
3287
+ title: string;
3288
+ /** The answers so far, kept with the progress. */
3289
+ answers: A;
3290
+ /** Merges answers in. One that changes which steps follow this one means walking them again: they count as not reached. */
3291
+ setAnswers: (patch: Partial<A>) => void;
3292
+ /** The furthest step reached: any step up to it can be gone to. */
3293
+ furthest: number;
3294
+ isFirst: boolean;
3295
+ isLast: boolean;
3296
+ /** Goes on to the next step, which then counts as reached; answers given with it are kept in the same move. */
3297
+ next: (patch?: Partial<A>) => void;
3298
+ /** PageHeader's onBack: the step before, or undefined on the first step (no Back link there). */
3299
+ back: (() => void) | undefined;
3300
+ /** Goes to a step reached; any other is ignored. */
3301
+ goTo: (step: number) => void;
3302
+ /** The Stepper's props: the steps shown (done before the furthest, and a step past it can't be pressed), this one, and going to one. */
3303
+ stepper: {
3304
+ steps: {
3305
+ label: string;
3306
+ status?: "complete";
3307
+ disabled?: boolean;
3308
+ }[];
3309
+ currentStep: number;
3310
+ onStepChange: (index: number) => void;
3311
+ };
3312
+ /** Keeps the progress and leaves the flow, for exitTo. */
3313
+ saveAndExit: () => void;
3314
+ /** Ends the flow: its stored progress and answers go, and the user goes on to finishTo. */
3315
+ finish: () => void;
3316
+ }
3317
+ /** A flow's stored progress: its record under the prefix, its answers merged over the initial ones. Null when none (or unreadable). */
3318
+ declare function readFlowProgress<A>(storageKey: string, initialAnswers: A): FlowProgress<A> | null;
3319
+ /**
3320
+ * Sprint 25.16 A30 (R28-57, R28-58; P22): the library owns a flow's step. A flow with an address per step has one
3321
+ * `:step` route, and this hook reads the step from it: the step and the total, next, back and go-to, never past the
3322
+ * furthest step reached. An address not reached yet, past the last step or not a step at all ("/setup/9",
3323
+ * "/setup/abc") goes to the furthest step reached, the address changing with it: a fresh "/setup/3" lands on
3324
+ * "/setup/1". Steps can be conditional, so the total follows the answers. The progress (the furthest step, and the step
3325
+ * on screen) and the answers are kept in the browser's storage under the flow's name, so a return resumes; they go once
3326
+ * the flow finishes. Every caller with that name (a layout and its step, a page that mounts anew on each step, another
3327
+ * tab) shares one flow: its progress, its finish, the focus after a move and the tab's title. Its save-and-exit leaves
3328
+ * the flow (GOV.UK's save and return): with sign-in, the shell's "Save and log out", resumed after signing in; with
3329
+ * none, a page drawing <FlowSaved>, whose Continue resumes at the step the user was on. The focus shell's PageHeader
3330
+ * reads its caption, title, Stepper and Back from it; after a move the new step's heading takes focus and the browser
3331
+ * tab names the step.
3332
+ */
3333
+ declare function useFlowSteps<A, S extends FlowStep<A>>(options: UseFlowStepsOptions<A, S>): FlowSteps<A, S>;
3334
+
3335
+ interface FlowSavedProps {
3336
+ /** The flow's storageKey, as its useFlowSteps has it. */
3337
+ storageKey: string;
3338
+ /** The flow's step addresses, as its useFlowSteps has them: Continue goes to the step the user was on. */
3339
+ href: (step: number) => string;
3340
+ /** The page's one heading. Default "Your progress has been saved". */
3341
+ title?: string;
3342
+ /** What the user should know about coming back. Default: the answers are kept in this browser. */
3343
+ children?: ReactNode;
3344
+ /** The app's router. Left out, the shell's (AppShell's navigate). */
3345
+ navigate?: (href: string, options?: {
3346
+ replace?: boolean;
3347
+ }) => void;
3348
+ }
3349
+ /**
3350
+ * Sprint 25.16 A30 (R28-58): where a flow's "Save and continue later" goes when the app has no sign-in to leave to —
3351
+ * save and return: a page saying the progress has been saved, whose Continue resumes at the step the user was on. It
3352
+ * has left the flow, so the focus shell draws no exit while it shows; its heading takes focus, as the pressed exit has
3353
+ * gone. A status page, as "Page not found" is: one centred message under the page's one heading. With nothing saved
3354
+ * (a bookmark, cleared storage) it says so, and Continue starts the flow. Continue goes back to the step when the user
3355
+ * has just left it for this page (so Back from the step doesn't show it twice), else replaces this page with it; the
3356
+ * step's heading takes focus either way.
3357
+ */
3358
+ declare function FlowSaved({ storageKey, href, title, children, navigate }: FlowSavedProps): react_jsx_runtime.JSX.Element;
3359
+
3198
3360
  interface DestructiveActionOptions {
3199
3361
  /** The action's key as the preference lists name it ("remove_range"); derived from `title` when omitted. */
3200
3362
  action?: string;
@@ -3269,8 +3431,9 @@ interface PageContainerProps {
3269
3431
  maxWidth?: MaxWidth;
3270
3432
  /**
3271
3433
  * Caps the content under the header without narrowing the page: the header and tab strip keep the page's width, the
3272
- * content column below is capped at this width and left-aligned. For a form tab inside a tabbed area (round 17,
3273
- * 54.1) — `contentWidth="narrow"`; a layout pattern that wraps PageContainer passes it through. Never a hand-rolled
3434
+ * content column below is capped at this width and left-aligned. For a tab whose content is a form (round 17, 54.1)
3435
+ * — `contentWidth="narrow"`; a layout pattern that wraps PageContainer passes it through. A tab with lists or tables
3436
+ * beside its form keeps the full width: FormWrapper caps the fields itself (Sprint 25.16 A8). Never a hand-rolled
3274
3437
  * `max-w-` wrapper around the form.
3275
3438
  */
3276
3439
  contentWidth?: PageContainerWidth;
@@ -3296,6 +3459,15 @@ interface PageContainerProps {
3296
3459
  * `useContentWidth("narrow")` at the top of the page; the cap lifts when the page unmounts.
3297
3460
  */
3298
3461
  declare function useContentWidth(width: PageContainerWidth): void;
3462
+ /**
3463
+ * Sprint 25.16 A4 (R28-7): a page's own actions in the header its area layout draws ("Invite user" on Users, "Save" on
3464
+ * Roles), beside useContentWidth. Put them anywhere in the page: they render in the layout's PageHeader, as the page's
3465
+ * own live elements (its state and handlers, never a stale copy), and go when the page does. The layout passes no
3466
+ * actions per tab. Outside a PageContainer with a header they render nothing.
3467
+ */
3468
+ declare function PageActions({ children }: {
3469
+ children: ReactNode;
3470
+ }): react.ReactPortal | null;
3299
3471
  /**
3300
3472
  * The page's width constraint, and — when a PageHeader is among its direct
3301
3473
  * children — the page's composition: the header is placed inside the column
@@ -3311,6 +3483,15 @@ declare const PageContainer: react.ForwardRefExoticComponent<PageContainerProps
3311
3483
  interface SectionHeadingProps {
3312
3484
  /** Wraps onto more lines rather than being cut (an insight above a chart); a pane's title keeps one line. */
3313
3485
  title: string;
3486
+ /**
3487
+ * Makes the title editable, for a view whose name the user changes in place (a document, a board): called with each
3488
+ * new title as the user types. The title shows as a field at the title's size, filling the title's line. The actions
3489
+ * stay beside it while it keeps about 20 characters, and move under it when it can't, as they always do on a phone,
3490
+ * so a phone never squeezes the name to a few letters (the owner's review of 1 October: run 71's "Sys").
3491
+ */
3492
+ onTitleChange?: (title: string) => void;
3493
+ /** The editable title's name for a screen reader, what it is the title of ("Document title"). Default "Title". */
3494
+ titleLabel?: string;
3314
3495
  description?: string;
3315
3496
  /** The section's buttons. Below sm they sit under the title, like PageHeader's actions. */
3316
3497
  actions?: ReactNode;
@@ -3324,7 +3505,8 @@ interface SectionHeadingProps {
3324
3505
  * "section" (default): a heading within a page, spaced below by --ds-heading-gap. "pane": the title block at the
3325
3506
  * top of a SplitView pane on a fill page (an inbox, a library), where there is no PageHeader — a 16 px inset that
3326
3507
  * matches the list rows under it, a rule at the bottom and no margin below (Sprint 25.4 C-9, folded in from
3327
- * PaneHeader on the owner's review).
3508
+ * PaneHeader on the owner's review). At the top of the detail, an item's own header: there it insets at the page's
3509
+ * gutter, as the item's path above it does.
3328
3510
  */
3329
3511
  variant?: "section" | "pane";
3330
3512
  className?: string;
@@ -3389,4 +3571,4 @@ interface UseTextOverflowResult {
3389
3571
  */
3390
3572
  declare function useTextOverflow(options?: UseTextOverflowOptions): UseTextOverflowResult;
3391
3573
 
3392
- export { Accordion, ActionPanel, ActionPanelGroup, AddAnother, type AddAnotherProps, Alert, type AlertPlacement, AppShell, type AppShellContextValue, type AppShellFocus, AppShellPreferences, 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, type CalendarDay, Card, CardContent, CardDescription, CardFooter, CardGrid, type CardGridProps, 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, type DateInput, DatePicker, type DateRange, DateRangePicker, type DateRangePickerProps, type DateRangePreset, type DateRangeWords, type DescriptionItem, DescriptionList, type DescriptionListOrientation, type DescriptionListSize, type DestructiveActionHandle, type DestructiveActionOptions, Dialog, Divider, Dock, Drawer, Dropdown, DropdownMenu, type DropdownMenuDivider, type DropdownMenuEntry, type DropdownMenuItem, EmptyState, EntityCell, Field, type FieldControlProps, type FieldLabel, type FieldProps, FileUpload, type FileUploadItem, type FileUploadRequestOptions, type FileUploadStatus, type FitLabelsOptions, type FittedLabel, FormWrapper, Gantt, type GanttGroup, type GanttItem, type GanttProps, type GanttStatus, type GanttTone, type GridKeyboard, type GridKeyboardOptions, HoverCard, InlineFieldError, Input, Kbd, Label, type LabelBox, 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, Pager, Pagination, PinInput, Popover, Progress, type PromiseToastMessages, RadioGroup, Rating, ScrollArea, SectionHeading, type SectionHeadingProps, SegmentedControl, SettingsLayout, type SettingsLayoutProps, type SettingsSection, Sheet, Sidebar, type SidebarContextValue, type SidebarItem, SidebarNav, type SidebarNavSize, type SidebarPosition, type SidebarSection, type SidebarType, Skeleton, SkipLink, SliderRange, type SortDir, Spinner, StackedList, type StackedListVariant, StatsCard, StatusDot, type StatusDotVariant, Stepper, TIME_ZOOMS, type Tab, Table, type TableDensity, type TableProps, type TableRow, TableToolbar, type TableToolbarActiveFilter, type TableToolbarFilterOption, Tabs, Tag, TagInput, type TagPaletteColor, type TagVariant, TextOverflow, type TextOverflowProps, Textarea, TimeBar, type TimeBarProps, TimePicker, TimeRow, type TimeRowProps, type TimeScale, TimeScaleHeader, type TimeScaleHeaderProps, type TimeScaleOptions, type TimeTick, TimeViewport, type TimeViewportHandle, type TimeViewportLayout, type TimeViewportProps, type TimeViewportState, type TimeZoom, Timeline, Toast, type ToastAction, type ToastApi, type ToastOptions, type ToastPosition, ToastProvider, type ToastVariant, Toggle, Tooltip, Tour, TransferList, TreeView, type Trend, type UseTextOverflowOptions, type UseTextOverflowResult, dateOfDay, dayOf, endDayOf, fitLabel, fitLabels, formatDateRange, timeExtent, useAppShell, useContentWidth, useDestructiveAction, useFittedLabels, useFormContext, useGridKeyboard, useSidebar, useTextMeasure, useTextOverflow, useTimeScale, useTimeViewport, useTimeViewportLayout, useToast, useToastOptional, useUnsavedChanges };
3574
+ export { Accordion, ActionPanel, ActionPanelGroup, AddAnother, type AddAnotherProps, Alert, type AlertPlacement, AppShell, type AppShellContextValue, type AppShellFocus, AppShellPreferences, 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, BreakpointKey, BulkActionBar, Button, ButtonSizeContext, Calendar, type CalendarDay, Card, CardContent, CardDescription, CardFooter, CardGrid, type CardGridProps, 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, type DateInput, DatePicker, type DateRange, DateRangePicker, type DateRangePickerProps, type DateRangePreset, type DateRangeWords, type DescriptionItem, DescriptionList, type DescriptionListOrientation, type DescriptionListSize, type DestructiveActionHandle, type DestructiveActionOptions, Dialog, Divider, Dock, Drawer, Dropdown, DropdownMenu, type DropdownMenuDivider, type DropdownMenuEntry, type DropdownMenuItem, EmptyState, EntityCell, Field, type FieldControlProps, type FieldLabel, type FieldProps, FileUpload, type FileUploadItem, type FileUploadRequestOptions, type FileUploadStatus, type FitLabelsOptions, type FittedLabel, type FlowNavigate, type FlowProgress, FlowSaved, type FlowSavedProps, type FlowStep, type FlowSteps, FormWrapper, Gantt, type GanttGroup, type GanttItem, type GanttProps, type GanttStatus, type GanttTone, type GridKeyboard, type GridKeyboardOptions, HoverCard, InlineFieldError, Input, Kbd, Label, type LabelBox, 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, PageActions, PageContainer, type PageContainerWidth, PageHeader, type PageHeaderBehavior, type PageHeaderIntensity, type PageHeaderProps, type PageHeaderVariant, Pager, Pagination, PinInput, Popover, Progress, type PromiseToastMessages, RadioGroup, Rating, ScrollArea, SectionHeading, type SectionHeadingProps, SegmentedControl, SettingsLayout, type SettingsLayoutProps, type SettingsSection, Sheet, Sidebar, type SidebarContextValue, type SidebarItem, SidebarNav, type SidebarNavSize, type SidebarPosition, type SidebarSection, type SidebarType, Skeleton, SkipLink, SliderRange, type SortDir, Spinner, StackedList, type StackedListVariant, StatsCard, StatusDot, type StatusDotVariant, Stepper, TIME_ZOOMS, type Tab, Table, type TableDensity, type TableProps, type TableRow, TableToolbar, type TableToolbarActiveFilter, type TableToolbarFilterOption, Tabs, Tag, TagInput, type TagPaletteColor, type TagVariant, TextOverflow, type TextOverflowProps, Textarea, TimeBar, type TimeBarProps, TimePicker, TimeRow, type TimeRowProps, type TimeScale, TimeScaleHeader, type TimeScaleHeaderProps, type TimeScaleOptions, type TimeTick, TimeViewport, type TimeViewportHandle, type TimeViewportLayout, type TimeViewportProps, type TimeViewportState, type TimeZoom, Timeline, Toast, type ToastAction, type ToastApi, type ToastOptions, type ToastPosition, ToastProvider, type ToastVariant, Toggle, Tooltip, Tour, TransferList, TreeView, type Trend, type UseFlowStepsOptions, type UseTextOverflowOptions, type UseTextOverflowResult, dateOfDay, dayOf, endDayOf, fitLabel, fitLabels, formatDateRange, readFlowProgress, timeExtent, useAppShell, useContentWidth, useDestructiveAction, useFittedLabels, useFlowSteps, useFormContext, useGridKeyboard, useSidebar, useTextMeasure, useTextOverflow, useTimeScale, useTimeViewport, useTimeViewportLayout, useToast, useToastOptional, useUnsavedChanges };