@godxjp/ui 23.0.0 → 23.2.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 (93) hide show
  1. package/dist/app/date-format-labels.d.ts +14 -2
  2. package/dist/app/date-format-labels.js +1 -1
  3. package/dist/app/date-formats.d.ts +14 -2
  4. package/dist/app/date-formats.js +9 -2
  5. package/dist/components/data-display/card.d.ts +45 -2
  6. package/dist/components/data-display/card.js +4 -2
  7. package/dist/components/data-display/data-table.d.ts +8 -1
  8. package/dist/components/data-display/data-table.js +9 -2
  9. package/dist/components/data-display/feature-list.d.ts +26 -0
  10. package/dist/components/data-display/feature-list.js +29 -0
  11. package/dist/components/data-display/index.d.ts +6 -0
  12. package/dist/components/data-display/index.js +6 -0
  13. package/dist/components/data-display/swatch.d.ts +24 -0
  14. package/dist/components/data-display/swatch.js +19 -0
  15. package/dist/components/data-display/thumbnail.d.ts +37 -0
  16. package/dist/components/data-display/thumbnail.js +20 -0
  17. package/dist/components/data-entry/checkbox.js +1 -1
  18. package/dist/components/data-entry/form-field.js +2 -2
  19. package/dist/components/data-entry/input.js +1 -1
  20. package/dist/components/data-entry/number-input.js +27 -6
  21. package/dist/components/data-entry/radio.js +1 -1
  22. package/dist/components/data-entry/switch.js +1 -1
  23. package/dist/components/feedback/dialog.js +2 -2
  24. package/dist/components/feedback/index.d.ts +2 -2
  25. package/dist/components/feedback/index.js +19 -1
  26. package/dist/components/feedback/sheet.js +2 -22
  27. package/dist/components/feedback/skeleton.d.ts +33 -3
  28. package/dist/components/feedback/skeleton.js +154 -3
  29. package/dist/components/layout/flex.d.ts +1 -1
  30. package/dist/components/layout/flex.js +17 -5
  31. package/dist/components/layout/sidebar.js +9 -2
  32. package/dist/components/navigation/filter-bar.js +2 -1
  33. package/dist/components/navigation/tabs-scroll.d.ts +27 -0
  34. package/dist/components/navigation/tabs-scroll.js +36 -1
  35. package/dist/components/navigation/tabs.d.ts +2 -2
  36. package/dist/components/navigation/tabs.js +60 -16
  37. package/dist/i18n/messages/en.json +10 -1
  38. package/dist/i18n/messages/ja.json +10 -1
  39. package/dist/i18n/messages/vi.json +10 -1
  40. package/dist/lib/breakpoint-token.d.ts +8 -0
  41. package/dist/lib/breakpoint-token.js +29 -0
  42. package/dist/props/components/data-display.prop.d.ts +101 -1
  43. package/dist/props/components/feedback.prop.d.ts +85 -1
  44. package/dist/props/components/layout.prop.d.ts +72 -1
  45. package/dist/props/components/navigation.prop.d.ts +80 -2
  46. package/dist/props/registry.d.ts +124 -1
  47. package/dist/props/registry.js +140 -0
  48. package/dist/props/vocabulary/data.prop.d.ts +5 -0
  49. package/dist/props/vocabulary/index.d.ts +1 -1
  50. package/dist/styles/alert-layout.css +139 -0
  51. package/dist/styles/card-layout.css +48 -0
  52. package/dist/styles/control.css +41 -5
  53. package/dist/styles/data-display-layout.css +88 -0
  54. package/dist/styles/focus-ring.css +28 -0
  55. package/dist/styles/form-layout.css +4 -0
  56. package/dist/styles/layout.css +2 -1
  57. package/dist/styles/navigation-layout.css +89 -5
  58. package/dist/styles/shell-layout.css +22 -0
  59. package/dist/styles/table-layout.css +5 -2
  60. package/dist/tokens/components/card.css +2 -0
  61. package/dist/tokens/components/control.css +8 -3
  62. package/dist/tokens/components/data-display.css +23 -0
  63. package/dist/tokens/components/feedback.css +18 -0
  64. package/dist/tokens/components/navigation.css +4 -0
  65. package/dist/tokens/foundation.css +18 -16
  66. package/docs/CONSUMER-RULES.md +8 -3
  67. package/docs/CUSTOMER-THEMING.md +18 -8
  68. package/docs/DATETIME.md +11 -2
  69. package/docs/DESIGN-AUTHORITY.md +2 -1
  70. package/docs/FRAME-COVERAGE-REPORT.md +29 -3
  71. package/docs/SPACING.md +35 -5
  72. package/docs/TOKENS.md +1 -1
  73. package/docs/assets/shot-landscape.svg +12 -0
  74. package/docs/assets/shot-portrait.svg +10 -0
  75. package/docs/data-display/card/index.tsx +40 -0
  76. package/docs/data-display/data-table/index.tsx +17 -2
  77. package/docs/data-display/feature-list.tsx +159 -0
  78. package/docs/data-display/swatch.tsx +107 -0
  79. package/docs/data-display/table.tsx +1 -1
  80. package/docs/data-display/thumbnail.tsx +128 -0
  81. package/docs/data-entry/segmented-in-filter-row.tsx +77 -0
  82. package/docs/feedback/skeleton.tsx +57 -0
  83. package/docs/layout/flex.tsx +29 -0
  84. package/docs/layout/sidebar.tsx +66 -10
  85. package/docs/navigation/dropdown-menu.tsx +4 -4
  86. package/docs/navigation/tabs.tsx +131 -0
  87. package/docs/roadmap/ai-chat-components.md +1 -2
  88. package/docs/roadmap/tree-components.md +0 -1
  89. package/package.json +12 -21
  90. package/scripts/_agent-setup.mjs +18 -0
  91. package/scripts/consumer-rule.md +16 -0
  92. package/scripts/guinea-pig-skill.md +12 -6
  93. package/scripts/ui-audit.mjs +184 -7
