@kerfjs/ui 5.0.0-beta.76 → 5.0.0-beta.77

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 (101) hide show
  1. package/README.md +12 -0
  2. package/ai/component-catalog.json +212 -19
  3. package/ai/component-composition.json +122 -11
  4. package/ai/components/nav-stack.md +1 -0
  5. package/ai/components/select.md +1 -0
  6. package/ai/components/split-view.md +1 -0
  7. package/ai/components/text.md +4 -2
  8. package/ai/components/toolbar-control-group.md +20 -3
  9. package/ai/components/toolbar-text.md +19 -4
  10. package/ai/components/toolbar.md +10 -4
  11. package/ai/public-api-signatures-v1.md +51 -7
  12. package/ai/skill.md +26 -2
  13. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  14. package/dist/catalog.js +5 -5
  15. package/dist/{chunk-ZVYA6TLR.js → chunk-4Y4L5YEI.js} +3 -1
  16. package/dist/chunk-4Y4L5YEI.js.map +1 -0
  17. package/dist/{chunk-7QWIJEK5.js → chunk-6VQPLV3O.js} +3 -3
  18. package/dist/{chunk-7QWIJEK5.js.map → chunk-6VQPLV3O.js.map} +1 -1
  19. package/dist/{chunk-IVLTEBBT.js → chunk-M6BWQMQY.js} +2 -2
  20. package/dist/{chunk-IVLTEBBT.js.map → chunk-M6BWQMQY.js.map} +1 -1
  21. package/dist/{chunk-72LLWYP2.js → chunk-NVKRZ5DI.js} +1 -1
  22. package/dist/chunk-NVKRZ5DI.js.map +1 -0
  23. package/dist/{chunk-GO2CZX4M.js → chunk-RRCD3A6G.js} +13 -5
  24. package/dist/chunk-RRCD3A6G.js.map +1 -0
  25. package/dist/{chunk-5PAVAR4B.js → chunk-VHXHLZ6R.js} +10 -1
  26. package/dist/chunk-VHXHLZ6R.js.map +1 -0
  27. package/dist/chunk-WJN3V2H5.js +256 -0
  28. package/dist/chunk-WJN3V2H5.js.map +1 -0
  29. package/dist/{chunk-SJY7KC45.js → chunk-Z4EPMX25.js} +3 -3
  30. package/dist/{chunk-SJY7KC45.js.map → chunk-Z4EPMX25.js.map} +1 -1
  31. package/dist/{chunk-HGSTMZZ6.js → chunk-Z6PE5T7N.js} +2 -2
  32. package/dist/{chunk-HGSTMZZ6.js.map → chunk-Z6PE5T7N.js.map} +1 -1
  33. package/dist/collapsible-panel.js +2 -2
  34. package/dist/index.d.ts +3 -2
  35. package/dist/index.js +6 -5
  36. package/dist/list-header.d.ts +1 -0
  37. package/dist/list-header.js +1 -1
  38. package/dist/nav-stack.d.ts +1 -0
  39. package/dist/nav-stack.js +1 -1
  40. package/dist/select-register.js +3 -0
  41. package/dist/select-register.js.map +1 -1
  42. package/dist/select.d.ts +1 -0
  43. package/dist/select.js +1 -1
  44. package/dist/split-view.js +1 -1
  45. package/dist/styles/components/actions/toolbar/toolbar.css +32 -0
  46. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +51 -0
  47. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +11 -0
  48. package/dist/styles/components/navigation/nav-stack/nav-stack.css +11 -0
  49. package/dist/styles/components/typography/text/text.css +19 -0
  50. package/dist/styles/nav-stack.css +11 -0
  51. package/dist/styles/text.css +19 -0
  52. package/dist/styles/toolbar-control-group.css +51 -0
  53. package/dist/styles/toolbar-text.css +11 -0
  54. package/dist/styles/toolbar.css +32 -0
  55. package/dist/text.d.ts +5 -2
  56. package/dist/text.js +1 -1
  57. package/dist/toolbar-control-group.d.ts +14 -2
  58. package/dist/toolbar-control-group.js +1 -1
  59. package/dist/toolbar-text.d.ts +10 -2
  60. package/dist/toolbar-text.js +1 -1
  61. package/dist/wire-nav-stack.js +58 -22
  62. package/dist/wire-nav-stack.js.map +1 -1
  63. package/dist/wire-toolbar-visibility.d.ts +13 -0
  64. package/dist/wire-toolbar-visibility.js +3 -0
  65. package/dist/wire-toolbar-visibility.js.map +1 -0
  66. package/dist/workbench.js +1 -1
  67. package/docs/accessibility.md +15 -0
  68. package/docs/collapsible-panel.md +4 -0
  69. package/docs/component-contract.md +31 -0
  70. package/docs/component-selection.md +55 -1
  71. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  72. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  73. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  74. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  75. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  76. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  77. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  78. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  79. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  80. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  81. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  82. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  83. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  84. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  85. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  86. package/docs/design/templates/toolbar-control-group.svg +1 -1
  87. package/docs/design/templates/toolbar-dark.svg +1 -1
  88. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  89. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  90. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  91. package/docs/design/templates/toolbar-text.svg +1 -1
  92. package/docs/design/templates/toolbar.svg +1 -1
  93. package/docs/design/templates.md +2 -0
  94. package/docs/layout.md +12 -1
  95. package/docs/nav-stack.md +5 -1
  96. package/llms.txt +24 -0
  97. package/package.json +5 -1
  98. package/dist/chunk-5PAVAR4B.js.map +0 -1
  99. package/dist/chunk-72LLWYP2.js.map +0 -1
  100. package/dist/chunk-GO2CZX4M.js.map +0 -1
  101. package/dist/chunk-ZVYA6TLR.js.map +0 -1
