@kerfjs/ui 5.0.0-beta.60 → 5.0.0-beta.62

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 (142) hide show
  1. package/README.md +1 -0
  2. package/ai/component-catalog.json +141 -24
  3. package/ai/component-composition-rules.json +8 -0
  4. package/ai/component-composition.d.ts +10 -0
  5. package/ai/component-composition.json +117 -8
  6. package/ai/component-composition.schema.json +21 -0
  7. package/ai/components/README.md +5 -4
  8. package/ai/components/chip.md +72 -0
  9. package/ai/components/grid.md +10 -7
  10. package/ai/components/list-item.md +10 -7
  11. package/ai/components/pane.md +3 -2
  12. package/ai/components/select.md +6 -2
  13. package/ai/components/tabs.md +8 -4
  14. package/ai/components/toolbar-text.md +2 -1
  15. package/ai/components/toolbar.md +3 -2
  16. package/ai/public-api-signatures-v1.md +116 -24
  17. package/ai/skill.md +24 -4
  18. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  19. package/dist/app-tab.d.ts +12 -2
  20. package/dist/app-tab.js +1 -1
  21. package/dist/browser/chip.js +3 -0
  22. package/dist/catalog.js +8 -8
  23. package/dist/chip.d.ts +29 -0
  24. package/dist/chip.js +3 -0
  25. package/dist/chip.js.map +1 -0
  26. package/dist/{chunk-WPLIO5WJ.js → chunk-4MG3KXJM.js} +40 -5
  27. package/dist/chunk-4MG3KXJM.js.map +1 -0
  28. package/dist/{chunk-F7F7KRO2.js → chunk-4SQK27MR.js} +33 -18
  29. package/dist/chunk-4SQK27MR.js.map +1 -0
  30. package/dist/chunk-EAC4CDY7.js +57 -0
  31. package/dist/chunk-EAC4CDY7.js.map +1 -0
  32. package/dist/{chunk-T57AXDFM.js → chunk-ENGVYQPG.js} +4 -3
  33. package/dist/chunk-ENGVYQPG.js.map +1 -0
  34. package/dist/{chunk-5PESG2VP.js → chunk-KYDDCJXU.js} +4 -3
  35. package/dist/chunk-KYDDCJXU.js.map +1 -0
  36. package/dist/{chunk-MERWRTBG.js → chunk-N2DRU35S.js} +1 -1
  37. package/dist/chunk-N2DRU35S.js.map +1 -0
  38. package/dist/{chunk-EZVNC4J6.js → chunk-OD2VXAPL.js} +4 -1
  39. package/dist/chunk-OD2VXAPL.js.map +1 -0
  40. package/dist/{chunk-T66UNBXL.js → chunk-Q6YU3BT7.js} +11 -2
  41. package/dist/chunk-Q6YU3BT7.js.map +1 -0
  42. package/dist/{chunk-N3GKMPDW.js → chunk-RKTTF3L4.js} +3 -1
  43. package/dist/chunk-RKTTF3L4.js.map +1 -0
  44. package/dist/chunk-SWVW56CV.js +188 -0
  45. package/dist/chunk-SWVW56CV.js.map +1 -0
  46. package/dist/{chunk-46263QLK.js → chunk-UA6JW52D.js} +53 -7
  47. package/dist/chunk-UA6JW52D.js.map +1 -0
  48. package/dist/{chunk-AGXQQFKZ.js → chunk-UCKKT6KO.js} +13 -4
  49. package/dist/chunk-UCKKT6KO.js.map +1 -0
  50. package/dist/{chunk-3SXMEK3B.js → chunk-V3DX3K65.js} +1 -1
  51. package/dist/chunk-V3DX3K65.js.map +1 -0
  52. package/dist/{chunk-UWONG4QE.js → chunk-VCBTX62E.js} +11 -3
  53. package/dist/chunk-VCBTX62E.js.map +1 -0
  54. package/dist/{chunk-2OXQHM7I.js → chunk-X6ADHJNI.js} +45 -20
  55. package/dist/chunk-X6ADHJNI.js.map +1 -0
  56. package/dist/collapsible-panel.js +2 -2
  57. package/dist/grid.d.ts +13 -5
  58. package/dist/grid.js +1 -1
  59. package/dist/index.d.ts +5 -4
  60. package/dist/index.js +17 -16
  61. package/dist/list-item.d.ts +11 -1
  62. package/dist/list-item.js +1 -1
  63. package/dist/nav-stack.d.ts +3 -1
  64. package/dist/nav-stack.js +1 -1
  65. package/dist/pane.d.ts +8 -3
  66. package/dist/pane.js +1 -1
  67. package/dist/popup-menu.d.ts +2 -2
  68. package/dist/popup-menu.js +1 -1
  69. package/dist/select-register.js +46 -0
  70. package/dist/select-register.js.map +1 -1
  71. package/dist/select.d.ts +16 -0
  72. package/dist/select.js +1 -1
  73. package/dist/split-view.d.ts +1 -1
  74. package/dist/split-view.js +1 -1
  75. package/dist/styles/app-tab.css +119 -0
  76. package/dist/styles/chip.css +118 -0
  77. package/dist/styles/grid.css +7 -0
  78. package/dist/styles/list-item.css +14 -9
  79. package/dist/styles/nav-stack.css +13 -0
  80. package/dist/styles/pane.css +33 -0
  81. package/dist/styles/popup-menu.css +2 -1
  82. package/dist/styles/resizable-region.css +9 -0
  83. package/dist/styles/segmented-control.css +2 -1
  84. package/dist/styles/select.css +45 -0
  85. package/dist/styles/split-view.css +6 -0
  86. package/dist/styles/styles.css +1 -0
  87. package/dist/styles/tab-bar.css +3 -0
  88. package/dist/styles/tab-scaffold.css +13 -0
  89. package/dist/styles/toolbar-text.css +15 -6
  90. package/dist/styles/toolbar.css +15 -5
  91. package/dist/styles/workbench.css +117 -93
  92. package/dist/tab-bar.d.ts +6 -2
  93. package/dist/tab-bar.js +1 -1
  94. package/dist/tab-scaffold.d.ts +3 -0
  95. package/dist/tab-scaffold.js +1 -0
  96. package/dist/tab-scaffold.js.map +1 -1
  97. package/dist/{token-search-field-CCke1yvQ.d.ts → token-search-field-DvgFLhLL.d.ts} +6 -2
  98. package/dist/token-search-field.d.ts +1 -1
  99. package/dist/token-search-model.d.ts +1 -1
  100. package/dist/token-search-model.js +1 -1
  101. package/dist/toolbar-text.d.ts +1 -1
  102. package/dist/toolbar-text.js +1 -1
  103. package/dist/toolbar.d.ts +2 -2
  104. package/dist/toolbar.js +1 -1
  105. package/dist/wire-catalog.js +1 -1
  106. package/dist/wire-tab-bars.js +1 -1
  107. package/dist/wire-token-search-fields.d.ts +1 -1
  108. package/dist/workbench.js +1 -1
  109. package/docs/accessibility.md +29 -3
  110. package/docs/collapsible-panel.md +4 -3
  111. package/docs/component-contract.md +5 -0
  112. package/docs/component-selection.md +92 -11
  113. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  114. package/docs/design/templates/segmented-control/equal.svg +1 -1
  115. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  116. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  117. package/docs/design/templates/segmented-control-dark.svg +1 -1
  118. package/docs/design/templates/segmented-control.svg +1 -1
  119. package/docs/layout.md +51 -9
  120. package/docs/nav-stack.md +5 -0
  121. package/docs/split-view.md +5 -0
  122. package/docs/sunken-panel.md +12 -0
  123. package/docs/tab-scaffold.md +5 -0
  124. package/docs/webawesome-theme.md +62 -0
  125. package/docs/workbench.md +22 -10
  126. package/llms.txt +40 -8
  127. package/package.json +7 -1
  128. package/dist/chunk-2OXQHM7I.js.map +0 -1
  129. package/dist/chunk-3SXMEK3B.js.map +0 -1
  130. package/dist/chunk-46263QLK.js.map +0 -1
  131. package/dist/chunk-5I7OHCIP.js +0 -96
  132. package/dist/chunk-5I7OHCIP.js.map +0 -1
  133. package/dist/chunk-5PESG2VP.js.map +0 -1
  134. package/dist/chunk-AGXQQFKZ.js.map +0 -1
  135. package/dist/chunk-EZVNC4J6.js.map +0 -1
  136. package/dist/chunk-F7F7KRO2.js.map +0 -1
  137. package/dist/chunk-MERWRTBG.js.map +0 -1
  138. package/dist/chunk-N3GKMPDW.js.map +0 -1
  139. package/dist/chunk-T57AXDFM.js.map +0 -1
  140. package/dist/chunk-T66UNBXL.js.map +0 -1
  141. package/dist/chunk-UWONG4QE.js.map +0 -1
  142. package/dist/chunk-WPLIO5WJ.js.map +0 -1
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 268" width="492" height="268"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="88"/></clipPath><clipPath id="cp1"><rect x="16" y="164" width="460" height="88"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="88" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="142" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="164" width="460" height="88" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="268" rx="0" fill="rgb(28,28,30)"/><text x="16" y="28" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">Equal-width rounded</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="88"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="20" y="20" width="210.3" height="44"/></clipPath><clipPath id="svgimg4ov1"><rect x="21" y="21" width="208.3" height="42" rx="11"/></clipPath><filter id="svgimg4sh2" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg4ct3"><rect x="38.7" y="36" width="35.3" height="12"/></clipPath><clipPath id="svgimg4ct4"><rect x="114.1" y="36" width="22" height="12"/></clipPath><clipPath id="svgimg4ct5"><rect x="168.5" y="36" width="50.8" height="12"/></clipPath></defs><g clip-path="url(#svgimg4cp0)"><rect x="20" y="20" width="210.3" height="44" rx="12" fill="rgb(58,58,60)"/><rect x="20.5" y="20.5" width="209" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/></g><g clip-path="url(#svgimg4cp0)"><g clip-path="url(#svgimg4ov1)"><rect x="22" y="23" width="68.8" height="40" rx="10" fill="rgba(0,0,0,0.5)" filter="url(#svgimg4sh2)"/><rect x="22" y="22" width="68.8" height="40" rx="10" fill="rgb(28,28,30)"/><rect x="22.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><text x="38.7" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(138,203,255)">Board</text><rect x="91.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="114.13" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(174,174,178)">List</text><rect x="160.5" y="22.5" width="67" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="168.5" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(174,174,178)">Timeline</text></g></g></g></g></g></g><text x="16" y="154" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">Pill, small</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="164" width="460" height="88"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 164)"><defs><clipPath id="svgimg7cp0"><rect x="20" y="20" width="141.4" height="44"/></clipPath><clipPath id="svgimg7ov1"><rect x="21" y="21" width="139.4" height="42" rx="21"/></clipPath><clipPath id="svgimg7ct2"><rect x="31.5" y="36.5" width="21.1" height="11"/></clipPath><filter id="svgimg7sh3" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg7ct4"><rect x="70" y="36.5" width="30.3" height="11"/></clipPath><clipPath id="svgimg7ct5"><rect x="116.3" y="36.5" width="35.1" height="11"/></clipPath></defs><g clip-path="url(#svgimg7cp0)"><rect x="20" y="20" width="141.4" height="44" rx="22" fill="rgb(58,58,60)"/><rect x="20.5" y="20.5" width="140" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg7ov1)"><rect x="22.5" y="22.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="31.47" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(174,174,178)">Day</text><rect x="62" y="23" width="46.3" height="40" rx="20" fill="rgba(0,0,0,0.5)" filter="url(#svgimg7sh3)"/><rect x="62" y="22" width="46.3" height="40" rx="20" fill="rgb(28,28,30)"/><rect x="62.5" y="22.5" width="45" height="39" rx="19.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><text x="70" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(138,203,255)">Week</text><rect x="108.5" y="22.5" width="50" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="116.28" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(174,174,178)">Month</text></g></g></g></g></g></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 268" width="492" height="268"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="88"/></clipPath><clipPath id="cp1"><rect x="16" y="164" width="460" height="88"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="88" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="142" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="164" width="460" height="88" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="268" rx="0" fill="rgb(28,28,30)"/><text x="16" y="28" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">Equal-width rounded</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="88"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="20" y="20" width="210.3" height="44"/></clipPath><clipPath id="svgimg4ov1"><rect x="21" y="21" width="208.3" height="42" rx="11"/></clipPath><filter id="svgimg4sh2" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg4ct3"><rect x="38.7" y="36" width="35.3" height="12"/></clipPath><clipPath id="svgimg4ct4"><rect x="114.1" y="36" width="22" height="12"/></clipPath><clipPath id="svgimg4ct5"><rect x="168.5" y="36" width="50.8" height="12"/></clipPath></defs><g clip-path="url(#svgimg4cp0)"><rect x="20" y="20" width="210.3" height="44" rx="12" fill="rgb(58,58,60)"/><rect x="20.5" y="20.5" width="209" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/></g><g clip-path="url(#svgimg4cp0)"><g clip-path="url(#svgimg4ov1)"><rect x="22" y="23" width="68.8" height="40" rx="10" fill="rgba(0,0,0,0.5)" filter="url(#svgimg4sh2)"/><rect x="22" y="22" width="68.8" height="40" rx="10" fill="rgb(28,28,30)"/><rect x="22.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><text x="38.7" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(138,203,255)">Board</text><rect x="91.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="114.13" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(245,245,247)">List</text><rect x="160.5" y="22.5" width="67" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="168.5" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(245,245,247)">Timeline</text></g></g></g></g></g></g><text x="16" y="154" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">Pill, small</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="164" width="460" height="88"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 164)"><defs><clipPath id="svgimg7cp0"><rect x="20" y="20" width="141.4" height="44"/></clipPath><clipPath id="svgimg7ov1"><rect x="21" y="21" width="139.4" height="42" rx="21"/></clipPath><clipPath id="svgimg7ct2"><rect x="31.5" y="36.5" width="21.1" height="11"/></clipPath><filter id="svgimg7sh3" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg7ct4"><rect x="70" y="36.5" width="30.3" height="11"/></clipPath><clipPath id="svgimg7ct5"><rect x="116.3" y="36.5" width="35.1" height="11"/></clipPath></defs><g clip-path="url(#svgimg7cp0)"><rect x="20" y="20" width="141.4" height="44" rx="22" fill="rgb(58,58,60)"/><rect x="20.5" y="20.5" width="140" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg7ov1)"><rect x="22.5" y="22.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="31.47" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(245,245,247)">Day</text><rect x="62" y="23" width="46.3" height="40" rx="20" fill="rgba(0,0,0,0.5)" filter="url(#svgimg7sh3)"/><rect x="62" y="22" width="46.3" height="40" rx="20" fill="rgb(28,28,30)"/><rect x="62.5" y="22.5" width="45" height="39" rx="19.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><text x="70" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(138,203,255)">Week</text><rect x="108.5" y="22.5" width="50" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="116.28" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(245,245,247)">Month</text></g></g></g></g></g></g></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 268" width="492" height="268"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="88"/></clipPath><clipPath id="cp1"><rect x="16" y="164" width="460" height="88"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="88" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="142" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="164" width="460" height="88" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="268" rx="0" fill="rgb(255,255,255)"/><text x="16" y="28" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Equal-width rounded</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="88"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="20" y="20" width="210.3" height="44"/></clipPath><clipPath id="svgimg4ov1"><rect x="21" y="21" width="208.3" height="42" rx="11"/></clipPath><filter id="svgimg4sh2" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg4ct3"><rect x="38.7" y="36" width="35.3" height="12"/></clipPath><clipPath id="svgimg4ct4"><rect x="114.1" y="36" width="22" height="12"/></clipPath><clipPath id="svgimg4ct5"><rect x="168.5" y="36" width="50.8" height="12"/></clipPath></defs><g clip-path="url(#svgimg4cp0)"><rect x="20" y="20" width="210.3" height="44" rx="12" fill="rgb(229,229,234)"/><rect x="20.5" y="20.5" width="209" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/></g><g clip-path="url(#svgimg4cp0)"><g clip-path="url(#svgimg4ov1)"><rect x="22" y="23" width="68.8" height="40" rx="10" fill="rgba(0,0,0,0.14)" filter="url(#svgimg4sh2)"/><rect x="22" y="22" width="68.8" height="40" rx="10" fill="rgb(255,255,255)"/><rect x="22.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgb(209,209,214)" stroke-width="1"/><text x="38.7" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(12,98,243)">Board</text><rect x="91.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="114.13" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(110,110,115)">List</text><rect x="160.5" y="22.5" width="67" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="168.5" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(110,110,115)">Timeline</text></g></g></g></g></g></g><text x="16" y="154" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Pill, small</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="164" width="460" height="88"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 164)"><defs><clipPath id="svgimg7cp0"><rect x="20" y="20" width="141.4" height="44"/></clipPath><clipPath id="svgimg7ov1"><rect x="21" y="21" width="139.4" height="42" rx="21"/></clipPath><clipPath id="svgimg7ct2"><rect x="31.5" y="36.5" width="21.1" height="11"/></clipPath><filter id="svgimg7sh3" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg7ct4"><rect x="70" y="36.5" width="30.3" height="11"/></clipPath><clipPath id="svgimg7ct5"><rect x="116.3" y="36.5" width="35.1" height="11"/></clipPath></defs><g clip-path="url(#svgimg7cp0)"><rect x="20" y="20" width="141.4" height="44" rx="22" fill="rgb(229,229,234)"/><rect x="20.5" y="20.5" width="140" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg7ov1)"><rect x="22.5" y="22.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="31.47" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(110,110,115)">Day</text><rect x="62" y="23" width="46.3" height="40" rx="20" fill="rgba(0,0,0,0.14)" filter="url(#svgimg7sh3)"/><rect x="62" y="22" width="46.3" height="40" rx="20" fill="rgb(255,255,255)"/><rect x="62.5" y="22.5" width="45" height="39" rx="19.5" fill="none" stroke="rgb(209,209,214)" stroke-width="1"/><text x="70" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(12,98,243)">Week</text><rect x="108.5" y="22.5" width="50" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="116.28" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(110,110,115)">Month</text></g></g></g></g></g></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 268" width="492" height="268"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="88"/></clipPath><clipPath id="cp1"><rect x="16" y="164" width="460" height="88"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="88" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="142" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="164" width="460" height="88" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="268" rx="0" fill="rgb(255,255,255)"/><text x="16" y="28" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Equal-width rounded</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="88"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="20" y="20" width="210.3" height="44"/></clipPath><clipPath id="svgimg4ov1"><rect x="21" y="21" width="208.3" height="42" rx="11"/></clipPath><filter id="svgimg4sh2" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg4ct3"><rect x="38.7" y="36" width="35.3" height="12"/></clipPath><clipPath id="svgimg4ct4"><rect x="114.1" y="36" width="22" height="12"/></clipPath><clipPath id="svgimg4ct5"><rect x="168.5" y="36" width="50.8" height="12"/></clipPath></defs><g clip-path="url(#svgimg4cp0)"><rect x="20" y="20" width="210.3" height="44" rx="12" fill="rgb(229,229,234)"/><rect x="20.5" y="20.5" width="209" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/></g><g clip-path="url(#svgimg4cp0)"><g clip-path="url(#svgimg4ov1)"><rect x="22" y="23" width="68.8" height="40" rx="10" fill="rgba(0,0,0,0.14)" filter="url(#svgimg4sh2)"/><rect x="22" y="22" width="68.8" height="40" rx="10" fill="rgb(255,255,255)"/><rect x="22.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgb(209,209,214)" stroke-width="1"/><text x="38.7" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(12,98,243)">Board</text><rect x="91.5" y="22.5" width="68" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="114.13" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(29,29,31)">List</text><rect x="160.5" y="22.5" width="67" height="39" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="168.5" y="46" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="650" fill="rgb(29,29,31)">Timeline</text></g></g></g></g></g></g><text x="16" y="154" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Pill, small</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="164" width="460" height="88"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 164)"><defs><clipPath id="svgimg7cp0"><rect x="20" y="20" width="141.4" height="44"/></clipPath><clipPath id="svgimg7ov1"><rect x="21" y="21" width="139.4" height="42" rx="21"/></clipPath><clipPath id="svgimg7ct2"><rect x="31.5" y="36.5" width="21.1" height="11"/></clipPath><filter id="svgimg7sh3" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="1.5"/></filter><clipPath id="svgimg7ct4"><rect x="70" y="36.5" width="30.3" height="11"/></clipPath><clipPath id="svgimg7ct5"><rect x="116.3" y="36.5" width="35.1" height="11"/></clipPath></defs><g clip-path="url(#svgimg7cp0)"><rect x="20" y="20" width="141.4" height="44" rx="22" fill="rgb(229,229,234)"/><rect x="20.5" y="20.5" width="140" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg7ov1)"><rect x="22.5" y="22.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="31.47" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(29,29,31)">Day</text><rect x="62" y="23" width="46.3" height="40" rx="20" fill="rgba(0,0,0,0.14)" filter="url(#svgimg7sh3)"/><rect x="62" y="22" width="46.3" height="40" rx="20" fill="rgb(255,255,255)"/><rect x="62.5" y="22.5" width="45" height="39" rx="19.5" fill="none" stroke="rgb(209,209,214)" stroke-width="1"/><text x="70" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(12,98,243)">Week</text><rect x="108.5" y="22.5" width="50" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="116.28" y="46.5" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(29,29,31)">Month</text></g></g></g></g></g></g></svg>
package/docs/layout.md CHANGED
@@ -36,6 +36,37 @@ size) tall, and below that lets the whole pane scroll as one column, header,
36
36
  content, and footer together, so the content keeps its natural height. The
