@godxjp/ui 28.7.0 → 28.8.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 (85) hide show
  1. package/dist/components/data-display/index.d.ts +2 -0
  2. package/dist/components/data-display/index.js +2 -0
  3. package/dist/components/data-display/marquee.d.ts +16 -0
  4. package/dist/components/data-display/marquee.js +155 -0
  5. package/dist/components/general/reveal.d.ts +23 -2
  6. package/dist/components/general/reveal.js +37 -7
  7. package/dist/components/general/typography.d.ts +4 -1
  8. package/dist/components/general/typography.js +14 -1
  9. package/dist/components/layout/affix.d.ts +86 -0
  10. package/dist/components/layout/affix.js +187 -0
  11. package/dist/components/layout/index.d.ts +4 -0
  12. package/dist/components/layout/index.js +4 -0
  13. package/dist/components/layout/legal-document-shell.js +4 -3
  14. package/dist/components/layout/masonry.d.ts +74 -0
  15. package/dist/components/layout/masonry.js +214 -0
  16. package/dist/components/layout/page-container.js +5 -20
  17. package/dist/components/navigation/anchor.d.ts +64 -0
  18. package/dist/components/navigation/anchor.js +284 -0
  19. package/dist/components/navigation/index.d.ts +4 -0
  20. package/dist/components/navigation/index.js +4 -0
  21. package/dist/components/navigation/mega-menu.d.ts +21 -0
  22. package/dist/components/navigation/mega-menu.js +526 -0
  23. package/dist/contracts/measurement.json +1 -1
  24. package/dist/i18n/messages/en.json +517 -0
  25. package/dist/i18n/messages/ja.json +513 -0
  26. package/dist/i18n/messages/vi.json +513 -0
  27. package/dist/lib/hooks.d.ts +68 -0
  28. package/dist/lib/hooks.js +52 -0
  29. package/dist/lib/platform.d.ts +14 -0
  30. package/dist/lib/platform.js +10 -1
  31. package/dist/lib/utils.d.ts +1 -1
  32. package/dist/lib/utils.js +3 -2
  33. package/dist/props/components/data-display.prop.d.ts +95 -1
  34. package/dist/props/components/general.prop.d.ts +47 -3
  35. package/dist/props/components/layout.prop.d.ts +194 -0
  36. package/dist/props/components/navigation.prop.d.ts +263 -0
  37. package/dist/props/registry.d.ts +359 -4
  38. package/dist/props/registry.js +472 -3
  39. package/dist/props/vocabulary/index.d.ts +1 -1
  40. package/dist/props/vocabulary/interaction.prop.d.ts +39 -2
  41. package/dist/styles/control.css +5 -6
  42. package/dist/styles/data-display-layout.css +2 -1
  43. package/dist/styles/density.css +4 -0
  44. package/dist/styles/layout.css +79 -0
  45. package/dist/styles/motion.css +121 -1
  46. package/dist/styles/navigation-layout.css +397 -1
  47. package/dist/styles/shell-layout.css +3 -0
  48. package/dist/styles/text-layout.css +52 -4
  49. package/dist/tokens/base.css +5 -0
  50. package/dist/tokens/components/affix.css +7 -0
  51. package/dist/tokens/components/anchor.css +17 -0
  52. package/dist/tokens/components/control.css +3 -3
  53. package/dist/tokens/components/form.css +1 -1
  54. package/dist/tokens/components/marquee.css +7 -0
  55. package/dist/tokens/components/masonry.css +6 -0
  56. package/dist/tokens/components/mega-menu.css +62 -0
  57. package/dist/tokens/components/shell.css +3 -0
  58. package/dist/tokens/foundation.css +11 -0
  59. package/dist/tokens/semantic/layout.css +7 -0
  60. package/docs/COMPOSITION-VS-COMPONENT.md +19 -1
  61. package/docs/DESIGN-AUTHORITY.md +99 -18
  62. package/docs/FRAME-COVERAGE-REPORT.md +7 -2
  63. package/docs/data-display/marquee.tsx +254 -0
  64. package/docs/foundation/_theme-editor-scope.ts +222 -0
  65. package/docs/foundation/density.tsx +12 -2
  66. package/docs/foundation/spacing.tsx +5 -0
  67. package/docs/foundation/theme-editor.tsx +645 -0
  68. package/docs/general/activity.tsx +65 -0
  69. package/docs/general/reveal.tsx +290 -22
  70. package/docs/general/typography.tsx +91 -1
  71. package/docs/layout/affix.tsx +209 -0
  72. package/docs/layout/masonry.tsx +291 -0
  73. package/docs/navigation/anchor.tsx +285 -0
  74. package/docs/navigation/mega-menu-panel.tsx +86 -0
  75. package/docs/navigation/mega-menu.tsx +254 -0
  76. package/docs/roadmap/website-components.md +779 -0
  77. package/docs/showcase/acme-website.tsx +75 -39
  78. package/docs/showcase/futurelastic-web.tsx +91 -49
  79. package/docs/showcase/marketing-page.tsx +885 -0
  80. package/docs/showcase/table-footer-totals.tsx +12 -2
  81. package/docs/showcase/theme-customization.tsx +1259 -0
  82. package/package.json +5 -3
  83. package/scripts/brand-accent.generated.mjs +27 -0
  84. package/scripts/ui-audit.mjs +66 -0
  85. package/scripts/visual-audit-rules.mjs +46 -2