package/README.md CHANGED
@@ -243,6 +243,7 @@ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
243
243
  | `TabBar` | `@kerfjs/ui/tab-bar` | `@kerfjs/ui/tab-bar.css` |
244
244
  | `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
245
245
  | `wireScrollDividers` | `@kerfjs/ui/wire-scroll-dividers` | — |
246
+ | `wireToolbarVisibility` | `@kerfjs/ui/wire-toolbar-visibility` | — |
246
247
  | `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
247
248
  | `Skeleton` | `@kerfjs/ui/skeleton` | `@kerfjs/ui/skeleton.css` |
248
249
  | `SunkenPanel` | `@kerfjs/ui/sunken-panel` | `@kerfjs/ui/sunken-panel.css` |
@@ -794,3 +795,14 @@ explicit. `npm run build` emits standard CSS to `dist/styles`; `npm run dev`
794
795
  applies the same transform directly to source styles and hot-reloads edits.
795
796
 
796
797
  Lowered surfaces and decorative neutral fills/borders use translucent shared theme colors. Nested surfaces compound naturally; demos compose public components without per-depth overrides. See [contextual transparency](docs/webawesome-theme.md#contextual-transparency).
798
+
799
+ `ToolbarText` and `ToolbarControlGroup` accept typed `hideBelow`/`showBelow`
800
+ lengths (for example `px(416)`). Wire `wireToolbarVisibility(root)` from
801
+ `@kerfjs/ui/wire-toolbar-visibility` and dispose on unmount. Thresholds use the
802
+ nearest Toolbar content-box width: hideBelow hides strictly below, showBelow
803
+ shows strictly below, with complementary behavior at equality. Percentages use
804
+ that content width; em and custom properties use the item's own context. Invalid,
805
+ negative, unresolved, or contradictory values leave the item visible under this
806
+ width policy. Keep primary actions visible and offer a complementary overflow
807
+ group. See `docs/component-contract.md` "Toolbar width visibility" for lifecycle
808
+ details.
@@ -821,6 +821,11 @@
821
821
  "on": "kui-nav-stack__chrome-copy",
822
822
  "meaning": "Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade."
823
823
  },
824
+ {
825
+ "name": "data-nav-revealed",
826
+ "on": "kui-nav-stack__view",
827
+ "meaning": "\"true\" on the preserved, aria-hidden previous view while an incoming view slides over it."
828
+ },
824
829
  {
825
830
  "name": "data-nav-exiting",
826
831
  "on": "kui-nav-stack__view",
@@ -978,6 +983,11 @@
978
983
  "on": "kui-nav-stack__chrome-copy",
979
984
  "meaning": "Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade."
980
985
  },
986
+ {
987
+ "name": "data-nav-revealed",
988
+ "on": "kui-nav-stack__view",
989
+ "meaning": "\"true\" on the preserved, aria-hidden previous view while an incoming view slides over it."
990
+ },
981
991
  {
982
992
  "name": "data-nav-exiting",
983
993
  "on": "kui-nav-stack__view",
@@ -1518,14 +1528,17 @@
1518
1528
  "uses": [
1519
1529
  "toolbar-text",
1520
1530
  "toolbar-control-group",
1521
- "wa-button"
1531
+ "wa-button",
1532
+ "popup-menu"
1522
1533
  ],
1523
1534
  "purpose": "Leading, centered, and trailing toolbar composition.",
1524
1535
  "publicExports": [
1525
- "Toolbar"
1536
+ "Toolbar",
1537
+ "wireToolbarVisibility"
1526
1538
  ],
1527
1539
  "useWhen": [
1528
- "Compose application chrome or a page, panel, or dialog heading with leading, center, and trailing regions."
1540
+ "Compose application chrome or a page, panel, or dialog heading with leading, center, and trailing regions.",
1541
+ "Use typed hideBelow/showBelow lengths with wireToolbarVisibility(root) for per-item toolbar priority; keep primary actions available and provide a showBelow overflow alternative."
1529
1542
  ],
1530
1543
  "avoidWhen": [
1531
1544
  "Do not use it as a generic wrapper when no toolbar or heading relationship exists."
@@ -1548,7 +1561,8 @@
1548
1561
  "trailing priority for an expanded trailing control at compact or narrow widths",
1549
1562
  "trailing groups and a standalone primary wa-button wrap instead of clipping",
1550
1563
  "outer inset independently configurable from zone gap",
1551
- "app bar or bottom bar claiming its screen edges (safeAreaEdges)"
1564
+ "app bar or bottom bar claiming its screen edges (safeAreaEdges)",
1565
+ "typed hideBelow/showBelow thresholds at the nearest Toolbar content width"
1552
1566
  ],
1553
1567
  "accessibility": [
1554
1568
  "Supply a label when the toolbar needs an accessible name."
@@ -1586,6 +1600,23 @@
1586
1600
  "meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
1587
1601
  }
1588
1602
  ]
