@tailor-platform/app-shell 1.19.0 → 1.20.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 (46) hide show
  1. package/dist/app-shell-core.css +2 -2
  2. package/dist/app-shell.d.ts +807 -130
  3. package/dist/app-shell.js +12419 -10930
  4. package/dist/{appshell-DQTz-QwK.js → appshell-B4QkQvXF.js} +377 -360
  5. package/dist/fonts/inter.css +7 -7
  6. package/dist/fonts/noto-sans-jp.css +116 -116
  7. package/dist/testing.d.ts +119 -89
  8. package/dist/testing.js +1 -1
  9. package/dist/vite-plugin.d.ts +119 -89
  10. package/package.json +10 -8
  11. package/skills/app-shell-patterns/SKILL.md +4 -3
  12. package/skills/app-shell-patterns/references/api/create-ai-gateway-client.md +32 -2
  13. package/skills/app-shell-patterns/references/api/define-module.md +5 -5
  14. package/skills/app-shell-patterns/references/api/router/use-params.md +2 -2
  15. package/skills/app-shell-patterns/references/api/use-ai-chat.md +46 -8
  16. package/skills/app-shell-patterns/references/api/use-app-shell-config.md +4 -4
  17. package/skills/app-shell-patterns/references/api/use-app-shell-data.md +5 -5
  18. package/skills/app-shell-patterns/references/api/use-app-shell.md +2 -2
  19. package/skills/app-shell-patterns/references/api/use-auth.md +3 -3
  20. package/skills/app-shell-patterns/references/api/use-route-error.md +12 -12
  21. package/skills/app-shell-patterns/references/components/action-panel.md +4 -2
  22. package/skills/app-shell-patterns/references/components/activity-card.md +3 -3
  23. package/skills/app-shell-patterns/references/components/ai-chat.md +37 -3
  24. package/skills/app-shell-patterns/references/components/app-shell.md +6 -5
  25. package/skills/app-shell-patterns/references/components/card.md +2 -2
  26. package/skills/app-shell-patterns/references/components/data-table.md +87 -31
  27. package/skills/app-shell-patterns/references/components/date-picker.md +2 -2
  28. package/skills/app-shell-patterns/references/components/default-sidebar.md +2 -2
  29. package/skills/app-shell-patterns/references/components/dialog.md +8 -0
  30. package/skills/app-shell-patterns/references/components/filter-rail.md +10 -3
  31. package/skills/app-shell-patterns/references/components/form.md +5 -5
  32. package/skills/app-shell-patterns/references/components/global-header-layout.md +31 -8
  33. package/skills/app-shell-patterns/references/components/layout.md +24 -17
  34. package/skills/app-shell-patterns/references/components/select.md +8 -0
  35. package/skills/app-shell-patterns/references/components/sidebar-group.md +9 -7
  36. package/skills/app-shell-patterns/references/components/sidebar-layout.md +74 -11
  37. package/skills/app-shell-patterns/references/components/sidebar-section.md +8 -8
  38. package/skills/app-shell-patterns/references/components/tabs.md +32 -2
  39. package/skills/app-shell-patterns/references/components/tree.md +342 -0
  40. package/skills/app-shell-patterns/references/components/with-guard.md +5 -5
  41. package/skills/app-shell-patterns/references/concepts/authentication.md +1 -1
  42. package/skills/app-shell-patterns/references/concepts/routing-navigation.md +3 -3
  43. package/skills/app-shell-patterns/references/concepts/styling-theming.md +13 -13
  44. package/skills/app-shell-patterns/references/migrations.md +20 -0
  45. package/skills/app-shell-patterns/references/pages/document-detail.md +8 -12
  46. package/skills/app-shell-patterns/references/patterns/interaction-multi-select.md +1 -1
@@ -49,6 +49,7 @@ import { ReactNode } from 'react';
49
49
  import { Ref } from 'react';
50
50
  import { RefObject } from 'react';
51
51
  import { Select as Select_2 } from '@base-ui/react/select';
52
+ import { StandardJSONSchemaV1 } from '@standard-schema/spec';
52
53
  import { StandardSchemaV1 } from '@standard-schema/spec';
53
54
  import { Tabs as Tabs_2 } from '@base-ui/react/tabs';
54
55
  import { Time } from '@internationalized/date';
@@ -154,6 +155,11 @@ declare function Actions({ className, ...props }: ActionsProps): JSX.Element;
154
155
 
155
156
  declare type ActionsProps = React_2.ComponentProps<"div">;
156
157
 