37
37
  default `fixed` always pins them.
38
38
 
39
+ ### Lowered work surfaces
40
+
41
+ Set `appearance="sunken"` when the work area itself should use the lowered
42
+ surface color, including blank space below short content and the scroll
43
+ viewport. The default appearance is unchanged. The fixed Pane paints its
44
+ content scroller; with `chromePlacement="auto"`, the Pane root paints the
45
+ surface because it becomes the scroller in a short viewport. Header and footer
46
+ chrome stay on the normal surface. No second scroll container or
47
+ `SunkenPanel` wrapper is needed.
48
+ For custom chrome colors in auto mode, set `--kui-pane-chrome-background`
49
+ on the Pane; it defaults to `--kui-color-surface`.
50
+
51
+ ```tsx
52
+ <Pane appearance="sunken" footer={<Composer />}>
53
+ <Conversation />
54
+ </Pane>
55
+ ```
56
+
57
+ `PaneConfig.appearance` forwards through Workbench `mainPane`, panel `pane`,
58
+ and CollapsiblePanel `pane`. Workbench also applies that choice to its main or
59
+ panel region when it renders no Pane chrome. Set `appearance: "sunken"` on a
60
+ `NavStackView` or `TabScaffoldTab` when its view or scene owns scrolling.
61
+ For a `SplitView`, put a `Pane` in the list or detail region and set its
62
+ appearance; SplitView only arranges the regions and does not own their scroll.
63
+ Choose the innermost owner when composing layouts.
64
+
65
+ The color uses `--kui-sunken-panel-background`, falling back to
66
+ `--kui-color-surface-lowered`, just like `SunkenPanel`. Select one scroll owner
67
+ in a nested layout so a translucent override paints once. The public color
68
+ override may be set at a Pane or layout boundary.
69
+
39
70
  Pass any combination of logical sides to `separators`: `block-start`,
