@tailor-platform/app-shell 1.16.0 → 1.17.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 (42) hide show
  1. package/dist/app-shell-core.css +1 -1
  2. package/dist/app-shell.d.ts +692 -106
  3. package/dist/app-shell.js +6294 -4939
  4. package/dist/{appshell-B0wh5Lq0.js → appshell-CahhZy7v.js} +316 -297
  5. package/dist/semantic-contrast.test.ts +154 -0
  6. package/dist/style-entry.d.ts +117 -82
  7. package/dist/testing.d.ts +122 -85
  8. package/dist/testing.js +1 -1
  9. package/dist/theme-bridge.test.ts +101 -1
  10. package/dist/theme.bridge.css +91 -0
  11. package/dist/theme.css +6 -1
  12. package/dist/themes/_template.css +7 -1
  13. package/dist/themes/bloom.css +0 -6
  14. package/dist/themes/cream.css +0 -6
  15. package/dist/themes/default.css +389 -69
  16. package/dist/vite-plugin.d.ts +117 -82
  17. package/package.json +1 -1
  18. package/skills/app-shell-patterns/SKILL.md +7 -5
  19. package/skills/app-shell-patterns/references/api/define-module.md +2 -2
  20. package/skills/app-shell-patterns/references/api/define-resource.md +2 -2
  21. package/skills/app-shell-patterns/references/api/use-app-shell-config.md +53 -47
  22. package/skills/app-shell-patterns/references/api/use-app-shell-data.md +30 -26
  23. package/skills/app-shell-patterns/references/api/use-app-shell.md +37 -30
  24. package/skills/app-shell-patterns/references/api/use-toast.md +28 -31
  25. package/skills/app-shell-patterns/references/components/app-shell.md +4 -4
  26. package/skills/app-shell-patterns/references/components/card.md +79 -7
  27. package/skills/app-shell-patterns/references/components/data-table.md +267 -52
  28. package/skills/app-shell-patterns/references/components/date-picker.md +32 -21
  29. package/skills/app-shell-patterns/references/components/filter-rail.md +165 -0
  30. package/skills/app-shell-patterns/references/components/sidebar-group.md +6 -0
  31. package/skills/app-shell-patterns/references/components/sidebar-section.md +114 -0
  32. package/skills/app-shell-patterns/references/concepts/custom-components.md +1 -1
  33. package/skills/app-shell-patterns/references/concepts/file-based-routing.md +7 -1
  34. package/skills/app-shell-patterns/references/concepts/graphql.md +20 -14
  35. package/skills/app-shell-patterns/references/concepts/routing-navigation.md +41 -3
  36. package/skills/app-shell-patterns/references/concepts/sidebar-navigation.md +32 -0
  37. package/skills/app-shell-patterns/references/concepts/styling-theming.md +255 -58
  38. package/skills/app-shell-patterns/references/migrations.md +21 -0
  39. package/skills/app-shell-patterns/references/pages/document-detail.md +6 -6
  40. package/skills/app-shell-patterns/references/patterns/form-modal.md +26 -20
  41. package/skills/app-shell-patterns/references/patterns/interaction-multi-select.md +129 -118
  42. package/skills/app-shell-patterns/references/patterns/list-dense-scan.md +2 -2
@@ -456,9 +456,11 @@ export declare type AppShellPageProps = {
456
456
  icon?: ReactNode;
457
457
  /**
458
458
  * Custom breadcrumb segment title for this page.
459
- * Can be a static string or a function that receives the URL segment.
459
+ * Can be a static string or a `labels.t("key")` translation function.
460
+ * Other callbacks receive the URL segment and may return a LocalizedString
461
+ * (e.g. `(segment) => labels.t("order", { id: segment })`), resolved using the current locale.
460
462
  */
461
- breadcrumbTitle?: string | ((segment: string) => string);
463
+ breadcrumbTitle?: string | ((segment: string) => LocalizedString);
462
464
  };
463
465
  /**
464
466
  * Guards to control access to this page.
@@ -1058,6 +1060,18 @@ declare namespace Body_2 {
1058
1060
  var displayName: string;
1059
1061
  }
1060
1062
 
1063
+ /** True / false with a third "no constraint" state. */
1064
+ declare type BooleanSection<TField extends string = string> = FieldSectionBase<TField> & {
1065
+ control: "boolean";
1066
+ operator?: "eq" | "ne";
1067
+ /** Default "Yes". */
1068
+ trueLabel?: ReactNode;
1069
+ /** Default "No". */
1070
+ falseLabel?: ReactNode;
1071
+ /** Default "Any"; `null` removes it. */
1072
+ anyLabel?: ReactNode | null;
1073
+ };
1074
+
1061
1075
  /**
1062
1076
  * Responsive breakpoints, aligned with Tailwind's default breakpoints.
1063
1077
  * `initial` is the base (mobile-first) value applied below the `sm` breakpoint.
@@ -1338,6 +1352,40 @@ export declare type CheckboxProps = Omit<React_2.ComponentProps<typeof Checkbox_
1338
1352
  label?: React_2.ReactNode;
1339
1353
  };
1340
1354
 
1355
+ /** Multi-select — the `in` (any of) or `nin` (none of) operator. */
1356
+ declare type CheckboxSection<TField extends string = string> = FieldSectionBase<TField> & {
1357
+ control: "checkbox";
1358
+ operator?: "in" | "nin";
1359
+ options: readonly FacetOption[];
1360
+ sort?: OptionSort;
1361
+ /**
1362
+ * Options shown before "Show N more". Default 8, `false` shows everything.
1363
+ * A selected option is never truncated away.
1364
+ */
1365
+ truncate?: number | false;
1366
+ /** Option values held at the top, in this order. */
1367
+ pinned?: readonly string[];
1368
+ /**
1369
+ * Above this many options, show a search box. Defaults to `truncate` (so any
1370
+ * list long enough to need "Show more" is searchable), or 12 when nothing is
1371
+ * truncated. `false` never shows it.
1372
+ */
1373
+ searchThreshold?: number | false;
1374
+ };
1375
+
1376
+ /** Clears only the rail's own fields. Renders nothing while none are active. */
1377
+ declare function ClearAll({ children, className }: ClearAllProps): JSX.Element | null;
1378
+
1379
+ declare namespace ClearAll {
1380
+ var displayName: string;
1381
+ }
1382
+
1383
+ declare type ClearAllProps = {
1384
+ /** Default "Clear all". */
1385
+ children?: ReactNode;
1386
+ className?: string;
1387
+ };
1388
+
1341
1389
  /** A button that closes the dialog. */
1342
1390
  declare function Close({ ...props }: React_2.ComponentProps<typeof Dialog_2.Close>): JSX.Element;
1343
1391
 
@@ -2135,7 +2183,7 @@ declare type CommonPageResource = {
2135
2183
  meta: {
2136
2184
  title: LocalizedString;
2137
2185
  icon?: ReactNode;
2138
- breadcrumbTitle?: string | ((segment: string) => string);
2186
+ breadcrumbTitle?: string | ((segment: string) => LocalizedString);
2139
2187
  };
2140
2188
  };
2141
2189
 
@@ -2194,7 +2242,7 @@ declare namespace Content {
2194
2242
  var displayName: string;
2195
2243
  }
2196
2244
 
2197
- declare function Content_2({ className, ...props }: React_2.ComponentProps<"div">): JSX.Element;
2245
+ declare function Content_2({ className, padding, ...props }: ContentProps): JSX.Element;
2198
2246
 
