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

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 (147) hide show
  1. package/README.md +15 -0
  2. package/ai/application-ui-diagnostic-ids-v1.json +3 -0
  3. package/ai/component-catalog.json +333 -28
  4. package/ai/component-composition.json +224 -17
  5. package/ai/components/nav-stack.md +4 -3
  6. package/ai/components/select.md +1 -0
  7. package/ai/components/split-view.md +1 -0
  8. package/ai/components/surface-scaffold.md +11 -2
  9. package/ai/components/text.md +4 -2
  10. package/ai/components/toolbar-control-group.md +22 -3
  11. package/ai/components/toolbar-text.md +21 -4
  12. package/ai/components/toolbar.md +12 -4
  13. package/ai/public-api-signatures-v1.md +99 -127
  14. package/ai/skill.md +37 -3
  15. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  16. package/dist/browser/nav-stack.js +2 -0
  17. package/dist/browser/split-view.js +2 -0
  18. package/dist/catalog-resources.d.ts +3 -3
  19. package/dist/catalog.d.ts +3 -3
  20. package/dist/catalog.js +6 -6
  21. package/dist/chunk-2GOCOLQL.js +270 -0
  22. package/dist/chunk-2GOCOLQL.js.map +1 -0
  23. package/dist/{chunk-ZVYA6TLR.js → chunk-4Y4L5YEI.js} +3 -1
  24. package/dist/chunk-4Y4L5YEI.js.map +1 -0
  25. package/dist/{chunk-XIZRXI7N.js → chunk-A7DYEERU.js} +13 -1
  26. package/dist/chunk-A7DYEERU.js.map +1 -0
  27. package/dist/{chunk-7QWIJEK5.js → chunk-DSLRNR43.js} +9 -8
  28. package/dist/chunk-DSLRNR43.js.map +1 -0
  29. package/dist/{chunk-AOAW55JN.js → chunk-DXQZ3BEO.js} +4 -1
  30. package/dist/chunk-DXQZ3BEO.js.map +1 -0
  31. package/dist/chunk-IKCUPTR2.js +170 -0
  32. package/dist/chunk-IKCUPTR2.js.map +1 -0
  33. package/dist/{chunk-HGSTMZZ6.js → chunk-JL4BBZP4.js} +5 -4
  34. package/dist/chunk-JL4BBZP4.js.map +1 -0
  35. package/dist/{chunk-IVLTEBBT.js → chunk-M6BWQMQY.js} +2 -2
  36. package/dist/{chunk-IVLTEBBT.js.map → chunk-M6BWQMQY.js.map} +1 -1
  37. package/dist/{chunk-72LLWYP2.js → chunk-NVKRZ5DI.js} +1 -1
  38. package/dist/chunk-NVKRZ5DI.js.map +1 -0
  39. package/dist/{chunk-GO2CZX4M.js → chunk-RRCD3A6G.js} +13 -5
  40. package/dist/chunk-RRCD3A6G.js.map +1 -0
  41. package/dist/{chunk-5PAVAR4B.js → chunk-VHXHLZ6R.js} +10 -1
  42. package/dist/chunk-VHXHLZ6R.js.map +1 -0
  43. package/dist/collapsible-panel.js +2 -2
  44. package/dist/index.d.ts +4 -3
  45. package/dist/index.js +9 -8
  46. package/dist/list-header.d.ts +1 -0
  47. package/dist/list-header.js +1 -1
  48. package/dist/nav-stack-B1Qc2e5q.d.ts +101 -0
  49. package/dist/nav-stack.d.ts +12 -93
  50. package/dist/nav-stack.js +5 -1
  51. package/dist/pane.d.ts +5 -2
  52. package/dist/pane.js +1 -1
  53. package/dist/select-register.js +3 -0
  54. package/dist/select-register.js.map +1 -1
  55. package/dist/select.d.ts +1 -0
  56. package/dist/select.js +1 -1
  57. package/dist/split-view.d.ts +9 -4
  58. package/dist/split-view.js +7 -3
  59. package/dist/split-view.js.map +1 -1
  60. package/dist/styles/components/actions/toolbar/toolbar.css +32 -0
  61. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +105 -7
  62. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +17 -0
  63. package/dist/styles/components/layout/pane/pane.css +7 -0
  64. package/dist/styles/components/navigation/nav-stack/nav-stack.css +17 -12
  65. package/dist/styles/components/navigation/tab-scaffold/tab-scaffold.css +17 -0
  66. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +55 -0
  67. package/dist/styles/components/typography/text/text.css +19 -0
  68. package/dist/styles/nav-stack.css +17 -12
  69. package/dist/styles/pane.css +7 -0
  70. package/dist/styles/surface-scaffold.css +55 -0
  71. package/dist/styles/tab-scaffold.css +17 -0
  72. package/dist/styles/text.css +19 -0
  73. package/dist/styles/toolbar-control-group.css +105 -7
  74. package/dist/styles/toolbar-text.css +17 -0
  75. package/dist/styles/toolbar.css +32 -0
  76. package/dist/surface-scaffold-register.d.ts +4 -0
  77. package/dist/surface-scaffold-register.js +59 -0
  78. package/dist/surface-scaffold-register.js.map +1 -0
  79. package/dist/surface-scaffold.d.ts +10 -2
  80. package/dist/surface-scaffold.js +1 -1
  81. package/dist/tab-scaffold.d.ts +2 -0
  82. package/dist/tab-scaffold.js +1 -0
  83. package/dist/tab-scaffold.js.map +1 -1
  84. package/dist/text.d.ts +5 -2
  85. package/dist/text.js +1 -1
  86. package/dist/toolbar-control-group.d.ts +14 -2
  87. package/dist/toolbar-control-group.js +1 -1
  88. package/dist/toolbar-text.d.ts +10 -2
  89. package/dist/toolbar-text.js +1 -1
  90. package/dist/wire-nav-stack.js +58 -22
  91. package/dist/wire-nav-stack.js.map +1 -1
  92. package/dist/wire-toolbar-visibility.d.ts +13 -0
  93. package/dist/wire-toolbar-visibility.js +3 -0
  94. package/dist/wire-toolbar-visibility.js.map +1 -0
  95. package/dist/workbench.d.ts +5 -13
  96. package/dist/workbench.js +1 -1
  97. package/docs/accessibility.md +15 -0
  98. package/docs/collapsible-panel.md +4 -0
  99. package/docs/component-contract.md +38 -0
  100. package/docs/component-selection.md +56 -2
  101. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  102. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  103. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  104. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  105. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  106. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  107. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  108. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  109. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  110. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  111. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  112. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  113. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  114. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  115. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  116. package/docs/design/templates/toolbar-control-group.svg +1 -1
  117. package/docs/design/templates/toolbar-dark.svg +1 -1
  118. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  119. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  120. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  121. package/docs/design/templates/toolbar-text.svg +1 -1
  122. package/docs/design/templates/toolbar.svg +1 -1
  123. package/docs/design/templates.md +2 -0
  124. package/docs/layout.md +32 -1
  125. package/docs/nav-stack.md +35 -19
  126. package/docs/recipes.md +5 -1
  127. package/docs/split-view.md +7 -4
  128. package/docs/surface-scaffold.md +46 -0
  129. package/docs/tab-scaffold.md +57 -0
  130. package/docs/ui-doctor.md +23 -0
  131. package/docs/workbench.md +3 -2
  132. package/doctor/component-style-checks.mjs +224 -0
  133. package/doctor/index.mjs +42 -13
  134. package/llms.txt +34 -0
  135. package/package.json +11 -2
  136. package/ux-demo/recipes/list-detail-dialog.tsx +4 -0
  137. package/ux-demo/recipes/navigation-stack.tsx +2 -2
  138. package/dist/chunk-5PAVAR4B.js.map +0 -1
  139. package/dist/chunk-72LLWYP2.js.map +0 -1
  140. package/dist/chunk-7QWIJEK5.js.map +0 -1
  141. package/dist/chunk-AOAW55JN.js.map +0 -1
  142. package/dist/chunk-GO2CZX4M.js.map +0 -1
  143. package/dist/chunk-HGSTMZZ6.js.map +0 -1
  144. package/dist/chunk-SJY7KC45.js +0 -123
  145. package/dist/chunk-SJY7KC45.js.map +0 -1
  146. package/dist/chunk-XIZRXI7N.js.map +0 -1
  147. package/dist/chunk-ZVYA6TLR.js.map +0 -1