1603
+ },
1604
+ {
1605
+ "export": "wireToolbarVisibility",
1606
+ "import": "@kerfjs/ui/wire-toolbar-visibility",
1607
+ "required": false,
1608
+ "stateAttributes": [
1609
+ {
1610
+ "name": "data-toolbar-width-hidden",
1611
+ "on": "ToolbarText, ToolbarControlGroup and its paired busy status",
1612
+ "meaning": "True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers."
1613
+ },
1614
+ {
1615
+ "name": "data-toolbar-visibility-probe",
1616
+ "on": "private aria-hidden measurement boxes under Toolbar",
1617
+ "meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
1618
+ }
1619
+ ]
1589
1620
  }
1590
1621
  ],
1591
1622
  "publicClasses": [
@@ -1612,6 +1643,9 @@
1612
1643
  "catalogRoute": "?component=toolbar",
1613
1644
  "documentation": "docs/component-selection.md",
1614
1645
  "recipe": "docs/component-selection.md#ambiguous-choices"
1646
+ },
1647
+ "publicExportImports": {
1648
+ "wireToolbarVisibility": "@kerfjs/ui/wire-toolbar-visibility"
1615
1649
  }
1616
1650
  },
1617
1651
  {
@@ -1635,7 +1669,10 @@
1635
1669
  "Use ToolbarActionLink for navigation or external resources that must retain native anchor semantics inside a group.",
1636
1670
  "Fill it with plain <button> controls (the group styles > button fully); use wa-button only for a Web Awesome feature. A popup menu is a PopupMenu in a single group with nestedDropdown; it renders its own trigger, so never hand-write wa-dropdown markup. Each control stays whole: an icon sits beside its label on one row and no trigger gets a fixed width. Use overflow=wrap for independent links that should move as whole actions to another row on narrow surfaces.",
1637
1671
  "For an avatar control, set content=avatar and avatarImage instead of inserting an img; one button paints the group and multiple buttons paint only the pressed highlight.",
1638
- "In a Workbench or CollapsiblePanel toolbar, mark a group relocateOnCollapse to keep it available in the work-area toolbar when the panel closes; place it directly or in an array in any toolbar zone."
1672
+ "In a Workbench or CollapsiblePanel toolbar, mark a group relocateOnCollapse to keep it available in the work-area toolbar when the panel closes; place it directly or in an array in any toolbar zone.",
1673
+ "Use tileTone for a contained single group containing only a direct decorative SVG icon; interactive or mixed groups retain their existing control chrome.",
1674
+ "Set expandedOverflow=visible on an expanded search to anchor application suggestions, date pickers, or help below the group without overriding its geometry.",
1675
+ "Use typed hideBelow/showBelow lengths with wireToolbarVisibility(root) for per-item toolbar priority; keep primary actions available and provide a showBelow overflow alternative."
1639
1676
  ],
1640
1677
  "avoidWhen": [
1641
1678
  "Do not use merely to align unrelated buttons or to imitate an exclusive choice.",
@@ -1674,7 +1711,10 @@
1674
1711
  "always visible or compact-only responsive visibility",
1675
1712
  "relocate on panel collapse",
1676
1713
  "avatar scrim",
1677
- "contained avatar background on a single group or selected multi-button highlight"
1714
+ "contained avatar background on a single group or selected multi-button highlight",
1715
+ "neutral, brand, success, warning, or danger quiet icon tile tone",
1716
+ "clip or visible app-owned overflow while a search is expanded",
1717
+ "typed hideBelow/showBelow thresholds at the nearest Toolbar content width"
1678
1718
  ],
1679
1719
  "accessibility": [
1680
1720
  "Name the group when its relationship is not evident from context.",
@@ -1692,7 +1732,25 @@
1692
1732
  "browser-condition-css"
1693
1733
  ]
1694
1734
  },
