@godxjp/ui 27.0.0 → 27.3.1

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 (68) hide show
  1. package/dist/components/data-display/badge.d.ts +10 -3
  2. package/dist/components/data-display/badge.js +14 -3
  3. package/dist/components/data-display/data-table.d.ts +20 -12
  4. package/dist/components/data-display/data-table.js +53 -5
  5. package/dist/components/data-display/range-timeline.d.ts +16 -0
  6. package/dist/components/data-display/range-timeline.js +115 -80
  7. package/dist/components/data-display/table.d.ts +16 -0
  8. package/dist/components/data-display/table.js +2 -0
  9. package/dist/components/data-entry/checkbox.js +23 -5
  10. package/dist/components/data-entry/command.d.ts +3 -1
  11. package/dist/components/data-entry/command.js +10 -2
  12. package/dist/components/data-entry/form-errors.d.ts +5 -0
  13. package/dist/components/data-entry/form-errors.js +6 -0
  14. package/dist/components/data-entry/form-field.js +9 -8
  15. package/dist/components/data-entry/index.d.ts +1 -0
  16. package/dist/components/data-entry/search-select.js +145 -136
  17. package/dist/components/data-entry/select.js +38 -3
  18. package/dist/components/feedback/dialog.d.ts +4 -3
  19. package/dist/components/feedback/dialog.js +46 -19
  20. package/dist/components/feedback/non-modal-layer.d.ts +16 -0
  21. package/dist/components/feedback/non-modal-layer.js +37 -0
  22. package/dist/components/feedback/sheet.d.ts +7 -4
  23. package/dist/components/feedback/sheet.js +63 -40
  24. package/dist/components/layout/org-switcher.js +1 -1
  25. package/dist/components/layout/responsive-grid.d.ts +8 -2
  26. package/dist/components/layout/responsive-grid.js +2 -0
  27. package/dist/components/query/mutation-feedback.js +2 -4
  28. package/dist/contracts/measurement.json +1 -1
  29. package/dist/form/form-field-control.d.ts +1 -1
  30. package/dist/form/form-field-control.js +32 -23
  31. package/dist/form/form-root.d.ts +1 -1
  32. package/dist/form/form-root.js +25 -6
  33. package/dist/i18n/messages/en.json +2 -1
  34. package/dist/i18n/messages/ja.json +2 -1
  35. package/dist/i18n/messages/vi.json +2 -1
  36. package/dist/props/components/data-display.prop.d.ts +12 -0
  37. package/dist/props/components/data-entry.prop.d.ts +10 -0
  38. package/dist/props/components/feedback.prop.d.ts +7 -1
  39. package/dist/props/components/form.prop.d.ts +52 -3
  40. package/dist/props/components/index.d.ts +1 -1
  41. package/dist/props/components/layout.prop.d.ts +7 -0
  42. package/dist/props/registry.d.ts +26 -3
  43. package/dist/props/registry.js +25 -2
  44. package/dist/props/vocabulary/data.prop.d.ts +27 -1
  45. package/dist/props/vocabulary/index.d.ts +1 -1
  46. package/dist/styles/control.css +44 -1
  47. package/dist/styles/data-display-layout.css +58 -1
  48. package/dist/styles/form-layout.css +21 -0
  49. package/dist/styles/layout.css +7 -0
  50. package/dist/styles/navigation-layout.css +5 -1
  51. package/dist/styles/shell-layout.css +1 -14
  52. package/dist/styles/table-layout.css +80 -8
  53. package/dist/tokens/components/control.css +5 -0
  54. package/dist/tokens/components/data-display.css +6 -0
  55. package/dist/tokens/components/navigation.css +1 -1
  56. package/dist/tokens/components/table.css +2 -0
  57. package/docs/DESIGN-AUTHORITY.md +32 -1
  58. package/docs/FORMS.md +11 -10
  59. package/docs/data-display/data-table/examples/server-paged.tsx +156 -0
  60. package/docs/data-display/data-table/examples/striped-list.tsx +173 -0
  61. package/docs/data-display/popover.tsx +43 -1
  62. package/docs/data-display/timeline.tsx +73 -9
  63. package/docs/data-entry/command.tsx +80 -1
  64. package/docs/data-entry/form-root.tsx +12 -2
  65. package/docs/feedback/dialog.tsx +82 -0
  66. package/docs/feedback/sheet.tsx +84 -0
  67. package/docs/layout/responsive-grid.tsx +100 -0
  68. package/package.json +4 -2
@@ -114,6 +114,16 @@ export type ControlCountProp = {
114
114
  strategy?: (value: string) => number;
115
115
  };
116
116
  /** @see Input */