40
71
  `block-end`, `inline-start`, and `inline-end`. Every line is off by default and
41
72
  each enabled side uses `--kui-pane-separator-width` (1px) and
@@ -331,26 +362,37 @@ insets.
331
362
 
332
363
  ## Grid
333
364
 
334
- Use `Grid` from `@kerfjs/ui/grid` when a fixed positive number of columns must
335
- share the available width evenly. Every track is `minmax(0, 1fr)`, so a child
336
- with wider intrinsic content cannot make its column wider than its peers. Grid
337
- defaults to the `xs` gap and accepts the same finite spacing names, complete
338
- typed `CssLength` values, and typed flex-participation contract as Row.
365
+ Use `Grid` from `@kerfjs/ui/grid` when equal-width columns must share the
366
+ available width. Set a fixed positive `columns` count or a typed
367
+ `minColumnWidth` for automatic container-width collapse. Fixed tracks use
368
+ `minmax(0, 1fr)`; responsive tracks use `auto-fit` and cap their minimum at
369
+ 100% so a narrow container keeps one column without overflow. Grid defaults
370
+ to the `xs` gap and accepts the same finite spacing names, complete typed
371
+ `CssLength` values, and typed flex-participation contract as Row.
339
372
 
340
373
  ```tsx
341
374
  import { Grid } from "@kerfjs/ui/grid";
375
+ import { px } from "@kerfjs/ui/css-values";
342
376
 
343
377
  <Grid columns={2} gap="m">
344
378
  <label>Quantity <input /></label>
345
379
  <label>Unit <input /></label>
346
380
  </Grid>;
381
+
382
+ <Grid minColumnWidth={px(376)} gap="m">
383
+ <label>Provider <input /></label>
384
+ <label>Endpoint <input /></label>
385
+ </Grid>;
347
386
  ```