package/README.md CHANGED
@@ -37,6 +37,9 @@ back to the root or component-local support code placed in the wrong folder.
37
37
  Browser verification always builds current source: both `npm run test:e2e`
38
38
  and direct focused Playwright commands run the catalog/conformance preflights
39
39
  and production build before preview. See the [UX catalog contract](./docs/ux-demo.md).
40
+ Failed Playwright tests retain traces and screenshots alongside an HTML report.
41
+ The CI `ui` job uploads the report and per-test failure evidence for 14 days when
42
+ the browser suite fails; the artifact is named `ui-browser-failure-<run>-<attempt>`.
40
43
 
41
44
  When authoring a component gallery, follow the single
42
45
  [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract)
@@ -243,6 +246,7 @@ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
243
246
  | `TabBar` | `@kerfjs/ui/tab-bar` | `@kerfjs/ui/tab-bar.css` |
244
247
  | `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
245
248
  | `wireScrollDividers` | `@kerfjs/ui/wire-scroll-dividers` | — |
249
+ | `wireToolbarVisibility` | `@kerfjs/ui/wire-toolbar-visibility` | — |
246
250
  | `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
247
251
  | `Skeleton` | `@kerfjs/ui/skeleton` | `@kerfjs/ui/skeleton.css` |
248
252
  | `SunkenPanel` | `@kerfjs/ui/sunken-panel` | `@kerfjs/ui/sunken-panel.css` |