117
+ /** `Command` — the library's own knob; cmdk's root props pass through untouched beside it. */
118
+ export type CommandProp = {
119
+ /**
120
+ * antd `List` `split`: draw the list as ONE ruled box — group padding 0, rows full-bleed to the
121
+ * panel edge with a square highlight, a hairline `border-block-end` between rows and none after
122
+ * the last visible one. For option / checkbox lists (filter facets, pickers). Default `false`:
123
+ * a command palette keeps its airy, inset rows.
124
+ */
125
+ split?: boolean;
126
+ };
117
127
  export type InputProp = Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "prefix"> & {
118
128
  onValueChange?: (value: string) => void;
119
129
  /** Control height tier: `md` (default), `sm` or `lg` — the same tiers as SelectTrigger. */
@@ -16,7 +16,13 @@ export type DialogProp = {
16
16
  defaultOpen?: DefaultOpenProp;
17
17
  onOpenChange?: OnOpenChangeProp;
18
18
  variant?: ConfirmVariantProp;
19
- /** Kept from Radix. RAC's `Modal` always locks scroll, so `false` no longer turns that off. */
19
+ /**
20
+ * `false` renders a NON-MODAL dialog (allowed by WAI-ARIA APG, Dialog (Modal) pattern): the page
21
+ * behind stays interactive and in the accessibility tree, no scroll lock, no scrim, an outside
22
+ * press does not close it, no `aria-modal`. Focus moves in on open, Tab can leave, Escape closes
23
+ * while focus is inside, focus returns to the trigger. Ignored (dev warning) for
24
+ * `variant="destructive"` — an alertdialog is always modal. Default `true`.
25
+ */
20
26
  modal?: boolean;
21
27
  children?: ChildrenProp;
22
28
  };
@@ -58,6 +58,18 @@ export type FormRootProp<TFieldValues extends FieldValues> = {
58
58
  * render a form-level error instead.
59
59
  */
60
60
  onSubmitError?: (error: unknown) => void;
61
+ /**
62
+ * The form-level banner shown when `onSubmit` rejects. Default: the localized
63
+ * `dataEntry.form.submitFailed` text. A node replaces that text; `false` never shows the banner.
64
+ *
65
+ * The banner is skipped by default for a validation rejection (`classifyQueryError` category
66
+ * `"validation"`: 400/422) once the `errors` bag holds at least one message — a field or
67
+ * `<FormErrors />` already shows it (antd shows field errors, not a form banner) — and stays
68
+ * skipped for that failure if the app later clears the bag. A validation rejection with an empty
69
+ * or message-less bag, and every other rejection (5xx, network, unknown), shows it. Errors mapped with react-hook-form `setError` instead of `errors` are not detected —
70
+ * pass `false` there.
71
+ */
72
+ submitFailedMessage?: React.ReactNode | false;
61
73
  /**
62
74
  * A native `<Button type="reset">` inside the form restores `defaultValues` (adapter path:
63
75
  * `adapter.reset()`); this runs afterwards for any extra app state (a status banner, a step).
@@ -105,7 +117,12 @@ export type FormRootProp<TFieldValues extends FieldValues> = {
105
117
  /** @see FormFieldControl */
106
118
  export type FormFieldControlProp<TFieldValues extends FieldValues> = Pick<import("./data-entry.prop.js").FormFieldProp, "id" | "field" | "labelAddon" | "layout" | "labelWidth" | "controlWidth" | "colSpan"> & {
107
119
  name: FieldPath<TFieldValues>;
108
- label: LabelProp;
120
+ /**
121
+ * Field label. Optional (antd `Form.Item`): omitted, the field renders NO label row and reserves
122
+ * no space for one — the boolean-field shape, where the control carries its own inline label
123
+ * (`valuePropName="checked"` + `<Checkbox {...field}>label</Checkbox>`).
124
+ */
125
+ label?: LabelProp;
109
126
  required?: RequiredProp;
110
127
  helper?: HelperProp;
111
128
  /**
@@ -152,6 +169,12 @@ export type FormFieldControlProp<TFieldValues extends FieldValues> = Pick<import
152
169
  */
153
170
  preserve?: boolean;
154
171
  className?: string;
172
+ } & ({
173
+ /**
174
+ * Which prop of the control carries the value (antd `valuePropName`). Default `"value"`: the
175
+ * render prop receives `value` / `onChange` / `onValueChange`.
176
+ */
177
+ valuePropName?: "value";
155
178
  children: (field: {
156
179
  id: string;
157
180
  name: string;
@@ -159,11 +182,37 @@ export type FormFieldControlProp<TFieldValues extends FieldValues> = Pick<import
159
182
  onChange: (...args: unknown[]) => void;
160
183
  onValueChange: (...args: unknown[]) => void;
161
184
  onBlur: () => void;
162
- ref: React.Ref<HTMLInputElement>;
185
+ /**
186
+ * Callback ref typed on `HTMLElement`, so `{...field}` spreads onto every godx-ui control
187
+ * (Input, Textarea, Select, NumberInput, DatePicker) with no cast. react-hook-form only needs
188
+ * `focus()` on it to focus the first invalid field.
189
+ */
190
+ ref: React.RefCallback<HTMLElement>;
163
191
  /** Present (and `true`) only when the field is disabled, so `{...field}` never re-enables a control. */
164
192
  disabled?: DisabledProp;
165
193
  }) => React.ReactNode;
166
- };
194
+ } | {
195
+ /**
196
+ * `"checked"` (antd `valuePropName="checked"`) — a boolean field. The render prop receives
197
+ * `checked` / `onCheckedChange` instead of `value` / `onChange`, so
198
+ * `{(field) => <Checkbox {...field}>label</Checkbox>}` (or `<Switch {...field} />`) needs no
199
+ * wiring. The stored value is always a boolean: `"indeterminate"` and any non-`true` payload
200
+ * store `false`.
201
+ */
202
+ valuePropName: "checked";
203
+ children: (field: {
204
+ id: string;
205
+ name: string;
206
+ /** `true` only when the stored value is exactly `true`. */
207
+ checked: boolean;
208
+ onCheckedChange: (checked: boolean | "indeterminate") => void;
209
+ onBlur: () => void;
210
+ /** Same callback ref as the `"value"` bag — spreads onto `Checkbox` / `Switch` with no cast. */
211
+ ref: React.RefCallback<HTMLElement>;
212
+ /** Present (and `true`) only when the field is disabled, so `{...field}` never re-enables a control. */
213
+ disabled?: DisabledProp;
214
+ }) => React.ReactNode;
215
+ });
167
216
  /**
168
217
  * @see FormFieldArray — dynamic repeating fields (antd `Form.List`) on react-hook-form's
169
218
  * `useFieldArray`. `name` is the array field; each row hands back the dotted path prefix to build
@@ -1,6 +1,6 @@
1
1
  export type { AppLauncherApp, AppLauncherGroup, AppLauncherLabels, AppLauncherProp, AppShellProp, AuthFooterProp, AuthIdentityProp, OrgSwitcherLabels, OrgSwitcherOrganization, OrgSwitcherProp, DragAxisProp, DragBoundsProp, DraggablePanelLabels, DraggablePanelPlacementProp, DraggablePanelPositionProp, DraggablePanelProp, PageContainerProp, PageInsetProp, SidebarItemProp, SidebarProductProp, SidebarProp, SidebarSectionProp, TopbarProp, } from "./layout.prop.js";
2
2
  export type { ButtonProp } from "./general.prop.js";
3
- export type { InputProp, TextareaProp, FormFieldProp, SearchInputProp, CheckboxProp, CheckboxGroupProp, ChoiceOptionProp, RadioProp, RadioGroupProp, SwitchProp, SliderProp, CalendarProp, DatePickerProp, TimePickerProp, ColorPickerProp, UploadProp, UploadFileItemProp, UploadVariantProp, TreeOptionProp, TreeFieldNamesProp, CascaderProp, TreeSelectProp, ShowCheckedStrategyProp, TransferProp, TransferItemProp, } from "./data-entry.prop.js";
3
+ export type { CommandProp, InputProp, TextareaProp, FormFieldProp, SearchInputProp, CheckboxProp, CheckboxGroupProp, ChoiceOptionProp, RadioProp, RadioGroupProp, SwitchProp, SliderProp, CalendarProp, DatePickerProp, TimePickerProp, ColorPickerProp, UploadProp, UploadFileItemProp, UploadVariantProp, TreeOptionProp, TreeFieldNamesProp, CascaderProp, TreeSelectProp, ShowCheckedStrategyProp, TransferProp, TransferItemProp, } from "./data-entry.prop.js";
4
4
  export type { AvatarProp, EmptyStateProp, DescriptionsProp, DescriptionsItemProp, BadgeProp, DataTableProp, QrCodeProp, } from "./data-display.prop.js";
5
5
  export type { ChartDatum, ChartSeriesProp, LineChartProp, BarChartProp, AreaChartProp, PieChartProp, } from "./charts.prop.js";
6
6
  export type { AlertQueryErrorProp, AlertProp, DialogProp, DialogContentProp, AlertTitleProp, AlertContentProp, AlertDescriptionProp, AlertActionsProp, SheetResponsiveProp, SkeletonRowsProp, } from "./feedback.prop.js";
@@ -266,6 +266,13 @@ export type ResponsiveGridColumnsProp = number | {
266
266
  */
267
267
  export type ResponsiveGridFlowProp = "rows" | "columns";
268
268
  export type ResponsiveGridPresetProp = "pricing-plans";
269
+ /**
270
+ * Block-axis alignment of the cells in each grid row — antd `Row align`, spelled with Flex's
271
+ * `FlexAlignProp` values (antd `top` → `start`; `stretch` is the same word). `stretch` gives every
272
+ * cell the height of the tallest one, so an empty Kanban lane is still a full-height drop zone.
273
+ * Omitted, each flow keeps its own alignment: `columns` → `start`, `rows` → the grid's stretch.
274
+ */
275
+ export type ResponsiveGridAlignProp = Extract<FlexAlignProp, "start" | "stretch">;
269
276
  export type MasterDetailRailWidthProp = "narrow" | "compact" | "standard" | "wide";
270
277
  export type MasterDetailRailProp = "master" | "detail";
271
278
  /**
@@ -352,7 +352,12 @@ export declare const VOCABULARY_REGISTRY: {
352
352
  readonly TablePaginationProp: {
353
353
  readonly file: "vocabulary/data.prop.ts";
354
354
  readonly category: "data";
355
- readonly description: "DataTable pagination object surface — 1-based current | pageSize | total | pageSizeOptions | showSizeChanger | onChange (antd TablePaginationConfig); `false` hides the pager";
355
+ readonly description: "DataTable pagination object surface — 1-based current | pageSize | total | pageSizeOptions | showSizeChanger | showTotal | position | onChange (antd TablePaginationConfig); `false` hides the pager. Without a composed DataTable.Pagination the table renders its own Pagination footer (total + page numbers, density-sized); total > data.length ≤ pageSize reads as server paging";
356
+ };
357
+ readonly TablePaginationPositionProp: {
358
+ readonly file: "vocabulary/data.prop.ts";
359
+ readonly category: "data";
360
+ readonly description: "DataTable pagination footer position (antd TablePaginationPosition, logical) — topStart | topCenter | topEnd | bottomStart | bottomCenter | bottomEnd (default) | none";
356
361
  };
357
362
  readonly TableCellIndentProp: {
358
363
  readonly file: "vocabulary/data.prop.ts";
@@ -799,6 +804,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
799
804
  readonly file: "components/layout.prop.ts";
800
805
  readonly vocabulary: readonly [];
801
806
  };
807
+ readonly ResponsiveGridAlignProp: {
808
+ readonly group: "layout";
809
+ readonly file: "components/layout.prop.ts";
810
+ readonly vocabulary: readonly [];
811
+ };
802
812
  readonly MasterDetailRailWidthProp: {
803
813
  readonly group: "layout";
804
814
  readonly file: "components/layout.prop.ts";
@@ -1322,6 +1332,15 @@ export declare const COMPONENT_PROP_REGISTRY: {
1322
1332
  readonly file: "components/data-entry.prop.ts";
1323
1333
  readonly vocabulary: readonly ["PlaceholderProp", "ValueProp", "DisabledProp"];
1324
1334
  };
1335
+ readonly CommandProp: {
1336
+ readonly group: "data-entry";
1337
+ readonly file: "components/data-entry.prop.ts";
1338
+ readonly vocabulary: readonly [{
1339
+ readonly field: "split";
1340
+ readonly local: true;
1341
+ readonly reason: "antd List `split` — ruled-list presentation (row dividers, 0 list padding) for option/checkbox lists; the rest of the root API is cmdk's (gh#699).";
1342
+ }];
1343
+ };
1325
1344
  readonly TextareaProp: {
1326
1345
  readonly group: "data-entry";
1327
1346
  readonly file: "components/data-entry.prop.ts";
@@ -1686,7 +1705,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
1686
1705
  readonly DataTableProp: {
1687
1706
  readonly group: "data-display";
1688
1707
  readonly file: "components/data-display.prop.ts";
1689
- readonly vocabulary: readonly ["ColumnDefProp", "DensityProp", "SortStateProp", "SelectedIdsProp", "GetRowLabelProp", "HandlerProp", "TablePresetProp", "TableColumnPriorityProp", "BreakpointProp", "ColumnFixedProp", "ColumnFilterItemProp", "ColumnFilterStateProp", "ColumnSorterProp", "TableRowSelectionProp", "TableExpandableProp", "TableSummaryProp", "TableScrollProp", "TableStickyProp", "OnRowProp", "TablePaginationProp", "SortDirectionProp", "OnColumnFilterChangeProp"];
1708
+ readonly vocabulary: readonly ["ColumnDefProp", "DensityProp", "SortStateProp", "SelectedIdsProp", "GetRowLabelProp", "HandlerProp", "TablePresetProp", "TableColumnPriorityProp", "BreakpointProp", "ColumnFixedProp", "ColumnFilterItemProp", "ColumnFilterStateProp", "ColumnSorterProp", "TableRowSelectionProp", "TableExpandableProp", "TableSummaryProp", "TableScrollProp", "TableStickyProp", "OnRowProp", "TablePaginationProp", "TablePaginationPositionProp", "SortDirectionProp", "OnColumnFilterChangeProp"];
1690
1709
  };
1691
1710
  readonly ListRowDensityProp: {
1692
1711
  readonly group: "data-display";
@@ -2883,7 +2902,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
2883
2902
  readonly vocabulary: readonly ["LabelProp", {
2884
2903
  readonly field: "columns";
2885
2904
  readonly local: true;
2886
- readonly reason: "Labels and positive numeric unit counts define a consumer-supplied axis.";
2905
+ readonly reason: "Labels, positive numeric unit counts and an optional muted flag (non-working period) define a consumer-supplied axis.";
2906
+ }, {
2907
+ readonly field: "bordered";
2908
+ readonly local: true;
2909
+ readonly reason: "Rules the body as a grid (row rules, header rule, a vertical rule per column); default true, same name and default as Calendar bordered.";
2887
2910
  }, {
2888
2911
  readonly field: "bands";
2889
2912
  readonly local: true;
@@ -350,7 +350,12 @@ const VOCABULARY_REGISTRY = {
350
350
  TablePaginationProp: {
351
351
  file: "vocabulary/data.prop.ts",
352
352
  category: "data",
353
- description: "DataTable pagination object surface \u2014 1-based current | pageSize | total | pageSizeOptions | showSizeChanger | onChange (antd TablePaginationConfig); `false` hides the pager"
353
+ description: "DataTable pagination object surface \u2014 1-based current | pageSize | total | pageSizeOptions | showSizeChanger | showTotal | position | onChange (antd TablePaginationConfig); `false` hides the pager. Without a composed DataTable.Pagination the table renders its own Pagination footer (total + page numbers, density-sized); total > data.length \u2264 pageSize reads as server paging"
354
+ },
355
+ TablePaginationPositionProp: {
356
+ file: "vocabulary/data.prop.ts",
357
+ category: "data",
358
+ description: "DataTable pagination footer position (antd TablePaginationPosition, logical) \u2014 topStart | topCenter | topEnd | bottomStart | bottomCenter | bottomEnd (default) | none"
354
359
  },
355
360
  TableCellIndentProp: {
356
361
  file: "vocabulary/data.prop.ts",
@@ -794,6 +799,7 @@ const COMPONENT_PROP_REGISTRY = {
794
799
  ResponsiveGridFlowProp: { group: "layout", file: "components/layout.prop.ts", vocabulary: [] },
795
800
  ResponsiveGridColumnsProp: { group: "layout", file: "components/layout.prop.ts", vocabulary: [] },
796
801
  ResponsiveGridPresetProp: { group: "layout", file: "components/layout.prop.ts", vocabulary: [] },
802
+ ResponsiveGridAlignProp: { group: "layout", file: "components/layout.prop.ts", vocabulary: [] },
797
803
  MasterDetailRailWidthProp: {
798
804
  group: "layout",
799
805
  file: "components/layout.prop.ts",
@@ -1499,6 +1505,17 @@ const COMPONENT_PROP_REGISTRY = {
1499
1505
  file: "components/data-entry.prop.ts",
1500
1506
  vocabulary: ["PlaceholderProp", "ValueProp", "DisabledProp"]
1501
1507
  },
1508
+ CommandProp: {
1509
+ group: "data-entry",
1510
+ file: "components/data-entry.prop.ts",
1511
+ vocabulary: [
1512
+ {
1513
+ field: "split",
1514
+ local: true,
1515
+ reason: "antd List `split` \u2014 ruled-list presentation (row dividers, 0 list padding) for option/checkbox lists; the rest of the root API is cmdk's (gh#699)."
1516
+ }
1517
+ ]
1518
+ },
1502
1519
  TextareaProp: {
1503
1520
  group: "data-entry",
1504
1521
  file: "components/data-entry.prop.ts",
@@ -2045,6 +2062,7 @@ const COMPONENT_PROP_REGISTRY = {
2045
2062
  "TableStickyProp",
2046
2063
  "OnRowProp",
2047
2064
  "TablePaginationProp",
2065
+ "TablePaginationPositionProp",
2048
2066
  "SortDirectionProp",
2049
2067
  "OnColumnFilterChangeProp"
2050
2068
  ]
@@ -3385,7 +3403,12 @@ const COMPONENT_PROP_REGISTRY = {
3385
3403
  {
3386
3404
  field: "columns",
3387
3405
  local: true,
3388
- reason: "Labels and positive numeric unit counts define a consumer-supplied axis."
3406
+ reason: "Labels, positive numeric unit counts and an optional muted flag (non-working period) define a consumer-supplied axis."
3407
+ },
3408
+ {
3409
+ field: "bordered",
3410
+ local: true,
3411
+ reason: "Rules the body as a grid (row rules, header rule, a vertical rule per column); default true, same name and default as Calendar bordered."
3389
3412
  },
3390
3413
  {
3391
3414
  field: "bands",
@@ -265,18 +265,44 @@ export type OnRowProp<T> = (row: T, index: number) => (React.HTMLAttributes<HTML
265
265
  * Pagination object surface (antd `TablePaginationConfig`). 1-BASED `current`, like antd — the
266
266
  * TanStack-shaped `{ pageIndex, pageSize }` form the prop already accepted is still accepted and
267
267
  * is told apart by its `pageIndex` field. `false` hides the pager entirely.
268
+ *
269
+ * Given WITHOUT a composed `<DataTable.Pagination>`, the table renders its own antd footer: the
270
+ * real `Pagination` (total + page numbers) at `position`, sized from the table's `density`.
271
+ * A composed `<DataTable.Pagination>` keeps its own footer and wins — never two pagers.
268
272
  */
269
273
  export type TablePaginationProp = {
270
274
  /** 1-based current page. */
271
275
  current?: number;
272
276
  pageSize?: number;
273
- /** Total row count on the server — drives the page count under manual pagination. */
277
+ /**
278
+ * Total row count on the server — drives the page count. As in antd, a `total` larger than
279
+ * `data.length` with no more than `pageSize` rows is read as SERVER paging: `data` is the current
280
+ * page, shown as is, and the footer offers `ceil(total / pageSize)` pages.
281
+ */
274
282
  total?: number;
275
283
  pageSizeOptions?: number[];
276
284
  /** Default `true`. `false` drops the rows-per-page select. */
277
285
  showSizeChanger?: boolean;
286
+ /** antd `showTotal` — `true` for the localized total label, or a `(total, range)` render. */
287
+ showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode);
288
+ /**
289
+ * antd `hideOnSinglePage`, whose antd default is `false` — and that default is kept HERE, in the
290
+ * table footer, although the standalone `Pagination` defaults it to `true` (gh#711). A list
291
+ * screen's footer carries the total and the rows-per-page select, so hiding it on the last page
292
+ * of a shrinking filter makes the row count disappear exactly when the user is checking it.
293
+ */
294
+ hideOnSinglePage?: boolean;
295
+ /** antd `position`, logical spelling. Default `["bottomEnd"]` (antd `bottomRight`). */
296
+ position?: TablePaginationPositionProp[];
278
297
  onChange?: (page: number, pageSize: number) => void;
279
298
  };