348
387
 
349
388
  `columns` must be a positive safe integer; invalid counts throw instead of
350
- silently producing invalid CSS. Grid is layout-only and adds no ARIA grid role.
351
- The application owns child semantics and responsive count changes. Use
352
- application-owned CSS grid for intrinsic, asymmetric, spanning, auto-fit, or
353
- masonry tracks, and use `ResizableRegion` when people must adjust a boundary.
389
+ silently producing invalid CSS. Import `px` from `@kerfjs/ui/css-values` for a
390
+ pixel minimum. `columns` and `minColumnWidth` are mutually exclusive. In the
391
+ responsive mode, the container width decides how many equal tracks fit; constrain
392
+ the Grid's outer width when the form should have a maximum count. Grid is
393
+ layout-only and adds no ARIA grid role. The application owns child semantics.
394
+ Use application-owned CSS grid for intrinsic, asymmetric, spanning, or masonry
395
+ tracks, and use `ResizableRegion` when people must adjust a boundary.
354
396
 
355
397
  ## Row and List alignment
356
398
 
package/docs/nav-stack.md CHANGED
@@ -60,6 +60,11 @@ optional per-view `bottomToolbar`. The component-level
60
60
  The back control appears automatically once the stack has more than one entry;
61
61
  `wireNavStack`'s `onBack` is where the app pops its own signal.