@@ -794,3 +798,14 @@ explicit. `npm run build` emits standard CSS to `dist/styles`; `npm run dev`
794
798
  applies the same transform directly to source styles and hot-reloads edits.
795
799
 
796
800
  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).
801
+
802
+ `ToolbarText` and `ToolbarControlGroup` accept typed `hideBelow`/`showBelow`
803
+ lengths (for example `px(416)`). Wire `wireToolbarVisibility(root)` from
804
+ `@kerfjs/ui/wire-toolbar-visibility` and dispose on unmount. Thresholds use the
805
+ nearest Toolbar content-box width: hideBelow hides strictly below, showBelow
806
+ shows strictly below, with complementary behavior at equality. Percentages use
807
+ that content width; em and custom properties use the item's own context. Invalid,
808
+ negative, unresolved, or contradictory values leave the item visible under this
809
+ width policy. Keep primary actions visible and offer a complementary overflow
810
+ group. See `docs/component-contract.md` "Toolbar width visibility" for lifecycle
811
+ details.
@@ -29,6 +29,9 @@
29
29
  "KUI-D010",
30
30
  "KUI-D011",
31
31
  "KUI-D020",
32
+ "KUI-D030",
33
+ "KUI-D031",
34
+ "KUI-D032",
32
35
  "KUI-L001",
33
36
  "KUI-L002",
34
37
  "KUI-L003",
@@ -761,13 +761,13 @@
761
761
  ],
762
762
  "appOwns": [
763
763
  "ordered view stack and stable keys",
764
- "view content and titles",
764
+ "view content and structured top and bottom toolbar configurations",
765
765
  "push and pop actions",
766
766
  "preferred initial focus targets when DOM order is insufficient",
767
- "per-view bottom toolbar content or a persistent fallback",
767
+ "per-view bottom toolbar or a persistent structured fallback",
768
768
  "per-view leading, center, and trailing top-toolbar groups",
769
- "per-view fixed header content above the active view's scroll area",
770
- "top-toolbar configuration, title size, and heading level",
769
+ "per-view header and footer with List and Pane configuration",
770
+ "top-toolbar defaults, title size, and heading level",
771
771
  "whether the chrome and bottom-toolbar dividers follow the scroll, always show, or never show (chromeDividers)"
772
772
  ],
773
773
  "variants": [
@@ -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",
@@ -854,7 +859,6 @@
854
859
  "kui-nav-stack__chrome-copy",
855
860
  "kui-nav-stack__chrome-copy--bottom",
856
861
  "kui-nav-stack__chrome-copy--exiting",
857
- "kui-nav-stack__header",
858
862
  "kui-nav-stack__viewport",
859
863
  "kui-nav-stack__view",
860
864
  "kui-nav-stack__view--entering",
@@ -978,6 +982,11 @@
978
982
  "on": "kui-nav-stack__chrome-copy",
979
983
  "meaning": "Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade."
980
984
  },