1695
- "wiring": [],
1735
+ "wiring": [
1736
+ {
1737
+ "export": "wireToolbarVisibility",
1738
+ "import": "@kerfjs/ui/wire-toolbar-visibility",
1739
+ "required": false,
1740
+ "stateAttributes": [
1741
+ {
1742
+ "name": "data-toolbar-width-hidden",
1743
+ "on": "ToolbarText, ToolbarControlGroup and its paired busy status",
1744
+ "meaning": "True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers."
1745
+ },
1746
+ {
1747
+ "name": "data-toolbar-visibility-probe",
1748
+ "on": "private aria-hidden measurement boxes under Toolbar",
1749
+ "meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
1750
+ }
1751
+ ]
1752
+ }
1753
+ ],
1696
1754
  "publicClasses": [
1697
1755
  "kui-toolbar-action-link",
1698
1756
  "kui-toolbar-control-group"
@@ -1722,13 +1780,74 @@
1722
1780
  "--kui-toolbar-control-pressed-color",
1723
1781
  "--kui-toolbar-control-selected-background",
1724
1782
  "--kui-toolbar-control-selected-color",
1725
- "--kui-toolbar-control-selected-shadow"
1783
+ "--kui-toolbar-control-selected-shadow",
1784
+ "--kui-color-neutral-fill-quiet",
1785
+ "--kui-color-neutral-border-quiet",
1786
+ "--kui-color-brand-fill-quiet",
1787
+ "--kui-color-brand-border-quiet",
1788
+ "--kui-color-success-fill-quiet",
1789
+ "--kui-color-success-border-quiet",
1790
+ "--kui-color-success-on-quiet",
1791
+ "--kui-color-warning-fill-quiet",
1792
+ "--kui-color-warning-border-quiet",
1793
+ "--kui-color-warning-on-quiet",
1794
+ "--kui-color-danger-fill-quiet",
1795
+ "--kui-color-danger-border-quiet",
1796
+ "--kui-color-danger-on-quiet"
1726
1797
  ],
1727
1798
  "links": {
1728
1799
  "catalogRoute": "?component=toolbar-control-group",
1729
1800
  "documentation": "docs/component-selection.md",
1730
1801
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
1731
- }
1802
+ },
1803
+ "cssValueProps": [
1804
+ {
1805
+ "path": "hideBelow",
1806
+ "grammar": "length",
1807
+ "helpers": [
1808
+ "px",
1809
+ "rem",
1810
+ "em",
1811
+ "pct",
1812
+ "space",
1813
+ "lengthVar",
1814
+ "calc"
1815
+ ],
1816
+ "nonStandaloneHelpers": [
1817
+ "plus"
1818
+ ],
1819
+ "shorthands": [],
1820
+ "canonicalShorthands": [],
1821
+ "exceptionalShorthands": [],
1822
+ "rawPolicy": "forbid",
1823
+ "examples": [
1824
+ "hideBelow={px(416)}"
1825
+ ]
1826
+ },
1827
+ {
1828
+ "path": "showBelow",
1829
+ "grammar": "length",
1830
+ "helpers": [
1831
+ "px",
1832
+ "rem",
1833
+ "em",
1834
+ "pct",
1835
+ "space",
1836
+ "lengthVar",
1837
+ "calc"
1838
+ ],
1839
+ "nonStandaloneHelpers": [
1840
+ "plus"
1841
+ ],
1842
+ "shorthands": [],
1843
+ "canonicalShorthands": [],
1844
+ "exceptionalShorthands": [],
1845
+ "rawPolicy": "forbid",
1846
+ "examples": [
1847
+ "showBelow={px(416)}"
1848
+ ]
1849
+ }
1850
+ ]
1732
1851
  },
1733
1852
  {
1734
1853
  "id": "surface-scaffold",
@@ -1913,11 +2032,13 @@
1913
2032
  ],
1914
2033
  "useWhen": [
1915
2034
  "Render toolbar identity or heading text at a supported hierarchy size; pass headingLevel for heading semantics.",
1916
- "Use action for an editable toolbar title: it renders a native button that shrinks and ellipsizes beside sibling status chips."
2035
+ "Use action for an editable toolbar title: it renders a native button that shrinks and ellipsizes beside sibling status chips.",
2036
+ "Use tone=dark for title or filename text on a loud toolbar surface, matching dark ToolbarControlGroups.",
2037
+ "Use typed hideBelow/showBelow lengths with wireToolbarVisibility(root) for per-item toolbar priority; keep primary actions available and provide a showBelow overflow alternative."
1917
2038
  ],
1918
2039
  "avoidWhen": [
1919
2040
  "Do not omit headingLevel when the text is the page or section heading.",
1920
- "Large, default, and small are intentionally quiet toolbar identity text and have no tone option. Use xlarge-fixed for a normal-color toolbar heading at the fixed font-l step; use Text with an h2-h6 variant for a content subsection title, or ListHeader for a list or menu section."
2041
+ "Large, default, and small are intentionally quiet toolbar identity text in default tone. Use xlarge-fixed for a normal-color toolbar heading at the fixed font-l step; use Text with an h2-h6 variant for a content subsection title, or ListHeader for a list or menu section."
1921
2042
  ],
1922
2043
  "alternatives": [
1923
2044
  {
@@ -1943,7 +2064,9 @@
1943
2064
  "default",
1944
2065
  "small",
1945
2066
  "xsmall",
1946
- "placeholder (loading)"
2067
+ "placeholder (loading)",
2068
+ "dark (loud-surface foreground)",
2069
+ "typed hideBelow/showBelow thresholds at the nearest Toolbar content width"
1947
2070
  ],
1948
2071
  "accessibility": [
1949
2072
  "Plain text is not a heading; pass headingLevel to expose role=heading + aria-level for a page/section title.",
@@ -1961,7 +2084,25 @@
1961
2084
  "browser-condition-css"
1962
2085
  ]
1963
2086
  },