158
+ declare type ActiveToolCall = {
159
+ id: string;
160
+ name: string;
161
+ };
162
+
157
163
  export declare const ActivityCard: typeof ActivityCardStandalone & {
158
164
  Root: typeof Root_3;
159
165
  Items: typeof Items;
@@ -285,9 +291,15 @@ export declare const aggregations: {
285
291
 
286
292
  export declare const AIChat: AIChatComponent;
287
293
 
294
+ /** Low-level event stream consumed by `useAIChat()`. */
288
295
  export declare type AIChatCompletionEvent = {
289
296
  type: "text-delta";
290
297
  text: string;
298
+ } | {
299
+ type: "tool-call";
300
+ toolCallId: string;
301
+ toolName: string;
302
+ argumentsText: string;
291
303
  } | {
292
304
  type: "done";
293
305
  finishReason?: string;
@@ -314,6 +326,7 @@ declare type AIChatComponent = typeof AIChatRoot & {
314
326
  ChainOfThoughtSearchResults: typeof ChainOfThoughtSearchResults;
315
327
  ChainOfThoughtSearchResult: typeof ChainOfThoughtSearchResult;
316
328
  Tool: typeof Tool;
329
+ ToolCall: typeof ToolCall;
317
330
  ToolHeader: typeof ToolHeader;
318
331
  ToolContent: typeof ToolContent;
319
332
  ToolInput: typeof ToolInput;
@@ -369,6 +382,7 @@ export declare type AIChatHeaderProps = {
369
382
  className?: string;
370
383
  };
371
384
 
385
+ /** Public chat message shape exposed by `useAIChat()`. */
372
386
  export declare interface AIChatMessage {
373
387
  id: string;
374
388
  role: "user" | "assistant";
@@ -392,17 +406,56 @@ declare function AIChatRoot({ className, children, status, ...props }: AIChatPro
392
406
 
393
407
  export declare type AIChatStatus = "ready" | "submitted" | "streaming" | "error";
394
408
 
409
+ export declare type AIChatToolCallProps = {
410
+ /** A requested tool from useAIChat().toolCalls, not an execution success receipt. */
411
+ call: ReturnType<typeof useAIChat>["toolCalls"][number];
412
+ className?: string;
413
+ };
414
+
415
+ /** Context passed to local tool executors. */
416
+ export declare interface AIChatToolContext {
417
+ /** Abort signal for the in-flight chat request. */
418
+ signal: AbortSignal;
419
+ /** Public user/assistant transcript visible to the current chat turn. */
420
+ messages: AIChatMessage[];
421
+ }
422
+
423
+ /**
424
+ * Schema contract for local AI chat tools.
425
+ *
426
+ * A schema must validate runtime inputs and generate JSON Schema for the AI
427
+ * Gateway request. Zod 4 implements both Standard Schema contracts directly.
428
+ *
429
+ * @example
430
+ * ```ts
431
+ * import { z } from "zod/v4";
432
+ *
433
+ * const schema = z.object({
434
+ * customerId: z.string(),
435
+ * includeInactive: z.boolean().optional(),
436
+ * });
437
+ * ```
438
+ */
439
+ export declare type AIChatToolSchema<Input = unknown, Output = Input> = StandardSchemaV1<Input, Output> & StandardJSONSchemaV1<Input, Output>;
440
+
441
+ /** Internal transcript message shape sent to the AI Gateway transport layer. */
395
442
  export declare type AIGatewayChatMessage = {
396
443
  role: "system" | "user";
397
444
  content: string;
398
445
  } | {
399
446
  role: "assistant";
400
447
  content?: string;
448
+ toolCalls?: AIGatewayToolCall[];
449
+ } | {
450
+ role: "tool";
451
+ toolCallId: string;
452
+ content: string;
401
453
  };
402
454
 
403
455
  export declare interface AIGatewayChatRequest {
404
456
  model: string;
405
457
  messages: AIGatewayChatMessage[];
458
+ tools?: AIGatewayFunctionTool[];
406
459
  signal?: AbortSignal;
407
460
  }
408
461
 
@@ -413,6 +466,39 @@ export declare interface AIGatewayClient {
413
466
  streamChatCompletion(request: AIGatewayChatRequest): AsyncIterable<AIChatCompletionEvent>;
414
467
  }
415
468
 
469
+ /** Normalized local function tool definition understood by the AI Gateway. */
470
+ export declare interface AIGatewayFunctionTool {
471
+ type: "function";
472
+ function: {
473
+ name: string;
474
+ description?: string;
475
+ parameters: Record<string, unknown>;
476
+ };
477
+ }
478
+
479
+ /** Normalized local function tool call emitted by the AI Gateway transport. */
480
+ export declare interface AIGatewayToolCall {
481
+ id: string;
482
+ name: string;
483
+ argumentsText: string;
484
+ }
485
+
486
+ /**
487
+ * A tool executed locally inside AppShell.
488
+ *
489
+ * Local tools are validated with Standard Schema, executed in-process, and then
490
+ * written back into the internal AI Gateway transcript as `role: "tool"`
491
+ * messages for the next model round.
492
+ * Schema and executor are split so heterogeneous schemas compare structurally.
493
+ */
494
+ export declare type AILocalTool<TSchema extends AIChatToolSchema<any, any> = AIChatToolSchema<any, any>> = {
495
+ kind: "local";
496
+ description?: string;
497
+ schema: TSchema;
498
+ } & {
499
+ execute: (args: StandardSchemaV1.InferOutput<TSchema>, context: AIChatToolContext) => unknown | Promise<unknown>;
500
+ };
501
+
416
502
  export declare const Alert: {
417
503
  Root: typeof Root_2;
418
504
  Title: typeof Title;
@@ -581,9 +667,12 @@ export declare interface AppShellRegister {
581
667
  }
582
668
 
583
669
  export declare type AppShellSidebarState = {
670
+ /** Effective desktop operations after normalizing sidebarBehaviour or deprecated collapsible. */
671
+ sidebarBehaviour: SidebarBehaviour;
584
672
  /**
585
673
  * Whether the sidebar is expanded on desktop — the same signal the DOM
586
- * exposes as `[data-slot="sidebar"][data-state]`.
674
+ * exposes as `[data-slot="sidebar"][data-state]` when collapsing is enabled.
675
+ * Always `true` in "fixed" or "resize" mode, regardless of `defaultOpen`.
587
676
  *
588
677
  * On mobile the sidebar is an overlay sheet rather than an in-flow column,
589
678
  * so this does not describe how much room the content has; branch on
@@ -592,11 +681,13 @@ export declare type AppShellSidebarState = {
592
681
  open: boolean;
593
682
  /** Whether the viewport is below the mobile breakpoint (768px). */
594
683
  isMobile: boolean;
595
- /** Expand or collapse the sidebar. */
684
+ /** Expand or collapse the desktop sidebar. Inert in "fixed" or "resize" mode. */
596
685
  setOpen: (open: boolean) => void;
597
686
  /**
598
687
  * Toggle the sidebar — the same action as `<SidebarLayout.Trigger />` and the
599
688
  * ⌘B / Ctrl+B shortcut, including the mobile and tablet overlay behaviour.
689
+ * Desktop toggling is inert in "fixed" or "resize" mode. Mobile/tablet menu
690
+ * toggling remains available in every mode.
600
691
  */
601
692
  toggle: () => void;
602
693
  };
@@ -1489,6 +1580,34 @@ declare type CheckboxSection<TField extends string = string> = FieldSectionBase<
1489
1580
  searchThreshold?: number | false;
1490
1581
  };
1491
1582
 
1583
+ /** `"checkbox"` mode's own props. */
1584
+ declare type CheckboxSelectionOwnProps<T> = {
1585
+ /** What clicking and Space do to a row. Default `"none"`. */
1586
+ selectionMode: "checkbox";
1587
+ /**
1588
+ * Names the hidden inputs that carry the value on native form submission,
1589
+ * one per key (read with `formData.getAll(name)`). Inside a `Field.Root`, the
1590
+ * field's `name` wins.
1591
+ */
1592
+ name?: string;
1593
+ /** `id` of the form that owns the hidden inputs, when the tree is rendered outside it. */
1594
+ form?: string;
1595
+ /** The string written into each hidden input. Defaults to the item's key. */
1596
+ itemToStringValue?: (item: T, context: TreeMapItemContext<T>) => string;
1597
+ /** At least one item must be ticked before the owning form can submit. */
1598
+ required?: boolean;
1599
+ /**
1600
+ * Id for the tree's form control (Field generates one otherwise). A native
1601
+ * `<label htmlFor>` focuses the tree but doesn't name it — name it with a
1602
+ * `Field.Label`, `aria-label` or `aria-labelledby`.
1603
+ */
1604
+ id?: string;
1605
+ /** Ref to the hidden proxy input that carries `required` and Field validation. */
1606
+ inputRef?: React_2.Ref<HTMLInputElement>;
1607
+ /** Fires when focus leaves the tree (not each row). */
1608
+ onBlur?: () => void;
1609
+ } & TreeValueProps<T> & TreeSelectionBehaviorProps;
1610
+
1492
1611
  /** Clears only the rail's own fields. Renders nothing while none are active. */
1493
1612
  declare function ClearAll({ children, className }: ClearAllProps): JSX.Element | null;
1494
1613
 
@@ -2423,7 +2542,7 @@ declare namespace Content_2 {
2423
2542
  }
2424
2543
 
2425
2544
  /** The main dialog panel that contains the dialog content. Automatically includes a close button and overlay. */
2426
- declare function Content_3({ className, children, ...props }: React_2.ComponentProps<typeof Dialog_2.Popup>): JSX.Element;
2545
+ declare function Content_3({ className, children, ref, initialFocus, ...props }: DialogContentProps): JSX.Element;
2427
2546
 
2428
2547
  declare namespace Content_3 {
2429
2548
  var displayName: string;
@@ -2481,9 +2600,9 @@ export declare type ContextData = AppShellRegister extends {
2481
2600
  *
2482
2601
  * Use it for plain text-like inputs, or pass a native element to `render`
2483
2602
  * (e.g. `render={<textarea />}`). `Select`, `Combobox`, `Autocomplete`,
2484
- * `Checkbox`, `Textarea`, `DateField`, `DatePicker` and `DateRangePicker` go
2485
- * directly under `Field.Root` instead: each draws its own frame and registers
2486
- * with the Field context itself. Passing one to `render` draws a second frame
2603
+ * `Checkbox`, `Textarea`, `DateField`, `DatePicker`, `DateRangePicker` and
2604
+ * `Tree` go directly under `Field.Root` instead: each draws its own frame and
2605
+ * registers with the Field context itself. Passing one to `render` draws a second frame
2487
2606
  * and logs a warning. `Input` does not connect to `Field.Root` — use
2488
2607
  * `Field.Control` in its place inside a field.
2489
2608
  */
@@ -2944,6 +3063,26 @@ export declare interface DataTableContextValue<TRow extends Record<string, unkno
2944
3063
  collapseAllRows?: () => void;
2945
3064
  /** Expansion config. Its presence enables the expand column and detail rows. */
2946
3065
  rowExpansion?: RowExpansionOptions<TRow>;
3066
+ /** Sub-rows config. Its presence turns the table into a tree. */
3067
+ subRows?: SubRowsOptions<TRow>;
3068
+ /** The rows to render with sub-rows: each page row followed by its open sub-rows. */
3069
+ visibleRows?: DataTableTreeRow<TRow>[];
3070
+ /** Key of the hierarchy column. */
3071
+ treeColumnKey?: string;
3072
+ /**
3073
+ * The hierarchy column. It's owned by `subRows`, so it's not in `columns`,
3074
+ * but it leads `visibleColumns`.
3075
+ */
3076
+ hierarchyColumn?: Column<TRow>;
3077
+ /** Ids of the rows whose sub-rows are open. */
3078
+ expandedSubRowIds?: string[];
3079
+ /** Opens or closes `row`'s sub-rows. */
3080
+ toggleSubRows?: (row: TRow) => void;
3081
+ /** A row's checkbox, derived as `rowSelection.selectionStrategy` says. */
3082
+ getRowCheckState?: (row: TRow) => {
3083
+ checked: boolean;
3084
+ indeterminate: boolean;
3085
+ };
2947
3086
  }
2948
3087
 
2949
3088
  /**
@@ -2959,6 +3098,38 @@ declare type DataTableDateFilterOperator = Extract<OperatorForFilterType["date"]
2959
3098
 
2960
3099
  declare type DataTableEnumFilterOperator = Extract<OperatorForFilterType["enum"], "in">;
2961
3100
 
3101
+ /**
3102
+ * `rowExpansion` and `subRows` are mutually exclusive. The `never` members reject
3103
+ * both even when options come from a typed variable or a spread.
3104
+ */
3105
+ declare type DataTableExpansionOptions<TRow extends Record<string, unknown>> = {
3106
+ /**
3107
+ * Expandable detail rows. Providing this enables the whole feature: a chevron
3108
+ * column is added at the left edge (auto-pinned left, after the selection
3109
+ * column) and `render`'s output appears in a full-width row beneath its parent.
3110
+ *
3111
+ * Grouped rather than flat so the parts can't be configured in a broken
3112
+ * combination — a label or predicate without a renderer, or `expandedIds`
3113
+ * without `onChange`, are all compile errors.
3114
+ *
3115
+ * **Requirement:** Each row must have a string or number `id` field.
3116
+ * Expansion is keyed by `id`, so rows without one render no chevron.
3117
+ *
3118
+ * **Note:** Expansion is **not** cleared on page change — ids of rows no
3119
+ * longer on the page simply do not render. Call `collapseAllRows()` to reset.
3120
+ */
3121
+ rowExpansion?: RowExpansionOptions<TRow>;
3122
+ subRows?: never;
3123
+ } | {
3124
+ rowExpansion?: never;
3125
+ /**
3126
+ * Nested rows under each row, opened from a caret in the hierarchy column.
3127
+ * See {@link SubRowsOptions}. Can't be combined with `rowExpansion`: a row
3128
+ * shows either its sub-rows or a detail panel, so passing both is a type error.
3129
+ */
3130
+ subRows: SubRowsOptions<TRow>;
3131
+ };
3132
+
2962
3133
  export declare type DataTableFilterConfig = (Extract<FilterConfig, {
2963
3134
  type: "string";
2964
3135
  }> & {
@@ -3093,6 +3264,19 @@ declare namespace DataTableToolbar {
3093
3264
  var displayName: string;
3094
3265
  }
3095
3266
 
3267
+ /** One rendered row of a table with `subRows`. */
3268
+ export declare interface DataTableTreeRow<TRow extends Record<string, unknown>> {
3269
+ row: TRow;
3270
+ /** 0 for the page's own rows. */
3271
+ depth: number;
3272
+ /** The row has sub-rows (and an id, so it can open). */
3273
+ hasSubRows: boolean;
3274
+ /** Its sub-rows are shown. */
3275
+ expanded: boolean;
3276
+ /** Unique render key, from the row's position in the tree. */
3277
+ key: string;
3278
+ }
3279
+
3096
3280
  declare type DataTableUiFilterOperatorByType = {
3097
3281
  string: DataTableStringFilterOperator;
3098
3282
  number: DataTableNumericTemporalFilterOperator;
@@ -3427,6 +3611,39 @@ export declare type DefaultSidebarProps = {
3427
3611
  iconRail?: boolean;
3428
3612
  };
3429
3613
 
3614
+ /**
3615
+ * Small typed helper for defining local AI chat tools.
3616
+ *
3617
+ * This is mostly an identity function, but it keeps `execute(args)` inferred
3618
+ * from the provided schema when tools are declared inline.
3619
+ *
3620
+ * @example
3621
+ * ```ts
3622
+ * import { defineAIChatTool } from "@tailor-platform/app-shell";
3623
+ * import { z } from "zod/v4";
3624
+ *
3625
+ * const lookupCustomer = defineAIChatTool({
3626
+ * description: "Look up a customer in the current workspace",
3627
+ * schema: z.object({
3628
+ * customerId: z.string(),
3629
+ * }),
3630
+ * async execute({ customerId }, { signal }) {
3631
+ * const customer = await fetchCustomer(customerId, { signal });
3632
+ * return {
3633
+ * id: customer.id,
3634
+ * name: customer.name,
3635
+ * status: customer.status,
3636
+ * };
3637
+ * },
3638
+ * });
3639
+ * ```
3640
+ */
3641
+ export declare function defineAIChatTool<const TSchema extends AIChatToolSchema<any, any>>(tool: {
3642
+ description?: string;
3643
+ schema: TSchema;
3644
+ execute: (args: StandardSchemaV1.InferOutput<TSchema>, context: AIChatToolContext) => unknown | Promise<unknown>;
3645
+ }): AILocalTool<TSchema>;
3646
+
3430
3647
  /**
3431
3648
  * Defines internationalization labels for multiple locales.
3432
3649
  *
@@ -3732,6 +3949,8 @@ export declare const Dialog: {
3732
3949
  Trigger: typeof Trigger_2;
3733
3950
  };
3734
3951
 
3952
+ declare type DialogContentProps = React_2.ComponentProps<typeof Dialog_2.Popup>;
3953
+
3735
3954
  declare type DialogRootProps = Pick<React_2.ComponentProps<typeof Dialog_2.Root>, "open" | "defaultOpen" | "onOpenChange" | "modal"> & {
3736
3955
  children: React_2.ReactNode;
3737
3956
  };
@@ -3957,6 +4176,14 @@ declare type ErrorBoundaryProps = {
3957
4176
  errorBoundary?: ErrorBoundaryComponent;
3958
4177
  };
3959
4178
 
4179
+ /**
4180
+ * Rules out another mode's props, so that (say) `name` without
4181
+ * `selectionMode: "checkbox"` is a type error rather than silently ignored.
4182
+ */
4183
+ declare type Excluding<P> = {
4184
+ [K in Exclude<keyof P, "selectionMode">]?: never;
4185
+ };
4186
+
3960
4187
  /**
3961
4188
  * Type-safe path builder for file-based routing.
3962
4189
  *
@@ -4578,7 +4805,7 @@ declare type GlobalHeaderLayoutBodyProps = GlobalHeaderLayoutCommonProps & {
4578
4805
  children?: never;
4579
4806
  };
4580
4807
 
4581
- declare type GlobalHeaderLayoutCommonProps = {
4808
+ declare type GlobalHeaderLayoutCommonProps = SidebarBehaviourProps & {
4582
4809
  /**
4583
4810
  * The app-wide top bar, spanning above the sidebar and content.
4584
4811
  *
@@ -4593,8 +4820,6 @@ declare type GlobalHeaderLayoutCommonProps = {
4593
4820
  sidebar?: React.ReactNode;
4594
4821
  /** Whether the sidebar is expanded by default on desktop. @default true */
4595
4822
  defaultOpen?: boolean;
4596
- /** Whether the sidebar can be collapsed. @default true */
4597
- collapsible?: boolean;
4598
4823
  };
4599
4824
 
4600
4825
  /** Default content layout — you render the page via the `Outlet` render prop. */
@@ -4901,6 +5126,29 @@ declare type HeadProps = React_2.ComponentProps<"th"> & {
4901
5126
  */
4902
5127
  export declare const hidden: () => GuardResult;
4903
5128
 
5129
+ /**
5130
+ * The column that carries the sub-rows hierarchy: the indent, the open / close
5131
+ * caret, the selection checkbox (except under `"independent"`), and the row's
5132
+ * label. It takes the display options of a regular {@link Column}, typed the
5133
+ * same way per `type`, but its layout belongs to `subRows`: it's always first
5134
+ * and pinned left, and it stays out of column settings and saved layout.
5135
+ *
5136
+ * `id`, `pin`, `align`, `edit`, `sort` and `filter` aren't available. `label`
5137
+ * and `accessor` are required: `accessor` also names each row's caret for
5138
+ * assistive tech ("Expand row Assets").
5139
+ */
5140
+ export declare type HierarchyColumn<TRow extends Record<string, unknown>> = Pick<ColumnBase<TRow>, "render" | "cellProps" | "header" | "headerProps" | "footer" | "footerProps" | "width" | "truncate"> & {
5141
+ /** Header text, and the caret's name prefix. */
5142
+ label: string;
5143
+ } & HierarchyColumnTypeBranch<TRow>;
5144
+
5145
+ /** Each `ColumnTypeBranch`, without `edit` and with `accessor` required. */
5146
+ declare type HierarchyColumnTypeBranch<TRow extends Record<string, unknown>> = ColumnTypeBranch<TRow> extends infer Branch ? Branch extends {
5147
+ accessor?: infer Accessor;
5148
+ } ? Omit<Branch, "edit" | "accessor"> & {
5149
+ accessor: NonNullable<Accessor>;
5150
+ } : never : never;
5151
+
4904
5152
  declare type HourCycle = 12 | 24;
4905
5153
 
4906
5154
  export declare type I18nLabels<Def extends Record<string, LabelValue> = Record<string, LabelValue>, L extends string = never> = {
@@ -5094,7 +5342,7 @@ export declare const Layout: LayoutComponent;
5094
5342
 
5095
5343
  /**
5096
5344
  * Typed explicitly rather than assigning onto a `function Layout`: that form emits
5097
- * `var Header: typeof import("./Layout").Header`, which the declaration rollup
5345
+ * `var Header: typeof import("./layout").Header`, which the declaration rollup
5098
5346
  * rewrites to a bare `Header` — a namespace, not a type (TS2709). See `check-dts`.
5099
5347
  */
5100
5348
  declare type LayoutComponent = typeof LayoutRoot & {
@@ -5193,8 +5441,11 @@ declare namespace LinkItem {
5193
5441
 
5194
5442
  export { LinkProps }
5195
5443
 
5196
- /** Groups the individual tab buttons. */
5197
- declare function List({ className, children, ...props }: React_2.ComponentProps<typeof Tabs_2.List>): JSX.Element;
5444
+ /**
5445
+ * Groups the individual tab buttons. Tabs stay on one row and scroll sideways
5446
+ * when they do not fit. `className` applies to the inner track.
5447
+ */
5448
+ declare function List({ className, children, ...props }: Omit<React_2.ComponentProps<typeof Tabs_2.List>, "render">): JSX.Element;
5198
5449
 
5199
5450
  declare namespace List {
5200
5451
  var displayName: string;
@@ -6298,8 +6549,16 @@ declare type RowExpansionOptions<TRow extends Record<string, unknown>> = {
6298
6549
  onChange?: (ids: string[]) => void;
6299
6550
  });
6300
6551
 
6301
- /** Controlled or uncontrolled row-selection configuration. Keep the mode stable while mounted. */
6302
- export declare type RowSelectionOptions = {
6552
+ /**
6553
+ * Controlled or uncontrolled row-selection configuration. Keep the mode stable while mounted.
6554
+ *
6555
+ * With `subRows`, `selectionStrategy` says how ticking spreads through the
6556
+ * hierarchy and what the selected ids list, exactly as on `Tree`. It defaults to
6557
+ * `"leaves"`: a parent row is a container, its checkbox is derived from the rows
6558
+ * beneath it, and the selection lists the leaf rows. Without `subRows` every row
6559
+ * is independent and it has no effect.
6560
+ */
6561
+ export declare type RowSelectionOptions = TreeSelectionBehaviorProps & {
6303
6562
  /**
6304
6563
  * Bulk actions for the selected IDs, shown in `DataTable.Footer` while at
6305
6564
  * least one row is selected. The bar includes the selection count, these
@@ -6907,6 +7166,34 @@ declare type SheetRootProps = Pick<React_2.ComponentProps<typeof Drawer.Root>, "
6907
7166
 
6908
7167
  declare type Side = "top" | "right" | "bottom" | "left";
6909
7168
 
7169
+ /** Allowed desktop operations; every mode keeps normal mobile/tablet menu presentation. */
7170
+ declare type SidebarBehaviour =
7171
+ /** Always expanded at a fixed desktop width, with no collapse/resize controls; ignores defaultOpen. */
7172
+ "fixed"
7173
+ /** Desktop collapse/expand controls only, with a fixed width and no resize handle; respects defaultOpen. */
7174
+ | "collapse"
7175
+ /**
7176
+ * Desktop resizing only, while always expanded; ignores defaultOpen.
7177
+ * Width clamps to 192–480px, and double-click resets to 256px without collapsing.
7178
+ */
7179
+ | "resize"
7180
+ /**
7181
+ * Default: both desktop collapsing and resizing are enabled; respects defaultOpen.
7182
+ * Dragging can expand, resize, and collapse. Double-click resets to 256px or collapses from 256px.
7183
+ */
7184
+ | "collapse-and-resize";
7185
+
7186
+ /** New and deprecated configuration cannot be specified together. */
7187
+ declare type SidebarBehaviourProps = {
7188
+ /** Desktop operations to allow. @default "collapse-and-resize" */
7189
+ sidebarBehaviour?: SidebarBehaviour;
7190
+ collapsible?: never;
7191
+ } | {
7192
+ sidebarBehaviour?: never;
7193
+ /** @deprecated Use sidebarBehaviour. true maps to "collapse", false to "fixed". */
7194
+ collapsible?: boolean;
7195
+ };
7196
+
6910
7197
  /**
6911
7198
  * A collapsible group for sidebar navigation.
6912
7199
  *
@@ -7110,7 +7397,7 @@ declare type SidebarLayoutBodyProps = SidebarLayoutCommonProps & {
7110
7397
  children?: never;
7111
7398
  };
7112
7399
 
7113
- declare type SidebarLayoutCommonProps = {
7400
+ declare type SidebarLayoutCommonProps = SidebarBehaviourProps & {
7114
7401
  /**
7115
7402
  * Custom sidebar content. Replaces the whole sidebar region.
7116
7403
  *
@@ -7127,14 +7414,6 @@ declare type SidebarLayoutCommonProps = {
7127
7414
  * @default true
7128
7415
  */
7129
7416
  defaultOpen?: boolean;
7130
- /**
7131
- * Whether the sidebar can be collapsed.
7132
- * When set to `false`, the sidebar is always visible and cannot be toggled.
7133
- * `defaultOpen` is ignored when this is `false`.
7134
- *
7135
- * @default true
7136
- */
7137
- collapsible?: boolean;
7138
7417
  /**
7139
7418
  * A global top bar rendered above **everything** — spanning the full width
7140
7419
  * across the top of the primary sidebar and the content region alike. The
@@ -7274,6 +7553,24 @@ export declare type SidebarSectionProps = {
7274
7553
  */
7275
7554
  export declare const SidebarSeparator: () => JSX.Element;
7276
7555
 
7556
+ /** `"single"` mode's own props. */
7557
+ declare type SingleSelectionOwnProps<T> = {
7558
+ /** What clicking and Space do to a row. Default `"none"`. */
7559
+ selectionMode: "single";
7560
+ /** Controlled selection: the selected row's key, or `null` for none. */
7561
+ selectedKey?: string | null;
7562
+ /** Initial selection when uncontrolled. */
7563
+ defaultSelectedKey?: string | null;
7564
+ /** Fires when the user selects a row, with its key and your item. */
7565
+ onSelectedKeyChange?: (key: string, item: T) => void;
7566
+ /**
7567
+ * Opens the selected row's ancestors when it starts out hidden or
7568
+ * `selectedKey` changes from outside, so the selection is always on screen.
7569
+ * A group the user closes afterwards stays closed. Default `true`.
7570
+ */
7571
+ revealSelected?: boolean;
7572
+ };
7573
+
7277
7574
  declare type Size = "sm" | "md" | "lg" | "xl" | "full";
7278
7575
 
7279
7576
  /**
@@ -7384,6 +7681,39 @@ declare namespace SubmenuTrigger {
7384
7681
  var displayName: string;
7385
7682
  }
7386
7683
 
7684
+ /**
7685
+ * Nested rows, shown under their parent when it's opened. The page's rows are
7686
+ * the top level, so pagination counts them, and each parent's sub-rows stay on
7687
+ * its page.
7688
+ *
7689
+ * `hierarchyColumn` defines the column that carries the hierarchy. Like the
7690
+ * row-actions column, it's added by the feature rather than taken from
7691
+ * `columns`: it's always first and pinned left, can't be hidden or moved, and
7692
+ * leaves your other columns as you defined them.
7693
+ *
7694
+ * **Requirement:** Each row must have a string or number `id`, unique across
7695
+ * the whole tree. Expansion and selection are keyed by it; a row without one
7696
+ * shows its sub-rows nowhere and can't be selected.
7697
+ */
7698
+ export declare type SubRowsOptions<TRow extends Record<string, unknown>> = {
7699
+ /** A row's sub-rows. Omitted, `null` or empty means a leaf. */
7700
+ getSubRows: (row: TRow) => readonly TRow[] | null | undefined;
7701
+ /** The column that shows the hierarchy. See {@link HierarchyColumn}. */
7702
+ hierarchyColumn: HierarchyColumn<TRow>;
7703
+ } & ({
7704
+ /** Controlled: ids of the rows whose sub-rows are open. Update it from `onExpandedChange`. */
7705
+ expandedIds: string[];
7706
+ /** Called with every open id after the user opens or closes a row. */
7707
+ onExpandedChange: (ids: string[]) => void;
7708
+ defaultExpandedIds?: never;
7709
+ } | {
7710
+ expandedIds?: never;
7711
+ /** Ids open at first, when uncontrolled. */
7712
+ defaultExpandedIds?: string[];
7713
+ /** Notification in uncontrolled mode, with every open id. */
7714
+ onExpandedChange?: (ids: string[]) => void;
7715
+ });
7716
+
7387
7717
  /**
7388
7718
  * A starter-prompt chip. Submits `suggestion` as if the user had typed and
7389
7719
  * sent it — the fastest way to teach people what the assistant is good at.
@@ -8048,6 +8378,9 @@ declare type ToolbarRowProps = Omit<React_2.ComponentProps<"div">, "role" | "onK
8048
8378
 
8049
8379
  declare type ToolbarSeparatorProps = Omit<React_2.ComponentProps<"div">, "role" | "aria-orientation">;
8050
8380
 
8381
+ /** Compact tool-call label for the active flow, rendered as its own row. */
8382
+ declare function ToolCall({ call, className }: AIChatToolCallProps): JSX.Element;
8383
+
8051
8384
  declare function ToolContent({ className, ...props }: ToolContentProps): JSX.Element;
8052
8385
 
8053
8386
  declare type ToolContentProps = ComponentProps<typeof DisclosurePanel>;
@@ -8095,10 +8428,311 @@ export declare const Tooltip: {
8095
8428
  Provider: typeof Provider;
8096
8429
  };
8097
8430
 
8098
- declare type TooltipRootProps = Pick<React_2.ComponentProps<typeof Tooltip_2.Root>, "open" | "defaultOpen" | "onOpenChange"> & {
8431
+ declare type TooltipRootProps = Pick<React_2.ComponentProps<typeof Tooltip_2.Root>, "open" | "defaultOpen" | "onOpenChange" | "disabled"> & {
8099
8432
  children: React_2.ReactNode;
8100
8433
  };
8101
8434
 
8435
+ /**
8436
+ * A tree of your own items, for browsing hierarchies (accounts, locations,
8437
+ * categories), picking one node, or ticking many. It follows the ARIA tree
8438
+ * pattern: one tab stop, arrows to move and open, Space to select or tick, and
8439
+ * Enter for `onAction`.
8440
+ *
8441
+ * Pass your own items with `mapItem` (as with `Select` / `Combobox`). A key is
8442
+ * the item's identity across the whole tree: the same key in two places is one
8443
+ * item. When codes repeat with different meanings, compose a unique key from
8444
+ * the `parents` that `mapItem` receives.
8445
+ *
8446
+ * `selectionMode` sets what a row does:
8447
+ *
8448
+ * - `"none"` (default): browsing. Clicking a leaf runs `onAction`.
8449
+ * - `"single"`: one selected row (`selectedKey`), for master–detail views.
8450
+ * - `"checkbox"`: a multi-select form control (`value`). By default parents are
8451
+ * containers: ticking one ticks every enabled leaf beneath it, and the value
8452
+ * lists leaves. `selectionStrategy` changes that. `name`
8453
+ * submits one hidden input per value key, and inside a `Field.Root` it picks
8454
+ * up the label, description, error, `required` and invalid state.
8455
+ *
8456
+ * `filter` narrows the tree to matches and their ancestors. The tree has no
8457
+ * search box of its own; for the "search, pick, then add" flow in a dialog, use
8458
+ * {@link TreePicker}.
8459
+ *
8460
+ * The list scrolls inside the component, so give it a height (or a sized
8461
+ * container) for long trees.
8462
+ *
8463
+ * @example
8464
+ * ```tsx
8465
+ * // warehouses: (Warehouse | Bin)[], so `mapItem` can return either level.
8466
+ * const isWarehouse = (node: Warehouse | Bin): node is Warehouse => "bins" in node;
8467
+ * const [bins, setBins] = useState<string[]>([]);
8468
+ *
8469
+ * <Field.Root name="bins">
8470
+ * <Field.Label>Bins to count</Field.Label>
8471
+ * <Tree
8472
+ * className="astw:h-96"
8473
+ * items={warehouses}
8474
+ * mapItem={(item, { parents }) =>
8475
+ * isWarehouse(item)
8476
+ * ? { key: item.id, label: item.name, children: item.bins }
8477
+ * : // `parents` is the union too. A guard, unlike a cast, has TypeScript
8478
+ * // check there's a warehouse above (hence `?.`).
8479
+ * { key: `${parents.find(isWarehouse)?.id}/${item.code}`, label: item.code }
8480
+ * }
8481
+ * selectionMode="checkbox"
8482
+ * value={bins}
8483
+ * onValueChange={setBins}
8484
+ * />
8485
+ * </Field.Root>
8486
+ * ```
8487
+ */
8488
+ export declare function Tree<T>(props: TreeProps<T>): JSX.Element;
8489
+
8490
+ export declare namespace Tree {
8491
+ var displayName: string;
8492
+ }
8493
+
8494
+ export declare type TreeChangeDetails<T> = {
8495
+ /** The value's items in tree order, one per key. Keys that aren't in the tree are left out. */
8496
+ selected: TreeSelectedItem<T>[];
8497
+ };
8498
+
8499
+ /** Props for {@link Tree} with `selectionMode: "checkbox"`: the value, how ticking works, and forms. */
8500
+ declare type TreeCheckboxSelectionProps<T> = CheckboxSelectionOwnProps<T> & Excluding<SingleSelectionOwnProps<T>>;
8501
+
8502
+ /** What the tree shows — shared by `Tree` and `TreePicker`. */
8503
+ declare interface TreeContentProps<T> {
8504
+ /** Your top-level items. Children come from `mapItem`. */
8505
+ items: ReadonlyArray<T>;
8506
+ /** Reads an item's key, label, children and disabled state. */
8507
+ mapItem: (item: T, context: TreeMapItemContext<T>) => TreeMappedItem<T>;
8508
+ /** The row's content. Defaults to the item's `label`. */
8509
+ renderItem?: (row: TreeRowState<T>) => React_2.ReactNode;
8510
+ /** Shown when there's nothing to show. Defaults to "No items.", or "No matching items." while filtering. */
8511
+ emptyText?: React_2.ReactNode;
8512
+ }
8513
+
8514
+ /** What `filter` receives alongside each item. */
8515
+ declare type TreeFilterContext<T> = {
8516
+ /** The item's `label` from `mapItem`. */
8517
+ label: string;
8518
+ /** The item's ancestors, top level first. */
8519
+ parents: T[];
8520
+ };
8521
+
8522
+ /** Props for {@link Tree}'s filtering. */
8523
+ declare type TreeFilterProps<T> = {
8524
+ /**
8525
+ * Shows only the items that match, plus their ancestors. Groups with a match
8526
+ * open on their own, and the user can still close them. A parent that matches
8527
+ * with no matching children keeps all its children, so it can still be opened.
8528
+ */
8529
+ filter?: (item: T, context: TreeFilterContext<T>) => boolean;
8530
+ };
8531
+
8532
+ /** What `mapItem` receives alongside each item. */
8533
+ declare type TreeMapItemContext<T> = {
8534
+ /** The item's ancestors, top level first. Empty for top-level items. */
8535
+ parents: T[];
8536
+ };
8537
+
8538
+ /**
8539
+ * How {@link Tree} reads one of your items. Mirrors `MappedItem` from
8540
+ * `Select` / `Combobox`, plus the tree's `children` and `disabled`.
8541
+ */
8542
+ export declare type TreeMappedItem<T> = {
8543
+ /**
8544
+ * Identifies the item across the whole tree. The same key in two places is
8545
+ * one item: ticking one ticks both. When codes repeat with different meanings
8546
+ * (bin `A1` in two warehouses), compose a unique key from `parents`.
8547
+ */
8548
+ key: string;
8549
+ /** Plain text: the default row content, the default search text, and the accessible name. */
8550
+ label: string;
8551
+ /** The item's children. Omitted or empty means a leaf, and only leaves are selectable values. */
8552
+ children?: ReadonlyArray<T>;
8553
+ /** Locks the item. A disabled parent locks everything beneath it. */
8554
+ disabled?: boolean;
8555
+ };
8556
+
8557
+ /** Props for {@link Tree} with `selectionMode: "none"` (the default). */
8558
+ declare type TreeNoSelectionProps<T> = {
8559
+ /** What clicking and Space do to a row. Default `"none"`. */
8560
+ selectionMode?: "none";
8561
+ } & Excluding<SingleSelectionOwnProps<T>> & Excluding<CheckboxSelectionOwnProps<T>>;
8562
+
8563
+ /**
8564
+ * A {@link Tree} in a dialog, for picking many items out of a
8565
+ * hierarchical catalog and committing them in one go — products with variants,
8566
+ * accounts with sub-accounts, warehouses with bins. It wraps `Tree` the
8567
+ * way `DatePicker` wraps `DateField`.
8568
+ *
8569
+ * The picker owns the dialog chrome, the search box, expand/collapse, and the
8570
+ * selection while it is open; each open starts empty. The consumer owns how
8571
+ * items are read (`mapItem`), how rows look (`renderItem`), how search matches
8572
+ * (`matchesSearch`) and what happens on commit (`onCommit`).
8573
+ *
8574
+ * By default parents are containers: ticking one ticks every enabled leaf
8575
+ * beneath it, and `onCommit` receives the ticked leaves in tree order with their
8576
+ * parents. `selectionStrategy` changes that, as on `Tree`.
8577
+ * Enter on a row or the "Add N items" button commits, then the picker closes
8578
+ * itself.
8579
+ *
8580
+ * The dialog has a fixed height and the list scrolls inside it, so opening or
8581
+ * closing a group never shifts what is on screen.
8582
+ *
8583
+ * @example
8584
+ * ### Bulk-adding catalog items
8585
+ * ```tsx
8586
+ * // catalog: (Category | Product)[], so `mapItem` can return either level.
8587
+ * const isProduct = (item: Category | Product): item is Product => "sku" in item;
8588
+ *
8589
+ * <TreePicker
8590
+ * open={open}
8591
+ * onOpenChange={setOpen}
8592
+ * title="Add items"
8593
+ * items={catalog}
8594
+ * mapItem={(item) =>
8595
+ * "products" in item
8596
+ * ? { key: item.id, label: item.name, children: item.products }
8597
+ * : { key: item.sku, label: item.name }
8598
+ * }
8599
+ * renderItem={({ item }) => (
8600
+ * <span className="flex w-full justify-between gap-3">
8601
+ * <span>{item.name}</span>
8602
+ * {"price" in item ? <span>{money(item.price)}</span> : null}
8603
+ * </span>
8604
+ * )}
8605
+ * // Items have the union type; a guard (not a cast) keeps categories out if
8606
+ * // the selection strategy ever returns parents.
8607
+ * onCommit={(picked) => addToOrder(picked.flatMap(({ item }) => (isProduct(item) ? [item] : [])))}
8608
+ * />
8609
+ * ```
8610
+ */
8611
+ export declare function TreePicker<T>({ open, onOpenChange, title, onCommit, ctaLabel, matchesSearch, filterSlot, searchPlaceholder, className, ...treeProps }: TreePickerProps<T>): JSX.Element;
8612
+
8613
+ export declare namespace TreePicker {
8614
+ var displayName: string;
8615
+ }
8616
+
8617
+ /** Props for {@link TreePicker}. */
8618
+ export declare type TreePickerProps<T> = TreeContentProps<T> & TreeSelectionBehaviorProps & {
8619
+ /** Controls dialog visibility. */
8620
+ open: boolean;
8621
+ /**
8622
+ * Fires on every user-driven open/close (Esc, backdrop, close button, Cancel,
8623
+ * and after a successful commit). The picker closes itself after `onCommit`,
8624
+ * so consumers should not also call this from their commit handler.
8625
+ */
8626
+ onOpenChange(open: boolean): void;
8627
+ /**
8628
+ * Search predicate. Defaults to a case-insensitive match on the item's
8629
+ * `label`. An item is kept when it or any descendant matches. Receives the
8630
+ * same `{ label, parents }` as `Tree`'s `filter`.
8631
+ */
8632
+ matchesSearch?: (item: T, query: string, context: TreeFilterContext<T>) => boolean;
8633
+ /** Rendered to the right of the search input (e.g. a category filter button). */
8634
+ filterSlot?: React_2.ReactNode;
8635
+ /** Search input placeholder. Default: `"Search"`. */
8636
+ searchPlaceholder?: string;
8637
+ /** Dialog title. Also labels the tree for assistive tech. Default: `"Select items"`. */
8638
+ title?: React_2.ReactNode;
8639
+ /**
8640
+ * Receives the value's items in tree order (see `selectionStrategy`). Items
8641
+ * ticked before `items` changed are included, even if they're no longer in it.
8642
+ */
8643
+ onCommit(selected: TreeSelectedItem<T>[]): void;
8644
+ /** Primary CTA label. Default: `"Add N items"`, or `"Add items"` when nothing is selected. */
8645
+ ctaLabel?(count: number): React_2.ReactNode;
8646
+ /** Merged onto the dialog panel. */
8647
+ className?: string;
8648
+ };
8649
+
8650
+ /** Props for {@link Tree}. */
8651
+ export declare type TreeProps<T> = TreeContentProps<T> & TreeFilterProps<T> & {
8652
+ /**
8653
+ * Enter on a row — the row's default action. In `"none"` mode a click on a
8654
+ * leaf runs it too. In `"checkbox"` mode without `onAction`, Enter inside a
8655
+ * `<form>` submits it (like Enter in a text input).
8656
+ */
8657
+ onAction?: (item: T, key: string) => void;
8658
+ /** Locks the whole tree, and in `"checkbox"` mode leaves it out of form submission. */
8659
+ disabled?: boolean;
8660
+ /** Accessible name for the tree. Use this, `aria-labelledby`, or a `Field.Label`. */
8661
+ "aria-label"?: string;
8662
+ /** Id of the element naming the tree (e.g. a card or dialog title). */
8663
+ "aria-labelledby"?: string;
8664
+ /**
8665
+ * Merged onto the root. The list scrolls inside it, so give it a height (or
8666
+ * place it in a sized container) for long trees.
8667
+ */
8668
+ className?: string;
8669
+ } & (TreeNoSelectionProps<T> | TreeSingleSelectionProps<T> | TreeCheckboxSelectionProps<T>);
8670
+
8671
+ /** What `renderItem` receives for each row. */
8672
+ export declare type TreeRowState<T> = {
8673
+ item: T;
8674
+ key: string;
8675
+ parents: T[];
8676
+ /** 0 for top-level rows. */
8677
+ depth: number;
8678
+ isLeaf: boolean;
8679
+ /** The row's checkbox is ticked. Under `"leaves"`, `"topmost"` and `"all"`, a parent is ticked when every enabled leaf beneath it is. */
8680
+ checked: boolean;
8681
+ /** Under `"leaves"`, `"topmost"` and `"all"`, a parent with some, but not all, enabled leaves ticked. */
8682
+ indeterminate: boolean;
8683
+ /** The row is the selected one, in `"single"` mode. */
8684
+ selected: boolean;
8685
+ expanded: boolean;
8686
+ disabled: boolean;
8687
+ };
8688
+
8689
+ /** One entry of the value, as reported by `onValueChange` and `TreePicker`'s `onCommit`. */
8690
+ export declare type TreeSelectedItem<T> = {
8691
+ key: string;
8692
+ /** Your original item. */
8693
+ item: T;
8694
+ /** The item's ancestors, top level first. */
8695
+ parents: T[];
8696
+ };
8697
+
8698
+ /** How ticking works and what the value lists. */
8699
+ declare type TreeSelectionBehaviorProps = {
8700
+ /** How ticking works and what the value lists. Default `"leaves"`. */
8701
+ selectionStrategy?: TreeSelectionStrategy;
8702
+ };
8703
+
8704
+ /**
8705
+ * How ticking works and what the value lists. Take a parent P with leaves A and B:
8706
+ *
8707
+ * | Strategy | Tick P | Tick A and B | P ticked on its own? |
8708
+ * | ---------------------- | ------------ | ------------ | -------------------- |
8709
+ * | `"leaves"` (default) | `[A, B]` | `[A, B]` | No |
8710
+ * | `"topmost"` | `[P]` | `[P]` | No |
8711
+ * | `"all"` | `[P, A, B]` | `[P, A, B]` | No |
8712
+ * | `"cascade"` | `[P, A, B]` | `[A, B]` | Yes |
8713
+ * | `"independent"` | `[P]` | `[A, B]` | Yes |
8714
+ *
8715
+ * - `"leaves"`, `"topmost"` and `"all"` treat parents as containers: a parent's
8716
+ * checkbox comes from its leaves, so unticking A after ticking P leaves P
8717
+ * indeterminate. With `"topmost"`, `P` stands for everything beneath it.
8718
+ * - `"cascade"` makes parents items in their own right. Ticking one also ticks
8719
+ * everything beneath it, but unticking A leaves `[P, B]`, with P still ticked.
8720
+ * - `"independent"` ticks every item on its own.
8721
+ */
8722
+ export declare type TreeSelectionStrategy = "leaves" | "topmost" | "all" | "cascade" | "independent";
8723
+
8724
+ /** Props for {@link Tree} with `selectionMode: "single"`. */
8725
+ declare type TreeSingleSelectionProps<T> = SingleSelectionOwnProps<T> & Excluding<CheckboxSelectionOwnProps<T>>;
8726
+
8727
+ /** The selection: a list of keys. Which keys depends on `selectionStrategy`. */
8728
+ declare type TreeValueProps<T> = {
8729
+ /** Controlled selection: the checked keys. */
8730
+ value?: readonly string[];
8731
+ /** Initial selection when uncontrolled. */
8732
+ defaultValue?: readonly string[];
8733
+ onValueChange?: (value: string[], details: TreeChangeDetails<T>) => void;
8734
+ };
8735
+
8102
8736
  /** The element that triggers the tooltip on hover or focus. */
8103
8737
  declare function Trigger({ ...props }: React_2.ComponentProps<typeof Tooltip_2.Trigger>): JSX.Element;
8104
8738
 
@@ -8196,11 +8830,20 @@ declare type TypedPaths<TRoutes extends Record<string, Record<string, string>>>
8196
8830
  for<T extends (keyof TRoutes & string) | `${keyof TRoutes & string}?${string}`>(path: T, ...params: ExtractBasePath<T> extends keyof TRoutes ? IsEmptyObject<TRoutes[ExtractBasePath<T>]> extends true ? [] : [TRoutes[ExtractBasePath<T>]] : never): string;
8197
8831
  };
8198
8832
 
8833
+ /**
8834
+ * React hook for AI Gateway chat with optional local tools.
8835
+ *
8836
+ * Messages stay text-first. Requested tool names are exposed only for the
8837
+ * active request; tool-call and tool-result protocol messages remain internal.
8838
+ */
8199
8839
  export declare function useAIChat(config: {
8200
8840
  client: AIGatewayClient;
8201
8841
  model: string;
8842
+ tools?: Record<string, AILocalTool>;
8202
8843
  }): {
8203
8844
  messages: AIChatMessage[];
8845
+ /** Requested tools in the active flow; cleared on completion, stop, or error. */
8846
+ toolCalls: ActiveToolCall[];
8204
8847
  status: AIChatStatus;
8205
8848
  error?: Error;
8206
8849
  /**
@@ -8927,22 +9570,6 @@ export declare type UseDataTableOptions<TRow extends Record<string, unknown>, TF
8927
9570
  * @deprecated Use `rowSelection.onChange` instead.
8928
9571
  */
8929
9572
  onSelectionChange?: (ids: string[]) => void;
8930
- /**
8931
- * Expandable detail rows. Providing this enables the whole feature: a chevron
8932
- * column is added at the left edge (auto-pinned left, after the selection
8933
- * column) and `render`'s output appears in a full-width row beneath its parent.
8934
- *
8935
- * Grouped rather than flat so the parts can't be configured in a broken
8936
- * combination — a label or predicate without a renderer, or `expandedIds`
8937
- * without `onChange`, are all compile errors.
8938
- *
8939
- * **Requirement:** Each row must have a string or number `id` field.
8940
- * Expansion is keyed by `id`, so rows without one render no chevron.
8941
- *
8942
- * **Note:** Expansion is **not** cleared on page change — ids of rows no
8943
- * longer on the page simply do not render. Call `collapseAllRows()` to reset.
8944
- */
8945
- rowExpansion?: RowExpansionOptions<TRow>;
8946
9573
  /**
8947
9574
  * Sort behaviour configuration.
8948
9575
  *
@@ -8953,7 +9580,7 @@ export declare type UseDataTableOptions<TRow extends Record<string, unknown>, TF
8953
9580
  sort?: false | {
8954
9581
  multiple?: boolean;
8955
9582
  };
8956
- };
9583
+ } & DataTableExpansionOptions<TRow>;
8957
9584
 
8958
9585
  /**
8959
9586
  * Return type of `useDataTable` hook.
@@ -9053,6 +9680,26 @@ export declare interface UseDataTableReturn<TRow extends Record<string, unknown>
9053
9680
  collapseAllRows?: () => void;
9054
9681
  /** Expansion config (passthrough for `DataTable.Root`). */
9055
9682
  rowExpansion?: RowExpansionOptions<TRow>;
9683
+ /** Sub-rows config (passthrough for `DataTable.Root`). */
9684
+ subRows?: SubRowsOptions<TRow>;
9685
+ /** The rows to render: each page row followed by its open sub-rows, with depth. */
9686
+ visibleRows?: DataTableTreeRow<TRow>[];
9687
+ /** Key of the hierarchy column. */
9688
+ treeColumnKey?: string;
9689
+ /** The hierarchy column, built from `subRows.hierarchyColumn`. Rendered first, pinned left. */
9690
+ hierarchyColumn?: Column<TRow>;
9691
+ /** Ids of the rows whose sub-rows are open. */
9692
+ expandedSubRowIds?: string[];
9693
+ /** Opens or closes `row`'s sub-rows. */
9694
+ toggleSubRows?: (row: TRow) => void;
9695
+ /**
9696
+ * A row's checkbox. With propagation a parent's state is derived from the rows
9697
+ * beneath it, so it can be indeterminate.
9698
+ */
9699
+ getRowCheckState?: (row: TRow) => {
9700
+ checked: boolean;
9701
+ indeterminate: boolean;
9702
+ };
9056
9703
  }
9057
9704
 
9058
9705
  /**
@@ -9448,17 +10095,17 @@ declare namespace Root {
9448
10095
  }
9449
10096
 
9450
10097
 
9451
- declare namespace Header {
10098
+ declare namespace Title {
9452
10099
  var displayName: string;
9453
10100
  }
9454
10101
 
9455
10102
 
9456
- declare namespace Body {
10103
+ declare namespace Description {
9457
10104
  var displayName: string;
9458
10105
  }
9459
10106
 
9460
10107
 
9461
- declare namespace Footer {
10108
+ declare namespace Root {
9462
10109
  var displayName: string;
9463
10110
  }
9464
10111
 
@@ -9468,32 +10115,12 @@ declare namespace Row {
9468
10115
  }
9469
10116
 
9470
10117
 
9471
- declare namespace Head {
9472
- var displayName: string;
9473
- }
9474
-
9475
-
9476
- declare namespace Cell {
9477
- var displayName: string;
9478
- }
9479
-
9480
-
9481
- declare namespace Caption {
9482
- var displayName: string;
9483
- }
9484
-
9485
-
9486
- declare namespace Root {
9487
- var displayName: string;
9488
- }
9489
-
9490
-
9491
- declare namespace Title {
10118
+ declare namespace Group {
9492
10119
  var displayName: string;
9493
10120
  }
9494
10121
 
9495
10122
 
9496
- declare namespace Description {
10123
+ declare namespace Separator {
9497
10124
  var displayName: string;
9498
10125
  }
9499
10126
 
@@ -9518,42 +10145,42 @@ declare namespace Fallback {
9518
10145
  }
9519
10146
 
9520
10147
 
9521
- declare namespace SelectRoot {
10148
+ declare namespace Root {
9522
10149
  var displayName: string;
9523
10150
  }
9524
10151
 
9525
10152
 
9526
- declare namespace SelectTrigger {
10153
+ declare namespace Header {
9527
10154
  var displayName: string;
9528
10155
  }
9529
10156
 
9530
10157
 
9531
- declare namespace SelectValue {
10158
+ declare namespace Body {
9532
10159
  var displayName: string;
9533
10160
  }
9534
10161
 
9535
10162
 
9536
- declare namespace SelectContent {
10163
+ declare namespace Footer {
9537
10164
  var displayName: string;
9538
10165
  }
9539
10166
 
9540
10167
 
9541
- declare namespace SelectItem {
10168
+ declare namespace Row {
9542
10169
  var displayName: string;
9543
10170
  }
9544
10171
 
9545
10172
 
9546
- declare namespace SelectGroup {
10173
+ declare namespace Head {
9547
10174
  var displayName: string;
9548
10175
  }
9549
10176
 
9550
10177
 
9551
- declare namespace SelectGroupLabel {
10178
+ declare namespace Cell {
9552
10179
  var displayName: string;
9553
10180
  }
9554
10181
 
9555
10182
 
9556
- declare namespace SelectSeparator {
10183
+ declare namespace Caption {
9557
10184
  var displayName: string;
9558
10185
  }
9559
10186
 
@@ -9563,52 +10190,52 @@ declare namespace Root {
9563
10190
  }
9564
10191
 
9565
10192
 
9566
- declare namespace Header {
10193
+ declare namespace Trigger {
9567
10194
  var displayName: string;
9568
10195
  }
9569
10196
 
9570
10197
 
9571
- declare namespace Content {
10198
+ declare namespace Close {
9572
10199
  var displayName: string;
9573
10200
  }
9574
10201
 
9575
10202
 
9576
- declare namespace Root {
10203
+ declare namespace Content {
9577
10204
  var displayName: string;
9578
10205
  }
9579
10206
 
9580
10207
 
9581
- declare namespace Trigger {
10208
+ declare namespace Header {
9582
10209
  var displayName: string;
9583
10210
  }
9584
10211
 
9585
10212
 
9586
- declare namespace Close {
10213
+ declare namespace Footer {
9587
10214
  var displayName: string;
9588
10215
  }
9589
10216
 
9590
10217
 
9591
- declare namespace Content {
10218
+ declare namespace Title {
9592
10219
  var displayName: string;
9593
10220
  }
9594
10221
 
9595
10222
 
9596
- declare namespace Header {
10223
+ declare namespace Description {
9597
10224
  var displayName: string;
9598
10225
  }
9599
10226
 
9600
10227
 
9601
- declare namespace Footer {
10228
+ declare namespace Root {
9602
10229
  var displayName: string;
9603
10230
  }
9604
10231
 
9605
10232
 
9606
- declare namespace Title {
10233
+ declare namespace Header {
9607
10234
  var displayName: string;
9608
10235
  }
9609
10236
 
9610
10237
 
9611
- declare namespace Description {
10238
+ declare namespace Content {
9612
10239
  var displayName: string;
9613
10240
  }
9614
10241
 
@@ -9788,162 +10415,207 @@ declare namespace Panel {
9788
10415
  }
9789
10416
 
9790
10417
 
10418
+ declare namespace Trigger {
10419
+ var displayName: string;
10420
+ }
10421
+
10422
+
10423
+ declare namespace Provider {
10424
+ var displayName: string;
10425
+ }
10426
+
10427
+
9791
10428
  declare namespace Root {
9792
10429
  var displayName: string;
9793
10430
  }
9794
10431
 
9795
10432
 
9796
- declare namespace Row {
10433
+ declare namespace Header {
9797
10434
  var displayName: string;
9798
10435
  }
9799
10436
 
9800
10437
 
9801
- declare namespace Group {
10438
+ declare namespace ClearAll {
9802
10439
  var displayName: string;
9803
10440
  }
9804
10441
 
9805
10442
 
9806
- declare namespace Separator {
10443
+ declare namespace Sections {
9807
10444
  var displayName: string;
9808
10445
  }
9809
10446
 
9810
10447
 
9811
- declare namespace Provider {
10448
+ declare namespace Settings {
9812
10449
  var displayName: string;
9813
10450
  }
9814
10451
 
9815
10452
 
9816
- declare namespace Root {
10453
+ declare namespace ComboboxRoot {
9817
10454
  var displayName: string;
9818
10455
  }
9819
10456
 
9820
10457
 
9821
- declare namespace Header {
10458
+ declare namespace ComboboxInput {
9822
10459
  var displayName: string;
9823
10460
  }
9824
10461
 
9825
10462
 
9826
- declare namespace ClearAll {
10463
+ declare namespace ComboboxTrigger {
9827
10464
  var displayName: string;
9828
10465
  }
9829
10466
 
9830
10467
 
9831
- declare namespace Sections {
10468
+ declare namespace ComboboxInputGroup {
9832
10469
  var displayName: string;
9833
10470
  }
9834
10471
 
9835
10472
 
9836
- declare namespace Provider {
10473
+ declare namespace ComboboxContent {
9837
10474
  var displayName: string;
9838
10475
  }
9839
10476
 
9840
10477
 
9841
- declare namespace Root {
10478
+ declare namespace ComboboxList {
9842
10479
  var displayName: string;
9843
10480
  }
9844
10481
 
9845
10482
 
9846
- declare namespace Trigger {
10483
+ declare namespace ComboboxItem {
9847
10484
  var displayName: string;
9848
10485
  }
9849
10486
 
9850
10487
 
9851
- declare namespace Content {
10488
+ declare namespace ComboboxEmpty {
9852
10489
  var displayName: string;
9853
10490
  }
9854
10491
 
9855
10492
 
9856
- declare namespace Trigger {
10493
+ declare namespace ComboboxGroup {
9857
10494
  var displayName: string;
9858
10495
  }
9859
10496
 
9860
10497
 
9861
- declare namespace Settings {
10498
+ declare namespace ComboboxGroupLabel {
9862
10499
  var displayName: string;
9863
10500
  }
9864
10501
 
9865
10502
 
9866
- declare namespace ComboboxRoot {
10503
+ declare namespace ComboboxClear {
9867
10504
  var displayName: string;
9868
10505
  }
9869
10506
 
9870
10507
 
9871
- declare namespace ComboboxInput {
10508
+ declare namespace ComboboxChips {
9872
10509
  var displayName: string;
9873
10510
  }
9874
10511
 
9875
10512
 
9876
- declare namespace ComboboxTrigger {
10513
+ declare namespace ComboboxChip {
9877
10514
  var displayName: string;
9878
10515
  }
9879
10516
 
9880
10517
 
9881
- declare namespace ComboboxInputGroup {
10518
+ declare namespace ComboboxChipRemove {
9882
10519
  var displayName: string;
9883
10520
  }
9884
10521
 
9885
10522
 
9886
- declare namespace ComboboxContent {
10523
+ declare namespace ComboboxValue {
9887
10524
  var displayName: string;
9888
10525
  }
9889
10526
 
9890
10527
 
9891
- declare namespace ComboboxList {
10528
+ declare namespace ComboboxStatus {
9892
10529
  var displayName: string;
9893
10530
  }
9894
10531
 
9895
10532
 
9896
- declare namespace ComboboxItem {
10533
+ declare namespace ComboboxCollection {
9897
10534
  var displayName: string;
9898
10535
  }
9899
10536
 
9900
10537
 
9901
- declare namespace ComboboxEmpty {
10538
+ declare namespace Provider {
9902
10539
  var displayName: string;
9903
10540
  }
9904
10541
 
9905
10542
 
9906
- declare namespace ComboboxGroup {
10543
+ declare namespace Root {
9907
10544
  var displayName: string;
9908
10545
  }
9909
10546
 
9910
10547
 
9911
- declare namespace ComboboxGroupLabel {
10548
+ declare namespace Trigger {
9912
10549
  var displayName: string;
9913
10550
  }
9914
10551
 
9915
10552
 
9916
- declare namespace ComboboxClear {
10553
+ declare namespace Content {
9917
10554
  var displayName: string;
9918
10555
  }
9919
10556
 
9920
10557
 
9921
- declare namespace ComboboxChips {
10558
+ declare namespace SelectRoot {
9922
10559
  var displayName: string;
9923
10560
  }
9924
10561
 
9925
10562
 
9926
- declare namespace ComboboxChip {
10563
+ declare namespace SelectTrigger {
9927
10564
  var displayName: string;
9928
10565
  }
9929
10566
 
9930
10567
 
9931
- declare namespace ComboboxChipRemove {
10568
+ declare namespace SelectValue {
9932
10569
  var displayName: string;
9933
10570
  }
9934
10571
 
9935
10572
 
9936
- declare namespace ComboboxValue {
10573
+ declare namespace SelectContent {
9937
10574
  var displayName: string;
9938
10575
  }
9939
10576
 
9940
10577
 
9941
- declare namespace ComboboxStatus {
10578
+ declare namespace SelectItem {
9942
10579
  var displayName: string;
9943
10580
  }
9944
10581
 
9945
10582
 
9946
- declare namespace ComboboxCollection {
10583
+ declare namespace SelectGroup {
10584
+ var displayName: string;
10585
+ }
10586
+
10587
+
10588
+ declare namespace SelectGroupLabel {
10589
+ var displayName: string;
10590
+ }
10591
+
10592
+
10593
+ declare namespace SelectSeparator {
10594
+ var displayName: string;
10595
+ }
10596
+
10597
+
10598
+ declare namespace Root {
10599
+ var displayName: string;
10600
+ }
10601
+
10602
+
10603
+ declare namespace Viewport {
10604
+ var displayName: string;
10605
+ }
10606
+
10607
+
10608
+ declare namespace Row {
10609
+ var displayName: string;
10610
+ }
10611
+
10612
+
10613
+ declare namespace Interval {
10614
+ var displayName: string;
10615
+ }
10616
+
10617
+
10618
+ declare namespace TimelineLink {
9947
10619
  var displayName: string;
9948
10620
  }
9949
10621
 
@@ -10028,76 +10700,81 @@ declare namespace AutocompleteStatus {
10028
10700
  }
10029
10701
 
10030
10702
 
10031
- declare namespace DataTableRoot {
10703
+ declare namespace TreeRow {
10032
10704
  var displayName: string;
10033
10705
  }
10034
10706
 
10035
10707
 
10036
- declare namespace DataTableTable {
10708
+ declare namespace Root {
10037
10709
  var displayName: string;
10038
10710
  }
10039
10711
 
10040
10712
 
10041
- declare namespace DataTableFooter {
10713
+ declare namespace Items {
10042
10714
  var displayName: string;
10043
10715
  }
10044
10716
 
10045
10717
 
10046
- declare namespace Root {
10718
+ declare namespace Item {
10047
10719
  var displayName: string;
10048
10720
  }
10049
10721
 
10050
10722
 
10051
- declare namespace Viewport {
10723
+ declare namespace DataTableRoot {
10052
10724
  var displayName: string;
10053
10725
  }
10054
10726
 
10055
10727
 
10056
- declare namespace Row {
10728
+ declare namespace DataTableTable {
10057
10729
  var displayName: string;
10058
10730
  }
10059
10731
 
10060
10732
 
10061
- declare namespace Interval {
10733
+ declare namespace DataTableToolbar {
10062
10734
  var displayName: string;
10063
10735
  }
10064
10736
 
10065
10737
 
10066
- declare namespace TimelineLink {
10738
+ declare namespace DataTableColumnSettings {
10067
10739
  var displayName: string;
10068
10740
  }
10069
10741
 
10070
10742
 
10071
- declare namespace Root {
10743
+ declare namespace DataTableFooter {
10072
10744
  var displayName: string;
10073
10745
  }
10074
10746
 
10075
10747
 
10076
- declare namespace Items {
10748
+ declare namespace DataTableFilters {
10077
10749
  var displayName: string;
10078
10750
  }
10079
10751
 
10080
10752
 
10081
- declare namespace Item {
10753
+ declare namespace DataTableBody {
10082
10754
  var displayName: string;
10083
10755
  }
10084
10756
 
10085
10757
 
10086
- declare namespace DataTableColumnSettings {
10758
+ declare namespace DataTableHeaders {
10087
10759
  var displayName: string;
10088
10760
  }
10089
10761
 
10090
10762
 
10091
- declare namespace DataTableToolbar {
10763
+ declare namespace AddFilterPanel {
10092
10764
  var displayName: string;
10093
10765
  }
10094
10766
 
10095
10767
 
10096
- declare namespace DataTableFilters {
10768
+ declare namespace AsyncErrorState {
10097
10769
  var displayName: string;
10098
10770
  }
10099
10771
 
10100
10772
 
10101
- declare namespace AsyncErrorState {
10773
+ declare namespace DataTableHeaderContextMenu {
10774
+ var displayName: string;
10775
+ }
10776
+
10777
+
10778
+ declare namespace DataTableCellContextMenu {
10102
10779
  var displayName: string;
10103
10780
  }