985
+ {
986
+ "name": "data-nav-revealed",
987
+ "on": "kui-nav-stack__view",
988
+ "meaning": "\"true\" on the preserved, aria-hidden previous view while an incoming view slides over it."
989
+ },
981
990
  {
982
991
  "name": "data-nav-exiting",
983
992
  "on": "kui-nav-stack__view",
@@ -1518,14 +1527,17 @@
1518
1527
  "uses": [
1519
1528
  "toolbar-text",
1520
1529
  "toolbar-control-group",
1521
- "wa-button"
1530
+ "wa-button",
1531
+ "popup-menu"
1522
1532
  ],
1523
1533
  "purpose": "Leading, centered, and trailing toolbar composition.",
1524
1534
  "publicExports": [
1525
- "Toolbar"
1535
+ "Toolbar",
1536
+ "wireToolbarVisibility"
1526
1537
  ],
1527
1538
  "useWhen": [
1528
- "Compose application chrome or a page, panel, or dialog heading with leading, center, and trailing regions."
1539
+ "Compose application chrome or a page, panel, or dialog heading with leading, center, and trailing regions.",
1540
+ "Use typed hideBelow/showBelow lengths with wireToolbarVisibility(root) for per-item toolbar priority; keep primary actions available and provide a showBelow overflow alternative."
1529
1541
  ],
1530
1542
  "avoidWhen": [
1531
1543
  "Do not use it as a generic wrapper when no toolbar or heading relationship exists."
@@ -1548,7 +1560,8 @@
1548
1560
  "trailing priority for an expanded trailing control at compact or narrow widths",
1549
1561
  "trailing groups and a standalone primary wa-button wrap instead of clipping",
1550
1562
  "outer inset independently configurable from zone gap",
1551
- "app bar or bottom bar claiming its screen edges (safeAreaEdges)"
1563
+ "app bar or bottom bar claiming its screen edges (safeAreaEdges)",
1564
+ "typed hideBelow/showBelow thresholds at the nearest Toolbar content width"
1552
1565
  ],
1553
1566
  "accessibility": [
1554
1567
  "Supply a label when the toolbar needs an accessible name."
@@ -1586,6 +1599,33 @@
1586
1599
  "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
1600
  }
1588
1601
  ]
1602
+ },
1603
+ {
1604
+ "export": "wireToolbarVisibility",
1605
+ "import": "@kerfjs/ui/wire-toolbar-visibility",
1606
+ "required": false,
1607
+ "stateAttributes": [
1608
+ {
1609
+ "name": "data-toolbar-width-hidden",
1610
+ "on": "ToolbarText, ToolbarControlGroup and its paired busy status",
1611
+ "meaning": "True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers."
1612
+ },
1613
+ {
1614
+ "name": "data-toolbar-visibility-probe",
1615
+ "on": "private aria-hidden measurement boxes under Toolbar",
1616
+ "meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
1617
+ },
1618
+ {
1619
+ "name": "data-morph-preserve",
1620
+ "on": "private aria-hidden measurement boxes and visibility state children",
1621
+ "meaning": "Keeps helper-owned geometry and state across Kerf renders; replacement and explicit removal are repaired, and disposal removes them."
1622
+ },
1623
+ {
1624
+ "name": "data-toolbar-visibility-state",
1625
+ "on": "private hidden children of width-managed items and paired busy statuses",
1626
+ "meaning": "Preserves actual CSS visibility while rendering removes a transient parent marker, preventing geometry-driven render feedback."
1627
+ }
1628
+ ]
1589
1629
  }
1590
1630
  ],
1591
1631
  "publicClasses": [
@@ -1612,6 +1652,9 @@
1612
1652
  "catalogRoute": "?component=toolbar",
1613
1653
  "documentation": "docs/component-selection.md",
1614
1654
  "recipe": "docs/component-selection.md#ambiguous-choices"
1655
+ },
1656
+ "publicExportImports": {
1657
+ "wireToolbarVisibility": "@kerfjs/ui/wire-toolbar-visibility"
1615
1658
  }
1616
1659
  },