@@ -1,6 +1,6 @@
1
1
  /** Navigation component prop types — @see docs/COMPONENTS.md#navigation */
2
2
  import type * as React from "react";
3
- import type { ActionsProp, ChildrenProp, ClassNameProp, DisabledProp, ErrorProp, HasActiveFiltersProp, IdProp, LabelProp, OnClearFiltersProp, PendingProp, PlaceholderProp, StickyProp } from "../vocabulary/index.js";
3
+ import type { ActionsProp, ChildrenProp, ClassNameProp, DisabledProp, ErrorProp, HasActiveFiltersProp, IdProp, LabelProp, OnClearFiltersProp, PendingProp, PlaceholderProp, StickyProp, TextAlignProp } from "../vocabulary/index.js";
4
4
  import type { SearchSelectOptionProp } from "./data-entry.prop.js";
5
5
  /**
6
6
  * `wrap` (default) stacks on narrow viewports then wraps onto extra rows; `scroll` keeps ONE
@@ -330,6 +330,60 @@ export type TabsOverflowProp = "scroll" | "menu";
330
330
  * so an inline `(value, event) => void` leaks its second PARAMETER as a phantom prop.
331
331
  */
332
332
  export type TabsOnTabClickProp = (value: string, event: React.MouseEvent<HTMLButtonElement>) => void;
333
+ /**
334
+ * @see Tabs — Ant Design `animated`, same shape and same two switches.
335
+ *
336
+ * `inkBar` (default ON) is the `line` variant's active bar cross-fading between triggers.
337
+ * `tabPane` (default OFF, as in antd) fades the panel in when the selection moves.
338
+ *
339
+ * WHERE IT DIVERGES, and why: antd animates the PANE by laying every pane on one translated
340
+ * inline track and sliding it, which needs all of them mounted. This component destroys a hidden
341
+ * panel by default (`destroyOnHidden` — the opposite default from antd), so there is no track to
342
+ * slide; the pane animation is a token-owned fade-in on the panel that just became active
343
+ * (`--tabs-pane-motion-*`). The SWITCH is antd's, the motion is this library's, and both switches
344
+ * are additionally off under `prefers-reduced-motion` — which antd's is not.
345
+ */
346
+ export type TabsAnimatedProp = boolean | {
347
+ inkBar?: boolean;
348
+ tabPane?: boolean;
349
+ };
350
+ /**
351
+ * @see Tabs — Ant Design `indicator.size`, held to a NAMED axis instead of a pixel length.
352
+ *
353
+ * antd takes `number | (origin: number) => number` — a measured px length, or a function of the
354
+ * tab's own width. Neither can enter this library: a literal is what `no-arbitrary-spacing`
355
+ * exists to stop, and a function of the measured origin is the free-form escape hatch
356
+ * `docs/DESIGN-AUTHORITY.md` refuses by name. The two lengths that answer the actual request are
357
+ * named instead — `full` (the whole trigger, today's bar and the default) and `label` (the
358
+ * trigger's content box, i.e. minus its own inline padding), which is what
359
+ * `size: (origin) => origin - 2 * padding` is written to produce.
360
+ */
361
+ export type TabsIndicatorSizeProp = "full" | "label";
362
+ /**
363
+ * @see Tabs — Ant Design `indicator`. `align` keeps antd's own name AND its values, which are
364
+ * already logical, so it reads the shared `TextAlignProp` vocabulary rather than a second
365
+ * spelling of the same axis. It only has anything to place when `size` is shorter than the
366
+ * trigger, exactly as in antd.
367
+ */
368
+ export type TabsIndicatorProp = {
369
+ size?: TabsIndicatorSizeProp;
370
+ align?: TextAlignProp;
371
+ };
372
+ /**
373
+ * @see Tabs — the edge a scroll of the trigger strip moved TOWARDS, on the logical axis.
374
+ *
375
+ * antd reports `left | right | top | bottom`; those four cannot mirror for an RTL locale and two
376
+ * of them are just the other axis of the same event. `start`/`end` say the same thing on whichever
377
+ * axis the strip is on — the same override that makes `tabPlacement` logical.
378
+ */
379
+ export type TabsScrollDirectionProp = "start" | "end";
380
+ /**
381
+ * @see Tabs — Ant Design `onTabScroll`. A NAMED alias for the same reason as `TabsOnEditProp`.
382
+ * Only fires for the `items` API, which is the path that owns the strip element.
383
+ */
384
+ export type TabsOnScrollProp = (info: {
385
+ direction: TabsScrollDirectionProp;
386
+ }) => void;
333
387
  /** @see Tabs — high-level tabs with optional `items` array. */
