@godxjp/ui 31.5.0 → 31.7.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 (81) hide show
  1. package/agent/START-HERE.md +5 -5
  2. package/agent/components/BranchScopePicker.json +5 -0
  3. package/agent/components/Breadcrumb.json +1 -1
  4. package/agent/components/Cascader.json +1 -1
  5. package/agent/components/DataTable.json +2 -2
  6. package/agent/components/InfiniteQueryState.json +6 -1
  7. package/agent/components/PageContainer.json +1 -1
  8. package/agent/components/Progress.json +12 -1
  9. package/agent/components/RangeTimeline.json +6 -0
  10. package/agent/components/RecordPicker.json +10 -0
  11. package/agent/components/Text.json +1 -1
  12. package/agent/components/Transfer.json +5 -0
  13. package/agent/components/Tree.json +21 -4
  14. package/agent/components/TreeSelect.json +1 -1
  15. package/agent/components.json +72 -13
  16. package/agent/index.json +5 -5
  17. package/agent/llms.txt +6 -6
  18. package/agent/tokens.json +12 -0
  19. package/dist/components/data-display/data-table.d.ts +3 -0
  20. package/dist/components/data-display/data-table.js +415 -370
  21. package/dist/components/data-display/progress.d.ts +16 -0
  22. package/dist/components/data-display/progress.js +17 -3
  23. package/dist/components/data-display/range-timeline.d.ts +20 -0
  24. package/dist/components/data-display/range-timeline.js +217 -197
  25. package/dist/components/data-display/tree.js +179 -23
  26. package/dist/components/data-entry/branch-scope-picker.d.ts +1 -0
  27. package/dist/components/data-entry/branch-scope-picker.js +2 -1
  28. package/dist/components/data-entry/cascader.js +4 -5
  29. package/dist/components/data-entry/record-picker.d.ts +2 -0
  30. package/dist/components/data-entry/record-picker.js +22 -3
  31. package/dist/components/data-entry/transfer.d.ts +1 -1
  32. package/dist/components/data-entry/transfer.js +5 -2
  33. package/dist/components/data-entry/tree-select.js +14 -5
  34. package/dist/components/feedback/tooltip.d.ts +21 -0
  35. package/dist/components/feedback/tooltip.js +101 -0
  36. package/dist/components/general/typography.js +30 -11
  37. package/dist/components/layout/breadcrumb-ellipsis.d.ts +16 -0
  38. package/dist/components/layout/breadcrumb-ellipsis.js +28 -0
  39. package/dist/components/layout/breadcrumb.js +16 -7
  40. package/dist/components/layout/page-container.js +29 -20
  41. package/dist/components/query/infinite-query-state.d.ts +1 -1
  42. package/dist/components/query/infinite-query-state.js +2 -1
  43. package/dist/contracts/measurement.json +1 -1
  44. package/dist/i18n/messages/en.json +18 -3
  45. package/dist/i18n/messages/ja.json +9 -3
  46. package/dist/i18n/messages/vi.json +9 -3
  47. package/dist/lib/hooks.d.ts +8 -4
  48. package/dist/lib/hooks.js +5 -2
  49. package/dist/lib/tree.d.ts +23 -0
  50. package/dist/lib/tree.js +29 -0
  51. package/dist/props/components/data-display.prop.d.ts +21 -2
  52. package/dist/props/components/data-entry.prop.d.ts +31 -4
  53. package/dist/props/components/query.prop.d.ts +8 -1
  54. package/dist/props/registry.d.ts +29 -6
  55. package/dist/props/registry.js +46 -4
  56. package/dist/props/vocabulary/data.prop.d.ts +32 -2
  57. package/dist/props/vocabulary/index.d.ts +2 -2
  58. package/dist/props/vocabulary/navigation.prop.d.ts +14 -0
  59. package/dist/styles/data-display-layout.css +52 -0
  60. package/dist/styles/layers.json +3 -2
  61. package/dist/styles/layout.css +22 -0
  62. package/dist/styles/table-layout.css +24 -1
  63. package/dist/tokens/components/navigation.css +2 -0
  64. package/dist/tokens/components/tree.css +2 -0
  65. package/docs/data-display/data-table/examples/server-paged.tsx +23 -0
  66. package/docs/data-display/data-table/index.md +2 -0
  67. package/docs/data-display/progress.tsx +24 -6
  68. package/docs/data-display/timeline.tsx +33 -0
  69. package/docs/data-display/tree.tsx +154 -0
  70. package/docs/data-entry/branch-scope-picker.tsx +6 -1
  71. package/docs/data-entry/record-picker.tsx +1 -0
  72. package/docs/data-entry/transfer.tsx +1 -0
  73. package/docs/general/typography.tsx +84 -1
  74. package/docs/i18n/messages/en.json +48 -1
  75. package/docs/i18n/messages/ja.json +47 -1
  76. package/docs/i18n/messages/vi.json +47 -1
  77. package/docs/navigation/breadcrumb.tsx +24 -0
  78. package/docs/query/infinite-query-state.tsx +5 -1
  79. package/docs/roadmap/tree-components.md +2 -1
  80. package/package.json +2 -2
  81. package/scripts/ui-audit.mjs +15 -5