1617
1660
  {
@@ -1635,7 +1678,10 @@
1635
1678
  "Use ToolbarActionLink for navigation or external resources that must retain native anchor semantics inside a group.",
1636
1679
  "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
1680
  "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."
1681
+ "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.",
1682
+ "Use tileTone for a contained single group containing only a direct decorative SVG icon; interactive or mixed groups retain their existing control chrome.",
1683
+ "Set expandedOverflow=visible on an expanded search to anchor application suggestions, date pickers, or help below the group without overriding its geometry.",
1684
+ "Use typed hideBelow/showBelow lengths with wireToolbarVisibility(root) for per-item toolbar priority; keep primary actions available and provide a showBelow overflow alternative."
1639
1685
  ],
1640
1686
  "avoidWhen": [
1641
1687
  "Do not use merely to align unrelated buttons or to imitate an exclusive choice.",
@@ -1674,7 +1720,10 @@
1674
1720
  "always visible or compact-only responsive visibility",
1675
1721
  "relocate on panel collapse",
1676
1722
  "avatar scrim",
1677
- "contained avatar background on a single group or selected multi-button highlight"
1723
+ "contained avatar background on a single group or selected multi-button highlight",
1724
+ "neutral, brand, success, warning, or danger quiet icon tile tone",
1725
+ "clip or visible app-owned overflow while a search is expanded",
1726
+ "typed hideBelow/showBelow thresholds at the nearest Toolbar content width"
1678
1727
  ],
1679
1728
  "accessibility": [
1680
1729
  "Name the group when its relationship is not evident from context.",
@@ -1692,7 +1741,35 @@
1692
1741
  "browser-condition-css"
1693
1742
  ]
1694
1743
  },
1695
- "wiring": [],
1744
+ "wiring": [
1745
+ {
1746
+ "export": "wireToolbarVisibility",
1747
+ "import": "@kerfjs/ui/wire-toolbar-visibility",
1748
+ "required": false,
1749
+ "stateAttributes": [
1750
+ {
1751
+ "name": "data-toolbar-width-hidden",
1752
+ "on": "ToolbarText, ToolbarControlGroup and its paired busy status",
1753
+ "meaning": "True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers."
1754
+ },
1755
+ {
1756
+ "name": "data-toolbar-visibility-probe",
1757
+ "on": "private aria-hidden measurement boxes under Toolbar",
1758
+ "meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
1759
+ },
1760
+ {
1761
+ "name": "data-morph-preserve",
1762
+ "on": "private aria-hidden measurement boxes and visibility state children",
1763
+ "meaning": "Keeps helper-owned geometry and state across Kerf renders; replacement and explicit removal are repaired, and disposal removes them."
1764
+ },
1765
+ {
1766
+ "name": "data-toolbar-visibility-state",
1767
+ "on": "private hidden children of width-managed items and paired busy statuses",
1768
+ "meaning": "Preserves actual CSS visibility while rendering removes a transient parent marker, preventing geometry-driven render feedback."
1769
+ }
1770
+ ]
1771
+ }
1772
+ ],
1696
1773
  "publicClasses": [
1697
1774
  "kui-toolbar-action-link",
1698
1775
  "kui-toolbar-control-group"
@@ -1722,13 +1799,74 @@
1722
1799
  "--kui-toolbar-control-pressed-color",
1723
1800
  "--kui-toolbar-control-selected-background",
1724
1801
  "--kui-toolbar-control-selected-color",
1725
- "--kui-toolbar-control-selected-shadow"
1802
+ "--kui-toolbar-control-selected-shadow",
1803
+ "--kui-color-neutral-fill-quiet",
1804
+ "--kui-color-neutral-border-quiet",
1805
+ "--kui-color-brand-fill-quiet",
1806
+ "--kui-color-brand-border-quiet",
1807
+ "--kui-color-success-fill-quiet",
1808
+ "--kui-color-success-border-quiet",
1809
+ "--kui-color-success-on-quiet",
1810
+ "--kui-color-warning-fill-quiet",
1811
+ "--kui-color-warning-border-quiet",
1812
+ "--kui-color-warning-on-quiet",
1813
+ "--kui-color-danger-fill-quiet",
1814
+ "--kui-color-danger-border-quiet",
1815
+ "--kui-color-danger-on-quiet"
1726
1816
  ],