1964
- "wiring": [],
2087
+ "wiring": [
2088
+ {
2089
+ "export": "wireToolbarVisibility",
2090
+ "import": "@kerfjs/ui/wire-toolbar-visibility",
2091
+ "required": false,
2092
+ "stateAttributes": [
2093
+ {
2094
+ "name": "data-toolbar-width-hidden",
2095
+ "on": "ToolbarText, ToolbarControlGroup and its paired busy status",
2096
+ "meaning": "True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers."
2097
+ },
2098
+ {
2099
+ "name": "data-toolbar-visibility-probe",
2100
+ "on": "private aria-hidden measurement boxes under Toolbar",
2101
+ "meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
2102
+ }
2103
+ ]
2104
+ }
2105
+ ],
1965
2106
  "publicClasses": [
1966
2107
  "kui-toolbar-text"
1967
2108
  ],
@@ -1973,13 +2114,62 @@
1973
2114
  "--kui-font-l",
1974
2115
  "--kui-font-m",
1975
2116
  "--kui-font-s",
1976
- "--kui-font-xs"
2117
+ "--kui-font-xs",
2118
+ "--kui-color-neutral-on-loud"
1977
2119
  ],
1978
2120
  "links": {
1979
2121
  "catalogRoute": "?component=toolbar-text",
1980
2122
  "documentation": "docs/component-selection.md",
1981
2123
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
1982
- }
2124
+ },
2125
+ "cssValueProps": [
2126
+ {
2127
+ "path": "hideBelow",
2128
+ "grammar": "length",
2129
+ "helpers": [
2130
+ "px",
2131
+ "rem",
2132
+ "em",
2133
+ "pct",
2134
+ "space",
2135
+ "lengthVar",
2136
+ "calc"
2137
+ ],
2138
+ "nonStandaloneHelpers": [
2139
+ "plus"
2140
+ ],
2141
+ "shorthands": [],
2142
+ "canonicalShorthands": [],
2143
+ "exceptionalShorthands": [],
2144
+ "rawPolicy": "forbid",
2145
+ "examples": [
2146
+ "hideBelow={px(416)}"
2147
+ ]
2148
+ },
2149
+ {
2150
+ "path": "showBelow",
2151
+ "grammar": "length",
2152
+ "helpers": [
2153
+ "px",
2154
+ "rem",
2155
+ "em",
2156
+ "pct",
2157
+ "space",
2158
+ "lengthVar",
2159
+ "calc"
2160
+ ],
2161
+ "nonStandaloneHelpers": [
2162
+ "plus"
2163
+ ],
2164
+ "shorthands": [],
2165
+ "canonicalShorthands": [],
2166
+ "exceptionalShorthands": [],
2167
+ "rawPolicy": "forbid",
2168
+ "examples": [
2169
+ "showBelow={px(416)}"
2170
+ ]
2171
+ }
2172
+ ]
1983
2173
  },
1984
2174
  {
1985
2175
  "id": "text",
@@ -2026,7 +2216,8 @@
2026
2216
  "default, quiet, or danger tone",
2027
2217
  "compact, default, large, or xlarge size",
2028
2218
  "default or monospace font",
2029
- "flush item geometry and tight line height"
2219
+ "flush item geometry and tight line height",
2220
+ "controlMargins selects exterior 8px gutters with canonical physical Sides"
2030
2221
  ],
2031
2222
  "accessibility": [
2032
2223
  "Text renders a native paragraph by default; choose an h1 through h6 variant by document outline rather than appearance, or span for inline secondary text.",
@@ -2035,11 +2226,12 @@
2035
2226
  "FieldLabel is plain text, not a native label; give it an id and associate the preview group with aria-labelledby."
2036
2227
  ],
2037
2228
  "geometry": {
2038
- "margin": "none",
2229
+ "margin": "self",
2039
2230
  "border": "self",
2040
2231
  "padding": "self",
2041
2232
  "notes": [
2042
- "Block Text variants reset native margins and add a 1px transparent border plus the standard 8px item padding; flush removes the border and padding. Tight line height is available for compact copy. Span has no margin, border, or padding. FieldLabel mirrors the themed Web Awesome label typography, 9px inline inset, and bottom gap."
2233
+ "Block Text variants reset native margins and add a 1px transparent border plus the standard 8px item padding; flush removes the border and padding. Tight line height is available for compact copy. Span has no margin by default, border, or padding. FieldLabel mirrors the themed Web Awesome label typography, 9px inline inset, and bottom gap.",
2234
+ "controlMargins adds the shared control gutter outside selected physical edges without changing border or padding; avoid duplicating a parent inset. Spans retain inline display and native inline margin behavior."
2043
2235
  ]
2044
2236
  },
2045
2237
  "delivery": {
@@ -4231,7 +4423,8 @@
4231
4423
  ],