334
388
  export type TabsProp = {
335
389
  items?: TabItemProp[];
@@ -337,7 +391,14 @@ export type TabsProp = {
337
391
  defaultValue?: string;
338
392
  onValueChange?: (value: string) => void;
339
393
  variant?: TabsVariantProp;
340
- /** Ant Design `tabPlacement`. Default `top`. */
394
+ /**
395
+ * Ant Design `tabPlacement`. Default `top`.
396
+ *
397
+ * `start`/`end` FOLD to `top`/`bottom` at or below
398
+ * `--tabs-placement-responsive-breakpoint-width` (48rem), arrow keys included — a vertical strip
399
+ * shares one inline axis with its panel and a phone has no room for both. Ant Design folds the
400
+ * same pair the same way. Set the token to `0px` to keep the strip vertical at every width.
401
+ */
341
402
  tabPlacement?: TabsPlacementProp;
342
403
  /** Control tier of the triggers. Default `md`. Ant Design `size` (`small`/`middle`/`large`). */
343
404
  size?: "sm" | "md" | "lg";
@@ -384,6 +445,23 @@ export type TabsProp = {
384
445
  * "click" would be a fiction. Use `onValueChange` for selection, whatever moved it.
385
446
  */
386
447
  onTabClick?: TabsOnTabClickProp;
448
+ /**
449
+ * Ant Design `animated`. Default `{ inkBar: true, tabPane: false }` — antd's own default, and
450
+ * byte for byte what this strip already painted. @see TabsAnimatedProp
451
+ */
452
+ animated?: TabsAnimatedProp;
453
+ /**
454
+ * Ant Design `indicator`. Governs the `line` variant's active bar only — the other variants
455
+ * have no bar to place. @see TabsIndicatorProp
456
+ */
457
+ indicator?: TabsIndicatorProp;
458
+ /**
459
+ * Ant Design `more.icon` — the glyph on the `overflow="menu"` button, flat here for the same
460
+ * reason `addIcon` and `closeIcon` are flat: `overflow` names the BEHAVIOUR, the icon is a slot.
461
+ */
462
+ moreIcon?: React.ReactNode;
463
+ /** Ant Design `onTabScroll`, on the logical axis. @see TabsOnScrollProp */
464
+ onTabScroll?: TabsOnScrollProp;
387
465
  className?: ClassNameProp;
388
466
  listClassName?: ClassNameProp;
389
467
  contentClassName?: ClassNameProp;
@@ -584,6 +584,11 @@ export declare const VOCABULARY_REGISTRY: {
584
584
  readonly category: "data";
585
585
  readonly description: "Row ID extractor generic";
586
586
  };
587
+ readonly GetRowLabelProp: {
588
+ readonly file: "vocabulary/data.prop.ts";
589
+ readonly category: "data";
590
+ readonly description: "Row label extractor generic — the accessible name of a row's selection control";
591
+ };
587
592
  readonly OnRowClickProp: {
588
593
  readonly file: "vocabulary/data.prop.ts";
589
594
  readonly category: "data";
@@ -1533,7 +1538,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
1533
1538
  readonly DataTableProp: {
1534
1539
  readonly group: "data-display";
1535
1540
  readonly file: "components/data-display.prop.ts";
1536
- readonly vocabulary: readonly ["ColumnDefProp", "DensityProp", "SortStateProp", "SelectedIdsProp", "HandlerProp", "TablePresetProp", "TableColumnPriorityProp", "BreakpointProp", "ColumnFixedProp", "ColumnFilterItemProp", "ColumnFilterStateProp", "ColumnSorterProp", "TableRowSelectionProp", "TableExpandableProp", "TableSummaryProp", "TableScrollProp", "TableStickyProp", "OnRowProp", "TablePaginationProp", "SortDirectionProp", "OnColumnFilterChangeProp"];
1541
+ 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"];
1537
1542
  };
1538
1543
  readonly ListRowDensityProp: {
1539
1544
  readonly group: "data-display";
@@ -1935,6 +1940,45 @@ export declare const COMPONENT_PROP_REGISTRY: {
1935
1940
  readonly file: "components/feedback.prop.ts";
1936
1941
  readonly vocabulary: readonly [];
1937
1942
  };
1943
+ readonly SkeletonProp: {
1944
+ readonly group: "feedback";
1945
+ readonly file: "components/feedback.prop.ts";
1946
+ readonly vocabulary: readonly ["ClassNameProp", "ChildrenProp"];
1947
+ };
1948
+ readonly SkeletonAvatarProp: {
1949
+ readonly group: "feedback";
1950
+ readonly file: "components/feedback.prop.ts";
1951
+ readonly vocabulary: readonly ["SizeProp", "ClassNameProp"];
1952
+ };
1953
+ readonly SkeletonButtonProp: {
1954
+ readonly group: "feedback";
1955
+ readonly file: "components/feedback.prop.ts";
1956
+ readonly vocabulary: readonly ["SizeProp", "ShapeProp", "ClassNameProp"];
1957
+ };
1958
+ readonly SkeletonInputProp: {
1959
+ readonly group: "feedback";
1960
+ readonly file: "components/feedback.prop.ts";
1961
+ readonly vocabulary: readonly ["SizeProp", "ClassNameProp"];
1962
+ };
1963
+ readonly SkeletonNodeProp: {
1964
+ readonly group: "feedback";
1965
+ readonly file: "components/feedback.prop.ts";
1966
+ readonly vocabulary: readonly ["ChildrenProp", "ClassNameProp"];
1967
+ };
1968
+ readonly SkeletonImageProp: {
1969
+ readonly group: "feedback";
1970
+ readonly file: "components/feedback.prop.ts";
1971
+ readonly vocabulary: readonly ["ClassNameProp"];
1972
+ };
1973
+ readonly SkeletonArticleProp: {
1974
+ readonly group: "feedback";
1975
+ readonly file: "components/feedback.prop.ts";
1976
+ readonly vocabulary: readonly ["ChildrenProp", "ClassNameProp", {
1977
+ readonly field: "title";
1978
+ readonly local: true;
1979
+ readonly reason: "antd's Skeleton `title` is the presence/measure of the HEADING LINE, not the string TitleProp names — `false` drops the line and `{ width }` re-measures it.";
1980
+ }];
1981
+ };
1938
1982
  readonly ToolbarProp: {
1939
1983
  readonly group: "navigation";
1940
1984
  readonly file: "components/navigation.prop.ts";
@@ -2075,6 +2119,35 @@ export declare const COMPONENT_PROP_REGISTRY: {
2075
2119
  readonly file: "components/navigation.prop.ts";
2076
2120
  readonly vocabulary: readonly [];
2077
2121
  };
2122
+ readonly TabsAnimatedProp: {
2123
+ readonly group: "navigation";
2124
+ readonly file: "components/navigation.prop.ts";
2125
+ readonly vocabulary: readonly [];
2126
+ };
2127
+ readonly TabsIndicatorSizeProp: {
2128
+ readonly group: "navigation";
2129
+ readonly file: "components/navigation.prop.ts";
2130
+ readonly vocabulary: readonly [];
2131
+ };
2132
+ readonly TabsIndicatorProp: {
2133
+ readonly group: "navigation";
2134
+ readonly file: "components/navigation.prop.ts";
2135
+ readonly vocabulary: readonly ["TextAlignProp", {
2136
+ readonly field: "size";
2137
+ readonly local: true;
2138
+ readonly reason: "The LENGTH of the active bar along the strip (Ant Design `indicator.size`), not a control tier — `SizeProp` is the sm/md/lg band and reusing it here would say something false. Values stay a closed named axis (`full` | `label`) so no pixel length or origin-function enters the API.";
2139
+ }];
2140
+ };
2141
+ readonly TabsScrollDirectionProp: {
2142
+ readonly group: "navigation";
2143
+ readonly file: "components/navigation.prop.ts";
2144
+ readonly vocabulary: readonly [];
2145
+ };
2146
+ readonly TabsOnScrollProp: {
2147
+ readonly group: "navigation";
2148
+ readonly file: "components/navigation.prop.ts";
2149
+ readonly vocabulary: readonly ["HandlerProp"];
2150
+ };
2078
2151
  readonly TabItemProp: {
2079
2152
  readonly group: "navigation";
2080
2153
  readonly file: "components/navigation.prop.ts";
@@ -2197,6 +2270,56 @@ export declare const COMPONENT_PROP_REGISTRY: {
2197
2270
  readonly file: "components/data-display.prop.ts";
2198
2271
  readonly vocabulary: readonly ["ClassNameProp"];
2199
2272
  };
2273
+ readonly SwatchProp: {
2274
+ readonly group: "data-display";
2275
+ readonly file: "components/data-display.prop.ts";
2276
+ readonly vocabulary: readonly ["ClassNameProp", {
2277
+ readonly field: "color";
2278
+ readonly local: true;
2279
+ readonly reason: "A CSS colour VALUE a person chose (a brand's primary_color, a tag tint) — DATA, the same axis as Badge's `color`, and deliberately not ToneProp: a tone is a closed set of meanings and this colour means only itself (gh#527).";
2280
+ }, {
2281
+ readonly field: "aria-label";
2282
+ readonly local: true;
2283
+ readonly reason: "The sample's accessible NAME, which is what lets a read-only colour be shown with no visible label. Absent, the mark is aria-hidden (Legend's rule) — so colour is never the sole carrier either way.";
2284
+ }];
2285
+ };
2286
+ readonly FeatureStateProp: {
2287
+ readonly group: "data-display";
2288
+ readonly file: "components/data-display.prop.ts";
2289
+ readonly vocabulary: readonly [];
2290
+ };
2291
+ readonly FeatureItemProp: {
2292
+ readonly group: "data-display";
2293
+ readonly file: "components/data-display.prop.ts";
2294
+ readonly vocabulary: readonly ["LabelProp", "DescriptionProp", {
2295
+ readonly field: "state";
2296
+ readonly local: true;
2297
+ readonly reason: "Inclusion axis (included/excluded/limited) — FeatureList's own, not a tone.";
2298
+ }];
2299
+ };
2300
+ readonly FeatureListProp: {
2301
+ readonly group: "data-display";
2302
+ readonly file: "components/data-display.prop.ts";
2303
+ readonly vocabulary: readonly ["ClassNameProp"];
2304
+ };
2305
+ readonly ThumbnailSizeProp: {
2306
+ readonly group: "data-display";
2307
+ readonly file: "components/data-display.prop.ts";
2308
+ readonly vocabulary: readonly ["SizeProp"];
2309
+ };
2310
+ readonly ThumbnailProp: {
2311
+ readonly group: "data-display";
2312
+ readonly file: "components/data-display.prop.ts";
2313
+ readonly vocabulary: readonly ["SizeProp", "ClassNameProp", {
2314
+ readonly field: "alt";
2315
+ readonly local: true;
2316
+ readonly reason: "The native img alt contract, made required so it cannot be forgotten.";
2317
+ }, {
2318
+ readonly field: "src";
2319
+ readonly local: true;
2320
+ readonly reason: "The native img src attribute.";
2321
+ }];
2322
+ };
2200
2323
  readonly CodeBlockProp: {
2201
2324
  readonly group: "data-display";
2202
2325
  readonly file: "components/data-display.prop.ts";
@@ -585,6 +585,11 @@ const VOCABULARY_REGISTRY = {
585
585
  category: "data",
586
586
  description: "Row ID extractor generic"
587
587
  },
588
+ GetRowLabelProp: {
589
+ file: "vocabulary/data.prop.ts",
590
+ category: "data",
591
+ description: "Row label extractor generic \u2014 the accessible name of a row's selection control"
592
+ },
588
593
  OnRowClickProp: {
589
594
  file: "vocabulary/data.prop.ts",
590
595
  category: "data",
@@ -1833,6 +1838,7 @@ const COMPONENT_PROP_REGISTRY = {
1833
1838
  "DensityProp",
1834
1839
  "SortStateProp",
1835
1840
  "SelectedIdsProp",
1841
+ "GetRowLabelProp",
1836
1842
  "HandlerProp",
1837
1843
  "TablePresetProp",
1838
1844
  "TableColumnPriorityProp",
@@ -2233,6 +2239,49 @@ const COMPONENT_PROP_REGISTRY = {
2233
2239
  },
2234
2240
  SheetResponsiveProp: { group: "feedback", file: "components/feedback.prop.ts", vocabulary: [] },
2235
2241
  SkeletonRowsProp: { group: "feedback", file: "components/feedback.prop.ts", vocabulary: [] },
2242
+ SkeletonProp: {
2243
+ group: "feedback",
2244
+ file: "components/feedback.prop.ts",
2245
+ vocabulary: ["ClassNameProp", "ChildrenProp"]
2246
+ },
2247
+ SkeletonAvatarProp: {
2248
+ group: "feedback",
2249
+ file: "components/feedback.prop.ts",
2250
+ vocabulary: ["SizeProp", "ClassNameProp"]
2251
+ },
2252
+ SkeletonButtonProp: {
2253
+ group: "feedback",
2254
+ file: "components/feedback.prop.ts",
2255
+ vocabulary: ["SizeProp", "ShapeProp", "ClassNameProp"]
2256
+ },
2257
+ SkeletonInputProp: {
2258
+ group: "feedback",
2259
+ file: "components/feedback.prop.ts",
2260
+ vocabulary: ["SizeProp", "ClassNameProp"]
2261
+ },
2262
+ SkeletonNodeProp: {
2263
+ group: "feedback",
2264
+ file: "components/feedback.prop.ts",
2265
+ vocabulary: ["ChildrenProp", "ClassNameProp"]
2266
+ },
2267
+ SkeletonImageProp: {
2268
+ group: "feedback",
2269
+ file: "components/feedback.prop.ts",
2270
+ vocabulary: ["ClassNameProp"]
2271
+ },
2272
+ SkeletonArticleProp: {
2273
+ group: "feedback",
2274
+ file: "components/feedback.prop.ts",
2275
+ vocabulary: [
2276
+ "ChildrenProp",
2277
+ "ClassNameProp",
2278
+ {
2279
+ field: "title",
2280
+ local: true,
2281
+ reason: "antd's Skeleton `title` is the presence/measure of the HEADING LINE, not the string TitleProp names \u2014 `false` drops the line and `{ width }` re-measures it."
2282
+ }
2283
+ ]
2284
+ },
2236
2285
  ToolbarProp: {
2237
2286
  group: "navigation",
2238
2287
  file: "components/navigation.prop.ts",
@@ -2386,6 +2435,38 @@ const COMPONENT_PROP_REGISTRY = {
2386
2435
  file: "components/navigation.prop.ts",
2387
2436
  vocabulary: []
2388
2437
  },
2438
+ TabsAnimatedProp: {
2439
+ group: "navigation",
2440
+ file: "components/navigation.prop.ts",
2441
+ vocabulary: []
2442
+ },
2443
+ TabsIndicatorSizeProp: {
2444
+ group: "navigation",
2445
+ file: "components/navigation.prop.ts",
2446
+ vocabulary: []
2447
+ },
2448
+ TabsIndicatorProp: {
2449
+ group: "navigation",
2450
+ file: "components/navigation.prop.ts",
2451
+ vocabulary: [
2452
+ "TextAlignProp",
2453
+ {
2454
+ field: "size",
2455
+ local: true,
2456
+ reason: "The LENGTH of the active bar along the strip (Ant Design `indicator.size`), not a control tier \u2014 `SizeProp` is the sm/md/lg band and reusing it here would say something false. Values stay a closed named axis (`full` | `label`) so no pixel length or origin-function enters the API."
2457
+ }
2458
+ ]
2459
+ },
2460
+ TabsScrollDirectionProp: {
2461
+ group: "navigation",
2462
+ file: "components/navigation.prop.ts",
2463
+ vocabulary: []
2464
+ },
2465
+ TabsOnScrollProp: {
2466
+ group: "navigation",
2467
+ file: "components/navigation.prop.ts",
2468
+ vocabulary: ["HandlerProp"]
2469
+ },
2389
2470
  TabItemProp: {
2390
2471
  group: "navigation",
2391
2472
  file: "components/navigation.prop.ts",
@@ -2538,6 +2619,65 @@ const COMPONENT_PROP_REGISTRY = {
2538
2619
  file: "components/data-display.prop.ts",
2539
2620
  vocabulary: ["ClassNameProp"]
2540
2621
  },
2622
+ SwatchProp: {
2623
+ group: "data-display",
2624
+ file: "components/data-display.prop.ts",
2625
+ vocabulary: [
2626
+ "ClassNameProp",
2627
+ {
2628
+ field: "color",
2629
+ local: true,
2630
+ reason: "A CSS colour VALUE a person chose (a brand's primary_color, a tag tint) \u2014 DATA, the same axis as Badge's `color`, and deliberately not ToneProp: a tone is a closed set of meanings and this colour means only itself (gh#527)."
2631
+ },
2632
+ {
2633
+ field: "aria-label",
2634
+ local: true,
2635
+ reason: "The sample's accessible NAME, which is what lets a read-only colour be shown with no visible label. Absent, the mark is aria-hidden (Legend's rule) \u2014 so colour is never the sole carrier either way."
2636
+ }
2637
+ ]
2638
+ },
2639
+ FeatureStateProp: {
2640
+ group: "data-display",
2641
+ file: "components/data-display.prop.ts",
2642
+ vocabulary: []
2643
+ },
2644
+ FeatureItemProp: {
2645
+ group: "data-display",
2646
+ file: "components/data-display.prop.ts",
2647
+ vocabulary: [
2648
+ "LabelProp",
2649
+ "DescriptionProp",
2650
+ {
2651
+ field: "state",
2652
+ local: true,
2653
+ reason: "Inclusion axis (included/excluded/limited) \u2014 FeatureList's own, not a tone."
2654
+ }
2655
+ ]
2656
+ },
2657
+ FeatureListProp: {
2658
+ group: "data-display",
2659
+ file: "components/data-display.prop.ts",
2660
+ vocabulary: ["ClassNameProp"]
2661
+ },
2662
+ ThumbnailSizeProp: {
2663
+ group: "data-display",
2664
+ file: "components/data-display.prop.ts",
2665
+ vocabulary: ["SizeProp"]
2666
+ },
2667
+ ThumbnailProp: {
2668
+ group: "data-display",
2669
+ file: "components/data-display.prop.ts",
2670
+ vocabulary: [
2671
+ "SizeProp",
2672
+ "ClassNameProp",
2673
+ {
2674
+ field: "alt",
2675
+ local: true,
2676
+ reason: "The native img alt contract, made required so it cannot be forgotten."
2677
+ },
2678
+ { field: "src", local: true, reason: "The native img src attribute." }
2679
+ ]
2680
+ },
2541
2681
  CodeBlockProp: {
2542
2682
  group: "data-display",
2543
2683
  file: "components/data-display.prop.ts",
@@ -7,6 +7,11 @@ import type { BreakpointProp, ColumnAlignProp, SortDirectionProp } from "./inter
7
7
  import type { TableDensityProp } from "./layout.prop.js";
8
8
  /** Generic row identifier extractor for tables with selection. */
9
9
  export type GetRowIdProp<T> = (row: T) => string;
10
+ /**
11
+ * Human-readable row name — what a row's selection control is announced as. The row id is a KEY,
12
+ * not a name: announced, it reads a UUID aloud.
13
+ */
14
+ export type GetRowLabelProp<T> = (row: T) => string;
10
15
  /** Row click navigation handler. */
11
16
  export type OnRowClickProp<T> = (row: T) => void;
12
17
  /** Column definition for DataTable. */
@@ -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, 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, 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, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, } from "./data.prop.js";
@@ -288,6 +288,145 @@
288
288
  }
289
289
  }
290
290
 
291
+ .ui-skeleton-block[data-active],
292
+ .ui-skeleton-article[data-active] .ui-skeleton-block {
293
+ background-image: var(
294
+ --skeleton-sweep-gradient,
295
+ linear-gradient(90deg, hsl(var(--muted)) 25%, hsl(var(--border)) 37%, hsl(var(--muted)) 63%)
296
+ );
297
+ background-size: 400% 100%;
298
+
299
+ animation: ui-skeleton-sweep var(--duration-loop, 1400ms) ease infinite;
300
+ }
301
+
302
+ @keyframes ui-skeleton-sweep {
303
+ from {
304
+ background-position: 100% 50%;
305
+ }
306
+ to {
307
+ background-position: 0 50%;
308
+ }
309
+ }
310
+
311
+ @media (prefers-reduced-motion: reduce) {
312
+ .ui-skeleton-block,
313
+ .ui-skeleton-block[data-active],
314
+ .ui-skeleton-article[data-active] .ui-skeleton-block {
315
+ animation: none;
316
+ }
317
+ }
318
+
319
+ [data-skeleton-element] {
320
+ --skeleton-element-block-size: var(--control-height);
321
+
322
+ display: inline-block;
323
+ vertical-align: top;
324
+ block-size: var(--skeleton-element-block-size);
325
+ border-radius: var(--skeleton-element-radius);
326
+ }
327
+
328
+ [data-skeleton-element][data-size="xs"] {
329
+ --skeleton-element-block-size: var(--control-height-xs);
330
+ }
331
+
332
+ [data-skeleton-element][data-size="sm"] {
333
+ --skeleton-element-block-size: var(--control-height-sm);
334
+ }
335
+
336
+ [data-skeleton-element][data-size="lg"] {
337
+ --skeleton-element-block-size: var(--control-height-lg);
338
+ }
339
+
340
+ [data-skeleton-element="avatar"] {
341
+ inline-size: var(--skeleton-element-block-size);
342
+ border-radius: var(--avatar-square-radius);
343
+ }
344
+
345
+ [data-skeleton-element="avatar"][data-shape="circle"] {
346
+ border-radius: var(--radius-pill);
347
+ }
348
+
349
+ [data-skeleton-element="button"] {
350
+ inline-size: calc(var(--skeleton-element-block-size) * var(--skeleton-button-width-ratio));
351
+ min-inline-size: calc(var(--skeleton-element-block-size) * var(--skeleton-button-width-ratio));
352
+ }
353
+
354
+ [data-skeleton-element="button"][data-shape="pill"] {
355
+ border-radius: var(--radius-pill);
356
+ }
357
+
358
+ [data-skeleton-element="button"][data-shape="sharp"] {
359
+ border-radius: var(--radius-sharp);
360
+ }
361
+
362
+ [data-skeleton-element="input"] {
363
+ inline-size: calc(var(--skeleton-element-block-size) * var(--skeleton-input-width-ratio));
364
+ min-inline-size: calc(var(--skeleton-element-block-size) * var(--skeleton-input-width-ratio));
365
+ }
366
+
367
+ [data-skeleton-element][data-block] {
368
+ display: block;
369
+ inline-size: 100%;
370
+ min-inline-size: 0;
371
+ }
372
+
373
+ [data-skeleton-element="node"],
374
+ [data-skeleton-element="image"] {
375
+ display: inline-flex;
376
+ align-items: center;
377
+ justify-content: center;
378
+ vertical-align: middle;
379
+ inline-size: var(--skeleton-node-size);
380
+ block-size: var(--skeleton-node-size);
381
+ }
382
+
383
+ .ui-skeleton-image-glyph {
384
+ inline-size: var(--skeleton-image-glyph-size);
385
+ block-size: var(--skeleton-image-glyph-size);
386
+ color: var(--skeleton-image-glyph-color, hsl(var(--muted-foreground) / 0.4));
387
+ }
388
+
389
+ .ui-skeleton-article {
390
+ display: flex;
391
+ align-items: flex-start;
392
+ gap: var(--skeleton-article-avatar-gap);
393
+ inline-size: 100%;
394
+ }
395
+
396
+ .ui-skeleton-article-header {
397
+ flex: 0 0 auto;
398
+ }
399
+
400
+ .ui-skeleton-article-section {
401
+ display: grid;
402
+ flex: 1 1 auto;
403
+ gap: var(--skeleton-article-title-gap);
404
+ min-inline-size: 0;
405
+ }
406
+
407
+ .ui-skeleton-article[data-avatar] .ui-skeleton-article-title {
408
+ margin-block-start: var(--skeleton-article-avatar-title-offset);
409
+ }
410
+
411
+ .ui-skeleton-article-paragraph {
412
+ display: grid;
413
+ gap: var(--skeleton-article-line-gap);
414
+ }
415
+
416
+ .ui-skeleton-article-title,
417
+ .ui-skeleton-article-line {
418
+ block-size: var(--skeleton-block-height);
419
+ inline-size: var(--skeleton-line-width, 100%);
420
+ }
421
+
422
+ .ui-skeleton-article-line:last-child:not(:first-child):not(:nth-child(2)) {
423
+ --skeleton-line-width: var(--skeleton-paragraph-last-width);
424
+ }
425
+
426
+ .ui-skeleton-article[data-round] .ui-skeleton-block {
427
+ border-radius: var(--radius-pill);
428
+ }
429
+
291
430
  @keyframes pulse {
292
431
  50% {
293
432
  opacity: 0.5;