1727
1817
  "links": {
1728
1818
  "catalogRoute": "?component=toolbar-control-group",
1729
1819
  "documentation": "docs/component-selection.md",
1730
1820
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
1731
- }
1821
+ },
1822
+ "cssValueProps": [
1823
+ {
1824
+ "path": "hideBelow",
1825
+ "grammar": "length",
1826
+ "helpers": [
1827
+ "px",
1828
+ "rem",
1829
+ "em",
1830
+ "pct",
1831
+ "space",
1832
+ "lengthVar",
1833
+ "calc"
1834
+ ],
1835
+ "nonStandaloneHelpers": [
1836
+ "plus"
1837
+ ],
1838
+ "shorthands": [],
1839
+ "canonicalShorthands": [],
1840
+ "exceptionalShorthands": [],
1841
+ "rawPolicy": "forbid",
1842
+ "examples": [
1843
+ "hideBelow={px(416)}"
1844
+ ]
1845
+ },
1846
+ {
1847
+ "path": "showBelow",
1848
+ "grammar": "length",
1849
+ "helpers": [
1850
+ "px",
1851
+ "rem",
1852
+ "em",
1853
+ "pct",
1854
+ "space",
1855
+ "lengthVar",
1856
+ "calc"
1857
+ ],
1858
+ "nonStandaloneHelpers": [
1859
+ "plus"
1860
+ ],
1861
+ "shorthands": [],
1862
+ "canonicalShorthands": [],
1863
+ "exceptionalShorthands": [],
1864
+ "rawPolicy": "forbid",
1865
+ "examples": [
1866
+ "showBelow={px(416)}"
1867
+ ]
1868
+ }
1869
+ ]
1732
1870
  },
1733
1871
  {
1734
1872
  "id": "surface-scaffold",
@@ -1736,7 +1874,7 @@
1736
1874
  "category": "Structure",
1737
1875
  "kind": "component",
1738
1876
  "source": "kerf",
1739
- "description": "Typed Web Awesome dialog and popup surface sizing, presentation, and inset composition.",
1877
+ "description": "Typed Web Awesome dialog preferred widths and viewport bounds, presentation, and popup inset composition.",
1740
1878
  "uses": [
1741
1879
  "wa-dialog",
1742
1880
  "wa-dropdown",
@@ -1749,7 +1887,8 @@
1749
1887
  ],
1750
1888
  "useWhen": [
1751
1889
  "A Web Awesome dialog or dropdown needs a standard size, presentation, body/footer inset, or list-compatible menu inset.",
1752
- "A dialog body should compose rows, sections, or aligned bare prose through List and ListInsetText."
1890
+ "A dialog body should compose rows, sections, or aligned bare prose through List and ListInsetText.",
1891
+ "A modal needs a typed preferred width, viewport gutter, or dynamic viewport-bounded height cap while retaining native body scrolling and footer actions."
1753
1892
  ],
1754
1893
  "avoidWhen": [
1755
1894
  "Do not use it as a generic layout wrapper or to replace application-owned modal state and focus lifecycle.",
@@ -1766,6 +1905,7 @@
1766
1905
  "variants": [
1767
1906
  "small, medium, or large dialog",
1768
1907
  "modal, side-sheet, or fullscreen dialog",
1908
+ "typed modal preferred width, viewport gutter, and maximum height, including viewport cap",
1769
1909
  "none, compact, or comfortable body and footer inset",
1770
1910
  "standard, compact, or zero-inset popup menu"
1771
1911
  ],
@@ -1781,8 +1921,10 @@
1781
1921
  "delivery": {
1782
1922
  "browserImport": "@kerfjs/ui/surface-scaffold",
1783
1923
  "manualCssImport": "@kerfjs/ui/surface-scaffold.css",
1924
+ "registrationImport": "@kerfjs/ui/surface-scaffold/register",
1784
1925
  "sideEffects": [
1785
- "browser-condition-css"
1926
+ "browser-condition-css",
1927
+ "custom-element-registration"
1786
1928
  ]
1787
1929
  },
1788
1930
  "wiring": [],
@@ -1799,7 +1941,86 @@
1799
1941
  "catalogRoute": "?component=surface-scaffold",
1800
1942
  "documentation": "docs/surface-scaffold.md",
1801
1943
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
1802
- }
1944
+ },
1945
+ "cssValueProps": [
1946
+ {
1947
+ "path": "preferredWidth",
1948
+ "grammar": "length",
1949
+ "helpers": [
1950
+ "px",
1951
+ "rem",
1952
+ "remify",
1953
+ "em",
1954
+ "pct",
1955
+ "space",
1956
+ "lengthVar",
1957
+ "calc"
1958
+ ],
1959
+ "nonStandaloneHelpers": [
1960
+ "plus"
1961
+ ],
1962
+ "shorthands": [],
1963
+ "canonicalShorthands": [],
1964
+ "exceptionalShorthands": [],
1965
+ "rawPolicy": "forbid",
1966
+ "examples": [
1967
+ "preferredWidth={remify(832)}"
1968
+ ]
1969
+ },
1970
+ {
1971
+ "path": "viewportGutter",
1972
+ "grammar": "length",
1973
+ "helpers": [
1974
+ "px",
1975
+ "rem",
1976
+ "remify",
1977
+ "em",
1978
+ "pct",
1979
+ "space",
1980
+ "lengthVar",
1981
+ "calc"
1982
+ ],
1983
+ "nonStandaloneHelpers": [
1984
+ "plus"
1985
+ ],
1986
+ "shorthands": [],
1987
+ "canonicalShorthands": [],
1988
+ "exceptionalShorthands": [],
1989
+ "rawPolicy": "forbid",
1990
+ "examples": [
1991
+ "viewportGutter={remify(8)}"
1992
+ ]
1993
+ },
1994
+ {
1995
+ "path": "maxHeight",
1996
+ "grammar": "length",
1997
+ "helpers": [
1998
+ "px",
1999
+ "rem",
2000
+ "remify",
2001
+ "em",
2002
+ "pct",
2003
+ "space",
2004
+ "lengthVar",
2005
+ "calc"
2006
+ ],
2007
+ "nonStandaloneHelpers": [
2008
+ "plus"
2009
+ ],
2010
+ "shorthands": [
2011
+ "viewport"
2012
+ ],
2013
+ "canonicalShorthands": [
2014
+ "viewport"
2015
+ ],
2016
+ "exceptionalShorthands": [],
2017
+ "rawPolicy": "forbid",
2018
+ "examples": [
2019
+ "maxHeight=\"viewport\"",
2020
+ "maxHeight={remify(640)}"
2021
+ ]
2022
+ }
2023
+ ]
1803
2024
  },