4232
4424
  "useWhen": [
4233
4425
  "Choose a controlled value from a moderate or long list, including grouped and icon-bearing choices.",
4234
- "Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, foregroundColorVar() for an app-owned property, or foregroundColor() for a direct custom CSS color. Fill tokens such as success are backgrounds that leave the icon nearly invisible, so they, lengths, raw color strings, and unqualified colorVar() values are rejected."
4426
+ "Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, foregroundColorVar() for an app-owned property, or foregroundColor() for a direct custom CSS color. Fill tokens such as success are backgrounds that leave the icon nearly invisible, so they, lengths, raw color strings, and unqualified colorVar() values are rejected.",
4427
+ "Use the default content-sized menu for long option labels; native popup shifting keeps it within 10px viewport gutters. fitMenu instead matches trigger width and wraps labels."
4235
4428
  ],
4236
4429
  "avoidWhen": [
4237
4430
  "Do not use for commands or a small choice set that should stay visible."
@@ -754,6 +754,12 @@
754
754
  "helper": "wireNavStack",
755
755
  "meaning": "Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade."
756
756
  },
757
+ {
758
+ "name": "data-nav-revealed",
759
+ "on": "kui-nav-stack__view",
760
+ "helper": "wireNavStack",
761
+ "meaning": "\"true\" on the preserved, aria-hidden previous view while an incoming view slides over it."
762
+ },
757
763
  {
758
764
  "name": "data-nav-exiting",
759
765
  "on": "kui-nav-stack__view",
@@ -908,6 +914,12 @@
908
914
  "helper": "wireNavStack",
909
915
  "meaning": "Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade."
910
916
  },
917
+ {
918
+ "name": "data-nav-revealed",
919
+ "on": "kui-nav-stack__view",
920
+ "helper": "wireNavStack",
921
+ "meaning": "\"true\" on the preserved, aria-hidden previous view while an incoming view slides over it."
922
+ },
911
923
  {
912
924
  "name": "data-nav-exiting",
913
925
  "on": "kui-nav-stack__view",
@@ -1460,7 +1472,7 @@
1460
1472
  ],
1461
1473
  "wiring": {
1462
1474
  "required": false,
1463
- "helpers": ["wireScrollDividers"],
1475
+ "helpers": ["wireScrollDividers", "wireToolbarVisibility"],
1464
1476
  "obligations": [],
1465
1477
  "stateAttributes": [
1466
1478
  {
@@ -1474,6 +1486,18 @@
1474
1486
  "on": "a Toolbar named as targets chrome",
1475
1487
  "helper": "wireScrollDividers",
1476
1488
  "meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
1489
+ },
1490
+ {
1491
+ "name": "data-toolbar-width-hidden",
1492
+ "on": "ToolbarText, ToolbarControlGroup and its paired busy status",
1493
+ "helper": "wireToolbarVisibility",
1494
+ "meaning": "True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers."
1495
+ },
1496
+ {
1497
+ "name": "data-toolbar-visibility-probe",
1498
+ "on": "private aria-hidden measurement boxes under Toolbar",
1499
+ "helper": "wireToolbarVisibility",
1500
+ "meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
1477
1501
  }
1478
1502
  ]
1479
1503
  },
@@ -1570,9 +1594,22 @@
1570
1594
  ],
1571
1595
  "wiring": {
1572
1596
  "required": false,
1573
- "helpers": [],
1597
+ "helpers": ["wireToolbarVisibility"],
1574
1598
  "obligations": [],
1575
- "stateAttributes": []
1599
+ "stateAttributes": [
1600
+ {
1601
+ "name": "data-toolbar-width-hidden",
1602
+ "on": "ToolbarText, ToolbarControlGroup and its paired busy status",
1603
+ "helper": "wireToolbarVisibility",
1604
+ "meaning": "True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers."
1605
+ },
1606
+ {
1607
+ "name": "data-toolbar-visibility-probe",
1608
+ "on": "private aria-hidden measurement boxes under Toolbar",
1609
+ "helper": "wireToolbarVisibility",
1610
+ "meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
1611
+ }
1612
+ ]
1576
1613
  },
1577
1614
  "responsive": { "owner": "not-applicable", "behaviors": [] },
1578
1615
  "layout": {
@@ -1585,7 +1622,30 @@
1585
1622
  "Name an icon-only button or link with aria-label, not title. Once any help-tag installer is imported (select/register, popup-menu/register, or help-tags/register), it shows an aria-hidden Web Awesome help tag repeating that name after a 500ms hover and at once on keyboard focus, hidden on a press and on Escape, and never joins aria-labelledby. A native title keeps the browser tooltip and gets no second tag."
1586
1623
  ]
1587
1624
  },