2199
2247
  declare namespace Content_2 {
2200
2248
  var displayName: string;
@@ -2237,6 +2285,15 @@ export declare type ContentContainerProps = {
2237
2285
  children?: React.ReactNode;
2238
2286
  };
2239
2287
 
2288
+ declare type ContentProps = React_2.ComponentProps<"div"> & {
2289
+ /**
2290
+ * `"none"` renders the content edge-to-edge, for a `Table`, `DataTable` or
2291
+ * divided list that should meet the card's border.
2292
+ * @default "default"
2293
+ */
2294
+ padding?: "default" | "none";
2295
+ };
2296
+
2240
2297
  /**
2241
2298
  * Context data type inferred from AppShellRegister.
2242
2299
  * Falls back to Record<string, unknown> if not augmented.
@@ -2529,6 +2586,26 @@ export declare type CsvSchema = {
2529
2586
  columns: readonly CsvColumn[];
2530
2587
  };
2531
2588
 
2589
+ /**
2590
+ * Anything the built-in controls do not cover. Declares the `fields` it writes
2591
+ * so Clear all, Clear and the settings panel still treat it as rail-owned.
2592
+ */
2593
+ declare type CustomSection<TField extends string = string> = SectionBase & {
2594
+ control: "custom";
2595
+ fields: readonly TField[];
2596
+ clearable?: boolean;
2597
+ render: (context: CustomSectionContext<TField>) => ReactNode;
2598
+ };
2599
+
2600
+ /** What a custom section's `render` receives. */
2601
+ declare type CustomSectionContext<TField extends string = string> = {
2602
+ control: CollectionControl<TField>;
2603
+ /** The current filter on `field`, if any. */
2604
+ getFilter: (field: TField) => Filter<TField> | undefined;
2605
+ /** Replace (or with `null`, remove) the filter on `field`. */
2606
+ setFilter: (field: TField, next: Omit<Filter<TField>, "field"> | null) => void;
2607
+ };
2608
+
2532
2609
  export declare const DataTable: {
2533
2610
  /**
2534
2611
  * Context/provider root. Wraps all other `DataTable.*` components and
@@ -2558,6 +2635,11 @@ export declare const DataTable: {
2558
2635
  /**
2559
2636
  * Footer container for pagination and other footer content.
2560
2637
  * Place inside `DataTable.Root`, after `DataTable.Table`.
2638
+ *
2639
+ * When `useDataTable()` is given `rowSelection.actions`, the footer becomes the
2640
+ * bulk-action bar while rows are selected — the selection count, the
2641
+ * actions, and a Clear button — with its own children (usually
2642
+ * `DataTable.Pagination`) kept alongside.
2561
2643
  */
2562
2644
  readonly Footer: typeof DataTableFooter;
2563
2645
  /**
@@ -2573,6 +2655,14 @@ export declare const DataTable: {
2573
2655
  readonly Pagination: typeof DataTablePagination;
2574
2656
  };
2575
2657
 
2658
+ /** Presentation shared by row actions and selection actions. */
2659
+ export declare interface DataTableAction {
2660
+ id: string;
2661
+ label: string;
2662
+ icon?: ReactNode;
2663
+ variant?: "default" | "destructive";
2664
+ }
2665
+
2576
2666
  declare type DataTableBooleanFilterOperator = OperatorForFilterType["boolean"];
2577
2667
 
2578
2668
  /**
@@ -2642,15 +2732,29 @@ export declare interface DataTableContextValue<TRow extends Record<string, unkno
2642
2732
  setPin: (key: string, side: "left" | "right" | "none" | null) => void;
2643
2733
  onClickRow?: (row: TRow) => void;
2644
2734
  rowActions?: RowAction<TRow>[];
2735
+ /** Selection config, including bulk actions shown by `DataTable.Footer`. */
2736
+ rowSelection?: RowSelectionOptions;
2645
2737
  selectedIds: string[];
2646
2738
  isRowSelected: (row: TRow) => boolean;
2647
2739
  toggleRowSelection?: (row: TRow) => void;
2648
2740
  /**
2649
- * Selects all rows on the **current page** only. Cross-page selection is not supported.
2650
- * Undefined when `onSelectionChange` is not provided.
2741
+ * Adds every row on the **current page** to the selection; rows selected on
2742
+ * other pages are kept.
2651
2743
  */
2652
2744
  selectAllRows?: () => void;
2745
+ /**
2746
+ * Removes the **current page's** rows from the selection; rows selected on
2747
+ * other pages stay selected.
2748
+ */
2749
+ deselectAllRows?: () => void;
2750
+ /** Empties the selection across all pages. */
2653
2751
  clearSelection?: () => void;
2752
+ /** Id of the selection action whose request is in flight, or `null`. */
2753
+ pendingActionId?: string | null;
2754
+ /** See `UseDataTableReturn.runSelectionAction`. */
2755
+ runSelectionAction?: (action: {
2756
+ id: string;
2757
+ }, request: PromiseLike<unknown>) => void;
2654
2758
  isAllSelected: boolean;
2655
2759
  isIndeterminate: boolean;
2656
2760
  /** Ids of the currently expanded rows. */
@@ -2688,6 +2792,10 @@ export declare type DataTableFilterConfig = (Extract<FilterConfig, {
2688
2792
  type: "number";
2689
2793
  }> & {
2690
2794
  operators?: NonEmptyReadonlyArray<DataTableNumericTemporalFilterOperator>;
2795
+ }) | (Extract<FilterConfig, {
2796
+ type: "decimal";
2797
+ }> & {
2798
+ operators?: NonEmptyReadonlyArray<DataTableNumericTemporalFilterOperator>;
2691
2799
  }) | (Extract<FilterConfig, {
2692
2800
  type: "datetime";
2693
2801
  }> & {
@@ -2740,7 +2848,7 @@ declare namespace DataTableFilters {
2740
2848
 
2741
2849
  /** Use `DataTable.Footer` instead of calling this directly. */
2742
2850
  declare function DataTableFooter({ children, className }: {
2743
- children: ReactNode;
2851
+ children?: ReactNode;
2744
2852
  className?: string;
2745
2853
  }): JSX.Element;
2746
2854
 
@@ -2809,6 +2917,7 @@ declare namespace DataTableToolbar {
2809
2917
  declare type DataTableUiFilterOperatorByType = {
2810
2918
  string: DataTableStringFilterOperator;
2811
2919
  number: DataTableNumericTemporalFilterOperator;
2920
+ decimal: DataTableNumericTemporalFilterOperator;
2812
2921
  datetime: DataTableNumericTemporalFilterOperator;
2813
2922
  date: DataTableDateFilterOperator;
2814
2923
  time: DataTableNumericTemporalFilterOperator;
@@ -2852,6 +2961,7 @@ declare interface DateControlProps<T extends DateValue> {
2852
2961
  isRequired?: boolean;
2853
2962
  isInvalid?: boolean;
2854
2963
  autoFocus?: boolean;
2964
+ /** 12- or 24-hour time; defaults to the locale. */
2855
2965
  hourCycle?: HourCycle;
2856
2966
  placeholderValue?: DateValue;
2857
2967
  firstDayOfWeek?: FirstDayOfWeek;
@@ -2866,6 +2976,8 @@ declare interface DateControlProps<T extends DateValue> {
2866
2976
  "aria-describedby"?: string;
2867
2977
  /** BCP-47 locale override; defaults to the AppShell formatting locale. */
2868
2978
  locale?: string;
2979
+ /** Show the locale's short day of the week next to the date (e.g. `(金)`, `Fri,`). */
2980
+ showDayOfWeek?: boolean;
2869
2981
  }
2870
2982
 
2871
2983
  /**
@@ -2951,6 +3063,7 @@ export declare type DateRangePickerProps<T extends DateValue = DateValue> = {
2951
3063
  isRequired?: boolean;
2952
3064
  isInvalid?: boolean;
2953
3065
  autoFocus?: boolean;
3066
+ /** 12- or 24-hour time; defaults to the locale. */
2954
3067
  hourCycle?: HourCycle;
2955
3068
  placeholderValue?: DateValue;
2956
3069
  firstDayOfWeek?: FirstDayOfWeek;
@@ -2976,6 +3089,31 @@ export declare type DateRangePickerProps<T extends DateValue = DateValue> = {
2976
3089
  locale?: string;
2977
3090
  /** IANA timezone; defaults to the AppShell `timeZone`. */
2978
3091
  timeZone?: string;
3092
+ /** Show the locale's short day of the week next to each date. */
3093
+ showDayOfWeek?: boolean;
3094
+ };
3095
+
3096
+ /** A from/to date pair, committed as `between` `{ min, max }`. */
3097
+ declare type DateRangeSection<TField extends string = string> = FieldSectionBase<TField> & {
3098
+ control: "dateRange";
3099
+ min?: string;
3100
+ max?: string;
3101
+ /** Named spans offered above the picker ("Last 30 days"). Click again to clear. */
3102
+ presets?: readonly {
3103
+ label: string;
3104
+ from: string;
3105
+ to: string;
3106
+ }[];
3107
+ };
3108
+
3109
+ /** A single `YYYY-MM-DD` date with one fixed operator. */
3110
+ declare type DateSection<TField extends string = string> = FieldSectionBase<TField> & {
3111
+ control: "date";
3112
+ operator: "eq" | "gte" | "lte";
3113
+ /** `YYYY-MM-DD` */
3114
+ min?: string;
3115
+ /** `YYYY-MM-DD` */
3116
+ max?: string;
2979
3117
  };
2980
3118
 
2981
3119
  export { DateValue }
@@ -3166,7 +3304,7 @@ export declare const defineI18nLabels: <const L extends Exclude<string, "en">, c
3166
3304
  };
3167
3305
  /**
3168
3306
  * A function to get the translater for a specific label key.
3169
- * This is expected to be used in `meta.title` in module/resource definitions.
3307
+ * Use directly in `meta.title` or `meta.breadcrumbTitle` in module/resource definitions.
3170
3308
  *
3171
3309
  * Note: When using dynamic labels with props in meta.title, the props are
3172
3310
  * bound at definition time (when calling labels.t), not at render time.
@@ -3639,6 +3777,25 @@ declare type ExtractBasePath<T extends string> = T extends `${infer Base}?${stri
3639
3777
  /** Extracts the item type from a possibly-grouped items array element. */
3640
3778
  declare type ExtractItem<I> = I extends ItemGroup<infer T> ? T : I;
3641
3779
 
3780
+ /**
3781
+ * One choice in a checkbox or radio section.
3782
+ *
3783
+ * Widens `SelectOption` (`{ value, label }`) and stays assignable **from** it,
3784
+ * so an existing `column.filter.options` array passes straight in.
3785
+ *
3786
+ * `value` is a string on purpose: `useURLCollectionVariables` stringifies array
3787
+ * members when it writes the URL, so a numeric `in` filter would come back as
3788
+ * `["1","2"]` and match nothing after a reload.
3789
+ */
3790
+ declare type FacetOption = SelectOption & {
3791
+ /** Leading adornment — a colour swatch, a status dot. */
3792
+ icon?: ReactNode;
3793
+ /** Rendered but not selectable, with this as the reason (shown as a tooltip). */
3794
+ disabledReason?: string;
3795
+ /** A data-quality note shown as a tooltip, e.g. "Legacy spelling". */
3796
+ note?: string;
3797
+ };
3798
+
3642
3799
  /** Shown when there is no image or the image failed to load. */
3643
3800
  declare function Fallback({ className, ...props }: React_2.ComponentProps<typeof Avatar_2.Fallback>): JSX.Element;
3644
3801
 
@@ -3762,6 +3919,12 @@ declare type FieldRootProps = Pick<React_2.ComponentProps<typeof Field_2.Root>,
3762
3919
  };
3763
3920
  };
3764
3921
 
3922
+ declare type FieldSectionBase<TField extends string> = SectionBase & {
3923
+ field: TField;
3924
+ /** Show the per-section Clear. Default `true`. */
3925
+ clearable?: boolean;
3926
+ };
3927
+
3765
3928
  export declare const Fieldset: {
3766
3929
  Root: typeof Root_9;
3767
3930
  Legend: typeof Legend;
@@ -3792,7 +3955,7 @@ declare type FieldsetRootProps = Pick<React_2.ComponentProps<typeof Fieldset_2.R
3792
3955
  /**
3793
3956
  * Field type mapping for Data View.
3794
3957
  */
3795
- export declare type FieldType = "string" | "number" | "boolean" | "uuid" | "datetime" | "date" | "time" | "enum" | "array" | "nested" | "file";
3958
+ export declare type FieldType = "string" | "number" | "decimal" | "boolean" | "uuid" | "datetime" | "date" | "time" | "enum" | "array" | "nested" | "file";
3796
3959
 
3797
3960
  /**
3798
3961
  * Supported field types for DescriptionCard
@@ -3811,6 +3974,7 @@ export declare function fieldTypeToFilterConfig(field: string, type: FieldType,
3811
3974
  declare type FieldTypeToFilterConfigType = {
3812
3975
  string: "string";
3813
3976
  number: "number";
3977
+ decimal: "decimal";
3814
3978
  boolean: "boolean";
3815
3979
  uuid: "uuid";
3816
3980
  datetime: "datetime";
@@ -3831,6 +3995,7 @@ export declare function fieldTypeToSortConfig(field: string, type: FieldType): S
3831
3995
  declare type FieldTypeToTSType = {
3832
3996
  string: string;
3833
3997
  number: number;
3998
+ decimal: string;
3834
3999
  boolean: boolean;
3835
4000
  uuid: string;
3836
4001
  datetime: string;
@@ -3862,6 +4027,9 @@ export declare type FilterConfig = {
3862
4027
  } | {
3863
4028
  field: string;
3864
4029
  type: "number";
4030
+ } | {
4031
+ field: string;
4032
+ type: "decimal";
3865
4033
  } | {
3866
4034
  field: string;
3867
4035
  type: "datetime";
@@ -3892,6 +4060,75 @@ declare type FilterInputForFieldType<TFilterConfigType extends FilterConfig["typ
3892
4060
  */
3893
4061
  export declare type FilterOperator = OperatorForFilterType[FilterConfig["type"]];
3894
4062
 
4063
+ /**
4064
+ * An always-visible faceted filter rail. Sections are config (`sections`), so
4065
+ * any mix of checkbox, radio, boolean, text, date, range and custom sections
4066
+ * works; every other feature is an optional part you include or leave out.
4067
+ *
4068
+ * It writes the same `CollectionControl` a `DataTable` reads, so it can sit in
4069
+ * a separate `Layout.Column` beside the table. Below `lg` it turns itself into
4070
+ * a left sheet behind a "Filters" button, like the Sidebar does.
4071
+ *
4072
+ * @example
4073
+ * ```tsx
4074
+ * <FilterRail.Root control={control} sections={sections} layout={layout}>
4075
+ * <FilterRail.Header>
4076
+ * <FilterRail.ClearAll />
4077
+ * <FilterRail.Settings />
4078
+ * </FilterRail.Header>
4079
+ * <FilterRail.Sections />
4080
+ * </FilterRail.Root>
4081
+ * ```
4082
+ */
4083
+ export declare const FilterRail: {
4084
+ Provider: typeof Provider_2;
4085
+ Root: typeof Root_14;
4086
+ Header: typeof Header_7;
4087
+ ClearAll: typeof ClearAll;
4088
+ Sections: typeof Sections;
4089
+ Settings: typeof Settings;
4090
+ Trigger: typeof Trigger_5;
4091
+ };
4092
+
4093
+ /** Everything the rail filters with. Given to `Provider`, or to `Root` directly. */
4094
+ /**
4095
+ * `TField` is the control's field type; `TSectionField` the sections' — it must
4096
+ * fit inside `TField`, and defaults to it. With an untyped control
4097
+ * (`CollectionControl<string>`), type the sections with the row's keys to catch
4098
+ * a `field` that is not on the table:
4099
+ *
4100
+ * ```ts
4101
+ * const sections: FilterRailSection<keyof Row & string>[] = [...];
4102
+ * ```
4103
+ */
4104
+ declare type FilterRailConfig<TField extends string = string, TSectionField extends TField = TField> = {
4105
+ /**
4106
+ * The same `control` passed to `useDataTable`. A prop rather than context:
4107
+ * the rail sits in a different `Layout.Column`, outside `DataTable.Root`.
4108
+ */
4109
+ control: CollectionControl<TField>;
4110
+ /** Top to bottom. Any mix of section types. */
4111
+ sections: readonly FilterRailSection<TSectionField>[];
4112
+ /** User layout (order / hidden / sort). Required for `FilterRail.Settings`. */
4113
+ layout?: RailLayoutBinding;
4114
+ /** 32px rows (default) or 40px. */
4115
+ density?: "compact" | "comfortable";
4116
+ /** Fires after the rail applies a change. */
4117
+ onFilterChange?: (next: Filter<TField>[], changed: readonly TSectionField[]) => void;
4118
+ };
4119
+
4120
+ declare type FilterRailProviderProps<TField extends string = string, TSectionField extends TField = TField> = FilterRailConfig<TField, TSectionField> & {
4121
+ children: ReactNode;
4122
+ };
4123
+
4124
+ /**
4125
+ * Standalone, `Root` takes the config itself. Inside `FilterRail.Provider` —
4126
+ * needed only when a `FilterRail.Trigger` sits outside the rail — it takes none.
4127
+ */
4128
+ export declare type FilterRailRootProps<TField extends string = string, TSectionField extends TField = TField> = RootOwnProps & (FilterRailConfig<TField, TSectionField> | NoConfig);
4129
+
4130
+ export declare type FilterRailSection<TField extends string = string> = TextSection<TField> | RadioSection<TField> | CheckboxSection<TField> | DateSection<TField> | DateRangeSection<TField> | NumberRangeSection<TField> | BooleanSection<TField> | CustomSection<TField>;
4131
+
3895
4132
  /**
3896
4133
  * Week-start override for the `weekStart`/`weekEnd` shortcuts (and the calendar
3897
4134
  * grid). Defined here — with the resolver that consumes it — so the field and
@@ -4383,11 +4620,25 @@ declare namespace Header_6 {
4383
4620
  var displayName: string;
4384
4621
  }
4385
4622
 
4623
+ declare function Header_7({ title, children, className }: HeaderProps_2): JSX.Element;
4624
+
4625
+ declare namespace Header_7 {
4626
+ var displayName: string;
4627
+ }
4628
+
4386
4629
  declare type HeaderProps = Omit<React_2.ComponentProps<"div">, "title"> & {
4387
4630
  title?: React_2.ReactNode;
4388
4631
  description?: React_2.ReactNode;
4389
4632
  };
4390
4633
 
4634
+ declare type HeaderProps_2 = {
4635
+ /** Default "Filters". */
4636
+ title?: ReactNode;
4637
+ /** Actions on the right — `FilterRail.ClearAll`, `FilterRail.Settings`, or your own. */
4638
+ children?: ReactNode;
4639
+ className?: string;
4640
+ };
4641
+
4391
4642
  /**
4392
4643
  * Context passed to custom `header` renderers.
4393
4644
  */
@@ -4887,6 +5138,10 @@ export { NavLink }
4887
5138
 
4888
5139
  export { NavLinkProps }
4889
5140
 
5141
+ declare type NoConfig = {
5142
+ [K in keyof FilterRailConfig]?: never;
5143
+ };
5144
+
4890
5145
  /**
4891
5146
  * Extract the node type from a cursor connection result.
4892
5147
  */
@@ -4916,6 +5171,17 @@ declare interface NumberCellOptions {
4916
5171
  locale?: string;
4917
5172
  }
4918
5173
 
5174
+ /** A numeric from/to pair: `between` `{ min, max }`, or `gte` / `lte` when half-open. */
5175
+ declare type NumberRangeSection<TField extends string = string> = FieldSectionBase<TField> & {
5176
+ control: "numberRange";
5177
+ /** Input bounds and placeholders. One end typed alone commits `gte` / `lte`. */
5178
+ min?: number;
5179
+ max?: number;
5180
+ step?: number;
5181
+ /** Rendered after the inputs — "units", "$". */
5182
+ unit?: ReactNode;
5183
+ };
5184
+
4919
5185
  export declare type OpenCommandPaletteOptions = {
4920
5186
  /** Optional initial text to prefill into the palette input. */
4921
5187
  search?: string;
@@ -4947,6 +5213,7 @@ declare type OperatorForFilterType = {
4947
5213
  export declare const OPERATORS_BY_FILTER_TYPE: {
4948
5214
  readonly string: readonly ["eq", "ne", "contains", "notContains", "hasPrefix", "hasSuffix", "notHasPrefix", "notHasSuffix", "in", "nin", "regex"];
4949
5215
  readonly number: readonly ["eq", "ne", "gt", "gte", "lt", "lte", "between", "in", "nin"];
5216
+ readonly decimal: readonly ["eq", "ne", "gt", "gte", "lt", "lte", "between", "in", "nin"];
4950
5217
  readonly datetime: readonly ["eq", "ne", "gt", "gte", "lt", "lte", "between", "in", "nin"];
4951
5218
  readonly date: readonly ["eq", "ne", "gt", "gte", "lt", "lte", "between", "in", "nin"];
4952
5219
  readonly time: readonly ["eq", "ne", "gt", "gte", "lt", "lte", "between", "in", "nin"];
@@ -4960,7 +5227,16 @@ declare type OperatorValueType<TOp extends string, TValue> = TOp extends "in" |
4960
5227
  max: TValue;
4961
5228
  } : TValue;
4962
5229
 
4963
- declare type OrderableFieldType = "string" | "number" | "boolean" | "datetime" | "date" | "time" | "enum";
5230
+ /**
5231
+ * How a checkbox section's options are ordered.
5232
+ *
5233
+ * `"given"` (default) keeps the authored order — a curated vocabulary
5234
+ * (XS · S · M · L) must never be reordered. `"label"` sorts A–Z. A comparator
5235
+ * gives any other fixed order.
5236
+ */
5237
+ declare type OptionSort = "given" | "label" | ((a: FacetOption, b: FacetOption) => number);
5238
+
5239
+ declare type OrderableFieldType = "string" | "number" | "decimal" | "boolean" | "datetime" | "date" | "time" | "enum";
4964
5240
 
4965
5241
  /**
4966
5242
  * A React component that can be used as a page in file-based routing.
@@ -5076,6 +5352,17 @@ declare namespace Provider {
5076
5352
  var displayName: string;
5077
5353
  }
5078
5354
 
5355
+ /**
5356
+ * Holds the rail's state for every part beneath it. Only needed when a
5357
+ * `FilterRail.Trigger` sits outside `FilterRail.Root` (in a table toolbar, say);
5358
+ * otherwise give `Root` the config directly.
5359
+ */
5360
+ declare function Provider_2<TField extends string = string, TSectionField extends TField = TField>({ control, sections, layout, density, onFilterChange, children, }: FilterRailProviderProps<TField, TSectionField>): JSX.Element;
5361
+
5362
+ declare namespace Provider_2 {
5363
+ var displayName: string;
5364
+ }
5365
+
5079
5366
  declare type ProviderProps = Pick<React_2.ComponentProps<typeof Tooltip_2.Provider>, "delay" | "closeDelay" | "timeout"> & {
5080
5367
  children: React_2.ReactNode;
5081
5368
  };
@@ -5101,6 +5388,36 @@ declare namespace RadioItemIndicator {
5101
5388
  var displayName: string;
5102
5389
  }
5103
5390
 
5391
+ /** Mutually exclusive choices — one filter, or none. */
5392
+ declare type RadioSection<TField extends string = string> = FieldSectionBase<TField> & {
5393
+ control: "radio";
5394
+ operator?: "eq" | "ne";
5395
+ options: readonly FacetOption[];
5396
+ /** The "no constraint" row. Default "Any"; `null` removes it. */
5397
+ anyLabel?: ReactNode | null;
5398
+ };
5399
+
5400
+ /**
5401
+ * The user's override of the authored section order, visibility and option
5402
+ * sort. Kept separate from `sections` so a new authored section needs no
5403
+ * migration of anyone's saved layout.
5404
+ */
5405
+ declare type RailLayout = {
5406
+ /** Section ids, top to bottom. Unlisted ids follow in authored order. */
5407
+ order: readonly string[];
5408
+ /** Section ids the user has switched off. */
5409
+ hidden: readonly string[];
5410
+ /** Per-section override of the authored `sort`. Checkbox sections only. */
5411
+ sort: Readonly<Record<string, UserOptionSort>>;
5412
+ };
5413
+
5414
+ declare type RailLayoutBinding = {
5415
+ value: RailLayout;
5416
+ onChange: (next: RailLayout) => void;
5417
+ /** Back to the authored defaults. Omit and no Reset is offered. */
5418
+ onReset?: () => void;
5419
+ };
5420
+
5104
5421
  /**
5105
5422
  * A standalone inline range calendar. The first click sets one end of the
5106
5423
  * range, the highlight follows the pointer (or arrow keys), and the second
@@ -5234,9 +5551,11 @@ declare type ResourceMeta = {
5234
5551
  title?: LocalizedString;
5235
5552
  icon?: ReactNode;
5236
5553
  /**
5237
- * Custom breadcrumb segment title for this page. Can be a string or a function.
5554
+ * Custom breadcrumb segment title. Pass `labels.t("key")` directly for localization.
5555
+ * Other callbacks receive the URL segment and may return a LocalizedString
5556
+ * (e.g. `(segment) => labels.t("order", { id: segment })`), resolved using the current locale.
5238
5557
  */
5239
- breadcrumbTitle?: string | ((segment: string) => string);
5558
+ breadcrumbTitle?: string | ((segment: string) => LocalizedString);
5240
5559
  };
5241
5560
 
5242
5561
  /**
@@ -5362,6 +5681,17 @@ declare namespace Root_13 {
5362
5681
  var displayName: string;
5363
5682
  }
5364
5683
 
5684
+ /**
5685
+ * The rail. Give it the config directly, or render it inside
5686
+ * `FilterRail.Provider` with no config when a `FilterRail.Trigger` lives
5687
+ * elsewhere on the page.
5688
+ */
5689
+ declare function Root_14<TField extends string = string, TSectionField extends TField = TField>(props: FilterRailRootProps<TField, TSectionField>): JSX.Element;
5690
+
5691
+ declare namespace Root_14 {
5692
+ var displayName: string;
5693
+ }
5694
+
5365
5695
  /**
5366
5696
  * Provides the shared time range used by all timeline primitives.
5367
5697
  *
@@ -5376,9 +5706,9 @@ declare namespace Root_13 {
5376
5706
  * </Timeline.Root>
5377
5707
  * ```
5378
5708
  */
5379
- declare function Root_14({ start, end, children, className, style }: TimelineRootProps): JSX.Element;
5709
+ declare function Root_15({ start, end, children, className, style }: TimelineRootProps): JSX.Element;
5380
5710
 
5381
- declare namespace Root_14 {
5711
+ declare namespace Root_15 {
5382
5712
  var displayName: string;
5383
5713
  }
5384
5714
 
@@ -5547,6 +5877,13 @@ declare type RootConfiguration = {
5547
5877
  timeZone?: string;
5548
5878
  };
5549
5879
 
5880
+ declare type RootOwnProps = {
5881
+ /** Accessible name of the rail landmark. Default "Filters". */
5882
+ "aria-label"?: string;
5883
+ className?: string;
5884
+ children: ReactNode;
5885
+ };
5886
+
5550
5887
  declare type RootProps = React_2.ComponentProps<"div"> & VariantProps<typeof alertVariants> & {
5551
5888
  /** Action element rendered below the description */
5552
5889
  action?: React_2.ReactNode;
@@ -5620,11 +5957,16 @@ declare namespace Row_3 {
5620
5957
  /**
5621
5958
  * A single row action definition for the actions column.
5622
5959
  */
5623
- export declare interface RowAction<TRow extends Record<string, unknown>> {
5624
- id: string;
5625
- label: string;
5626
- icon?: ReactNode;
5627
- variant?: "default" | "destructive";
5960
+ export declare interface RowAction<TRow extends Record<string, unknown>> extends DataTableAction {
5961
+ /** Whether the action can act on this row. Return `false` to disable it. */
5962
+ canApply?: (row: TRow) => boolean;
5963
+ /**
5964
+ * Return `true` to disable the action for a given row.
5965
+ *
5966
+ * @deprecated Use `canApply`, which reads the other way round:
5967
+ * `isDisabled: (row) => x` is `canApply: (row) => !x`. If both are set, the
5968
+ * action is disabled when either one says so.
5969
+ */
5628
5970
  isDisabled?: (row: TRow) => boolean;
5629
5971
  onClick: (row: TRow) => void;
5630
5972
  }
@@ -5677,6 +6019,32 @@ declare type RowExpansionOptions<TRow extends Record<string, unknown>> = {
5677
6019
  onChange?: (ids: string[]) => void;
5678
6020
  });
5679
6021
 
6022
+ /** Controlled or uncontrolled row-selection configuration. Keep the mode stable while mounted. */
6023
+ export declare type RowSelectionOptions = {
6024
+ /**
6025
+ * Bulk actions for the selected IDs, shown in `DataTable.Footer` while at
6026
+ * least one row is selected. The bar includes the selection count, these
6027
+ * actions, and Clear, with pagination kept alongside. The first three actions
6028
+ * render as buttons; the rest collapse into a "More actions" menu.
6029
+ * Omit or pass an empty array to enable selection without an action bar.
6030
+ */
6031
+ actions?: SelectionAction[];
6032
+ } & ({
6033
+ /**
6034
+ * Controlled selected ids. Update this array from `onChange`.
6035
+ * Commands issued before the owner commits each derive from this value.
6036
+ */
6037
+ selectedIds: string[];
6038
+ onChange: (ids: string[]) => void;
6039
+ defaultSelectedIds?: never;
6040
+ } | {
6041
+ selectedIds?: never;
6042
+ /** Initial selected ids in uncontrolled mode; subsequent changes are ignored. */
6043
+ defaultSelectedIds?: string[];
6044
+ /** Notification of user-driven selection changes, including under StrictMode. */
6045
+ onChange?: (ids: string[]) => void;
6046
+ });
6047
+
5680
6048
  /**
5681
6049
  * Setter shape compatible with `useSearchParams()`.
5682
6050
  */
@@ -5707,6 +6075,32 @@ export declare type SearchSource = {
5707
6075
  }) => Promise<CommandPaletteSearchResult[]>;
5708
6076
  };
5709
6077
 
6078
+ declare type SectionBase = {
6079
+ /** Stable and unique within the rail. Keys the layout and a11y ids. */
6080
+ id: string;
6081
+ /** The section heading — the word the business uses, not the field name. */
6082
+ label: ReactNode;
6083
+ /** One muted line under the heading. */
6084
+ hint?: ReactNode;
6085
+ /**
6086
+ * Start collapsed. Users expand or collapse any section from the chevron by
6087
+ * its title; while collapsed, the header still shows how many values are
6088
+ * selected. Default `false`.
6089
+ */
6090
+ defaultCollapsed?: boolean;
6091
+ };
6092
+
6093
+ /** Every section, in the user's layout. Scrolls; the header stays put. */
6094
+ declare function Sections({ className }: SectionsProps): JSX.Element;
6095
+
6096
+ declare namespace Sections {
6097
+ var displayName: string;
6098
+ }
6099
+
6100
+ declare type SectionsProps = {
6101
+ className?: string;
6102
+ };
6103
+
5710
6104
  export declare const Select: SelectComponent;
5711
6105
 
5712
6106
  /**
@@ -5807,6 +6201,38 @@ declare namespace SelectGroupLabel {
5807
6201
  var displayName: string;
5808
6202
  }
5809
6203
 
6204
+ /**
6205
+ * An ID-based bulk action shown in `DataTable.Footer` while a selection is open.
6206
+ * Configure through `UseDataTableOptions.rowSelection.actions`.
6207
+ */
6208
+ export declare interface SelectionAction extends DataTableAction {
6209
+ /**
6210
+ * Called with a click-time copy of all selected IDs, including unloaded rows.
6211
+ * Consumers own eligibility checks, fetching, confirmation, and execution.
6212
+ * Selection is never automatically cleared: update controlled selection based
6213
+ * on the actual result, preserving ineligible IDs and any new selections.
6214
+ *
6215
+ * Return a promise to disable the bar and show a spinner while it is pending.
6216
+ * For work started later by a confirmation dialog, pass the request to
6217
+ * `helpers.run` instead. Neither success nor failure changes selection.
6218
+ */
6219
+ onClick: (ids: string[], helpers: SelectionActionHelpers) => void | Promise<unknown>;
6220
+ }
6221
+
6222
+ /** The second argument to `SelectionAction.onClick`. */
6223
+ export declare interface SelectionActionHelpers {
6224
+ /** Empty the selection across all pages. */
6225
+ clearSelection: () => void;
6226
+ /**
6227
+ * Hand the bar a request it should track — for one that starts after
6228
+ * `onClick` has returned, typically from a confirm dialog's confirm button.
6229
+ * The bar then behaves as if `onClick` had returned it: actions (and Clear)
6230
+ * are disabled while it is pending. It never changes selection. Returns the
6231
+ * request, so it can be awaited too.
6232
+ */
6233
+ run: <T>(request: PromiseLike<T>) => PromiseLike<T>;
6234
+ }
6235
+
5810
6236
  declare function SelectItem({ className, children, ...props }: React_2.ComponentProps<typeof Select_2.Item>): JSX.Element;
5811
6237
 
5812
6238
  declare namespace SelectItem {
@@ -5961,6 +6387,23 @@ declare namespace Separator {
5961
6387
  var displayName: string;
5962
6388
  }
5963
6389
 
6390
+ /**
6391
+ * Show / hide, reorder and sort the sections. Renders nothing unless
6392
+ * `FilterRail.Root` has a `layout` binding.
6393
+ *
6394
+ * Hiding a section that carries a filter also clears that filter — hiding must
6395
+ * never strand an active filter somewhere the user cannot see it.
6396
+ */
6397
+ declare function Settings({ className }: SettingsProps): JSX.Element | null;
6398
+
6399
+ declare namespace Settings {
6400
+ var displayName: string;
6401
+ }
6402
+
6403
+ declare type SettingsProps = {
6404
+ className?: string;
6405
+ };
6406
+
5964
6407
  /**
5965
6408
  * Shared props between `AppShellProps` and the internal `WithPages` wrapper.
5966
6409
  *
@@ -6492,9 +6935,45 @@ declare const sidebarMenuButtonVariants: (props?: ({
6492
6935
 
6493
6936
  export declare function SidebarMenuItem({ className, ...props }: React_2.ComponentProps<"li">): JSX.Element;
6494
6937
 
6938
+ /**
6939
+ * A static heading for a run of flat sidebar navigation items.
6940
+ *
6941
+ * Unlike `SidebarGroup`, a section is neither collapsible nor navigable, and its
6942
+ * items keep the same styling and indentation as top-level items. In the icon
6943
+ * rail the heading is hidden so the compact layout is unaffected. Add dividers
6944
+ * between sections with `SidebarSeparator`.
6945
+ *
6946
+ * @example
6947
+ * ```tsx
6948
+ * <DefaultSidebar>
6949
+ * <SidebarItem to="/overview" />
6950
+ * <SidebarSeparator />
6951
+ * <SidebarSection title={labels.t("services")}>
6952
+ * <SidebarItem to="/ai-gateways" />
6953
+ * <SidebarItem to="/applications" />
6954
+ * </SidebarSection>
6955
+ * </DefaultSidebar>
6956
+ * ```
6957
+ */
6958
+ export declare const SidebarSection: (props: SidebarSectionProps) => JSX.Element;
6959
+
6960
+ export declare type SidebarSectionProps = {
6961
+ /**
6962
+ * Section heading (i18n supported).
6963
+ */
6964
+ title: LocalizedString;
6965
+ /**
6966
+ * Child items (SidebarItem, SidebarGroup, etc.)
6967
+ */
6968
+ children: ReactNode;
6969
+ };
6970
+
6495
6971
  /**
6496
6972
  * A visual divider for sidebar navigation.
6497
6973
  *
6974
+ * Adds 4px above and 8px below the line (on top of the menu's own gap) so the
6975
+ * items that follow read as a new section.
6976
+ *
6498
6977
  * @example
6499
6978
  * ```tsx
6500
6979
  * <DefaultSidebar>
@@ -6775,6 +7254,17 @@ export declare type TextareaProps = Omit<React_2.ComponentProps<typeof Field_2.C
6775
7254
  className?: string;
6776
7255
  };
6777
7256
 
7257
+ /** Free text with one fixed operator. */
7258
+ declare type TextSection<TField extends string = string> = FieldSectionBase<TField> & {
7259
+ control: "text";
7260
+ operator: "contains" | "hasPrefix" | "eq";
7261
+ placeholder?: string;
7262
+ /** Default 250 ms. Every commit resets pagination. */
7263
+ debounceMs?: number;
7264
+ /** Below this length the filter is removed instead of applied. Default 1. */
7265
+ minLength?: number;
7266
+ };
7267
+
6778
7268
  export { Time }
6779
7269
 
6780
7270
  /**
@@ -6793,7 +7283,7 @@ export { Time }
6793
7283
  * ```
6794
7284
  */
6795
7285
  export declare const Timeline: {
6796
- Root: typeof Root_14;
7286
+ Root: typeof Root_15;
6797
7287
  Viewport: typeof Viewport;
6798
7288
  Row: typeof Row_3;
6799
7289
  Interval: typeof Interval;
@@ -7276,6 +7766,23 @@ declare namespace Trigger_4 {
7276
7766
  var displayName: string;
7277
7767
  }
7278
7768
 
7769
+ /**
7770
+ * Opens the rail on narrow screens, carrying the active filter count. Place it
7771
+ * anywhere inside `FilterRail.Provider` — a table toolbar, a page header. It
7772
+ * renders nothing on wide screens, where the rail is already visible, and while
7773
+ * it is mounted `FilterRail.Root` skips its own fallback button.
7774
+ */
7775
+ declare function Trigger_5({ children, className }: TriggerProps_2): JSX.Element | null;
7776
+
7777
+ declare namespace Trigger_5 {
7778
+ var displayName: string;
7779
+ }
7780
+
7781
+ declare type TriggerButtonProps = {
7782
+ children?: ReactNode;
7783
+ className?: string;
7784
+ };
7785
+
7279
7786
  declare type TriggerProps = {
7280
7787
  /** Extra classes for the trigger button. */
7281
7788
  className?: string;
@@ -7286,6 +7793,8 @@ declare type TriggerProps = {
7286
7793
  onClick?: React.MouseEventHandler<HTMLButtonElement>;
7287
7794
  };
7288
7795
 
7796
+ declare type TriggerProps_2 = TriggerButtonProps;
7797
+
7289
7798
  /**
7290
7799
  * Metadata-aware collection variables that remain assignable to the broad
7291
7800
  * `CollectionVariables` shape expected by GraphQL clients.
@@ -7746,6 +8255,8 @@ export declare interface UseCollectionReturn<TFieldName extends string = string,
7746
8255
  /**
7747
8256
  * Hook for managing collection query parameters (filters, sort, pagination)
7748
8257
  * with metadata-based field name typing and automatic `fieldType` detection.
8258
+ * Datetime filters are normalized to RFC 3339 using the AppShell timezone
8259
+ * before initialization or updates. Invalid datetime values throw a TypeError.
7749
8260
  *
7750
8261
  * Returns `variables` with `query`, `order`, and `pagination` sub-properties
7751
8262
  * that can be mapped to GraphQL query variables.
@@ -8032,16 +8543,27 @@ export declare type UseDataTableOptions<TRow extends Record<string, unknown>, TF
8032
8543
  * The column is omitted when this array is empty or not provided.
8033
8544
  */
8034
8545
  rowActions?: RowAction<TRow>[];
8546
+ /**
8547
+ * Controlled or uncontrolled row selection. Providing this option enables
8548
+ * checkboxes. Uses string-normalized `row.id`; rows without an id are excluded.
8549
+ * The header checkbox adds/removes only the current page, preserving other ids.
8550
+ */
8551
+ rowSelection?: RowSelectionOptions;
8035
8552
  /**
8036
8553
  * Called with the current array of selected row IDs whenever the selection
8037
- * changes. Providing this prop enables the checkbox selection column.
8038
- * Selection is ID-based (`row.id`) and persists across page changes.
8554
+ * changes. Providing this prop or `rowSelection` enables the checkbox
8555
+ * selection column. Selection is ID-based (`row.id`) and persists
8556
+ * across page changes. Remains supported; `rowSelection.onChange` takes
8557
+ * precedence when both callbacks are supplied.
8039
8558
  *
8040
8559
  * **Requirement:** Each row must have a string or number `id` field.
8041
8560
  * Rows without `id` are excluded from selection.
8042
8561
  *
8043
- * **Note:** `selectAllRows` (triggered by the header checkbox) selects only
8044
- * the rows on the **current page**, not all pages.
8562
+ * **Note:** The header checkbox acts on the **current page**: checking it adds
8563
+ * the page's rows to the selection and unchecking it removes them. Rows
8564
+ * selected on other pages are kept.
8565
+ *
8566
+ * @deprecated Use `rowSelection.onChange` instead.
8045
8567
  */
8046
8568
  onSelectionChange?: (ids: string[]) => void;
8047
8569
  /**
@@ -8137,11 +8659,27 @@ export declare interface UseDataTableReturn<TRow extends Record<string, unknown>
8137
8659
  control: CollectionControl | undefined;
8138
8660
  onClickRow?: (row: TRow) => void;
8139
8661
  rowActions?: RowAction<TRow>[];
8662
+ /** Selection config (passthrough for `DataTable.Root`). */
8663
+ rowSelection?: RowSelectionOptions;
8140
8664
  selectedIds: string[];
8141
8665
  isRowSelected: (row: TRow) => boolean;
8142
8666
  toggleRowSelection?: (row: TRow) => void;
8667
+ /** Adds every row on the current page to the selection. */
8143
8668
  selectAllRows?: () => void;
8669
+ /** Removes the current page's rows from the selection; other pages' rows stay selected. */
8670
+ deselectAllRows?: () => void;
8671
+ /** Empties the selection across all pages. */
8144
8672
  clearSelection?: () => void;
8673
+ /** Id of the selection action whose request is in flight, or `null`. */
8674
+ pendingActionId?: string | null;
8675
+ /**
8676
+ * Tracks a selection action's request: disables the bar while it is pending
8677
+ * without changing selection. This is what `SelectionActionHelpers.run` calls.
8678
+ * Undefined when selection is off.
8679
+ */
8680
+ runSelectionAction?: (action: {
8681
+ id: string;
8682
+ }, request: PromiseLike<unknown>) => void;
8145
8683
  isAllSelected: boolean;
8146
8684
  isIndeterminate: boolean;
8147
8685
  /** Ids of the currently expanded rows. */
@@ -8198,6 +8736,16 @@ declare function useFilter(options?: ComboboxFilterOptions): ComboboxFilter;
8198
8736
  */
8199
8737
  declare function useFilter_2(options?: AutocompleteFilterOptions): AutocompleteFilter;
8200
8738
 
8739
+ /**
8740
+ * The user's section order, visibility and option sort, persisted to
8741
+ * localStorage under `storageKey`. Pass the result to `FilterRail.Root`'s
8742
+ * `layout` prop to enable `FilterRail.Settings`.
8743
+ *
8744
+ * For a team-shared layout, build a `{ value, onChange, onReset }` binding over
8745
+ * your own store instead — the rail does not care where it lives.
8746
+ */
8747
+ export declare function useFilterRailLayout(storageKey: string): RailLayoutBinding;
8748
+
8201
8749
  export { useLocation }
8202
8750
 
8203
8751
  export { useMatch }
@@ -8300,6 +8848,9 @@ export declare const useResolvedLocale: () => {
8300
8848
 
8301
8849
  export { useResolvedPath }
8302
8850
 
8851
+ /** The option sorts a user may pick in `FilterRail.Settings`. */
8852
+ declare type UserOptionSort = "given" | "label";
8853
+
8303
8854
  export { useRouteError }
8304
8855
 
8305
8856
  export { useSearchParams }
@@ -8561,12 +9112,12 @@ declare namespace Root {
8561
9112
  }
8562
9113
 
8563
9114
 
8564
- declare namespace Title {
9115
+ declare namespace Image {
8565
9116
  var displayName: string;
8566
9117
  }
8567
9118
 
8568
9119
 
8569
- declare namespace Description {
9120
+ declare namespace Fallback {
8570
9121
  var displayName: string;
8571
9122
  }
8572
9123
 
@@ -8576,32 +9127,37 @@ declare namespace Root {
8576
9127
  }
8577
9128
 
8578
9129
 
8579
- declare namespace List {
9130
+ declare namespace Header {
8580
9131
  var displayName: string;
8581
9132
  }
8582
9133
 
8583
9134
 
8584
- declare namespace Tab {
9135
+ declare namespace Body {
8585
9136
  var displayName: string;
8586
9137
  }
8587
9138
 
8588
9139
 
8589
- declare namespace Panel {
9140
+ declare namespace Footer {
8590
9141
  var displayName: string;
8591
9142
  }
8592
9143
 
8593
9144
 
8594
- declare namespace Root {
9145
+ declare namespace Row {
8595
9146
  var displayName: string;
8596
9147
  }
8597
9148
 
8598
9149
 
8599
- declare namespace Image {
9150
+ declare namespace Head {
8600
9151
  var displayName: string;
8601
9152
  }
8602
9153
 
8603
9154
 
8604
- declare namespace Fallback {
9155
+ declare namespace Cell {
9156
+ var displayName: string;
9157
+ }
9158
+
9159
+
9160
+ declare namespace Caption {
8605
9161
  var displayName: string;
8606
9162
  }
8607
9163
 
@@ -8616,47 +9172,47 @@ declare namespace Header {
8616
9172
  }
8617
9173
 
8618
9174
 
8619
- declare namespace Body {
9175
+ declare namespace Content {
8620
9176
  var displayName: string;
8621
9177
  }
8622
9178
 
8623
9179
 
8624
- declare namespace Footer {
9180
+ declare namespace Root {
8625
9181
  var displayName: string;
8626
9182
  }
8627
9183
 
8628
9184
 
8629
- declare namespace Row {
9185
+ declare namespace Trigger {
8630
9186
  var displayName: string;
8631
9187
  }
8632
9188
 
8633
9189
 
8634
- declare namespace Head {
9190
+ declare namespace Close {
8635
9191
  var displayName: string;
8636
9192
  }
8637
9193
 
8638
9194
 
8639
- declare namespace Cell {
9195
+ declare namespace Content {
8640
9196
  var displayName: string;
8641
9197
  }
8642
9198
 
8643
9199
 
8644
- declare namespace Caption {
9200
+ declare namespace Header {
8645
9201
  var displayName: string;
8646
9202
  }
8647
9203
 
8648
9204
 
8649
- declare namespace Root {
9205
+ declare namespace Footer {
8650
9206
  var displayName: string;
8651
9207
  }
8652
9208
 
8653
9209
 
8654
- declare namespace Header {
9210
+ declare namespace Title {
8655
9211
  var displayName: string;
8656
9212
  }
8657
9213
 
8658
9214
 
8659
- declare namespace Content {
9215
+ declare namespace Description {
8660
9216
  var displayName: string;
8661
9217
  }
8662
9218
 
@@ -8666,192 +9222,197 @@ declare namespace Root {
8666
9222
  }
8667
9223
 
8668
9224
 
8669
- declare namespace Trigger {
9225
+ declare namespace Legend {
8670
9226
  var displayName: string;
8671
9227
  }
8672
9228
 
8673
9229
 
8674
- declare namespace Close {
9230
+ declare namespace ComboboxRoot {
8675
9231
  var displayName: string;
8676
9232
  }
8677
9233
 
8678
9234
 
8679
- declare namespace Content {
9235
+ declare namespace ComboboxInput {
8680
9236
  var displayName: string;
8681
9237
  }
8682
9238
 
8683
9239
 
8684
- declare namespace Header {
9240
+ declare namespace ComboboxTrigger {
8685
9241
  var displayName: string;
8686
9242
  }
8687
9243
 
8688
9244
 
8689
- declare namespace Footer {
9245
+ declare namespace ComboboxInputGroup {
8690
9246
  var displayName: string;
8691
9247
  }
8692
9248
 
8693
9249
 
8694
- declare namespace Title {
9250
+ declare namespace ComboboxContent {
8695
9251
  var displayName: string;
8696
9252
  }
8697
9253
 
8698
9254
 
8699
- declare namespace Description {
9255
+ declare namespace ComboboxList {
8700
9256
  var displayName: string;
8701
9257
  }
8702
9258
 
8703
9259
 
8704
- declare namespace Root {
9260
+ declare namespace ComboboxItem {
8705
9261
  var displayName: string;
8706
9262
  }
8707
9263
 
8708
9264
 
8709
- declare namespace Label {
9265
+ declare namespace ComboboxEmpty {
8710
9266
  var displayName: string;
8711
9267
  }
8712
9268
 
8713
9269
 
8714
- declare namespace Control {
9270
+ declare namespace ComboboxGroup {
8715
9271
  var displayName: string;
8716
9272
  }
8717
9273
 
8718
9274
 
8719
- declare namespace Description {
9275
+ declare namespace ComboboxGroupLabel {
8720
9276
  var displayName: string;
8721
9277
  }
8722
9278
 
8723
9279
 
8724
- declare namespace Error {
9280
+ declare namespace ComboboxClear {
8725
9281
  var displayName: string;
8726
9282
  }
8727
9283
 
8728
9284
 
8729
- declare namespace Validity {
9285
+ declare namespace ComboboxChips {
8730
9286
  var displayName: string;
8731
9287
  }
8732
9288
 
8733
9289
 
8734
- declare namespace Root {
9290
+ declare namespace ComboboxChip {
8735
9291
  var displayName: string;
8736
9292
  }
8737
9293
 
8738
9294
 
8739
- declare namespace Legend {
9295
+ declare namespace ComboboxChipRemove {
8740
9296
  var displayName: string;
8741
9297
  }
8742
9298
 
8743
9299
 
8744
- declare namespace Root {
9300
+ declare namespace ComboboxValue {
8745
9301
  var displayName: string;
8746
9302
  }
8747
9303
 
8748
9304
 
8749
- declare namespace Trigger {
9305
+ declare namespace ComboboxStatus {
8750
9306
  var displayName: string;
8751
9307
  }
8752
9308
 
8753
9309
 
8754
- declare namespace Content {
9310
+ declare namespace ComboboxCollection {
8755
9311
  var displayName: string;
8756
9312
  }
8757
9313
 
8758
9314
 
8759
- declare namespace Item {
9315
+ declare namespace Root {
8760
9316
  var displayName: string;
8761
9317
  }
8762
9318
 
8763
9319
 
8764
- declare namespace LinkItem {
9320
+ declare namespace Label {
8765
9321
  var displayName: string;
8766
9322
  }
8767
9323
 
8768
9324
 
8769
- declare namespace CheckboxItem {
9325
+ declare namespace Control {
8770
9326
  var displayName: string;
8771
9327
  }
8772
9328
 
8773
9329
 
8774
- declare namespace CheckboxItemIndicator {
9330
+ declare namespace Description {
8775
9331
  var displayName: string;
8776
9332
  }
8777
9333
 
8778
9334
 
8779
- declare namespace RadioItem {
9335
+ declare namespace Error {
8780
9336
  var displayName: string;
8781
9337
  }
8782
9338
 
8783
9339
 
8784
- declare namespace RadioItemIndicator {
9340
+ declare namespace Validity {
8785
9341
  var displayName: string;
8786
9342
  }
8787
9343
 
8788
9344
 
8789
- declare namespace RadioGroup {
9345
+ declare namespace Root {
8790
9346
  var displayName: string;
8791
9347
  }
8792
9348
 
8793
9349
 
8794
- declare namespace Group {
9350
+ declare namespace Trigger {
8795
9351
  var displayName: string;
8796
9352
  }
8797
9353
 
8798
9354
 
8799
- declare namespace GroupLabel {
9355
+ declare namespace Content {
8800
9356
  var displayName: string;
8801
9357
  }
8802
9358
 
8803
9359
 
8804
- declare namespace MenuSeparator {
9360
+ declare namespace Item {
8805
9361
  var displayName: string;
8806
9362
  }
8807
9363
 
8808
9364
 
8809
- declare namespace SubmenuRoot {
9365
+ declare namespace LinkItem {
8810
9366
  var displayName: string;
8811
9367
  }
8812
9368
 
8813
9369
 
8814
- declare namespace SubmenuTrigger {
9370
+ declare namespace CheckboxItem {
8815
9371
  var displayName: string;
8816
9372
  }
8817
9373
 
8818
9374
 
8819
- declare namespace Root {
9375
+ declare namespace CheckboxItemIndicator {
8820
9376
  var displayName: string;
8821
9377
  }
8822
9378
 
8823
9379
 
8824
- declare namespace Trigger {
9380
+ declare namespace RadioItem {
8825
9381
  var displayName: string;
8826
9382
  }
8827
9383
 
8828
9384
 
8829
- declare namespace Close {
9385
+ declare namespace RadioItemIndicator {
8830
9386
  var displayName: string;
8831
9387
  }
8832
9388
 
8833
9389
 
8834
- declare namespace Content {
9390
+ declare namespace RadioGroup {
8835
9391
  var displayName: string;
8836
9392
  }
8837
9393
 
8838
9394
 
8839
- declare namespace Header {
9395
+ declare namespace Group {
8840
9396
  var displayName: string;
8841
9397
  }
8842
9398
 
8843
9399
 
8844
- declare namespace Footer {
9400
+ declare namespace GroupLabel {
8845
9401
  var displayName: string;
8846
9402
  }
8847
9403
 
8848
9404
 
8849
- declare namespace Title {
9405
+ declare namespace MenuSeparator {
8850
9406
  var displayName: string;
8851
9407
  }
8852
9408
 
8853
9409
 
8854
- declare namespace Description {
9410
+ declare namespace SubmenuRoot {
9411
+ var displayName: string;
9412
+ }
9413
+
9414
+
9415
+ declare namespace SubmenuTrigger {
8855
9416
  var displayName: string;
8856
9417
  }
8857
9418
 
@@ -8876,47 +9437,62 @@ declare namespace Separator {
8876
9437
  }
8877
9438
 
8878
9439
 
8879
- declare namespace SelectRoot {
9440
+ declare namespace Root {
8880
9441
  var displayName: string;
8881
9442
  }
8882
9443
 
8883
9444
 
8884
- declare namespace SelectTrigger {
9445
+ declare namespace Trigger {
8885
9446
  var displayName: string;
8886
9447
  }
8887
9448
 
8888
9449
 
8889
- declare namespace SelectValue {
9450
+ declare namespace Close {
8890
9451
  var displayName: string;
8891
9452
  }
8892
9453
 
8893
9454
 
8894
- declare namespace SelectContent {
9455
+ declare namespace Content {
8895
9456
  var displayName: string;
8896
9457
  }
8897
9458
 
8898
9459
 
8899
- declare namespace SelectItem {
9460
+ declare namespace Header {
8900
9461
  var displayName: string;
8901
9462
  }
8902
9463
 
8903
9464
 
8904
- declare namespace SelectGroup {
9465
+ declare namespace Footer {
8905
9466
  var displayName: string;
8906
9467
  }
8907
9468
 
8908
9469
 
8909
- declare namespace SelectGroupLabel {
9470
+ declare namespace Title {
8910
9471
  var displayName: string;
8911
9472
  }
8912
9473
 
8913
9474
 
8914
- declare namespace SelectSeparator {
9475
+ declare namespace Description {
8915
9476
  var displayName: string;
8916
9477
  }
8917
9478
 
8918
9479
 
8919
- declare namespace Provider {
9480
+ declare namespace Root {
9481
+ var displayName: string;
9482
+ }
9483
+
9484
+
9485
+ declare namespace List {
9486
+ var displayName: string;
9487
+ }
9488
+
9489
+
9490
+ declare namespace Tab {
9491
+ var displayName: string;
9492
+ }
9493
+
9494
+
9495
+ declare namespace Panel {
8920
9496
  var displayName: string;
8921
9497
  }
8922
9498
 
@@ -8926,97 +9502,107 @@ declare namespace Root {
8926
9502
  }
8927
9503
 
8928
9504
 
9505
+ declare namespace Title {
9506
+ var displayName: string;
9507
+ }
9508
+
9509
+
9510
+ declare namespace Description {
9511
+ var displayName: string;
9512
+ }
9513
+
9514
+
8929
9515
  declare namespace Trigger {
8930
9516
  var displayName: string;
8931
9517
  }
8932
9518
 
8933
9519
 
8934
- declare namespace Content {
9520
+ declare namespace Settings {
8935
9521
  var displayName: string;
8936
9522
  }
8937
9523
 
8938
9524
 
8939
- declare namespace ComboboxRoot {
9525
+ declare namespace Provider {
8940
9526
  var displayName: string;
8941
9527
  }
8942
9528
 
8943
9529
 
8944
- declare namespace ComboboxInput {
9530
+ declare namespace Root {
8945
9531
  var displayName: string;
8946
9532
  }
8947
9533
 
8948
9534
 
8949
- declare namespace ComboboxTrigger {
9535
+ declare namespace Header {
8950
9536
  var displayName: string;
8951
9537
  }
8952
9538
 
8953
9539
 
8954
- declare namespace ComboboxInputGroup {
9540
+ declare namespace ClearAll {
8955
9541
  var displayName: string;
8956
9542
  }
8957
9543
 
8958
9544
 
8959
- declare namespace ComboboxContent {
9545
+ declare namespace Sections {
8960
9546
  var displayName: string;
8961
9547
  }
8962
9548
 
8963
9549
 
8964
- declare namespace ComboboxList {
9550
+ declare namespace Provider {
8965
9551
  var displayName: string;
8966
9552
  }
8967
9553
 
8968
9554
 
8969
- declare namespace ComboboxItem {
9555
+ declare namespace Root {
8970
9556
  var displayName: string;
8971
9557
  }
8972
9558
 
8973
9559
 
8974
- declare namespace ComboboxEmpty {
9560
+ declare namespace Trigger {
8975
9561
  var displayName: string;
8976
9562
  }
8977
9563
 
8978
9564
 
8979
- declare namespace ComboboxGroup {
9565
+ declare namespace Content {
8980
9566
  var displayName: string;
8981
9567
  }
8982
9568
 
8983
9569
 
8984
- declare namespace ComboboxGroupLabel {
9570
+ declare namespace SelectRoot {
8985
9571
  var displayName: string;
8986
9572
  }
8987
9573
 
8988
9574
 
8989
- declare namespace ComboboxClear {
9575
+ declare namespace SelectTrigger {
8990
9576
  var displayName: string;
8991
9577
  }
8992
9578
 
8993
9579
 
8994
- declare namespace ComboboxChips {
9580
+ declare namespace SelectValue {
8995
9581
  var displayName: string;
8996
9582
  }
8997
9583
 
8998
9584
 
8999
- declare namespace ComboboxChip {
9585
+ declare namespace SelectContent {
9000
9586
  var displayName: string;
9001
9587
  }
9002
9588
 
9003
9589
 
9004
- declare namespace ComboboxChipRemove {
9590
+ declare namespace SelectItem {
9005
9591
  var displayName: string;
9006
9592
  }
9007
9593
 
9008
9594
 
9009
- declare namespace ComboboxValue {
9595
+ declare namespace SelectGroup {
9010
9596
  var displayName: string;
9011
9597
  }
9012
9598
 
9013
9599
 
9014
- declare namespace ComboboxStatus {
9600
+ declare namespace SelectGroupLabel {
9015
9601
  var displayName: string;
9016
9602
  }
9017
9603
 
9018
9604
 
9019
- declare namespace ComboboxCollection {
9605
+ declare namespace SelectSeparator {
9020
9606
  var displayName: string;
9021
9607
  }
9022
9608