62
62
 
63
+ Set a view's `appearance: "sunken"` to paint its scroll viewport with the
64
+ shared lowered-surface color, including space after short content. When the
65
+ view holds a `Pane` as its only child, set the appearance on the Pane instead
66
+ if its content owns scrolling. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
67
+
63
68
  ## The top toolbar
64
69
 
65
70
  The top chrome is a real `Toolbar`, so it follows the same zone,
@@ -26,6 +26,11 @@ shared interior edge. A pane whose only child is a `Pane` lets that child own
26
26
  the insets, and the compact form hands them to its `NavStack`. See
27
27
  [Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
28
28
 
29
+ For a lowered list or detail background, render a `Pane` in that region with
30
+ `appearance="sunken"`. SplitView arranges regions but does not own their
31
+ vertical scroll; its compact NavStack form can use the view's or nested Pane's
32
+ appearance. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
33
+
29
34
  ## Responsive by device class
30
35
 
31
36
  `SplitView` is declarative; the app derives `compact` from the device class and
@@ -38,6 +38,10 @@ Do not use `SunkenPanel` merely to add padding, as a substitute for pane
38
38
  header/content/footer anatomy, or around a child that already owns the same
39
39
  outer surface.
40
40
 
41
+ For a lowered scrolling work area with Pane chrome, use
42
+ [`Pane appearance="sunken"`](layout.md#lowered-work-surfaces). It paints the
43
+ scroll viewport and empty space without adding a second scroller.
44
+
41
45
  ## Public styling boundary
42
46
 
43
47
  Override the public properties at the composition boundary:
@@ -48,6 +52,14 @@ Override the public properties at the composition boundary:
48
52
  - `--kui-sunken-panel-gap`
49
53
  - `--kui-sunken-panel-radius`
50
54
 
55
+ `--kui-sunken-panel-background` can be overridden for a known backdrop. Keep
56
+ the default lowered surface opaque; a translucent override compounds when
57
+ sunken panels nest. See [Contextual transparency](./webawesome-theme.md#contextual-transparency)
58
+ for the color and contrast evaluation and its opt-in bounded prototype. The
59
+ prototype also compares Pane and Web Awesome sunken surfaces. Assign its
60
+ first, second, and transparent deeper tints on application-owned wrappers;
61
+ a single translucent override on every nested surface has no depth cap.
62
+
51
63
  The public root class is `.kui-sunken-panel`. Prefer the properties above over
52
64
  styling descendants. The `square` shape deliberately overrides the radius
53
65
  property with zero; use `rounded` when customizing the radius token.
@@ -59,6 +59,11 @@ truncate horizontally with an ellipsis when a destination name exceeds its
59
59
  share of the bar. On larger device classes, promote the tab set to a
60
60
  `Workbench` rail or a persistent sidebar instead of a bottom bar.
61
61
 
62
+ Set a tab's `appearance: "sunken"` when its scene owns scrolling and should
63
+ paint the lowered surface behind short or long content. For a scene whose
64
+ only child is a `Pane` or `NavStack`, set appearance on that child's scroll
65
+ owner. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
66
+
62
67
  ## Scroll divider
63
68
 
64
69
  The bar has no permanent top border. With `wireScrollDividers(appRoot)`
@@ -131,6 +131,68 @@ tiers:
131
131
  content stays compact and the action group has a clearer boundary. These two
132
132
  parts do not inherit the dialog's shared `--spacing` value.
133
133
 
134
+ ## Contextual transparency
135
+
136
+ Keep the shared `--kui-color-*` semantic fills, foregrounds, and borders opaque
137
+ by default. Their light and dark values mirror the Web Awesome theme, and the
138
+ contrast checks in `tests/browser/tone-contrast.spec.ts` assume known surfaces.
139
+ Compositing those tokens over arbitrary app backgrounds changes text contrast
140
+ and makes the same token mean a different visible color in each container.
141
+
142
+ The strongest candidate for transparency is a **component-scoped sunken
143
+ background**, through the existing `--kui-sunken-panel-background` and
144
+ `--kui-wa-sunken-background` overrides. A simple black overlay of 5.5% over
145
+ white approximates `#f1f1f1`, near the current light lowered surface; a second
146
+ nesting level becomes `#e4e4e4`. Matching the current dark lowered surface from
147
+ `#1c1c1e` takes about 39% black, and a second layer becomes near-black
148
+ `#0a0a0b`. An alpha that works for one level therefore needs a separate nesting
149
+ rule or a lighter dark treatment before it can become a default. The existing
150
+ opaque `--kui-color-surface-lowered` remains appropriate for page backgrounds.
151
+
152
+ | Candidate | Finding |
153
+ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
154
+ | Selected `ListItem` fill and border | A translucent brand layer would preserve a tinted or textured backdrop. Keep it in the component's existing `--kui-list-item-selected-*` overrides: making the shared brand fill translucent would also affect components that put `--kui-color-brand-on-fill` text on it. A 16% brand overlay gives about 4.35:1 for that text over the light lowered surface and 3.99:1 over a warm `#eee7dc` surface, below the 4.5:1 text target. |
155
+ | `ToolbarControlGroup` fill and border | A light 10% black layer approximates the current fill over white, and a dark 13% white layer approximates it over the dark surface. On a warm `#eee7dc` backdrop, the light layer puts the existing quiet text at about 3.31:1. Its dark tone already uses a translucent fill. Keep default control chrome opaque until a backdrop matrix validates its text, icons, borders, and selected state. |
156
+ | Quiet or disabled text and icons | Keep normal and quiet text/foreground tokens opaque; alpha changes their contrast with every backdrop. Disabled controls may use component-owned opacity, as they do now, without weakening shared foreground tokens. |
157
+ | Dividers and borders | Decorative separators can use scoped alpha over a known surface. Control boundaries and focus indicators need reliable contrast; do not replace the shared border or focus tokens with alpha globally. |
158
+
159
+ ### Bounded translucent prototype
160
+
161
+ The opt-in catalog prototype (`SunkenPanel` → Backdrop-aware prototype) uses
162
+ the existing public background overrides on `SunkenPanel`, `Pane`, and Web
163
+ Awesome sunken Card/Details. It does not change shared semantic tokens or
164
+ component defaults. The application assigns a depth class to each
165
+ application-owned wrapper; the component inside inherits its public color
166
+ override:
167
+
168
+ | Depth | Light tint | Dark tint | Treatment |
169
+ | ---------------- | ----------- | ----------- | ----------------------------------------------- |
170
+ | First | 5.5% black | 12% black | Shows the backdrop through the lowered surface. |
171
+ | Second | 3.5% black | 5% black | Adds a smaller inset step. |
172
+ | Third and deeper | transparent | transparent | Caps accumulated darkening. |
173
+
174
+ Over default white, the light levels approximate `#f1f1f1` then `#e9e9e9`;
175
+ over dark default `#1c1c1e`, they approximate `#19191a` then `#171719`.
176
+ The dark lowered backdrop reaches roughly `#0f0f11` then `#0e0e10`, which is
177
+ still visually close to black. Warm and textured backdrops retain their tone
178
+ and pattern; the first and second layers remain discernible in light mode but
179
+ are subtle in dark mode. These values are sRGB estimates; actual rendering
180
+ depends on backdrop and browser.
181
+
182
+ The browser matrix covers one and two layers on default, lowered, warm, and
183
+ two textured stripe colors in light and dark, across Chromium, Firefox, and
184
+ WebKit. It composites computed text and control colors with each tint and
185
+ requires at least 4.5:1 for panel text, an opaque button, Card text, and
186
+ Details text. It also checks a visible focus outline with forced colors and
187
+ the third layer's transparent cap. Theme colors must finish transitioning
188
+ before contrast is measured. The prototype keeps controls on opaque semantic
189
+ surfaces for predictable contrast.
190
+
191
+ Keep this treatment opt-in. It needs explicit depth assignment, and the dark
192
+ lowered case has too little separation to replace the opaque default. A
193
+ future default would need a stronger depth and contrast rule for arbitrary
194
+ backdrops, especially dark textures and nested mixed components.
195
+
134
196
  Add `class="hide-actions"` to a `wa-dialog` when the dialog supplies its own
135
197
  dismissal affordance and should omit Web Awesome's header action region. The
136
198
  theme sets `display: none` on the directly exported `header-actions` part; it
package/docs/workbench.md CHANGED
@@ -80,8 +80,9 @@ an optional `label`. Common shell behavior is configured rather than restyled:
80
80
  - `separator: "auto" | "hidden"` controls the owned dock-edge separator;
81
81
  - `collapseMotion: "slide" | "fade-slide" | "none"` keeps the track change
82
82
  instant while choosing composited content motion;
83
- - `contentOverflow: "clip" | "auto" | "visible"` lets a drawer temporarily
84
- expose an open popup without a descendant override;
83
+ - `contentOverflow: "clip" | "auto" | "visible"` chooses the resting overflow
84
+ policy. An open descendant `PopupMenu` or Web Awesome dropdown temporarily
85
+ releases rail/drawer clipping and raises its popup layer automatically;
85
86
  - `presentation: "inline" | "overlay" | "hidden"` supports compact overlays
86
87
  or a responsive replacement. An overlay rail spans the Workbench height at
87
88
  its side and an overlay drawer spans the work-area column at the bottom,
@@ -236,11 +237,14 @@ The `Pane`s and `List`s the Workbench composes around your content are
236
237
  configurable the same way:
237
238
 
238
239
  - `mainPane` (`PaneConfig`: `contentElement`, `contentLabel`, `separators`,
239
- `safeAreaEdges`, `chromeDividers`) configures the work area's `Pane`, which exists whenever the
240
- work area has a toolbar, `mainHeader`, or `mainFooter`;
240
+ `safeAreaEdges`, `chromeDividers`, `appearance`) configures the work area's
241
+ `Pane`, which exists whenever the work area has a toolbar, `mainHeader`, or
242
+ `mainFooter`. Without that chrome, `appearance: "sunken"` paints the main
243
+ region's own scroll surface;
241
244
  - a panel's `pane` configures the `Pane` a `toolbar` panel's `content` renders
242
245
  in — for example `{ contentElement: "nav", contentLabel: "Files" }` for a
243
- navigator rail;
246
+ navigator rail. Without a toolbar, `appearance: "sunken"` paints the panel
247
+ scroll region;
244
248
  - `mainHeaderList` / `mainFooterList` (`ListConfig`: `gap`, `hAlign`,
245
249
  `vAlign`, `dividerSides`, `textInsets`, `controlInsets`) configure the
246
250
  `List`s holding `mainHeader` / `mainFooter`.
@@ -310,8 +314,8 @@ const stop = wireWorkbench(root, {
310
314
  ```
311
315
 
312
316
  - **Pointer:** dragging the separator resizes the panel live (the wire marks
313
- it `data-resizing` and suppresses content motion) and commits the final
314
- size to the signal on release.
317
+ the rail or drawer `data-resizing` and suppresses its content transform
318
+ transition) and commits the final size to the signal on release.
315
319
  - **Keyboard:** focus the separator; arrow keys resize by `step` (16px),
316
320
  Shift+arrow by `largeStep` (64px), Home/End jump to `min`/`max`. The
317
321
  separator's `aria-valuenow`/`aria-valuemin`/`aria-valuemax` report the size
@@ -506,7 +510,6 @@ with state-derived props:
506
510
  collapsed={!drawerVisible.value}
507
511
  separator={magnified.value ? "hidden" : "auto"}
508
512
  collapseMotion="fade-slide"
509
- contentOverflow={createMenuOpen.value ? "visible" : "clip"}
510
513
  presentation={mobile.value ? "overlay" : "inline"}
511
514
  restoreControl={
512
515
  <ToolbarControlGroup label="Terminals" single>
@@ -528,8 +531,10 @@ collapse slides it out at the resized width. A collapsed,
528
531
  overlay, or hidden region is not resizeable. Together these policies replace
529
532
  app CSS for separator suppression, instant-track/composited-content collapse,
530
533
  popup overflow, mobile overlay/hidden replacement, resize-transition guards,
531
- and safe-area restore placement. The app still owns the signals and decides
532
- when each policy applies.
534
+ and safe-area restore placement. A descendant `PopupMenu` or Web Awesome
535
+ dropdown with `open` releases clipping for its lifecycle, so menu events need
536
+ not rerender the region. The app still owns the other signals and decides when
537
+ each policy applies.
533
538
 
534
539
  ## Public styling boundary
535
540
 
@@ -556,6 +561,13 @@ takes that edge away, and collapsing it (or presenting it as an overlay) hands
556
561
  the edge back. A region whose only child is a `Pane` or layout lets that child
557
562
  own the insets. See [Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
558
563
 
564
+ Workbench projects panel presentation, collapse, and responsive breakpoint
565
+ state onto its own region attributes. Its stylesheet then matches those local
566
+ attributes instead of searching descendants during list updates. It clears the
567
+ edge context on each region, while a sole Pane or layout child receives the
568
+ insets it owns. Applications still pass arbitrary `main` and panel content;
569
+ they need no marker classes or extra wrappers.
570
+
559
571
  ## How the collapse animates
560
572
 
561
573
  Collapsing snaps the panel's flex track to zero in a single reflow (so the work
package/llms.txt CHANGED
@@ -161,6 +161,9 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
161
161
  expanded trailing control to a full second row at `responsiveAt`; the leading
162
162
  title remains above it. Public leading-min-width, trailing-gap/justify, and
163
163
  per-zone inline-padding tokens cover app-specific toolbar geometry.
164
+ `--kui-toolbar-inset: 0px` removes an embedded Toolbar's outer padding and
165
+ corresponding minimum-height allowance while preserving its zone gap and
166
+ safe-area compensation.
164
167
  - **Position region restore controls declaratively.** A ResizableRegion has a
165
168
  background token, `contentOverflow="visible"` for an anchored popup,
166
169
  top/bottom `restorePosition`, typed `restoreInset`, and
@@ -172,6 +175,9 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
172
175
  `divider` owns row separators and `state="drag-target"` paints the drop
173
176
  target. Public ListItem tokens set row, icon, label, and trailing geometry;
174
177
  ListHeader height, title padding, and border tokens tune section density.
178
+ For a filled command list, scope `--kui-list-item-background`,
179
+ `--kui-list-item-border`, `--kui-list-item-hover-border`, and
180
+ `--kui-list-item-selected-border` at the list or row boundary.
175
181
  - **Use `Row` for horizontal and `List` for vertical layout.** Both expose
176
182
  physical `hAlign`/`vAlign` props and typed gaps. Row defaults to left/full,
177
183
  an `xs` gap, and no wrapping; List retains full/top and zero-gap defaults.
@@ -190,11 +196,11 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
190
196
  or `foregroundColorVar()`; fill tokens such as `uiColor('success-fill-quiet')` do not
191
197
  type-check. These brands are intentionally
192
198
  not interchangeable; rows use classes/tokens/props rather than raw `style`.
193
- - **Use `Grid` for a fixed positive count of equal-width columns.** It uses
194
- zero-minimum fractional tracks, so intrinsic content cannot make one column
195
- wider than its peers. The app owns responsive count changes; use custom CSS
196
- grid for asymmetric/intrinsic tracks and `ResizableRegion` for adjustable
197
- boundaries. `Grid.gap` and `Grid.flex` use the same typed grammars as Row.
199
+ - **Use `Grid` for equal-width columns.** Set a fixed positive `columns` count
200
+ or typed `minColumnWidth` for automatic container-width collapse, never both.
201
+ The app owns the outer width and child semantics; use custom CSS grid for
202
+ asymmetric/intrinsic tracks and `ResizableRegion` for adjustable boundaries.
203
+ `Grid.gap` and `Grid.flex` use the same typed grammars as Row.
198
204
  - **Give a layout root `fill`, not a frame `Pane`.** A Row, List, or Grid that
199
205
  is the sole layout root of a definite-height parent takes its full height
200
206
  with `fill` and carries safe `data-*` markers through `rootAttributes`.
@@ -234,6 +240,13 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
234
240
  toolbar filter menu adds `selectedPresentation="icon-only"` and a fixed
235
241
  `triggerIcon`: the trigger shows that icon plus a count badge while any
236
242
  choice is chosen, and its accessible name ends with the chosen labels.
243
+ Set `caret={false}` on an icon-only toolbar Select to make a round trigger;
244
+ the default keeps the visible caret.
245
+ `SelectChoice.disabled` keeps an unavailable option visible but unselectable;
246
+ `disabledReason` adds its tooltip. For multiple selects, opt in to
247
+ `selectAllLabel` and `clearLabel` footer buttons to select enabled choices
248
+ or clear the value through ordinary change events. The app owns the updated
249
+ controlled value and localized action labels.
237
250
  Icon-only Selects (single or multiple) and icon-only `PopupMenu`s show an
238
251
  `aria-hidden` Web Awesome help tag repeating that name (and a Select's
239
252
  choice) on hover and keyboard focus, hidden while the popup is open; the
@@ -264,7 +277,8 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
264
277
  in a `single` `ToolbarControlGroup` with `nestedDropdown`; never hand-write
265
278
  `wa-dropdown` markup for a menu. Let the group size the trigger from its icon,
266
279
  localized text, and caret. `PopupMenu` items also support nested `submenu`
267
- actions, checked or trailing choice marks, danger tone, and disabled reasons;
280
+ actions, headings, dividers, checked or trailing choice marks, danger tone,
281
+ and disabled reasons; nested headings/dividers stay out of keyboard choices;
268
282
  use `context` with `openPopupMenuAt`/`closePopupMenu` for pointer-anchored row
269
283
  menus. Do not force a dropdown or button width. Nothing
270
284
  wraps inside a group: an icon sits beside its label on one row, and a
@@ -285,6 +299,8 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
285
299
  app-owned content below. Do not create a private heading wrapper or restyle the
286
300
  toolbar. A narrow peripheral rail or drawer, where extra-large would truncate
287
301
  at its minimum size, names itself with the default `ToolbarText` size.
302
+ `ToolbarText size="xlarge-fixed"` keeps the 20px `--kui-font-l` heading step;
303
+ `xlarge` retains the responsive page-title clamp.
288
304
  - **Use `Text` for ordinary semantic headings, paragraphs, and inline secondary
289
305
  text outside toolbar title zones.** Omit `variant` for the default `p`, pass
290
306
  `h1`–`h6` based on the document outline, or use `variant="span"` inside a row,
@@ -358,7 +374,14 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
358
374
  Select All deletion does the same; deletion
359
375
  restoration finishes before the next keystroke rather than on a delayed frame.
360
376
  Persist both query and remaining tokens read from an edited field; change
361
- `revision` to replace its DOM-owned text programmatically. The one richer case is `wireTokenSearchFields`, which manages the
377
+ `revision` to replace unmanaged DOM-owned text programmatically, or call
378
+ `model.replace({ query, tokens })` for a model-managed field. In grammar-assisted
379
+ search, a model rule's `suggest(input, state)` receives current committed tokens
380
+ so suggestions can omit selected values; one-argument callbacks still work.
381
+ A sibling helper can call `model.commit(value)` for the active `name:` prefix
382
+ even when that value is not suggested; invalid values and missing prefixes
383
+ leave state unchanged.
384
+ The one richer case is `wireTokenSearchFields`, which manages the
362
385
  collapsible field's expand/collapse/focus by default (on, per-behavior opt-out) and
363
386
  exposes the `expanded` signal on its handle — bind it in render or hand in your own
364
387
  via `collapsible.signals`. Do not hand-roll open/collapse/focus that helper
@@ -404,8 +427,13 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
404
427
  closed value ellipsizes when space runs out.
405
428
  - **Configure application tabs at their owners.** AppTab's `icon-only`
406
429
  presentation keeps `name` accessible, `labelMaxWidth` ellipsizes a long name,
407
- and `attention` uses `--kui-app-tab-attention-color`. TabBar's public
430
+ `nameOverflow="visible"` shows the full name during inline loading, and
431
+ `dropTarget` highlights a drag-over without changing selection. `attention`
432
+ uses `--kui-app-tab-attention-color`. TabBar's public
408
433
  `--kui-tab-bar-strip-*` tokens set compact strip geometry.
434
+ Set `pinned` on the first AppTab to keep it visible within a scrolling
435
+ tablist; it remains in keyboard order. Use `--kui-app-tab-pinned-background`
436
+ for the surrounding surface and keep that backdrop opaque.
409
437
  - **Use `Badge` for compact non-interactive metadata.** Configure its semantic
410
438
  tone, appearance, shape, and size instead of creating badge CSS in an app or
411
439
  consuming component. Use a real button or link for interactive content.
@@ -413,6 +441,10 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
413
441
  takes no children, and needs a `label` (announced as an image) or
414
442
  `ariaHidden` when its owner announces it. A `TabScaffold` tab shows the dot
415
443
  with `badge: true` plus its required `badgeLabel`.
444
+ - **Use `Chip` for removable tags.** Give the native remove button a delegated
445
+ `removeAction` and a specific `removeLabel`; the application updates the tag
446
+ list. `itemId` identifies the chip to the action handler. `size="compact"`
447
+ gives a 20px chip and 16px remove button; `disabled` disables removal.
416
448
 
417
449
  ## Public exports
418
450
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kerfjs/ui",
3
- "version": "5.0.0-beta.60",
3
+ "version": "5.0.0-beta.62",
4
4
  "description": "Accessible, composable UI primitives for kerf applications.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -65,6 +65,11 @@
65
65
  "browser": "./dist/browser/badge.js",
66
66
  "import": "./dist/badge.js"
67
67
  },
68
+ "./chip": {
69
+ "types": "./dist/chip.d.ts",
70
+ "browser": "./dist/browser/chip.js",
71
+ "import": "./dist/chip.js"
72
+ },
68
73
  "./toolbar": {
69
74
  "types": "./dist/toolbar.d.ts",
70
75
  "browser": "./dist/browser/toolbar.js",
@@ -336,6 +341,7 @@
336
341
  "./styles.css": "./dist/styles/styles.css",
337
342
  "./lucide-icon.css": "./dist/styles/lucide-icon.css",
338
343
  "./badge.css": "./dist/styles/badge.css",
344
+ "./chip.css": "./dist/styles/chip.css",
339
345
  "./disclosure-arrow.css": "./dist/styles/disclosure-arrow.css",
340
346
  "./toolbar.css": "./dist/styles/toolbar.css",
341
347
  "./toolbar-control-group.css": "./dist/styles/toolbar-control-group.css",