1804
2025
  {
1805
2026
  "id": "floating-toolbar",
@@ -1913,11 +2134,13 @@
1913
2134
  ],
1914
2135
  "useWhen": [
1915
2136
  "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."
2137
+ "Use action for an editable toolbar title: it renders a native button that shrinks and ellipsizes beside sibling status chips.",
2138
+ "Use tone=dark for title or filename text on a loud toolbar surface, matching dark ToolbarControlGroups.",
2139
+ "Use typed hideBelow/showBelow lengths with wireToolbarVisibility(root) for per-item toolbar priority; keep primary actions available and provide a showBelow overflow alternative."
1917
2140
  ],
1918
2141
  "avoidWhen": [
1919
2142
  "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."
2143
+ "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
2144
  ],
1922
2145
  "alternatives": [
1923
2146
  {
@@ -1943,7 +2166,9 @@
1943
2166
  "default",
1944
2167
  "small",
1945
2168
  "xsmall",
1946
- "placeholder (loading)"
2169
+ "placeholder (loading)",
2170
+ "dark (loud-surface foreground)",
2171
+ "typed hideBelow/showBelow thresholds at the nearest Toolbar content width"
1947
2172
  ],
1948
2173
  "accessibility": [
1949
2174
  "Plain text is not a heading; pass headingLevel to expose role=heading + aria-level for a page/section title.",
@@ -1961,7 +2186,35 @@
1961
2186
  "browser-condition-css"
1962
2187
  ]
1963
2188
  },