@@ -743,12 +743,31 @@ export type TreeProp = {
743
743
  /** Start with every branch open (antd `defaultExpandAll`). Seeded once, never re-applied. */
744
744
  defaultExpandAll?: boolean;
745
745
  /**
746
- * Lazy children (antd `loadData`). Called ONCE per node the first time a branch with no
747
- * `children` and `isLeaf !== true` is expanded; push the fetched children into `treeData`.
746
+ * Lazy children (antd `loadData`). Called when a branch with no `children` and
747
+ * `isLeaf !== true` is expanded, and never again once its promise RESOLVES; push the fetched
748
+ * children into `treeData`. A REJECTED promise is not a load: the branch folds back shut
749
+ * (uncontrolled expansion) and the next expand asks again, up to 10 attempts (rc-tree).
748
750
  */
749
751
  loadData?: (node: TreeNodeProp) => void | Promise<void>;
750
752
  /** Render a node's title (antd `titleRender`). */
751
753
  titleRender?: (node: TreeNodeProp) => React.ReactNode;
754
+ /**
755
+ * Highlight the nodes this returns `true` for (antd `filterTreeNode`) — the match of a search
756
+ * box above the tree. Matching rows are marked, NOT hidden: the outline, the keyboard path and
757
+ * every ARIA attribute stay exactly as they were. The row gets `data-filter-node="true"` and its
758
+ * label reads `--tree-node-filter-foreground` in the medium weight, plus an sr-only "matches"
759
+ * so the mark is never colour alone. Receives the node data, as `titleRender` and `loadData` do.
760
+ */
761
+ filterTreeNode?: (node: TreeNodeProp) => boolean;
762
+ /**
763
+ * Viewport height in px (antd `height`). The tree scrolls inside this height, and — unless
764
+ * `virtual` is `false` — renders only the rows in view (plus a small overscan), so a branch of
765
+ * several hundred lazily-loaded children stays a few dozen DOM rows. Rows must share one height
766
+ * (the `size` tier) for the window to be exact.
767
+ */
768
+ height?: number;
769
+ /** Set `false` to render every row even when `height` is set (antd `virtual`). Default `true`. */
770
+ virtual?: boolean;
752
771
  /** Draw the connector rails between a parent and its children (antd `showLine`). */
753
772
  showLine?: boolean;
754
773
  /**
@@ -1209,6 +1209,17 @@ export type RecordPickerProp = Omit<React.ButtonHTMLAttributes<HTMLButtonElement
1209
1209
  };
1210
1210
  placeholder?: string;
1211
1211
  dialogTitle?: string;
1212
+ /**
1213
+ * Node shown when the search finds nothing (antd `notFoundContent`) — in the dropdown shape and
1214
+ * in the dialog alike. Localized `dataEntry.recordPicker.empty` otherwise.
1215
+ */
1216
+ notFoundContent?: NotFoundContentProp;
1217
+ /**
1218
+ * Text of the dialog's load-more button (localized `dataEntry.recordPicker.more` otherwise). Only
1219
+ * the label: the button and when it appears (the server returned a `nextCursor`) stay the
1220
+ * picker's.
1221
+ */
1222
+ loadMoreLabel?: LabelProp;
1212
1223
  size?: "xs" | "sm" | "md" | "lg";
1213
1224
  /**
1214
1225
  * Tên trường, do `FormField` truyền xuống. Khai tường minh vì CẢ HAI nhánh phải giữ nó: một
@@ -1788,8 +1799,9 @@ export type CascaderProp = FieldA11yProps & {
1788
1799
  */
1789
1800
  showCheckedStrategy?: Exclude<ShowCheckedStrategyProp, "SHOW_ALL">;
1790
1801
  /**
1791
- * Lazy children (antd `loadData`). Called ONCE per node the first time a branch with no
1792
- * `children` and `isLeaf !== true` is expanded; push the fetched children into `options`.
1802
+ * Lazy children (antd `loadData`). Called when a branch with no `children` and
1803
+ * `isLeaf !== true` is expanded, and never again once its promise RESOLVES; push the fetched
1804
+ * children into `options`. A REJECTED promise is forgotten, so the next activation asks again.
1793
1805
  */
1794
1806
  loadData?: (selectedOptions: TreeOptionProp[]) => void | Promise<void>;
1795
1807
  /** Render the trigger label from the selected path (antd `displayRender`). */
@@ -1864,8 +1876,10 @@ export type TreeSelectProp = FieldA11yProps & {
1864
1876
  /** Panel open change (antd `onOpenChange`). Fires for both controlled and uncontrolled panels. */
1865
1877
  onOpenChange?: OnOpenChangeProp;
1866
1878
  /**
1867
- * Lazy children (antd `loadData`). Called ONCE per node the first time a branch with no
1868
- * `children` and `isLeaf !== true` is expanded; push the fetched children into `treeData`.
1879
+ * Lazy children (antd `loadData`). Called when a branch with no `children` and
1880
+ * `isLeaf !== true` is expanded, and never again once its promise RESOLVES; push the fetched
1881
+ * children into `treeData`. A REJECTED promise folds the branch shut and the next expand asks
1882
+ * again, up to 10 attempts (rc-tree).
1869
1883
  */
1870
1884
  loadData?: (node: TreeOptionProp) => void | Promise<void>;
1871
1885
  /** Render a node's title (antd `treeTitleRender`). */
@@ -1945,6 +1959,14 @@ export type TransferProp = FieldA11yProps & {
1945
1959
  className?: ClassNameProp;
1946
1960
  selectedKeys?: [string[], string[]];
1947
1961
  onSelectChange?: (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => void;
1962
+ /**
1963
+ * antd `locale`, ported for `notFoundContent` only: the node an empty (or search-emptied) pane
1964
+ * shows. A `[source, target]` pair sets each pane separately, as in antd. Localized
1965
+ * `dataEntry.transfer.empty` otherwise.
1966
+ */
1967
+ locale?: {
1968
+ notFoundContent?: NotFoundContentProp | [NotFoundContentProp, NotFoundContentProp];
1969
+ };
1948
1970
  };
1949
1971
  /** @see BranchScopePicker — scope mode: every branch, or an explicit subset. */
1950
1972
  export type BranchScopeModeProp = "all" | "selected";
@@ -1989,6 +2011,11 @@ export type BranchScopePickerProp = FieldA11yProps & {
1989
2011
  loading?: boolean;
1990
2012
  /** Custom empty content when `branches` is empty; defaults to a localized message. */
1991
2013
  empty?: React.ReactNode;
2014
+ /**
2015
+ * Shown when the branch search matches nothing (antd `notFoundContent`); localized
2016
+ * `dataEntry.branchScope.noMatches` otherwise. An empty `branches` list is `empty`'s, not this.
2017
+ */
2018
+ notFoundContent?: NotFoundContentProp;
1992
2019
  /** Branch-collection READ failure (distinct from `error`, which is field validation). */
1993
2020
  listError?: React.ReactNode;
1994
2021
  /** Permission-denied state — the branch read was refused. Takes precedence over `listError`. */
@@ -3,7 +3,7 @@ import type * as React from "react";
3
3
  import type { InfiniteData, QueryKey, UseInfiniteQueryResult, UseMutationResult, UseQueryResult } from "@tanstack/react-query";
4
4
  import type { LinkProps } from "react-router-dom";
5
5
  import type { ButtonProp } from "./general.prop.js";
6
- import type { ClassNameProp, HandlerProp } from "../vocabulary/index.js";
6
+ import type { ClassNameProp, HandlerProp, LabelProp } from "../vocabulary/index.js";
7
7
  /** @see DataState — TanStack Query lifecycle widget (not a visual component). */
8
8
  export type DataStateProp<T> = {
9
9
  query: UseQueryResult<T>;
@@ -103,6 +103,13 @@ export type InfiniteQueryStateProp<TPage, TFlat = TPage extends {
103
103
  loadingMore?: React.ReactNode;
104
104
  /** Custom load-more footer; `false` hides footer entirely. */
105
105
  loadMore?: React.ReactNode | false;
106
+ /**
107
+ * Text of the built-in load-more button (localized `query.loadMore` otherwise) — e.g.
108
+ * 「さらに表示」「さらに古い版を表示」. Only the idle label: the button, its pending label and its
109
+ * disabled-while-fetching behaviour stay the component's. Ignored when `loadMore` replaces the
110
+ * footer.
111
+ */
112
+ loadMoreLabel?: LabelProp;
106
113
  /** Show default load-more button when `hasNextPage`. Default `true`. */
107
114
  showLoadMore?: boolean;
108
115
  children: (flat: TFlat, helpers: InfiniteQueryHelpers) => React.ReactNode;
@@ -304,10 +304,20 @@ export declare const VOCABULARY_REGISTRY: {
304
304
  readonly category: "data";
305
305
  readonly description: "One entry in the selection-column dropdown — { key, text, onSelect } (antd SelectionItem)";
306
306
  };
307
+ readonly TableSelectionBuiltInProp: {
308
+ readonly file: "vocabulary/data.prop.ts";
309
+ readonly category: "data";
310
+ readonly description: "Built-in selections entry — SELECT_ALL | SELECT_INVERT | SELECT_NONE (antd Table.SELECTION_ALL / SELECTION_INVERT / SELECTION_NONE, published as DataTable.SELECTION_*)";
311
+ };
312
+ readonly TableSelectAllMatchingProp: {
313
+ readonly file: "vocabulary/data.prop.ts";
314
+ readonly category: "data";
315
+ readonly description: "Server-paged 'select all N matching' banner — { total, selected, onSelectedChange } (no antd equivalent; Gmail/Jira/GitHub pattern)";
316
+ };
307
317
  readonly TableRowSelectionProp: {
308
318
  readonly file: "vocabulary/data.prop.ts";
309
319
  readonly category: "data";
310
- readonly description: "DataTable row-selection config — type | selectedRowKeys | onChange | getCheckboxProps | preserveSelectedRowKeys | selections | hideSelectAll | columnTitle (antd TableRowSelection)";
320
+ readonly description: "DataTable row-selection config — type | selectedRowKeys | onChange | getCheckboxProps | preserveSelectedRowKeys | selections | hideSelectAll | columnTitle | selectAllLabel | matching (antd TableRowSelection + select-all-matching)";
311
321
  };
312
322
  readonly TableExpandableProp: {
313
323
  readonly file: "vocabulary/data.prop.ts";
@@ -594,6 +604,11 @@ export declare const VOCABULARY_REGISTRY: {
594
604
  readonly category: "navigation";
595
605
  readonly description: "Single breadcrumb segment";
596
606
  };
607
+ readonly BreadcrumbItemEllipsisProp: {
608
+ readonly file: "vocabulary/navigation.prop.ts";
609
+ readonly category: "navigation";
610
+ readonly description: "One-line truncation of a breadcrumb segment, with the full label in a tooltip";
611
+ };
597
612
  readonly BreadcrumbProp: {
598
613
  readonly file: "vocabulary/navigation.prop.ts";
599
614
  readonly category: "navigation";
@@ -1810,7 +1825,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
1810
1825
  readonly RecordPickerProp: {
1811
1826
  readonly group: "data-entry";
1812
1827
  readonly file: "components/data-entry.prop.ts";
1813
- readonly vocabulary: readonly ["ValueProp", "OnValueChangeProp", "DisabledProp", "SizeProp", "PlaceholderProp"];
1828
+ readonly vocabulary: readonly ["ValueProp", "OnValueChangeProp", "DisabledProp", "SizeProp", "PlaceholderProp", "NotFoundContentProp", "LabelProp"];
1814
1829
  readonly note: "One picker whose SHAPE follows the size of the set: Select at or under `threshold`, a searchable Dialog with consumer-declared filters over it (gh#932).";
1815
1830
  };
1816
1831
  readonly RecordPickerFilterProp: {
@@ -1882,7 +1897,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
1882
1897
  readonly TransferProp: {
1883
1898
  readonly group: "data-entry";
1884
1899
  readonly file: "components/data-entry.prop.ts";
1885
- readonly vocabulary: readonly ["DisabledProp", "ClassNameProp"];
1900
+ readonly vocabulary: readonly ["DisabledProp", "ClassNameProp", {
1901
+ readonly field: "locale";
1902
+ readonly local: true;
1903
+ readonly reason: "antd Transfer `locale`, ported for `notFoundContent` only (one node, or a [source, target] pair) — gh#1044.";
1904
+ }];
1886
1905
  };
1887
1906
  readonly TransferItemProp: {
1888
1907
  readonly group: "data-entry";
@@ -1940,7 +1959,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
1940
1959
  readonly DataTableProp: {
1941
1960
  readonly group: "data-display";
1942
1961
  readonly file: "components/data-display.prop.ts";
1943
- 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"];
1962
+ readonly vocabulary: readonly ["ColumnDefProp", "DensityProp", "SortStateProp", "SelectedIdsProp", "GetRowLabelProp", "HandlerProp", "TablePresetProp", "TableColumnPriorityProp", "BreakpointProp", "ColumnFixedProp", "ColumnFilterItemProp", "ColumnFilterStateProp", "ColumnSorterProp", "TableRowSelectionProp", "TableSelectionBuiltInProp", "TableSelectAllMatchingProp", "TableExpandableProp", "TableSummaryProp", "TableScrollProp", "TableStickyProp", "OnRowProp", "TablePaginationProp", "TablePaginationPositionProp", "SortDirectionProp", "OnColumnFilterChangeProp"];
1944
1963
  };
1945
1964
  readonly ListRowDensityProp: {
1946
1965
  readonly group: "data-display";
@@ -2408,7 +2427,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
2408
2427
  readonly InfiniteQueryStateProp: {
2409
2428
  readonly group: "query";
2410
2429
  readonly file: "components/query.prop.ts";
2411
- readonly vocabulary: readonly ["HandlerProp"];
2430
+ readonly vocabulary: readonly ["HandlerProp", "LabelProp"];
2412
2431
  };
2413
2432
  readonly PrefetchLinkProp: {
2414
2433
  readonly group: "query";
@@ -3293,6 +3312,10 @@ export declare const COMPONENT_PROP_REGISTRY: {
3293
3312
  readonly field: "onRangeChange";
3294
3313
  readonly local: true;
3295
3314
  readonly reason: "An endpoint movement command, not an internally owned value; the consumer commits its row data.";
3315
+ }, {
3316
+ readonly field: "sticky";
3317
+ readonly local: true;
3318
+ readonly reason: "antd Table `sticky` — `true` or `{ offsetHeader }` (px) keeps the axis header on screen while the page scrolls (gh#1044).";
3296
3319
  }, {
3297
3320
  readonly field: "expandedValues";
3298
3321
  readonly local: true;
@@ -3476,7 +3499,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
3476
3499
  readonly field: "empty";
3477
3500
  readonly local: true;
3478
3501
  readonly reason: "Custom empty content when there are no branches.";
3479
- }, {
3502
+ }, "NotFoundContentProp", {
3480
3503
  readonly field: "listError";
3481
3504
  readonly local: true;
3482
3505
  readonly reason: "Branch-collection READ failure — deliberately distinct from ErrorProp `error`, which stays field validation.";
@@ -302,10 +302,20 @@ const VOCABULARY_REGISTRY = {
302
302
  category: "data",
303
303
  description: "One entry in the selection-column dropdown \u2014 { key, text, onSelect } (antd SelectionItem)"
304
304
  },
305
+ TableSelectionBuiltInProp: {
306
+ file: "vocabulary/data.prop.ts",
307
+ category: "data",
308
+ description: "Built-in selections entry \u2014 SELECT_ALL | SELECT_INVERT | SELECT_NONE (antd Table.SELECTION_ALL / SELECTION_INVERT / SELECTION_NONE, published as DataTable.SELECTION_*)"
309
+ },
310
+ TableSelectAllMatchingProp: {
311
+ file: "vocabulary/data.prop.ts",
312
+ category: "data",
313
+ description: "Server-paged 'select all N matching' banner \u2014 { total, selected, onSelectedChange } (no antd equivalent; Gmail/Jira/GitHub pattern)"
314
+ },
305
315
  TableRowSelectionProp: {
306
316
  file: "vocabulary/data.prop.ts",
307
317
  category: "data",
308
- description: "DataTable row-selection config \u2014 type | selectedRowKeys | onChange | getCheckboxProps | preserveSelectedRowKeys | selections | hideSelectAll | columnTitle (antd TableRowSelection)"
318
+ description: "DataTable row-selection config \u2014 type | selectedRowKeys | onChange | getCheckboxProps | preserveSelectedRowKeys | selections | hideSelectAll | columnTitle | selectAllLabel | matching (antd TableRowSelection + select-all-matching)"
309
319
  },
310
320
  TableExpandableProp: {
311
321
  file: "vocabulary/data.prop.ts",
@@ -594,6 +604,11 @@ const VOCABULARY_REGISTRY = {
594
604
  category: "navigation",
595
605
  description: "Single breadcrumb segment"
596
606
  },
607
+ BreadcrumbItemEllipsisProp: {
608
+ file: "vocabulary/navigation.prop.ts",
609
+ category: "navigation",
610
+ description: "One-line truncation of a breadcrumb segment, with the full label in a tooltip"
611
+ },
597
612
  BreadcrumbProp: {
598
613
  file: "vocabulary/navigation.prop.ts",
599
614
  category: "navigation",
@@ -2146,7 +2161,16 @@ const COMPONENT_PROP_REGISTRY = {
2146
2161
  RecordPickerProp: {
2147
2162
  group: "data-entry",
2148
2163
  file: "components/data-entry.prop.ts",
2149
- vocabulary: ["ValueProp", "OnValueChangeProp", "DisabledProp", "SizeProp", "PlaceholderProp"],
2164
+ vocabulary: [
2165
+ "ValueProp",
2166
+ "OnValueChangeProp",
2167
+ "DisabledProp",
2168
+ "SizeProp",
2169
+ "PlaceholderProp",
2170
+ // gh#1044: antd `notFoundContent` for the empty search, and the dialog's load-more text.
2171
+ "NotFoundContentProp",
2172
+ "LabelProp"
2173
+ ],
2150
2174
  note: "One picker whose SHAPE follows the size of the set: Select at or under `threshold`, a searchable Dialog with consumer-declared filters over it (gh#932)."
2151
2175
  },
2152
2176
  RecordPickerFilterProp: {
@@ -2262,7 +2286,15 @@ const COMPONENT_PROP_REGISTRY = {
2262
2286
  TransferProp: {
2263
2287
  group: "data-entry",
2264
2288
  file: "components/data-entry.prop.ts",
2265
- vocabulary: ["DisabledProp", "ClassNameProp"]
2289
+ vocabulary: [
2290
+ "DisabledProp",
2291
+ "ClassNameProp",
2292
+ {
2293
+ field: "locale",
2294
+ local: true,
2295
+ reason: "antd Transfer `locale`, ported for `notFoundContent` only (one node, or a [source, target] pair) \u2014 gh#1044."
2296
+ }
2297
+ ]
2266
2298
  },
2267
2299
  TransferItemProp: {
2268
2300
  group: "data-entry",
@@ -2350,6 +2382,8 @@ const COMPONENT_PROP_REGISTRY = {
2350
2382
  "ColumnFilterStateProp",
2351
2383
  "ColumnSorterProp",
2352
2384
  "TableRowSelectionProp",
2385
+ "TableSelectionBuiltInProp",
2386
+ "TableSelectAllMatchingProp",
2353
2387
  "TableExpandableProp",
2354
2388
  "TableSummaryProp",
2355
2389
  "TableScrollProp",
@@ -2830,7 +2864,8 @@ const COMPONENT_PROP_REGISTRY = {
2830
2864
  InfiniteQueryStateProp: {
2831
2865
  group: "query",
2832
2866
  file: "components/query.prop.ts",
2833
- vocabulary: ["HandlerProp"]
2867
+ // LabelProp: `loadMoreLabel`, the built-in button's idle text (gh#1044).
2868
+ vocabulary: ["HandlerProp", "LabelProp"]
2834
2869
  },
2835
2870
  PrefetchLinkProp: { group: "query", file: "components/query.prop.ts", vocabulary: [] },
2836
2871
  AuthExpiryProviderProp: {
@@ -3905,6 +3940,11 @@ const COMPONENT_PROP_REGISTRY = {
3905
3940
  local: true,
3906
3941
  reason: "An endpoint movement command, not an internally owned value; the consumer commits its row data."
3907
3942
  },
3943
+ {
3944
+ field: "sticky",
3945
+ local: true,
3946
+ reason: "antd Table `sticky` \u2014 `true` or `{ offsetHeader }` (px) keeps the axis header on screen while the page scrolls (gh#1044)."
3947
+ },
3908
3948
  {
3909
3949
  field: "expandedValues",
3910
3950
  local: true,
@@ -4144,6 +4184,8 @@ const COMPONENT_PROP_REGISTRY = {
4144
4184
  local: true,
4145
4185
  reason: "Custom empty content when there are no branches."
4146
4186
  },
4187
+ // gh#1044: antd `notFoundContent` — the line shown when the branch SEARCH matches nothing.
4188
+ "NotFoundContentProp",
4147
4189
  {
4148
4190
  field: "listError",
4149
4191
  local: true,
@@ -207,6 +207,25 @@ export type TableSelectionItemProp = {
207
207
  text: React.ReactNode;
208
208
  onSelect: (currentRowKeys: string[]) => void;
209
209
  };
210
+ /**
211
+ * A built-in entry for the `selections` list (antd `Table.SELECTION_ALL` / `SELECTION_INVERT` /
212
+ * `SELECTION_NONE`, published here as `DataTable.SELECTION_*`). Mix them with custom
213
+ * {@link TableSelectionItemProp} entries in any order, exactly as antd does.
214
+ */
215
+ export type TableSelectionBuiltInProp = "SELECT_ALL" | "SELECT_INVERT" | "SELECT_NONE";
216
+ /**
217
+ * "Select all N matching" for a server-paged table (Gmail / Jira / GitHub; antd has no
218
+ * equivalent). Once every row of the page is selected, a banner above the header offers the whole
219
+ * result set; choosing it flips `selected`, and the consumer then sends its FILTER to the server
220
+ * instead of the ids. Unticking any row, or "Clear selection", reports `false`.
221
+ */
222
+ export type TableSelectAllMatchingProp = {
223
+ /** Rows the current query matches on the server — the N in "Select all N". */
224
+ total: number;
225
+ /** Controlled: `true` while the whole matching set is selected. */
226
+ selected: boolean;
227
+ onSelectedChange: (selected: boolean) => void;
228
+ };
210
229
  /**
211
230
  * Row-selection configuration (antd `TableRowSelection`). The object form is the full surface;
212
231
  * the older `selectable` / `selected` / `onSelectChange` triple stays and drives the same state.
@@ -224,10 +243,21 @@ export type TableRowSelectionProp<T> = {
224
243
  };
225
244
  /** Keep keys selected even once their row leaves `data` (server paging / filtering). */
226
245
  preserveSelectedRowKeys?: boolean;
227
- /** Extra bulk-select entries under the header checkbox. `true` = the built-in all/none/invert. */
228
- selections?: TableSelectionItemProp[] | boolean;
246
+ /**
247
+ * Extra bulk-select entries under the header checkbox. `true` = the built-in all/invert/none;
248
+ * a list mixes `DataTable.SELECTION_*` built-ins with custom entries, in the order given.
249
+ */
250
+ selections?: (TableSelectionItemProp | TableSelectionBuiltInProp)[] | boolean;
229
251
  hideSelectAll?: boolean;
230
252
  columnTitle?: React.ReactNode;
253
+ /**
254
+ * Accessible name of the header checkbox. Default: "Select all rows", or "Select all rows on
255
+ * this page" once `matching` is set. Name what it really selects — on a server-paged table it
256
+ * is the page, not the result set.
257
+ */
258
+ selectAllLabel?: string;
259
+ /** Opt-in "select all N matching" banner for a server-paged table. */
260
+ matching?: TableSelectAllMatchingProp;
231
261
  };
232
262
  /** Expandable-row configuration (antd/rc-table `ExpandableConfig`). */
233
263
  export type TableExpandableProp<T> = {
@@ -3,5 +3,5 @@ export type { ClassNameProp, ChildrenProp, IdProp, OpenProp, DefaultOpenProp, On
3
3
  export type { TitleProp, SubtitleProp, StatusProp, DescriptionProp, ExtraProp, FooterProp, ActionProp, IconProp, ConfirmLabelProp, CancelLabelProp, ActionsProp, EmptyMessageProp, } from "./content.prop.js";
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, TextBreakProp, TypographyTypeProp, TitleLevelProp, TypographyCopyConfigProp, TypographyEditConfigProp, TypographyEllipsisConfigProp, TypographyActionsConfigProp, SizeProp, ControlStatusProp, ControlVariantProp, FormLayoutProp, DescriptionsLayoutProp, BreakpointProp, ConfirmVariantProp, ToneProp, AlertVariantProp, CalloutKindProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, RevealTriggerProp, InViewAmountProp, ActivityVariantProp, ActivityAnnounceProp, IconSizeProp, } from "./interaction.prop.js";
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, TablePaginationPositionProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, } from "./data.prop.js";
6
+ export type { BreadcrumbItemProp, BreadcrumbProp, BreadcrumbItemMenuProp, BreadcrumbItemEllipsisProp, 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, TableSelectionBuiltInProp, TableSelectAllMatchingProp, TableRowSelectionProp, TableExpandableProp, TableSummaryProp, TableScrollProp, TableStickyProp, OnRowProp, TablePaginationProp, TablePaginationPositionProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, } from "./data.prop.js";
@@ -33,6 +33,20 @@ export type BreadcrumbItemProp = {
33
33
  to?: string;
34
34
  /** Ant Design `menu` — a sibling dropdown on this segment. @see BreadcrumbItemMenuProp */
35
35
  menu?: BreadcrumbItemMenuProp;
36
+ /**
37
+ * One line, a long label cut with "…" (gh#1046). antd's Breadcrumb has no per-item ellipsis;
38
+ * the name and shape are antd Typography's `ellipsis`. The full label shows in a tooltip on hover
39
+ * and on keyboard focus of the crumb link — `true` / `{}` use the label, `{ tooltip: node }`
40
+ * replaces it, `{ tooltip: false }` drops it. Applies to link and current crumbs, not to a
41
+ * `menu` segment or an `itemRender` body. The trail then stays on one line; a theme may cap
42
+ * each such crumb with `--breadcrumb-item-max-inline-size`.
43
+ * @see BreadcrumbItemEllipsisProp
44
+ */
45
+ ellipsis?: BreadcrumbItemEllipsisProp;
46
+ };
47
+ /** `BreadcrumbItemProp.ellipsis` — on, or on with an explicit tooltip (gh#1046). */
48
+ export type BreadcrumbItemEllipsisProp = boolean | {
49
+ tooltip?: React.ReactNode;
36
50
  };
37
51
  /** Ordered breadcrumb trail above page title. */
38
52
  export type BreadcrumbProp = BreadcrumbItemProp[];
@@ -1129,6 +1129,11 @@
1129
1129
  padding-inline-end: calc(var(--code-block-space-inset) + var(--control-height-xs));
1130
1130
  }
1131
1131
 
1132
+ .ui-code-block[data-copyable][data-wrap="false"] {
1133
+ padding-inline-end: var(--code-block-space-inset);
1134
+ border-inline-end: calc(var(--control-height-xs) + 2 * var(--space-1)) solid transparent;
1135
+ }
1136
+
1132
1137
  .ui-code-block-copy {
1133
1138
  position: absolute;
1134
1139
  inset-block-start: var(--space-1);
@@ -1139,6 +1144,11 @@
1139
1144
  .ui-code-block[data-copyable] {
1140
1145
  padding-inline-end: calc(var(--code-block-space-inset) + var(--control-height-default));
1141
1146
  }
1147
+
1148
+ .ui-code-block[data-copyable][data-wrap="false"] {
1149
+ padding-inline-end: var(--code-block-space-inset);
1150
+ border-inline-end-width: calc(var(--control-height-default) + 2 * var(--space-1));
1151
+ }
1142
1152
  }
1143
1153
 
1144
1154
  .ui-code-block [data-code-token="comment"],
@@ -1545,6 +1555,20 @@
1545
1555
  border: var(--stroke-hairline) solid hsl(var(--range-timeline-border-color));
1546
1556
  border-radius: var(--radius-md, calc(var(--radius) / var(--radius-ratio)));
1547
1557
  }
1558
+
1559
+ .ui-range-timeline[data-sticky="true"] {
1560
+ overflow: clip;
1561
+ }
1562
+ .ui-range-timeline-sticky-header {
1563
+ position: sticky;
1564
+ inset-block-start: var(--range-timeline-sticky-offset, 0px);
1565
+ z-index: 2;
1566
+ overflow: hidden;
1567
+ }
1568
+ .ui-range-timeline-scroller {
1569
+ overflow-x: auto;
1570
+ overflow-y: hidden;
1571
+ }
1548
1572
  .ui-range-timeline-canvas {
1549
1573
  min-inline-size: calc(
1550
1574
  var(--range-timeline-label-width) + var(--range-timeline-columns, 1) *
@@ -2171,6 +2195,34 @@
2171
2195
  border-block-start-color: transparent;
2172
2196
  }
2173
2197
 
2198
+ .ui-tree-node[data-filter-node="true"]:not([data-disabled]) .ui-tree-label {
2199
+ color: var(--tree-node-filter-foreground, hsl(var(--text-brand, var(--primary))));
2200
+ font-weight: var(--font-weight-medium);
2201
+ }
2202
+
2203
+ .ui-tree[data-virtual="true"][data-show-line="true"] .ui-tree-node {
2204
+ position: relative;
2205
+ }
2206
+
2207
+ .ui-tree-rail {
2208
+ position: absolute;
2209
+ inset-block: 0;
2210
+ inset-inline-start: calc(
2211
+ var(--tree-node-padding-inline) + (var(--tree-rail-level, 1) - 1) * var(--tree-indent-width) +
2212
+ var(--tree-switcher-size) / 2
2213
+ );
2214
+ border-inline-start: var(--stroke-hairline) solid var(--tree-line-color, hsl(var(--border)));
2215
+ }
2216
+
2217
+ .ui-tree-spacer {
2218
+ flex: none;
2219
+ }
2220
+
2221
+ .ui-tree[data-virtual="true"][data-divided="true"]
2222
+ > .ui-tree-node[aria-level="1"][aria-posinset="1"] {
2223
+ border-block-start-color: transparent;
2224
+ }
2225
+
2174
2226
  .ui-tree-loading {
2175
2227
  display: flex;
2176
2228
  align-items: center;
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "31.5.0",
2
+ "version": "31.7.0",
3
3
  "generatedBy": "scripts/gen-style-layers.mjs — do not edit by hand; run `pnpm gen:style-layers`",
4
4
  "base": "base.css",
5
5
  "fonts": "fonts.css",
@@ -702,7 +702,8 @@
702
702
  },
703
703
  "PageContainer": {
704
704
  "layers": [
705
- "layout.css"
705
+ "layout.css",
706
+ "dialog-layout.css"
706
707
  ]
707
708
  },
708
709
  "Pagination": {
@@ -1036,6 +1036,28 @@
1036
1036
  color: hsl(var(--foreground));
1037
1037
  }
1038
1038
 
1039
+ .ui-breadcrumb-list[data-ellipsis] {
1040
+ flex-wrap: nowrap;
1041
+ }
1042
+ .ui-breadcrumb-list[data-ellipsis] > .ui-breadcrumb-item:not([data-ellipsis]) {
1043
+ flex-shrink: 0;
1044
+ white-space: nowrap;
1045
+ }
1046
+ .ui-breadcrumb-item[data-ellipsis] {
1047
+ min-inline-size: 0;
1048
+ max-inline-size: var(--breadcrumb-item-max-inline-size);
1049
+ }
1050
+ .ui-breadcrumb-item[data-ellipsis] > svg,
1051
+ .ui-breadcrumb-item[data-ellipsis] > .ui-breadcrumb-separator {
1052
+ flex-shrink: 0;
1053
+ }
1054
+ .ui-breadcrumb-ellipsis {
1055
+ min-inline-size: 0;
1056
+ overflow: hidden;
1057
+ text-overflow: ellipsis;
1058
+ white-space: nowrap;
1059
+ }
1060
+
1039
1061
  .ui-empty-state {
1040
1062
  display: flex;
1041
1063
  flex-direction: column;
@@ -187,7 +187,9 @@
187
187
  padding: 0;
188
188
  }
189
189
 
190
- .ui-table-row:has(> [data-slot="table-cell"][data-flush] > [data-slot="list-row"][data-unread]) {
190
+ .ui-table-row:not([data-state="selected"]):has(
191
+ > [data-slot="table-cell"][data-flush] > [data-slot="list-row"][data-unread]
192
+ ) {
191
193
  background-color: var(--list-row-unread-background, hsl(var(--muted)));
192
194
  }
193
195
 
@@ -210,6 +212,9 @@
210
212
  font: inherit;
211
213
  cursor: pointer;
212
214
  outline: none;
215
+
216
+ max-inline-size: 100%;
217
+ min-inline-size: 0;
213
218
  }
214
219
 
215
220
  .ui-data-table-sort-button::after {
@@ -332,6 +337,11 @@
332
337
  display: inline-flex;
333
338
  align-items: center;
334
339
  gap: var(--space-inline-xs);
340
+ min-inline-size: 0;
341
+ max-inline-size: 100%;
342
+ }
343
+ .ui-data-table-sort-label > .ui-data-table-sort-icon {
344
+ flex-shrink: 0;
335
345
  }
336
346
 
337
347
  :is(th, td).text-center > .ui-data-table-sort-button > .ui-data-table-sort-label {
@@ -554,6 +564,19 @@
554
564
  gap: var(--table-selection-menu-gap);
555
565
  }
556
566
 
567
+ .ui-data-table-matching[data-active] {
568
+ display: flex;
569
+ flex-wrap: wrap;
570
+ align-items: center;
571
+ justify-content: center;
572
+ gap: var(--space-inline-sm);
573
+ padding-block: var(--space-stack-xs);
574
+ padding-inline: var(--table-cell-space-x, var(--space-section-active));
575
+ border-block-end: var(--stroke-hairline) solid var(--table-border-color, hsl(var(--border)));
576
+ background-color: hsl(var(--muted));
577
+ font-size: var(--font-size-sm);
578
+ }
579
+
557
580
  .ui-data-table-surface .ui-table-bordered {
558
581
  border-width: 0;
559
582
  }
@@ -46,6 +46,8 @@
46
46
  --breadcrumb-font-size: var(--font-size-xs, calc(var(--font-size-base) / var(--font-size-ratio)));
47
47
 
48
48
  --breadcrumb-menu-trigger-gap: var(--space-inline-xs);
49
+
50
+ --breadcrumb-item-max-inline-size: none;
49
51
  --menu-shortcut-font-size: var(
50
52
  --font-size-xs,
51
53
  calc(var(--font-size-base) / var(--font-size-ratio))
@@ -27,5 +27,7 @@
27
27
  --tree-node-selected-background-alpha: initial;
28
28
  --tree-node-selected-foreground: initial;
29
29
 
30
+ --tree-node-filter-foreground: initial;
31
+
30
32
  --tree-loading-bar-inline-size: 40%;
31
33
  }