@@ -431,7 +431,7 @@ const VOCABULARY_REGISTRY = {
431
431
  TextSizeProp: {
432
432
  file: "vocabulary/interaction.prop.ts",
433
433
  category: "interaction",
434
- description: "Text size \u2014 golden-ratio type-scale steps (2xs\u20262xl), never an arbitrary px"
434
+ description: "Text size \u2014 ten type-scale steps shared by Text and Heading, never an arbitrary px: the golden-ratio UI ramp 2xs\u20262xl (\u224811\u202622px) plus the display ramp 3xl\u20265xl (\u224828/42/54px, derived from --font-size-display) that a marketing hero needs"
435
435
  },
436
436
  IconSizeProp: {
437
437
  file: "vocabulary/interaction.prop.ts",
@@ -451,7 +451,7 @@ const VOCABULARY_REGISTRY = {
451
451
  HeadingLevelProp: {
452
452
  file: "vocabulary/interaction.prop.ts",
453
453
  category: "interaction",
454
- description: "Heading level 1-4 \u2014 sizes from --heading-h* and the semantic element"
454
+ description: "Heading level 1-4 \u2014 the semantic element, and the --heading-h* size it takes unless `size` (TextSizeProp) overrides it"
455
455
  },
456
456
  TextAlignProp: {
457
457
  file: "vocabulary/interaction.prop.ts",
@@ -563,6 +563,16 @@ const VOCABULARY_REGISTRY = {
563
563
  category: "interaction",
564
564
  description: "Reveal entrance-stagger ordinal (0..6) \u2014 an index into the motion ladder, never a raw ms"
565
565
  },
566
+ RevealTriggerProp: {
567
+ file: "vocabulary/interaction.prop.ts",
568
+ category: "interaction",
569
+ description: "What starts a Reveal entrance \u2014 mount (default, historical) | view (reaches the viewport)"
570
+ },
571
+ InViewAmountProp: {
572
+ file: "vocabulary/interaction.prop.ts",
573
+ category: "interaction",
574
+ description: "How much of an element must be visible to count as in view \u2014 some | all | a 0..1 ratio (Motion's useInView `amount`)"
575
+ },
566
576
  ActivityVariantProp: {
567
577
  file: "vocabulary/interaction.prop.ts",
568
578
  category: "interaction",
@@ -821,6 +831,129 @@ const COMPONENT_PROP_REGISTRY = {
821
831
  ResponsiveGridColumnsProp: { group: "layout", file: "components/layout.prop.ts", vocabulary: [] },
822
832
  ResponsiveGridPresetProp: { group: "layout", file: "components/layout.prop.ts", vocabulary: [] },
823
833
  ResponsiveGridAlignProp: { group: "layout", file: "components/layout.prop.ts", vocabulary: [] },
834
+ MasonryColumnsProp: {
835
+ group: "layout",
836
+ file: "components/layout.prop.ts",
837
+ vocabulary: ["BreakpointProp"]
838
+ },
839
+ MasonryGapProp: { group: "layout", file: "components/layout.prop.ts", vocabulary: ["GapProp"] },
840
+ MasonryItemProp: {
841
+ group: "layout",
842
+ file: "components/layout.prop.ts",
843
+ vocabulary: [
844
+ "ChildrenProp",
845
+ {
846
+ field: "key",
847
+ local: true,
848
+ reason: "Ant Design `MasonryItem.key` \u2014 the tile's identity across re-orders and re-measures, a DATA field on the item descriptor, not React's reserved element key."
849
+ },
850
+ {
851
+ field: "column",
852
+ local: true,
853
+ reason: "Ant Design `MasonryItem.column` \u2014 pin to a 0-based column index instead of the shortest-column fill."
854
+ },
855
+ {
856
+ field: "height",
857
+ local: true,
858
+ reason: "Ant Design `MasonryItem.height` \u2014 a declared block size that replaces the measurement for this tile."
859
+ },
860
+ {
861
+ field: "data",
862
+ local: true,
863
+ reason: "Ant Design `MasonryItem.data` \u2014 arbitrary payload handed back to itemRender/onLayoutChange."
864
+ }
865
+ ]
866
+ },
867
+ MasonryLayoutEntryProp: {
868
+ group: "layout",
869
+ file: "components/layout.prop.ts",
870
+ vocabulary: [
871
+ {
872
+ field: "column",
873
+ local: true,
874
+ reason: "The 0-based column the item landed in \u2014 the whole payload of Ant Design `onLayoutChange`."
875
+ }
876
+ ]
877
+ },
878
+ MasonryProp: {
879
+ group: "layout",
880
+ file: "components/layout.prop.ts",
881
+ vocabulary: [
882
+ "GapProp",
883
+ "IdProp",
884
+ "ClassNameProp",
885
+ {
886
+ field: "items",
887
+ local: true,
888
+ reason: "Ant Design `Masonry.items` \u2014 the tile descriptors, in reading order."
889
+ },
890
+ {
891
+ field: "itemRender",
892
+ local: true,
893
+ reason: "Ant Design `Masonry.itemRender` \u2014 renders a tile that carries no children."
894
+ },
895
+ {
896
+ field: "columns",
897
+ local: true,
898
+ reason: "Ant Design `Masonry.columns` \u2014 fixed count or a per-breakpoint map (MasonryColumnsProp)."
899
+ },
900
+ {
901
+ field: "gutter",
902
+ local: true,
903
+ reason: "NOT a prop: typed `never` so antd's spelling of `gap` is a compile error that names the replacement instead of a silently-unspaced grid (docs/DESIGN-AUTHORITY.md)."
904
+ },
905
+ {
906
+ field: "fresh",
907
+ local: true,
908
+ reason: "Ant Design `Masonry.fresh` \u2014 observe every tile's own size, not just the container's."
909
+ },
910
+ {
911
+ field: "onLayoutChange",
912
+ local: true,
913
+ reason: "Ant Design `Masonry.onLayoutChange` \u2014 reports column assignment; not a controlled-value callback, so it is not OnValueChangeProp."
914
+ }
915
+ ]
916
+ },
917
+ AffixTargetProp: { group: "layout", file: "components/layout.prop.ts", vocabulary: [] },
918
+ AffixProp: {
919
+ group: "layout",
920
+ file: "components/layout.prop.ts",
921
+ vocabulary: [
922
+ "ChildrenProp",
923
+ "IdProp",
924
+ "ClassNameProp",
925
+ {
926
+ field: "offsetBlockStart",
927
+ local: true,
928
+ reason: "Ant Design `Affix.offsetTop` on its LOGICAL axis \u2014 the pin distance from the scrollport's block-start edge. A length in pixels, backed by the `--affix-inset-block-start` token; no vocabulary type owns a per-instance pin offset."
929
+ },
930
+ {
931
+ field: "offsetBlockEnd",
932
+ local: true,
933
+ reason: "Ant Design `Affix.offsetBottom` on its LOGICAL axis. See `offsetBlockStart`."
934
+ },
935
+ {
936
+ field: "offsetTop",
937
+ local: true,
938
+ reason: "NOT a prop: typed `never` so antd's physical spelling is a compile error that names `offsetBlockStart` instead of a header that never pins (docs/DESIGN-AUTHORITY.md)."
939
+ },
940
+ {
941
+ field: "offsetBottom",
942
+ local: true,
943
+ reason: "NOT a prop: typed `never` so antd's physical spelling is a compile error that names `offsetBlockEnd`."
944
+ },
945
+ {
946
+ field: "target",
947
+ local: true,
948
+ reason: "Ant Design `Affix.target` \u2014 the lazy scroll-box getter, the same shape `FloatButton.BackTop.target` already spells here."
949
+ },
950
+ {
951
+ field: "onChange",
952
+ local: true,
953
+ reason: "Ant Design `Affix.onChange` \u2014 an OBSERVATION of the pinned boolean, fired only on the transition. There is no pinned VALUE to control, so it is not the OnValueChangeProp half of a triad, and it is not OnChangeProp's DOM ChangeEvent either. `Attachments.onChange` and `ActionsFeedback.onChange` are the precedent."
954
+ }
955
+ ]
956
+ },
824
957
  MasterDetailRailWidthProp: {
825
958
  group: "layout",
826
959
  file: "components/layout.prop.ts",
@@ -1353,12 +1486,29 @@ const COMPONENT_PROP_REGISTRY = {
1353
1486
  vocabulary: [
1354
1487
  "ChildrenProp",
1355
1488
  "RevealDelayProp",
1489
+ "RevealTriggerProp",
1490
+ "InViewAmountProp",
1356
1491
  "AsChildProp",
1357
1492
  "ClassNameProp",
1358
1493
  {
1359
1494
  field: "delay",
1360
1495
  local: true,
1361
1496
  reason: "Reveal stagger ordinal \u2014 RevealDelayProp vocabulary."
1497
+ },
1498
+ {
1499
+ field: "on",
1500
+ local: true,
1501
+ reason: "Entrance trigger \u2014 RevealTriggerProp vocabulary (mount | view)."
1502
+ },
1503
+ {
1504
+ field: "once",
1505
+ local: true,
1506
+ reason: "Reveal-once latch for on='view' \u2014 Motion's useInView `once`, borrowed by name and type."
1507
+ },
1508
+ {
1509
+ field: "amount",
1510
+ local: true,
1511
+ reason: "Visibility threshold for on='view' \u2014 InViewAmountProp vocabulary."
1362
1512
  }
1363
1513
  ]
1364
1514
  },
@@ -1529,7 +1679,13 @@ const COMPONENT_PROP_REGISTRY = {
1529
1679
  HeadingProp: {
1530
1680
  group: "general",
1531
1681
  file: "components/general.prop.ts",
1532
- vocabulary: ["HeadingLevelProp", "TextToneProp", "TextAlignProp", "ClassNameProp"]
1682
+ vocabulary: [
1683
+ "HeadingLevelProp",
1684
+ "TextSizeProp",
1685
+ "TextToneProp",
1686
+ "TextAlignProp",
1687
+ "ClassNameProp"
1688
+ ]
1533
1689
  },
1534
1690
  TypographyProp: {
1535
1691
  group: "general",
@@ -2181,6 +2337,63 @@ const COMPONENT_PROP_REGISTRY = {
2181
2337
  }
2182
2338
  ]
2183
2339
  },
2340
+ MarqueeDirectionProp: {
2341
+ group: "data-display",
2342
+ file: "components/data-display.prop.ts",
2343
+ vocabulary: [
2344
+ {
2345
+ field: "direction",
2346
+ local: true,
2347
+ reason: "LOGICAL travel direction (start | end) \u2014 the edge the track moves towards, so it flips with `dir` instead of naming a physical side the way the prior art's `left | right | up | down` does."
2348
+ }
2349
+ ]
2350
+ },
2351
+ MarqueeSpeedProp: {
2352
+ group: "data-display",
2353
+ file: "components/data-display.prop.ts",
2354
+ vocabulary: [
2355
+ {
2356
+ field: "speed",
2357
+ local: true,
2358
+ reason: "Pace ordinal (slow | base | fast) over the `--marquee-interval` motion token. Not SizeProp: it names a DURATION rung, not a control box, and `xs|sm|md|lg` would read as a size on something that has none."
2359
+ }
2360
+ ]
2361
+ },
2362
+ MarqueeProp: {
2363
+ group: "data-display",
2364
+ file: "components/data-display.prop.ts",
2365
+ vocabulary: [
2366
+ "ChildrenProp",
2367
+ "GapProp",
2368
+ "LabelProp",
2369
+ "ClassNameProp",
2370
+ {
2371
+ field: "play",
2372
+ local: true,
2373
+ reason: "Controlled motion state. The boolean triad spelled for this surface (play / defaultPlay / onPlayChange), the same shape `open`/`defaultOpen`/`onOpenChange` takes for an overlay \u2014 `value` would say nothing about what is being valued."
2374
+ },
2375
+ {
2376
+ field: "defaultPlay",
2377
+ local: true,
2378
+ reason: "Uncontrolled member of the play triad."
2379
+ },
2380
+ {
2381
+ field: "onPlayChange",
2382
+ local: true,
2383
+ reason: "Change member of the play triad; value-first, like every other On*Change here."
2384
+ },
2385
+ {
2386
+ field: "pauseOnHover",
2387
+ local: true,
2388
+ reason: "Positive boolean, default false. An ADDITION to the pause control, never the mechanism \u2014 hover-only pause is the WCAG 2.2.2 failure (F16) the prior art ships."
2389
+ },
2390
+ {
2391
+ field: "fade",
2392
+ local: true,
2393
+ reason: "Positive boolean, default false. Masks both edges over `--marquee-mask-width`; the prior art's `gradient`/`gradientColor`/`gradientWidth` trio is one boolean and one token here."
2394
+ }
2395
+ ]
2396
+ },
2184
2397
  CredentialRevealProp: {
2185
2398
  group: "data-display",
2186
2399
  file: "components/data-display.prop.ts",
@@ -4077,6 +4290,262 @@ const COMPONENT_PROP_REGISTRY = {
4077
4290
  "ClassNameProp"
4078
4291
  ]
4079
4292
  },
4293
+ MegaMenuTriggerActionProp: {
4294
+ group: "navigation",
4295
+ file: "components/navigation.prop.ts",
4296
+ vocabulary: []
4297
+ },
4298
+ MegaMenuLinkProp: {
4299
+ group: "navigation",
4300
+ file: "components/navigation.prop.ts",
4301
+ vocabulary: [
4302
+ "LabelProp",
4303
+ "IconProp",
4304
+ "DisabledProp",
4305
+ "DescriptionProp",
4306
+ {
4307
+ field: "key",
4308
+ local: true,
4309
+ reason: "Ant Design MenuItemType.key \u2014 the row's identity, not a value axis. Kept as antd spells it so a consumer's existing `items` array transfers unchanged."
4310
+ },
4311
+ {
4312
+ field: "href",
4313
+ local: true,
4314
+ reason: "The destination of a nav LINK. Sidebar/NavList already spell it `href` on their own row types; there is no vocabulary entry because no control-shaped component has a destination."
4315
+ }
4316
+ ]
4317
+ },
4318
+ MegaMenuGroupProp: {
4319
+ group: "navigation",
4320
+ file: "components/navigation.prop.ts",
4321
+ vocabulary: [
4322
+ "LabelProp",
4323
+ "IconProp",
4324
+ "DescriptionProp",
4325
+ {
4326
+ field: "key",
4327
+ local: true,
4328
+ reason: "Ant Design MenuItemGroupType identity \u2014 see MegaMenuLinkProp.key."
4329
+ },
4330
+ {
4331
+ field: "links",
4332
+ local: true,
4333
+ reason: "Ant Design MenuItemGroupType.children, narrowed to leaves. Named for what it holds because a megamenu panel is exactly one level deep \u2014 `children` would imply the arbitrary nesting this deliberately does not have."
4334
+ }
4335
+ ]
4336
+ },
4337
+ MegaMenuPanelProp: {
4338
+ group: "navigation",
4339
+ file: "components/navigation.prop.ts",
4340
+ vocabulary: [
4341
+ {
4342
+ field: "groups",
4343
+ local: true,
4344
+ reason: 'The panel\'s columns \u2014 Ant Design SubMenuType.children restricted to `type: "group"` entries.'
4345
+ },
4346
+ {
4347
+ field: "footer",
4348
+ local: true,
4349
+ reason: "A full-width strip below the columns. Same word Card/Dialog use for the slot in that position; no vocabulary type exists for it."
4350
+ }
4351
+ ]
4352
+ },
4353
+ MegaMenuItemProp: {
4354
+ group: "navigation",
4355
+ file: "components/navigation.prop.ts",
4356
+ vocabulary: [
4357
+ "LabelProp",
4358
+ "IconProp",
4359
+ "DisabledProp",
4360
+ {
4361
+ field: "key",
4362
+ local: true,
4363
+ reason: "Ant Design MenuItemType/SubMenuType identity \u2014 see MegaMenuLinkProp.key."
4364
+ },
4365
+ {
4366
+ field: "href",
4367
+ local: true,
4368
+ reason: "Destination of a top-level LINK \u2014 see MegaMenuLinkProp.href."
4369
+ },
4370
+ {
4371
+ field: "panel",
4372
+ local: true,
4373
+ reason: "Presence of this field is what makes the item a DISCLOSURE BUTTON rather than a link (Ant Design SubMenuType vs MenuItemType). A discriminant, not a styling axis."
4374
+ }
4375
+ ]
4376
+ },
4377
+ MegaMenuLinkComponentProp: {
4378
+ group: "navigation",
4379
+ file: "components/navigation.prop.ts",
4380
+ vocabulary: []
4381
+ },
4382
+ MegaMenuProp: {
4383
+ group: "navigation",
4384
+ file: "components/navigation.prop.ts",
4385
+ vocabulary: [
4386
+ "OpenProp",
4387
+ "DefaultOpenProp",
4388
+ "OnOpenChangeProp",
4389
+ "ValueProp",
4390
+ "DefaultValueProp",
4391
+ "OnValueChangeProp",
4392
+ "SizeProp",
4393
+ "LabelProp",
4394
+ "IdProp",
4395
+ "ClassNameProp",
4396
+ {
4397
+ field: "items",
4398
+ local: true,
4399
+ reason: "Ant Design Menu.items \u2014 the bar, in antd's own spelling."
4400
+ },
4401
+ {
4402
+ field: "triggerAction",
4403
+ local: true,
4404
+ reason: "Ant Design `triggerSubMenuAction`, shortened because there is no sub-MENU here (the APG pattern is disclosure, not menubar). Its own union type MegaMenuTriggerActionProp, mirroring DropdownMenuTriggerActionProp."
4405
+ },
4406
+ {
4407
+ field: "openDelay",
4408
+ local: true,
4409
+ reason: "Ant Design `subMenuOpenDelay`, in ms rather than seconds. No vocabulary type: no other component times a hover open."
4410
+ },
4411
+ {
4412
+ field: "closeDelay",
4413
+ local: true,
4414
+ reason: "Ant Design `subMenuCloseDelay`, in ms. This is the hover-intent grace period \u2014 the diagonal a pointer may take toward the panel without it closing."
4415
+ },
4416
+ {
4417
+ field: "expandIcon",
4418
+ local: true,
4419
+ reason: "Ant Design `expandIcon`, kept verbatim including its `false` to remove it."
4420
+ },
4421
+ {
4422
+ field: "linkComponent",
4423
+ local: true,
4424
+ reason: "Same contract and same spelling as Sidebar.linkComponent / NavList.linkComponent, so a consumer who wired a router once wires it the same way here."
4425
+ }
4426
+ ]
4427
+ },
4428
+ AnchorContainerProp: {
4429
+ group: "navigation",
4430
+ file: "components/navigation.prop.ts",
4431
+ vocabulary: []
4432
+ },
4433
+ AnchorDirectionProp: {
4434
+ group: "navigation",
4435
+ file: "components/navigation.prop.ts",
4436
+ vocabulary: []
4437
+ },
4438
+ AnchorItemProp: {
4439
+ group: "navigation",
4440
+ file: "components/navigation.prop.ts",
4441
+ vocabulary: [
4442
+ "TitleProp",
4443
+ "ChildrenProp",
4444
+ {
4445
+ field: "key",
4446
+ local: true,
4447
+ reason: "Ant Design `AnchorItem.key` \u2014 the entry's identity in the `items` DATA, not React's reserved element key."
4448
+ },
4449
+ {
4450
+ field: "href",
4451
+ local: true,
4452
+ reason: "Ant Design `AnchorItem.href` \u2014 the in-page fragment. It is a real `<a href>`, so the field carries the HTML attribute's own name."
4453
+ },
4454
+ {
4455
+ field: "target",
4456
+ local: true,
4457
+ reason: "Ant Design `AnchorItem.target` \u2014 the `<a target>` attribute, passed through."
4458
+ },
4459
+ {
4460
+ field: "replace",
4461
+ local: true,
4462
+ reason: "Ant Design `AnchorItem.replace` \u2014 history replace rather than push, overriding the component-level prop."
4463
+ },
4464
+ {
4465
+ field: "targetOffsetBlockStart",
4466
+ local: true,
4467
+ reason: "Ant Design `AnchorItem.targetOffset` (6.4.0) on its LOGICAL axis \u2014 this entry's own scroll landing offset."
4468
+ }
4469
+ ]
4470
+ },
4471
+ AnchorProp: {
4472
+ group: "navigation",
4473
+ file: "components/navigation.prop.ts",
4474
+ vocabulary: [
4475
+ "ValueProp",
4476
+ "DefaultValueProp",
4477
+ "OnValueChangeProp",
4478
+ "OnClickProp",
4479
+ "LabelProp",
4480
+ "IdProp",
4481
+ "ClassNameProp",
4482
+ {
4483
+ field: "items",
4484
+ local: true,
4485
+ reason: "Ant Design `Anchor.items` \u2014 the entries, in document order."
4486
+ },
4487
+ {
4488
+ field: "direction",
4489
+ local: true,
4490
+ reason: "Ant Design `Anchor.direction` \u2014 the layout axis, and the same word Separator / Flex / Toolbar already use here for it."
4491
+ },
4492
+ {
4493
+ field: "affix",
4494
+ local: true,
4495
+ reason: "Ant Design `Anchor.affix` \u2014 `boolean` or the `AffixProp` subset. It is literally antd's own AffixProps minus the fields Anchor supplies, which is why gh#827 lands before gh#828."
4496
+ },
4497
+ {
4498
+ field: "bounds",
4499
+ local: true,
4500
+ reason: "Ant Design `Anchor.bounds` \u2014 pixel tolerance added to the decision line."
4501
+ },
4502
+ {
4503
+ field: "getContainer",
4504
+ local: true,
4505
+ reason: "Ant Design `Anchor.getContainer` \u2014 the lazy scroll-box getter."
4506
+ },
4507
+ {
4508
+ field: "getCurrentAnchor",
4509
+ local: true,
4510
+ reason: "Ant Design `Anchor.getCurrentAnchor` \u2014 antd's own escape hatch, which runs INSIDE the resolution with no render round-trip. A controlled `value` outranks it."
4511
+ },
4512
+ {
4513
+ field: "offsetBlockStart",
4514
+ local: true,
4515
+ reason: "Ant Design `Anchor.offsetTop` on its LOGICAL axis \u2014 the decision line, and the distance Affix pins the nav at."
4516
+ },
4517
+ {
4518
+ field: "targetOffsetBlockStart",
4519
+ local: true,
4520
+ reason: "Ant Design `Anchor.targetOffset` on its LOGICAL axis \u2014 where a clicked section lands."
4521
+ },
4522
+ {
4523
+ field: "showInkInFixed",
4524
+ local: true,
4525
+ reason: "Ant Design `Anchor.showInkInFixed` \u2014 draw the travelling ink even with `affix={false}`."
4526
+ },
4527
+ {
4528
+ field: "replace",
4529
+ local: true,
4530
+ reason: "Ant Design `Anchor.replace` \u2014 history replace rather than push."
4531
+ },
4532
+ {
4533
+ field: "onChange",
4534
+ local: true,
4535
+ reason: "NOT a prop: typed `never` so antd's spelling is a compile error that names `onValueChange` \u2014 the active href here is a controlled value (`value` / `defaultValue` / `onValueChange`), which antd has no spelling for."
4536
+ },
4537
+ {
4538
+ field: "offsetTop",
4539
+ local: true,
4540
+ reason: "NOT a prop: typed `never` so antd's physical spelling is a compile error that names `offsetBlockStart`."
4541
+ },
4542
+ {
4543
+ field: "targetOffset",
4544
+ local: true,
4545
+ reason: "NOT a prop: typed `never` so antd's physical spelling is a compile error that names `targetOffsetBlockStart`."
4546
+ }
4547
+ ]
4548
+ },
4080
4549
  WelcomeVariantProp: {
4081
4550
  group: "data-display",
4082
4551
  file: "components/data-display.prop.ts",
@@ -2,6 +2,6 @@
2
2
  export type { ClassNameProp, ChildrenProp, IdProp, OpenProp, DefaultOpenProp, OnOpenChangeProp, HandlerProp, PendingProp, RequiredProp, DisabledProp, LabelProp, HelperProp, ErrorProp, ErrorBagProp, PlaceholderProp, NameProp, ValueProp, DefaultValueProp, OnValueChangeProp, OnChangeProp, OnClickProp, AsChildProp, FlushProp, WidthProp, ControlWidthProp, AllowClearProp, MaxTagCountProp, MaxTagPlaceholderProp, NotFoundContentProp, PopupMatchWidthProp, } from "./shared.prop.js";
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
- 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, CalloutKindProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, ActivityVariantProp, ActivityAnnounceProp, IconSizeProp, } from "./interaction.prop.js";
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, CalloutKindProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, RevealTriggerProp, InViewAmountProp, ActivityVariantProp, ActivityAnnounceProp, IconSizeProp, } from "./interaction.prop.js";
6
6
  export type { BreadcrumbItemProp, BreadcrumbProp, BreadcrumbItemMenuProp, BreadcrumbItemMenuEntryProp, BreadcrumbSeparatorProp, BreadcrumbItemRenderProp, } from "./navigation.prop.js";
7
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";
@@ -29,8 +29,32 @@ export type ShapeProp = "default" | "pill" | "sharp";
29
29
  * square on the brand surface (`--avatar-square-*` tokens).
30
30
  */
31
31
  export type AvatarShapeProp = "circle" | "square";
32
- /** Text size — steps of the golden-ratio type scale (NEVER an arbitrary px). `sm` = base. */
33
- export type TextSizeProp = "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
32
+ /**
33
+ * Text size — steps of the type scale (NEVER an arbitrary px). `sm` = base.
34
+ *
35
+ * TEN steps, in TWO ramps that meet at `2xl`, exactly where Tailwind's own scale stops naming
36
+ * t-shirt sizes and starts counting (`xl` → `2xl` → `3xl`):
37
+ *
38
+ * - `2xs`…`2xl` — the UI ramp. `--font-size-base` × `--font-size-ratio`ⁿ (φ^¼), ≈11…22px. This is
39
+ * the dense enterprise scale and nothing about it moves.
40
+ * - `3xl`…`5xl` — the DISPLAY ramp, ≈28/42/54px, for a marketing hero / CTA headline. Its own
41
+ * base is `--font-size-display` and its own step is `--font-size-display-ratio` (1.28, bolder
42
+ * than the body's φ^¼ because marketing wants more contrast), so a service retunes the whole
43
+ * display ramp without touching a single admin screen.
44
+ *
45
+ * The four display tokens shipped at `foundation.css:513-521` with NOTHING public able to reach
46
+ * them, so every marketing page wrote its own `font-size` class instead — 58 bespoke classes
47
+ * across two showcases (gh#826). These three steps ARE that public surface. `--font-size-display`
48
+ * itself is deliberately NOT a step: it is the ramp's single re-tuning knob and `5xl` already
49
+ * resolves to it, so a `"display"` member would be a second name for the same value.
50
+ *
51
+ * SHARED WITH `Heading size`, on purpose. Radix Themes is the prior art — one numeric ladder that
52
+ * `Heading` and `Text` both read, so "make this figure as big as that headline" is one step name
53
+ * rather than a lookup between two ramps. (Material 3 and Polaris take the other fork, named ROLES
54
+ * on separate ramps; that fork is equally defensible but it would put a second size vocabulary
55
+ * beside this one, which `check:prop-vocabulary` exists to prevent.)
56
+ */
57
+ export type TextSizeProp = "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl" | "5xl";
34
58
  /**
35
59
  * Icon size — the NINE steps of the `--icon-size-*` scale (docs/TOKENS.md · gh#326), not the four
36
60
  * of the control `SizeProp`.
@@ -286,6 +310,19 @@ export type SortStateProp = {
286
310
  * rows cascades in.
287
311
  */
288
312
  export type RevealDelayProp = 0 | 1 | 2 | 3 | 4 | 5 | 6;
313
+ /**
314
+ * What STARTS a `Reveal` — `mount` (default, the historical behaviour: the entrance plays as soon
315
+ * as the element renders) or `view` (the entrance waits until the element reaches the viewport).
316
+ * A trigger, never a second component: the animation, the tokens and the reduced-motion contract
317
+ * are identical either way.
318
+ */
319
+ export type RevealTriggerProp = "mount" | "view";
320
+ /**
321
+ * How much of an element must be inside the viewport to count as in view — Motion's `useInView`
322
+ * `amount`, name and type unchanged. `"some"` (default) is any pixel, `"all"` is the whole box, a
323
+ * number is an explicit 0..1 ratio.
324
+ */
325
+ export type InViewAmountProp = "some" | "all" | number;
289
326
  /**
290
327
  * Ambient-activity mark for `Activity` — the LOOP counterpart to `RevealDelayProp`'s one-shot
291
328
  * ladder. `dots` (default) is the three-dot ellipsis convention (someone is typing); `pulse` a
@@ -93,7 +93,6 @@
93
93
  cursor: pointer;
94
94
  gap: var(--control-gap);
95
95
  white-space: nowrap;
96
- border-radius: var(--control-radius);
97
96
  font-weight: var(--font-weight-medium);
98
97
  transition-property: color, background-color, border-color, box-shadow;
99
98
  transition-duration: 150ms;
@@ -1246,9 +1245,9 @@
1246
1245
  min-height: var(--control-height);
1247
1246
  padding: var(--space-1) var(--control-padding-x);
1248
1247
 
1249
- border: var(--control-border-width) solid var(--control-surface-border-color);
1248
+ border: var(--control-border-width) solid var(--control-surface-border-color, hsl(var(--input)));
1250
1249
  border-radius: var(--control-radius);
1251
- background: var(--control-surface-background);
1250
+ background: var(--control-surface-background, hsl(var(--background)));
1252
1251
  box-shadow: var(--control-shadow);
1253
1252
  }
1254
1253
  .ui-tag-input-disabled {
@@ -1361,14 +1360,14 @@
1361
1360
  }
1362
1361
 
1363
1362
  .ui-control-surface {
1364
- border-color: var(--control-surface-border-color);
1365
- background: var(--control-surface-background);
1363
+ border-color: var(--control-surface-border-color, hsl(var(--input)));
1364
+ background: var(--control-surface-background, hsl(var(--background)));
1366
1365
  }
1367
1366
 
1368
1367
  .ui-control-surface[data-variant="filled"] {
1369
1368
  --control-shadow: var(--control-filled-shadow);
1370
1369
  border-color: var(--control-filled-border-color);
1371
- background: var(--control-filled-background);
1370
+ background: var(--control-filled-background, hsl(var(--muted)));
1372
1371
  }
1373
1372
 
1374
1373
  .ui-control-surface[data-variant="borderless"] {
@@ -1878,12 +1878,13 @@
1878
1878
 
1879
1879
  .ui-chat-bubble-skeleton {
1880
1880
  display: grid;
1881
+ grid-template-columns: minmax(0, var(--chat-bubble-max-inline-size));
1881
1882
  gap: var(--skeleton-row-gap);
1882
1883
  }
1883
1884
 
1884
1885
  .ui-chat-bubble-skeleton-line {
1885
1886
  block-size: var(--skeleton-block-height);
1886
- inline-size: var(--chat-bubble-max-inline-size);
1887
+ inline-size: auto;
1887
1888
  max-inline-size: 100%;
1888
1889
  }
1889
1890
 
@@ -27,6 +27,8 @@
27
27
  --space-8: calc(2rem * var(--scaling));
28
28
  --space-10: calc(2.5rem * var(--scaling));
29
29
  --space-12: calc(3rem * var(--scaling));
30
+ --space-20: calc(5rem * var(--scaling));
31
+ --space-24: calc(6rem * var(--scaling));
30
32
  --radius: calc(0.375rem * var(--scaling));
31
33
  --control-height: calc(var(--control-height-default) * var(--scaling));
32
34
  --control-height-sm: calc(var(--control-height) - calc(0.25rem * var(--scaling)));
@@ -48,6 +50,8 @@
48
50
  --space-page-x: var(--space-6);
49
51
  --space-page-y: var(--space-6);
50
52
  --space-section: var(--space-4);
53
+ --space-section-band: var(--space-20);
54
+ --space-section-hero: var(--space-24);
51
55
  --space-stack-xs: var(--space-1);
52
56
  --space-stack-sm: var(--space-2);
53
57
  --space-stack-md: var(--space-4);