299
+ /**
300
+ * Where DataTable's own pagination footer sits (antd `TablePaginationPosition`). antd's physical
301
+ * `topLeft` / `bottomRight` become `topStart` / `bottomEnd` here — the same logical respelling as
302
+ * `DropdownMenuPlacementProp` — so an RTL table puts the pager on its reading end with no second
303
+ * value. `none` renders no footer while the pagination state stays live.
304
+ */
305
+ export type TablePaginationPositionProp = "topStart" | "topCenter" | "topEnd" | "bottomStart" | "bottomCenter" | "bottomEnd" | "none";
280
306
  /**
281
307
  * Descriptions column count (antd `column`). A plain number keeps this library's own mobile-first
282
308
  * ladder; the `{ sm, md, lg, xl }` object is antd's responsive form, expressed against this
@@ -4,4 +4,4 @@ export type { TitleProp, SubtitleProp, StatusProp, DescriptionProp, ExtraProp, F
4
4
  export type { PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, MobileShellHeightProp, MobileShellWidthProp, OrientationProp, TableDensityProp, DensityProp, GapNameProp, PadProp, PadRawProp, PadSides, GapProp, GapStepProp, } from "./layout.prop.js";
5
5
  export type { ButtonVariantProp, ButtonSizeProp, BadgeVariantProp, AppSettingPickerAppearanceProp, AppSettingToggleAppearanceProp, ShapeProp, AvatarShapeProp, TextSizeProp, TextToneProp, FontWeightProp, HeadingLevelProp, TextAlignProp, TextWhitespaceProp, TypographyTypeProp, TitleLevelProp, TypographyCopyConfigProp, TypographyEditConfigProp, TypographyEllipsisConfigProp, TypographyActionsConfigProp, SizeProp, ControlStatusProp, ControlVariantProp, FormLayoutProp, DescriptionsLayoutProp, BreakpointProp, ConfirmVariantProp, ToneProp, AlertVariantProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, ActivityVariantProp, ActivityAnnounceProp, } from "./interaction.prop.js";
6
6
  export type { BreadcrumbItemProp, BreadcrumbProp, BreadcrumbItemMenuProp, BreadcrumbItemMenuEntryProp, BreadcrumbSeparatorProp, BreadcrumbItemRenderProp, } from "./navigation.prop.js";
7
- export type { GetRowIdProp, GetRowLabelProp, OnRowClickProp, ColumnDefProp, TablePresetProp, TableColumnPriorityProp, TableCellIndentProp, SelectedIdsProp, OnSelectChangeProp, OnTableDensityChangeProp, TableRowToneProp, RowToneProp, OnSortChangeProp, OnSearchChangeProp, OnClearFiltersProp, HasActiveFiltersProp, StickyProp, ColumnFixedProp, ColumnFilterValueProp, ColumnFilterItemProp, ColumnFilterStateProp, OnColumnFilterChangeProp, ColumnCompareProp, ColumnSorterProp, TableSelectionItemProp, TableRowSelectionProp, TableExpandableProp, TableSummaryProp, TableScrollProp, TableStickyProp, OnRowProp, TablePaginationProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, } from "./data.prop.js";
7
+ export type { GetRowIdProp, GetRowLabelProp, OnRowClickProp, ColumnDefProp, TablePresetProp, TableColumnPriorityProp, TableCellIndentProp, SelectedIdsProp, OnSelectChangeProp, OnTableDensityChangeProp, TableRowToneProp, RowToneProp, OnSortChangeProp, OnSearchChangeProp, OnClearFiltersProp, HasActiveFiltersProp, StickyProp, ColumnFixedProp, ColumnFilterValueProp, ColumnFilterItemProp, ColumnFilterStateProp, OnColumnFilterChangeProp, ColumnCompareProp, ColumnSorterProp, TableSelectionItemProp, TableRowSelectionProp, TableExpandableProp, TableSummaryProp, TableScrollProp, TableStickyProp, OnRowProp, TablePaginationProp, TablePaginationPositionProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, } from "./data.prop.js";
@@ -377,6 +377,14 @@
377
377
  line-height: 0;
378
378
  }
379
379
 
380
+ .ui-choice-field > .ui-choice-control {
381
+ display: flex;
382
+ align-items: center;
383
+ font-size: var(--font-size-base);
384
+ line-height: var(--control-label-line-height);
385
+ min-block-size: 1lh;
386
+ }
387
+
380
388
  .ui-choice-input {
381
389
  position: absolute;
382
390
  inset: 0;
@@ -770,6 +778,30 @@
770
778
  opacity: 0.5;
771
779
  }
772
780
 
781
+ .ui-command[data-split] .ui-command-group {
782
+ padding: var(--command-list-split-padding);
783
+ }
784
+
785
+ .ui-command[data-split] .ui-command-item {
786
+ border-radius: 0;
787
+ margin-inline: calc(-1 * var(--command-list-split-inset));
788
+ padding-inline: calc(var(--command-list-split-inset) + var(--command-input-padding-x));
789
+ }
790
+
791
+ .ui-command[data-split] .ui-command-group [cmdk-group-heading] {
792
+ padding-inline: calc(var(--command-list-split-inset) + var(--command-input-padding-x));
793
+ }
794
+
795
+ .ui-command[data-split] .ui-command-item:has(+ .ui-command-item) {
796
+ border-block-end: var(--command-item-divider-width) solid
797
+ hsl(var(--command-item-divider-color, var(--border)));
798
+ }
799
+
800
+ .ui-command[data-split] .ui-command-group:not([hidden]) ~ .ui-command-group:not([hidden]) {
801
+ border-block-start: var(--command-item-divider-width) solid
802
+ hsl(var(--command-item-divider-color, var(--border)));
803
+ }
804
+
773
805
  [data-slot="dialog-content"].ui-command-palette {
774
806
  top: var(--command-palette-inset-top);
775
807
  width: min(
@@ -1060,7 +1092,9 @@
1060
1092
  border: 0;
1061
1093
  padding: 0;
1062
1094
  cursor: pointer;
1063
- color: hsl(var(--rating-star-empty-color, var(--muted-foreground)) / var(--rating-star-empty-alpha));
1095
+ color: hsl(
1096
+ var(--rating-star-empty-color, var(--muted-foreground)) / var(--rating-star-empty-alpha)
1097
+ );
1064
1098
  line-height: 0;
1065
1099
  }
1066
1100
  .ui-rating-star:disabled {
@@ -1509,6 +1543,10 @@
1509
1543
  padding: var(--search-select-list-space-inset);
1510
1544
  }
1511
1545
 
1546
+ .ui-command[data-split] .ui-search-select-list {
1547
+ padding: var(--command-list-split-padding);
1548
+ }
1549
+
1512
1550
  .ui-search-select-option-slot {
1513
1551
  min-inline-size: 0;
1514
1552
  flex: 1 1 0%;
@@ -1702,6 +1740,11 @@
1702
1740
  display: contents;
1703
1741
  }
1704
1742
 
1743
+ .ui-select-root > [data-react-aria-prevent-focus][aria-hidden="true"] {
1744
+ position: absolute !important;
1745
+ inset: auto !important;
1746
+ }
1747
+
1705
1748
  .ui-select-content {
1706
1749
  position: relative;
1707
1750
  z-index: var(--overlay-z-index);
@@ -1328,12 +1328,69 @@
1328
1328
  min-inline-size: 0;
1329
1329
  overflow: hidden;
1330
1330
  padding: var(--space-2);
1331
- border-inline-end: 1px solid hsl(var(--range-timeline-border-color));
1331
+ border-inline-end: var(--range-timeline-grid-width) solid
1332
+ hsl(var(--range-timeline-border-color));
1332
1333
  }
1333
1334
  .ui-range-timeline-track {
1334
1335
  position: relative;
1335
1336
  min-inline-size: 0;
1336
1337
  }
1338
+
1339
+ .ui-range-timeline-body {
1340
+ position: relative;
1341
+ isolation: isolate;
1342
+ }
1343
+ .ui-range-timeline-grid {
1344
+ position: absolute;
1345
+ inset: 0;
1346
+ z-index: -1;
1347
+ display: grid;
1348
+ grid-template-columns: var(--range-timeline-label-width) minmax(0, 1fr);
1349
+ pointer-events: none;
1350
+ }
1351
+ .ui-range-timeline-grid-column {
1352
+ min-inline-size: 0;
1353
+ padding-inline: var(--space-2);
1354
+ border-inline-end: var(--range-timeline-grid-width) solid transparent;
1355
+ }
1356
+ .ui-range-timeline-grid-column[data-muted="true"] {
1357
+ background: var(--range-timeline-muted-column-background, hsl(var(--muted)));
1358
+ }
1359
+
1360
+ .ui-range-timeline[data-bordered="true"] .ui-range-timeline-column,
1361
+ .ui-range-timeline[data-bordered="true"] .ui-range-timeline-label,
1362
+ .ui-range-timeline[data-bordered="true"] .ui-range-timeline-grid-column {
1363
+ border-inline-end-color: var(--range-timeline-grid-color, hsl(var(--input)));
1364
+ }
1365
+ .ui-range-timeline[data-bordered="true"] .ui-range-timeline-header + .ui-range-timeline-header,
1366
+ .ui-range-timeline[data-bordered="true"] .ui-range-timeline-row {
1367
+ border-block-start: var(--range-timeline-grid-width) solid
1368
+ var(--range-timeline-grid-color, hsl(var(--input)));
1369
+ }
1370
+ .ui-range-timeline-outside {
1371
+ position: absolute;
1372
+ inset-block: 0;
1373
+ display: flex;
1374
+ align-items: center;
1375
+ gap: var(--space-1);
1376
+ padding-inline: var(--space-2);
1377
+ color: hsl(var(--muted-foreground));
1378
+ }
1379
+ .ui-range-timeline-outside[data-direction="before"] {
1380
+ inset-inline-start: 0;
1381
+ }
1382
+ .ui-range-timeline-outside[data-direction="after"] {
1383
+ inset-inline-end: 0;
1384
+ }
1385
+ .ui-range-timeline-outside-icon {
1386
+ inline-size: var(--icon-size-sm);
1387
+ block-size: var(--icon-size-sm);
1388
+ flex-shrink: 0;
1389
+ }
1390
+
1391
+ [dir="rtl"] .ui-range-timeline-outside-icon {
1392
+ transform: scaleX(-1);
1393
+ }
1337
1394
  .ui-range-timeline-bar {
1338
1395
  position: absolute;
1339
1396
  inset-block-start: 50%;
@@ -110,6 +110,11 @@
110
110
  > * {
111
111
  max-inline-size: 100%;
112
112
  }
113
+
114
+ .ui-form-field[data-collapse-below="false"][data-layout="horizontal"]
115
+ > .ui-form-field-control:first-child {
116
+ grid-column-start: 2;
117
+ }
113
118
  .ui-form-field[data-collapse-below="false"][data-label-align="end"]:is(
114
119
  [data-layout="horizontal"],
115
120
  [data-layout="inline"]
@@ -139,6 +144,10 @@
139
144
  > * {
140
145
  max-inline-size: 100%;
141
146
  }
147
+ .ui-form-field[data-collapse-below="sm"][data-layout="horizontal"]
148
+ > .ui-form-field-control:first-child {
149
+ grid-column-start: 2;
150
+ }
142
151
  .ui-form-field[data-collapse-below="sm"][data-label-align="end"]:is(
143
152
  [data-layout="horizontal"],
144
153
  [data-layout="inline"]
@@ -169,6 +178,10 @@
169
178
  > * {
170
179
  max-inline-size: 100%;
171
180
  }
181
+ .ui-form-field[data-collapse-below="md"][data-layout="horizontal"]
182
+ > .ui-form-field-control:first-child {
183
+ grid-column-start: 2;
184
+ }
172
185
  .ui-form-field[data-collapse-below="md"][data-label-align="end"]:is(
173
186
  [data-layout="horizontal"],
174
187
  [data-layout="inline"]
@@ -199,6 +212,10 @@
199
212
  > * {
200
213
  max-inline-size: 100%;
201
214
  }
215
+ .ui-form-field[data-collapse-below="lg"][data-layout="horizontal"]
216
+ > .ui-form-field-control:first-child {
217
+ grid-column-start: 2;
218
+ }
202
219
  .ui-form-field[data-collapse-below="lg"][data-label-align="end"]:is(
203
220
  [data-layout="horizontal"],
204
221
  [data-layout="inline"]
@@ -229,6 +246,10 @@
229
246
  > * {
230
247
  max-inline-size: 100%;
231
248
  }
249
+ .ui-form-field[data-collapse-below="xl"][data-layout="horizontal"]
250
+ > .ui-form-field-control:first-child {
251
+ grid-column-start: 2;
252
+ }
232
253
  .ui-form-field[data-collapse-below="xl"][data-label-align="end"]:is(
233
254
  [data-layout="horizontal"],
234
255
  [data-layout="inline"]
@@ -321,6 +321,13 @@
321
321
  align-items: start;
322
322
  }
323
323
 
324
+ .ui-responsive-grid[data-align="start"] {
325
+ align-items: start;
326
+ }
327
+ .ui-responsive-grid[data-align="stretch"] {
328
+ align-items: stretch;
329
+ }
330
+
324
331
  .ui-responsive-grid[data-gap="none"] {
325
332
  gap: 0;
326
333
  }
@@ -338,8 +338,12 @@
338
338
  justify-content: safe flex-end;
339
339
  }
340
340
 
341
+ .ui-pagination[data-align="end"] > .ui-pagination-total {
342
+ margin-inline-end: 0;
343
+ }
344
+
341
345
  .ui-pagination[data-size="sm"] {
342
- --control-height: var(--pagination-control-height-sm);
346
+ --control-height: var(--pagination-control-height-sm, var(--control-height-sm));
343
347
  }
344
348
 
345
349
  .ui-pagination-jumper {
@@ -1165,14 +1165,11 @@
1165
1165
  }
1166
1166
 
1167
1167
  .ui-org-switcher-command {
1168
+ --command-list-split-inset: var(--org-switcher-list-inset);
1168
1169
  width: 100%;
1169
1170
  padding-inline: calc(var(--org-switcher-list-inset) - var(--org-switcher-list-offset));
1170
1171
  }
1171
1172
 
1172
- .ui-org-switcher-command .ui-command-group {
1173
- padding: 0;
1174
- }
1175
-
1176
1173
  .ui-org-switcher-command .ui-command-input-wrapper {
1177
1174
 
1178
1175
  border: 1px solid hsl(var(--input));
@@ -1183,16 +1180,6 @@
1183
1180
  background: hsl(var(--background));
1184
1181
  }
1185
1182
 
1186
- .ui-org-switcher-command .ui-command-item {
1187
- border-radius: 0;
1188
- margin-inline: calc(-1 * var(--org-switcher-list-inset));
1189
- padding-inline: calc(var(--org-switcher-list-inset) + var(--command-input-padding-x));
1190
- }
1191
-
1192
- .ui-org-switcher-command .ui-command-item + .ui-command-item {
1193
- border-block-start: 1px solid hsl(var(--border));
1194
- }
1195
-
1196
1183
  [data-slot="dialog-footer"]:has(> .ui-org-switcher-legend),
1197
1184
  [data-slot="sheet-footer"]:has(> .ui-org-switcher-legend) {
1198
1185
  justify-content: flex-start;