1588
- "cssValueProps": [],
1625
+ "cssValueProps": [
1626
+ {
1627
+ "path": "hideBelow",
1628
+ "grammar": "length",
1629
+ "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1630
+ "nonStandaloneHelpers": ["plus"],
1631
+ "shorthands": [],
1632
+ "canonicalShorthands": [],
1633
+ "exceptionalShorthands": [],
1634
+ "rawPolicy": "forbid",
1635
+ "examples": ["hideBelow={px(416)}"]
1636
+ },
1637
+ {
1638
+ "path": "showBelow",
1639
+ "grammar": "length",
1640
+ "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1641
+ "nonStandaloneHelpers": ["plus"],
1642
+ "shorthands": [],
1643
+ "canonicalShorthands": [],
1644
+ "exceptionalShorthands": [],
1645
+ "rawPolicy": "forbid",
1646
+ "examples": ["showBelow={px(416)}"]
1647
+ }
1648
+ ],
1589
1649
  "boundaries": {
1590
1650
  "rootClass": "kui-toolbar-control-group",
1591
1651
  "publicClasses": [
@@ -1617,7 +1677,20 @@
1617
1677
  "--kui-toolbar-control-pressed-color",
1618
1678
  "--kui-toolbar-control-selected-background",
1619
1679
  "--kui-toolbar-control-selected-color",
1620
- "--kui-toolbar-control-selected-shadow"
1680
+ "--kui-toolbar-control-selected-shadow",
1681
+ "--kui-color-neutral-fill-quiet",
1682
+ "--kui-color-neutral-border-quiet",
1683
+ "--kui-color-brand-fill-quiet",
1684
+ "--kui-color-brand-border-quiet",
1685
+ "--kui-color-success-fill-quiet",
1686
+ "--kui-color-success-border-quiet",
1687
+ "--kui-color-success-on-quiet",
1688
+ "--kui-color-warning-fill-quiet",
1689
+ "--kui-color-warning-border-quiet",
1690
+ "--kui-color-warning-on-quiet",
1691
+ "--kui-color-danger-fill-quiet",
1692
+ "--kui-color-danger-border-quiet",
1693
+ "--kui-color-danger-on-quiet"
1621
1694
  ]
1622
1695
  },
1623
1696
  "diagnostics": [],
@@ -1775,9 +1848,22 @@
1775
1848
  ],
1776
1849
  "wiring": {
1777
1850
  "required": false,
1778
- "helpers": [],
1851
+ "helpers": ["wireToolbarVisibility"],
1779
1852
  "obligations": [],
1780
- "stateAttributes": []
1853
+ "stateAttributes": [
1854
+ {
1855
+ "name": "data-toolbar-width-hidden",
1856
+ "on": "ToolbarText, ToolbarControlGroup and its paired busy status",
1857
+ "helper": "wireToolbarVisibility",
1858
+ "meaning": "True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers."
1859
+ },
1860
+ {
1861
+ "name": "data-toolbar-visibility-probe",
1862
+ "on": "private aria-hidden measurement boxes under Toolbar",
1863
+ "helper": "wireToolbarVisibility",
1864
+ "meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
1865
+ }
1866
+ ]
1781
1867
  },
1782
1868
  "responsive": { "owner": "not-applicable", "behaviors": [] },
1783
1869
  "layout": {
@@ -1790,7 +1876,30 @@
1790
1876
  "Actionable text is a native button with its full text as its accessible name; action cannot be combined with headingLevel, placeholder, or wrap."
1791
1877
  ]
1792
1878
  },
1793
- "cssValueProps": [],
1879
+ "cssValueProps": [
1880
+ {
1881
+ "path": "hideBelow",
1882
+ "grammar": "length",
1883
+ "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1884
+ "nonStandaloneHelpers": ["plus"],
1885
+ "shorthands": [],
1886
+ "canonicalShorthands": [],
1887
+ "exceptionalShorthands": [],
1888
+ "rawPolicy": "forbid",
1889
+ "examples": ["hideBelow={px(416)}"]
1890
+ },
1891
+ {
1892
+ "path": "showBelow",
1893
+ "grammar": "length",
1894
+ "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1895
+ "nonStandaloneHelpers": ["plus"],
1896
+ "shorthands": [],
1897
+ "canonicalShorthands": [],
1898
+ "exceptionalShorthands": [],
1899
+ "rawPolicy": "forbid",
1900
+ "examples": ["showBelow={px(416)}"]
1901
+ }
1902
+ ],
1794
1903
  "boundaries": {
1795
1904
  "rootClass": "kui-toolbar-text",
1796
1905
  "publicClasses": ["kui-toolbar-text"],
@@ -1802,7 +1911,8 @@
1802
1911
  "--kui-font-l",
1803
1912
  "--kui-font-m",
1804
1913
  "--kui-font-s",
1805
- "--kui-font-xs"
1914
+ "--kui-font-xs",
1915
+ "--kui-color-neutral-on-loud"
1806
1916
  ]
1807
1917
  },
1808
1918
  "diagnostics": [],