1964
- "wiring": [],
2189
+ "wiring": [
2190
+ {
2191
+ "export": "wireToolbarVisibility",
2192
+ "import": "@kerfjs/ui/wire-toolbar-visibility",
2193
+ "required": false,
2194
+ "stateAttributes": [
2195
+ {
2196
+ "name": "data-toolbar-width-hidden",
2197
+ "on": "ToolbarText, ToolbarControlGroup and its paired busy status",
2198
+ "meaning": "True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers."
2199
+ },
2200
+ {
2201
+ "name": "data-toolbar-visibility-probe",
2202
+ "on": "private aria-hidden measurement boxes under Toolbar",
2203
+ "meaning": "Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility."
2204
+ },
2205
+ {
2206
+ "name": "data-morph-preserve",
2207
+ "on": "private aria-hidden measurement boxes and visibility state children",
2208
+ "meaning": "Keeps helper-owned geometry and state across Kerf renders; replacement and explicit removal are repaired, and disposal removes them."
2209
+ },
2210
+ {
2211
+ "name": "data-toolbar-visibility-state",
2212
+ "on": "private hidden children of width-managed items and paired busy statuses",
2213
+ "meaning": "Preserves actual CSS visibility while rendering removes a transient parent marker, preventing geometry-driven render feedback."
2214
+ }
2215
+ ]
2216
+ }
2217
+ ],
1965
2218
  "publicClasses": [
1966
2219
  "kui-toolbar-text"
1967
2220
  ],
@@ -1973,13 +2226,62 @@
1973
2226
  "--kui-font-l",
1974
2227
  "--kui-font-m",
1975
2228
  "--kui-font-s",
1976
- "--kui-font-xs"
2229
+ "--kui-font-xs",
2230
+ "--kui-color-neutral-on-loud"
1977
2231
  ],
1978
2232
  "links": {
1979
2233
  "catalogRoute": "?component=toolbar-text",
1980
2234
  "documentation": "docs/component-selection.md",
1981
2235
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
1982
- }
2236
+ },
2237
+ "cssValueProps": [
2238
+ {
2239
+ "path": "hideBelow",
2240
+ "grammar": "length",
2241
+ "helpers": [
2242
+ "px",
2243
+ "rem",
2244
+ "em",
2245
+ "pct",
2246
+ "space",
2247
+ "lengthVar",
2248
+ "calc"
2249
+ ],
2250
+ "nonStandaloneHelpers": [
2251
+ "plus"
2252
+ ],
2253
+ "shorthands": [],
2254
+ "canonicalShorthands": [],
2255
+ "exceptionalShorthands": [],
2256
+ "rawPolicy": "forbid",
2257
+ "examples": [
2258
+ "hideBelow={px(416)}"
2259
+ ]
2260
+ },
2261
+ {
2262
+ "path": "showBelow",
2263
+ "grammar": "length",
2264
+ "helpers": [
2265
+ "px",
2266
+ "rem",
2267
+ "em",
2268
+ "pct",
2269
+ "space",
2270
+ "lengthVar",
2271
+ "calc"
2272
+ ],
2273
+ "nonStandaloneHelpers": [
2274
+ "plus"
2275
+ ],
2276
+ "shorthands": [],
2277
+ "canonicalShorthands": [],
2278
+ "exceptionalShorthands": [],
2279
+ "rawPolicy": "forbid",
2280
+ "examples": [
2281
+ "showBelow={px(416)}"
2282
+ ]
2283
+ }
2284
+ ]
1983
2285
  },
1984
2286
  {
1985
2287
  "id": "text",
@@ -2026,7 +2328,8 @@
2026
2328
  "default, quiet, or danger tone",
2027
2329
  "compact, default, large, or xlarge size",
2028
2330
  "default or monospace font",
2029
- "flush item geometry and tight line height"
2331
+ "flush item geometry and tight line height",
2332
+ "controlMargins selects exterior 8px gutters with canonical physical Sides"
2030
2333
  ],
2031
2334
  "accessibility": [
2032
2335
  "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 +2338,12 @@
2035
2338
  "FieldLabel is plain text, not a native label; give it an id and associate the preview group with aria-labelledby."
2036
2339
  ],
2037
2340
  "geometry": {
2038
- "margin": "none",
2341
+ "margin": "self",
2039
2342
  "border": "self",
2040
2343
  "padding": "self",
2041
2344
  "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."
2345
+ "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.",
2346
+ "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
2347
  ]
2044
2348
  },
2045
2349
  "delivery": {
@@ -4231,7 +4535,8 @@
4231
4535
  ],
4232
4536
  "useWhen": [
4233
4537
  "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."
4538
+ "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.",
4539
+ "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
4540
  ],
4236
4541
  "avoidWhen": [
4237
4542
  "Do not use for commands or a small choice set that should stay visible."