@@ -1849,11 +1959,12 @@
1849
1959
  "layout": {
1850
1960
  "roles": ["structure"],
1851
1961
  "geometry": {
1852
- "margin": "none",
1962
+ "margin": "self",
1853
1963
  "border": "self",
1854
1964
  "padding": "self",
1855
1965
  "notes": [
1856
- "Block Text variants reset native margins and add a 1px transparent border plus the standard 8px item padding; flush removes the border and padding. Tight line height is available for compact copy. Span has no margin, border, or padding. FieldLabel mirrors the themed Web Awesome label typography, 9px inline inset, and bottom gap."
1966
+ "Block Text variants reset native margins and add a 1px transparent border plus the standard 8px item padding; flush removes the border and padding. Tight line height is available for compact copy. Span has no margin by default, border, or padding. FieldLabel mirrors the themed Web Awesome label typography, 9px inline inset, and bottom gap.",
1967
+ "controlMargins adds the shared control gutter outside selected physical edges without changing border or padding; avoid duplicating a parent inset. Spans retain inline display and native inline margin behavior."
1857
1968
  ]
1858
1969
  }
1859
1970
  },
@@ -67,6 +67,7 @@ Exact prop names and types: [`@kerfjs/ui/nav-stack`](../public-api-signatures-v1
67
67
 
68
68
  - `data-nav-chrome-transition` on `kui-nav-stack` (`wireNavStack`): "true" while the chrome cross-fades between the outgoing and incoming view.
69
69
  - `data-nav-chrome-copy` on `kui-nav-stack__chrome-copy` (`wireNavStack`): Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade.
70
+ - `data-nav-revealed` on `kui-nav-stack__view` (`wireNavStack`): "true" on the preserved, aria-hidden previous view while an incoming view slides over it.
70
71
  - `data-nav-exiting` on `kui-nav-stack__view` (`wireNavStack`): "true" on a popped view the helper briefly re-inserts to slide it out.
71
72
  - `data-scroll-overflow` on `the active kui-nav-stack__view, or the kui-pane__content of a sole Pane in it` (`wireScrollDividers`): The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it.
72
73
  - `data-scroll-divider` on `kui-nav-stack__chrome and kui-nav-stack__bottom` (`wireScrollDividers`): The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it.
@@ -12,6 +12,7 @@ Choose one or more controlled values, keep unavailable choices visible, and opti
12
12
 
13
13
  - Choose a controlled value from a moderate or long list, including grouped and icon-bearing choices.
14
14
  - Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, foregroundColorVar() for an app-owned property, or foregroundColor() for a direct custom CSS color. Fill tokens such as success are backgrounds that leave the icon nearly invisible, so they, lengths, raw color strings, and unqualified colorVar() values are rejected.
15
+ - Use the default content-sized menu for long option labels; native popup shifting keeps it within 10px viewport gutters. fitMenu instead matches trigger width and wraps labels.
15
16
 
16
17
  **Not when:**
17
18
 
@@ -70,6 +70,7 @@ Zones (a zone is bound to JSX only through its listed prop; never assume the zon
70
70
  - `data-resizing` on `kui-resizable-region` (`wireResizableRegions`): "true" during an active pointer drag of the handle.
71
71
  - `data-nav-chrome-transition` on `kui-nav-stack` (`wireNavStack`): "true" while the chrome cross-fades between the outgoing and incoming view.
72
72
  - `data-nav-chrome-copy` on `kui-nav-stack__chrome-copy` (`wireNavStack`): Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade.
73
+ - `data-nav-revealed` on `kui-nav-stack__view` (`wireNavStack`): "true" on the preserved, aria-hidden previous view while an incoming view slides over it.
73
74
  - `data-nav-exiting` on `kui-nav-stack__view` (`wireNavStack`): "true" on a popped view the helper briefly re-inserts to slide it out.
74
75
 
75
76
  ## Geometry
@@ -40,6 +40,7 @@ Exact prop names and types: [`@kerfjs/ui/text`](../public-api-signatures-v1.md#k
40
40
  - compact, default, large, or xlarge size
41
41
  - default or monospace font
42
42
  - flush item geometry and tight line height
43
+ - controlMargins selects exterior 8px gutters with canonical physical Sides
43
44
 
44
45
  ## Composition
45
46
 
@@ -55,9 +56,10 @@ No wiring helper.
55
56
 
56
57
  ## Geometry
57
58
 
58
- Margin: none · border: self · padding: self (layout role: structure). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
59
+ Margin: self · border: self · padding: self (layout role: structure). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
59
60
 
60
- - Block Text variants reset native margins and add a 1px transparent border plus the standard 8px item padding; flush removes the border and padding. Tight line height is available for compact copy. Span has no margin, border, or padding. FieldLabel mirrors the themed Web Awesome label typography, 9px inline inset, and bottom gap.
61
+ - Block Text variants reset native margins and add a 1px transparent border plus the standard 8px item padding; flush removes the border and padding. Tight line height is available for compact copy. Span has no margin by default, border, or padding. FieldLabel mirrors the themed Web Awesome label typography, 9px inline inset, and bottom gap.
62
+ - controlMargins adds the shared control gutter outside selected physical edges without changing border or padding; avoid duplicating a parent inset. Spans retain inline display and native inline margin behavior.
61
63
 
62
64
  ## Accessibility
63
65