@kerfjs/ui 5.0.0-beta.54 → 5.0.0-beta.56

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 (274) hide show
  1. package/README.md +14 -11
  2. package/ai/compile-time-contracts-v1.json +2 -2
  3. package/ai/component-catalog-v2.json +206 -39
  4. package/ai/component-catalog.json +306 -58
  5. package/ai/public-api-signatures-v1.md +671 -92
  6. package/ai/skill.md +43 -38
  7. package/ai/webawesome-jsx-signatures-v1.md +8 -2
  8. package/dist/app-tab.js +1 -1
  9. package/dist/badge.d.ts +35 -7
  10. package/dist/badge.js +1 -1
  11. package/dist/browser/content-item.js +3 -0
  12. package/dist/browser/popup-menu.js +3 -0
  13. package/dist/browser/select.js +1 -0
  14. package/dist/catalog-resources.d.ts +12 -1
  15. package/dist/catalog.d.ts +21 -4
  16. package/dist/catalog.js +260 -308
  17. package/dist/catalog.js.map +1 -1
  18. package/dist/{chunk-7IUSV4XG.js → chunk-24PHKUR3.js} +2 -2
  19. package/dist/chunk-24PHKUR3.js.map +1 -0
  20. package/dist/{chunk-WZ2GLEY4.js → chunk-2G2ZJQYK.js} +2 -14
  21. package/dist/chunk-2G2ZJQYK.js.map +1 -0
  22. package/dist/{chunk-D7GWXIAS.js → chunk-5I7QGQVT.js} +1 -1
  23. package/dist/chunk-5I7QGQVT.js.map +1 -0
  24. package/dist/{chunk-HJKRCKDR.js → chunk-63ZWBGE3.js} +6 -3
  25. package/dist/chunk-63ZWBGE3.js.map +1 -0
  26. package/dist/{chunk-44IG7PFV.js → chunk-6CINWX2E.js} +3 -3
  27. package/dist/{chunk-44IG7PFV.js.map → chunk-6CINWX2E.js.map} +1 -1
  28. package/dist/{chunk-C2FAYFDE.js → chunk-AGXQQFKZ.js} +2 -2
  29. package/dist/{chunk-C2FAYFDE.js.map → chunk-AGXQQFKZ.js.map} +1 -1
  30. package/dist/{chunk-ATHXW6RP.js → chunk-AHEG27M7.js} +2 -2
  31. package/dist/{chunk-ATHXW6RP.js.map → chunk-AHEG27M7.js.map} +1 -1
  32. package/dist/{chunk-7GUQYHKA.js → chunk-AK67F6QN.js} +4 -1
  33. package/dist/chunk-AK67F6QN.js.map +1 -0
  34. package/dist/chunk-BFPBS5Y4.js +250 -0
  35. package/dist/chunk-BFPBS5Y4.js.map +1 -0
  36. package/dist/chunk-DG6G5EPF.js +35 -0
  37. package/dist/chunk-DG6G5EPF.js.map +1 -0
  38. package/dist/{chunk-MTM43SJO.js → chunk-G33XC2NB.js} +1 -1
  39. package/dist/chunk-G33XC2NB.js.map +1 -0
  40. package/dist/{chunk-TZ5IHWB2.js → chunk-K6UNVKDK.js} +3 -3
  41. package/dist/{chunk-TZ5IHWB2.js.map → chunk-K6UNVKDK.js.map} +1 -1
  42. package/dist/chunk-KH6VUGHU.js +399 -0
  43. package/dist/chunk-KH6VUGHU.js.map +1 -0
  44. package/dist/{chunk-HMQ2ZDGG.js → chunk-KROD7KZK.js} +3 -2
  45. package/dist/chunk-KROD7KZK.js.map +1 -0
  46. package/dist/{chunk-5NDQABWK.js → chunk-M7QV3IHH.js} +3 -1
  47. package/dist/chunk-M7QV3IHH.js.map +1 -0
  48. package/dist/{chunk-RNZAKSME.js → chunk-MA6Z6EIM.js} +3 -3
  49. package/dist/{chunk-RNZAKSME.js.map → chunk-MA6Z6EIM.js.map} +1 -1
  50. package/dist/chunk-MA73TA6D.js +42 -0
  51. package/dist/chunk-MA73TA6D.js.map +1 -0
  52. package/dist/{chunk-ZMBU522F.js → chunk-MEY33VWB.js} +2 -2
  53. package/dist/{chunk-ZMBU522F.js.map → chunk-MEY33VWB.js.map} +1 -1
  54. package/dist/{chunk-T22EM4ET.js → chunk-MOBRFZH3.js} +81 -31
  55. package/dist/chunk-MOBRFZH3.js.map +1 -0
  56. package/dist/chunk-MP2GDBQZ.js +50 -0
  57. package/dist/chunk-MP2GDBQZ.js.map +1 -0
  58. package/dist/{chunk-3NBL3OUQ.js → chunk-NAPE7WUS.js} +2 -2
  59. package/dist/chunk-NAPE7WUS.js.map +1 -0
  60. package/dist/{chunk-CMUIXJZM.js → chunk-NBYTIVHS.js} +2 -2
  61. package/dist/{chunk-CMUIXJZM.js.map → chunk-NBYTIVHS.js.map} +1 -1
  62. package/dist/chunk-O3EXIBEZ.js +114 -0
  63. package/dist/chunk-O3EXIBEZ.js.map +1 -0
  64. package/dist/{chunk-KPNTVB7A.js → chunk-PK4N5QTO.js} +8 -7
  65. package/dist/chunk-PK4N5QTO.js.map +1 -0
  66. package/dist/chunk-QQOTQTDD.js +415 -0
  67. package/dist/chunk-QQOTQTDD.js.map +1 -0
  68. package/dist/{chunk-BJJKFVWW.js → chunk-T4UZTNZ4.js} +5 -5
  69. package/dist/chunk-T4UZTNZ4.js.map +1 -0
  70. package/dist/chunk-V65EOWNF.js +83 -0
  71. package/dist/chunk-V65EOWNF.js.map +1 -0
  72. package/dist/{chunk-GUIHMIT2.js → chunk-VNPQDCQZ.js} +3 -3
  73. package/dist/{chunk-GUIHMIT2.js.map → chunk-VNPQDCQZ.js.map} +1 -1
  74. package/dist/{chunk-5I22LMCV.js → chunk-VZOFZPSO.js} +2 -2
  75. package/dist/chunk-VZOFZPSO.js.map +1 -0
  76. package/dist/chunk-WLG6SSNT.js +94 -0
  77. package/dist/chunk-WLG6SSNT.js.map +1 -0
  78. package/dist/{chunk-NE5JAOQS.js → chunk-WOUF7YXM.js} +3 -3
  79. package/dist/{chunk-NE5JAOQS.js.map → chunk-WOUF7YXM.js.map} +1 -1
  80. package/dist/collapsible-panel.d.ts +51 -13
  81. package/dist/collapsible-panel.js +38 -10
  82. package/dist/collapsible-panel.js.map +1 -1
  83. package/dist/content-item.d.ts +46 -0
  84. package/dist/content-item.js +4 -0
  85. package/dist/content-item.js.map +1 -0
  86. package/dist/css-values.d.ts +5 -11
  87. package/dist/css-values.js +1 -1
  88. package/dist/disclosure-arrow.d.ts +4 -1
  89. package/dist/disclosure-arrow.js +1 -1
  90. package/dist/floating-toolbar.d.ts +17 -6
  91. package/dist/floating-toolbar.js +1 -1
  92. package/dist/grid.js +1 -1
  93. package/dist/help-tags-register.d.ts +13 -0
  94. package/dist/help-tags-register.js +9 -0
  95. package/dist/help-tags-register.js.map +1 -0
  96. package/dist/index.d.ts +7 -5
  97. package/dist/index.js +31 -29
  98. package/dist/list-action-row.js +1 -1
  99. package/dist/list-header.d.ts +14 -1
  100. package/dist/list-header.js +1 -1
  101. package/dist/list-inset-control.d.ts +1 -1
  102. package/dist/list-inset-control.js +1 -1
  103. package/dist/list-inset-text.d.ts +9 -10
  104. package/dist/list-inset-text.js +2 -1
  105. package/dist/list-item.js +1 -1
  106. package/dist/list.d.ts +10 -3
  107. package/dist/list.js +1 -1
  108. package/dist/nav-stack.d.ts +38 -5
  109. package/dist/nav-stack.js +4 -1
  110. package/dist/pane.d.ts +20 -2
  111. package/dist/pane.js +1 -1
  112. package/dist/panel-toolbar-C8sF-YZC.d.ts +63 -0
  113. package/dist/popup-menu-register.d.ts +9 -0
  114. package/dist/popup-menu-register.js +31 -0
  115. package/dist/popup-menu-register.js.map +1 -0
  116. package/dist/popup-menu.d.ts +71 -0
  117. package/dist/popup-menu.js +3 -0
  118. package/dist/popup-menu.js.map +1 -0
  119. package/dist/row.d.ts +1 -1
  120. package/dist/row.js +1 -1
  121. package/dist/select-register.js +70 -3
  122. package/dist/select-register.js.map +1 -1
  123. package/dist/select.d.ts +46 -8
  124. package/dist/select.js +2 -1
  125. package/dist/{divider-sides-BzB6rphT.d.ts → sides-BPSWde0A.d.ts} +1 -3
  126. package/dist/skeleton.js +1 -1
  127. package/dist/spacer.js +1 -1
  128. package/dist/split-view.d.ts +31 -3
  129. package/dist/split-view.js +33 -5
  130. package/dist/split-view.js.map +1 -1
  131. package/dist/state-banner.js +1 -1
  132. package/dist/styles/badge.css +13 -0
  133. package/dist/styles/catalog/components/catalog-example.css +1 -17
  134. package/dist/styles/catalog/components/catalog-stage.css +9 -14
  135. package/dist/styles/catalog/components/catalog.css +8 -18
  136. package/dist/styles/catalog.css +0 -5
  137. package/dist/styles/collapsible-panel.css +192 -39
  138. package/dist/styles/content-item.css +30 -0
  139. package/dist/styles/floating-toolbar.css +5 -0
  140. package/dist/styles/foundation.css +28 -19
  141. package/dist/styles/layout.css +1 -21
  142. package/dist/styles/list-action-row.css +13 -1
  143. package/dist/styles/list-inset-text.css +1 -2
  144. package/dist/styles/list-item.css +14 -1
  145. package/dist/styles/list.css +1 -1
  146. package/dist/styles/nav-stack.css +29 -64
  147. package/dist/styles/pane.css +33 -1
  148. package/dist/styles/popup-menu.css +90 -0
  149. package/dist/styles/resizable-region.css +53 -10
  150. package/dist/styles/select.css +39 -12
  151. package/dist/styles/split-view.css +21 -25
  152. package/dist/styles/state-banner.css +13 -4
  153. package/dist/styles/styles.css +1 -0
  154. package/dist/styles/tab-bar.css +31 -3
  155. package/dist/styles/tab-scaffold.css +36 -14
  156. package/dist/styles/text.css +1 -1
  157. package/dist/styles/token-search-field.css +4 -4
  158. package/dist/styles/toolbar-control-group.css +44 -12
  159. package/dist/styles/toolbar.css +57 -7
  160. package/dist/styles/value-table.css +19 -2
  161. package/dist/styles/webawesome.css +3 -1
  162. package/dist/styles/workbench.css +165 -31
  163. package/dist/tab-scaffold.d.ts +35 -1
  164. package/dist/tab-scaffold.js +50 -16
  165. package/dist/tab-scaffold.js.map +1 -1
  166. package/dist/text.js +1 -1
  167. package/dist/token-search-field.d.ts +13 -2
  168. package/dist/token-search-field.js +1 -1
  169. package/dist/toolbar-text.js +1 -1
  170. package/dist/toolbar.d.ts +12 -4
  171. package/dist/toolbar.js +1 -1
  172. package/dist/{types-CEsieBZi.d.ts → types-DXAGogOS.d.ts} +48 -0
  173. package/dist/value-table.js +1 -1
  174. package/dist/webawesome.d.ts +7 -1
  175. package/dist/wire-catalog.d.ts +24 -1
  176. package/dist/wire-catalog.js +26 -3
  177. package/dist/wire-catalog.js.map +1 -1
  178. package/dist/wire-sidebar.js +6 -3
  179. package/dist/wire-sidebar.js.map +1 -1
  180. package/dist/wire-token-search-fields.js +1 -1
  181. package/dist/wire-workbench.js +1 -350
  182. package/dist/wire-workbench.js.map +1 -1
  183. package/dist/workbench.d.ts +144 -6
  184. package/dist/workbench.js +11 -208
  185. package/dist/workbench.js.map +1 -1
  186. package/docs/accessibility.md +126 -6
  187. package/docs/app-layouts.md +9 -7
  188. package/docs/catalog.md +41 -9
  189. package/docs/collapsible-panel.md +79 -5
  190. package/docs/component-contract.md +38 -12
  191. package/docs/component-selection.md +64 -55
  192. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  193. package/docs/design/templates/empty-state/with-action.svg +1 -1
  194. package/docs/design/templates/empty-state-dark.svg +1 -1
  195. package/docs/design/templates/empty-state.svg +1 -1
  196. package/docs/design/templates/list/compact-dark.svg +1 -1
  197. package/docs/design/templates/list/compact.svg +1 -1
  198. package/docs/design/templates/list/stack-dark.svg +1 -1
  199. package/docs/design/templates/list/stack.svg +1 -1
  200. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  201. package/docs/design/templates/list-action-row/default.svg +1 -1
  202. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  203. package/docs/design/templates/list-action-row/selected.svg +1 -1
  204. package/docs/design/templates/list-action-row-dark.svg +1 -1
  205. package/docs/design/templates/list-action-row.svg +1 -1
  206. package/docs/design/templates/list-dark.svg +1 -1
  207. package/docs/design/templates/list-item/default-dark.svg +1 -1
  208. package/docs/design/templates/list-item/default.svg +1 -1
  209. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  210. package/docs/design/templates/list-item/selected.svg +1 -1
  211. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  212. package/docs/design/templates/list-item/trailing.svg +1 -1
  213. package/docs/design/templates/list-item-dark.svg +1 -1
  214. package/docs/design/templates/list-item.svg +1 -1
  215. package/docs/design/templates/list.svg +1 -1
  216. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  217. package/docs/design/templates/state-banner/danger.svg +1 -1
  218. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  219. package/docs/design/templates/state-banner/info.svg +1 -1
  220. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  221. package/docs/design/templates/state-banner/success.svg +1 -1
  222. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  223. package/docs/design/templates/state-banner/warning.svg +1 -1
  224. package/docs/design/templates/state-banner-dark.svg +1 -1
  225. package/docs/design/templates/state-banner.svg +1 -1
  226. package/docs/design/templates/value-table/details-dark.svg +1 -1
  227. package/docs/design/templates/value-table/details.svg +1 -1
  228. package/docs/design/templates/value-table-dark.svg +1 -1
  229. package/docs/design/templates/value-table.svg +1 -1
  230. package/docs/design-philosophy.md +1 -1
  231. package/docs/examples/command-palette-adapter.tsx +3 -2
  232. package/docs/layout.md +74 -29
  233. package/docs/nav-stack.md +45 -1
  234. package/docs/recipes.md +48 -40
  235. package/docs/split-view.md +46 -2
  236. package/docs/surface-scaffold.md +1 -1
  237. package/docs/tab-scaffold.md +50 -1
  238. package/docs/type-contracts.md +17 -17
  239. package/docs/ux-demo.md +8 -4
  240. package/docs/webawesome-theme.md +1 -2
  241. package/docs/workbench.md +131 -10
  242. package/llms.txt +38 -9
  243. package/package.json +24 -2
  244. package/ux-demo/recipes/app-shell.tsx +141 -223
  245. package/ux-demo/recipes/collapsible-sidebar.tsx +47 -77
  246. package/ux-demo/recipes/list-detail-dialog.tsx +150 -54
  247. package/ux-demo/recipes/mount-recipe.ts +0 -5
  248. package/ux-demo/recipes/navigation-sidebar.tsx +3 -2
  249. package/ux-demo/recipes/navigation-stack.tsx +3 -2
  250. package/ux-demo/recipes/types.ts +0 -1
  251. package/dist/chunk-3NBL3OUQ.js.map +0 -1
  252. package/dist/chunk-5I22LMCV.js.map +0 -1
  253. package/dist/chunk-5NDQABWK.js.map +0 -1
  254. package/dist/chunk-7GUQYHKA.js.map +0 -1
  255. package/dist/chunk-7IUSV4XG.js.map +0 -1
  256. package/dist/chunk-BJJKFVWW.js.map +0 -1
  257. package/dist/chunk-D7GWXIAS.js.map +0 -1
  258. package/dist/chunk-DQA5FMOX.js +0 -85
  259. package/dist/chunk-DQA5FMOX.js.map +0 -1
  260. package/dist/chunk-HJKRCKDR.js.map +0 -1
  261. package/dist/chunk-HMQ2ZDGG.js.map +0 -1
  262. package/dist/chunk-KPNTVB7A.js.map +0 -1
  263. package/dist/chunk-MTM43SJO.js.map +0 -1
  264. package/dist/chunk-T22EM4ET.js.map +0 -1
  265. package/dist/chunk-WZ2GLEY4.js.map +0 -1
  266. package/dist/chunk-XD7DWYXG.js +0 -34
  267. package/dist/chunk-XD7DWYXG.js.map +0 -1
  268. package/dist/chunk-ZK5EGVFP.js +0 -27
  269. package/dist/chunk-ZK5EGVFP.js.map +0 -1
  270. package/dist/styles/catalog/components/catalog-detail.css +0 -35
  271. package/dist/styles/catalog/components/catalog-resource-footer.css +0 -37
  272. package/dist/styles/catalog/components/catalog-secondary-sections.css +0 -38
  273. package/dist/styles/catalog/components/catalog-section-list.css +0 -22
  274. package/dist/styles/catalog/components/catalog-sidebar.css +0 -82
package/README.md CHANGED
@@ -168,8 +168,8 @@ The same property-specific boundary applies beyond spacing: use `flex()` (or a
168
168
  finite keyword) for `Row.flex`, `Grid.flex`, and `List.flex`; length builders and intrinsic-size keywords for
169
169
  `Skeleton.width`/`height`; length builders for `Skeleton.radius`; and
170
170
  a foreground color for `SelectChoice.color` — `uiColor()` with a foreground
171
- token such as `success-on-quiet`, or `foregroundColorVar()` (fill aliases such
172
- as `uiColor('success')` are rejected). These grammars are not
171
+ token such as `success-on-quiet`, or `foregroundColorVar()` (fill tokens such
172
+ as `uiColor('success-fill-quiet')` are rejected). These grammars are not
173
173
  interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
174
174
  `style` declarations; use `className`, public tokens, and component props.
175
175
 
@@ -184,6 +184,7 @@ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
184
184
  | `ToolbarControlGroup`, `ToolbarActionLink` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
185
185
  | `DialogSurface`, `PopupSurface` | `@kerfjs/ui/surface-scaffold` | `@kerfjs/ui/surface-scaffold.css` |
186
186
  | `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
187
+ | `PopupMenu` (register with `@kerfjs/ui/popup-menu/register`) | `@kerfjs/ui/popup-menu` | `@kerfjs/ui/popup-menu.css` |
187
188
  | `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
188
189
  | `Text` | `@kerfjs/ui/text` | `@kerfjs/ui/text.css` |
189
190
  | `List` | `@kerfjs/ui/list` | `@kerfjs/ui/list.css` |
@@ -196,6 +197,7 @@ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
196
197
  | `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
197
198
  | `ListInsetControl` | `@kerfjs/ui/list-inset-control` | `@kerfjs/ui/list-inset-control.css` |
198
199
  | `ListInsetText` | `@kerfjs/ui/list-inset-text` | `@kerfjs/ui/list-inset-text.css` |
200
+ | `ContentItem` | `@kerfjs/ui/content-item` | `@kerfjs/ui/content-item.css` |
199
201
  | `Pane` | `@kerfjs/ui/pane` | `@kerfjs/ui/pane.css` |
200
202
  | `NavStack` | `@kerfjs/ui/nav-stack` | `@kerfjs/ui/nav-stack.css` |
201
203
  | `wireNavStack` | `@kerfjs/ui/wire-nav-stack` | — |
@@ -246,11 +248,11 @@ onto another trailing-aligned row under every `responsive` policy, and a
246
248
  same way. Wrapping keeps every command visible at its full 44px target without
247
249
  moving focus or DOM identity. When a product wants fewer visible commands at
248
250
  narrow widths, it chooses them: render a lower-priority command inside an
249
- app-owned "More" popup menu (a `single` group around a `wa-dropdown`).
251
+ app-owned "More" `PopupMenu` (in a `single` group with `nestedDropdown`).
250
252
 
251
- `DisclosureArrow` defaults to an 18px root-scaled decorative visual. Override
252
- `--kui-disclosure-arrow-size` at the narrowest useful scope when a consumer
253
- needs another size; the owning control still supplies interaction, naming, and
253
+ `DisclosureArrow` defaults to an 18px root-scaled decorative visual. Pass a
254
+ typed `size` (for example `size={remify(24)}` from `@kerfjs/ui/css-values`)
255
+ when a consumer needs another size; the owning control still supplies interaction, naming, and
254
256
  expanded state. Kerf `Select` retains its independent Web Awesome expand-glyph
255
257
  scale of `.5` through `--kui-disclosure-icon-scale`. Author replacement
256
258
  `DisclosureArrow` icon content facing right before its configured direction
@@ -473,14 +475,15 @@ Add `.kui-content` to make its major children a vertical stack with 24px gaps.
473
475
  <ListItem action="open" label="Inbox" icon={inboxIcon} />
474
476
  <ListItem action="open" label="Drafts" />
475
477
  </section>
476
- <div class="kui-content-item">Workspace details</div>
478
+ <ContentItem>Workspace details</ContentItem>
477
479
  </nav>
478
480
  </aside>
479
481
  ```
480
482
 
481
- Ordinary children use `.kui-content-item`: 8px inline margin, a real 1px border
482
- (transparent by default), 8px padding, and 12px rounded corners. The pill
483
- modifier uses a 22px radius. A component can expose a transparent border or
483
+ Ordinary children use `ContentItem` (`@kerfjs/ui/content-item`): 8px inline
484
+ margin, a real 1px border (transparent by default), 8px padding, and 12px
485
+ rounded corners. `shape="pill"` uses a 22px radius, and `frame="framed"` paints
486
+ the neutral border only when the item marks a real distinction. A component can expose a transparent border or
484
487
  background without changing layout. `ListHeader` follows the same rule while
485
488
  keeping its dormant title and count-or-badge cluster separate from its optional
486
489
  44px action.
@@ -645,7 +648,7 @@ import "@kerfjs/ui/webawesome.css";
645
648
  import "@kerfjs/ui/select/register";
646
649
  ```
647
650
 
648
- That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it.
651
+ That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it. `PopupMenu` follows the same rule: import `@kerfjs/ui/popup-menu/register` once to register the dropdown, item, button, and divider elements it renders. Either registration also installs help tags: an icon-only Select, PopupMenu, or `aria-label`-named `<button>` in a `ToolbarControlGroup` shows its name in an `aria-hidden` tooltip on hover and keyboard focus. A toolbar with icon-only buttons but neither control imports `@kerfjs/ui/help-tags/register`, which registers only the tooltip.
649
652
  Use `label` for a visible label or `ariaLabel` for a visually hidden name. A
650
653
  nonempty visible label takes precedence when both are supplied. Kerf names the
651
654
  actual shadow combobox without adding visible label spacing; this also works
@@ -79,7 +79,7 @@
79
79
  "id": "KUI-T010",
80
80
  "publicImport": "@kerfjs/ui",
81
81
  "symbols": [
82
- "DividerSides",
82
+ "Sides",
83
83
  "StateBannerUrgency",
84
84
  "TabActivation",
85
85
  "TextVariant",
@@ -89,7 +89,7 @@
89
89
  "ToolbarControlGroupTone"
90
90
  ],
91
91
  "kind": "finite-vocabulary",
92
- "summary": "Finite public variant vocabularies, including canonical divider-edge combinations, are named exported unions rather than anonymous string sets."
92
+ "summary": "Finite public variant vocabularies, including canonical edge combinations, are named exported unions rather than anonymous string sets."
93
93
  },
94
94
  {
95
95
  "id": "KUI-T011",
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "accessibility": {
46
46
  "obligations": [
47
- "Badge is non-interactive. Supply label when visible content is abbreviated, and ariaHidden when it repeats an accessible name owned by the surrounding component.",
47
+ "Badge is non-interactive. Supply label when visible content is abbreviated, and ariaHidden when it repeats an accessible name owned by the surrounding component. A text-free dot must take either label (exposed as an image) or ariaHidden, which the types enforce.",
48
48
  "Keep meaningful text visible because tone is supplementary."
49
49
  ]
50
50
  },
@@ -139,7 +139,19 @@
139
139
  "The arrow is decorative; expose expanded state through aria-expanded on its owning control and keep that control's accessible name stable."
140
140
  ]
141
141
  },
142
- "cssValueProps": [],
142
+ "cssValueProps": [
143
+ {
144
+ "path": "size",
145
+ "grammar": "length",
146
+ "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
147
+ "nonStandaloneHelpers": ["plus"],
148
+ "shorthands": [],
149
+ "canonicalShorthands": [],
150
+ "exceptionalShorthands": [],
151
+ "rawPolicy": "forbid",
152
+ "examples": ["size={remify(24)}"]
153
+ }
154
+ ],
143
155
  "boundaries": {
144
156
  "rootClass": "kui-disclosure-arrow",
145
157
  "publicClasses": ["kui-disclosure-arrow"],
@@ -306,18 +318,6 @@
306
318
  "--kui-color-danger-on-normal",
307
319
  "--kui-color-danger-on-loud",
308
320
  "--kui-color-danger-on-fill",
309
- "--kui-color-border",
310
- "--kui-color-border-quiet",
311
- "--kui-color-accent",
312
- "--kui-color-accent-text",
313
- "--kui-color-pop",
314
- "--kui-color-pop-text",
315
- "--kui-color-success",
316
- "--kui-color-success-text",
317
- "--kui-color-warning",
318
- "--kui-color-warning-text",
319
- "--kui-color-danger",
320
- "--kui-color-danger-text",
321
321
  "--kui-focus-ring",
322
322
  "--kui-shadow-s",
323
323
  "--kui-shadow-l"
@@ -434,8 +434,6 @@
434
434
  "rootClass": "kui-content",
435
435
  "publicClasses": [
436
436
  "kui-content",
437
- "kui-content-item",
438
- "kui-content-item--pill",
439
437
  "kui-control-cluster",
440
438
  "kui-inline-metadata",
441
439
  "kui-scroll-owner"
@@ -614,6 +612,16 @@
614
612
  "id": "per-view bottom toolbar content or a persistent fallback",
615
613
  "owner": "application",
616
614
  "required": false
615
+ },
616
+ {
617
+ "id": "per-view leading, center, and trailing top-toolbar groups",
618
+ "owner": "application",
619
+ "required": false
620
+ },
621
+ {
622
+ "id": "top-toolbar configuration, title size, and heading level",
623
+ "owner": "application",
624
+ "required": false
617
625
  }
618
626
  ],
619
627
  "wiring": {
@@ -655,7 +663,8 @@
655
663
  },
656
664
  "accessibility": {
657
665
  "obligations": [
658
- "Give the stack region an accessible label and every back control a stable action label.",
666
+ "Give the stack region an accessible label and every back control a stable action label; visible backText names the control itself.",
667
+ "Set toolbarConfig.headingLevel when the view title is the page's or section's heading landmark.",
659
668
  "Use wireNavStack so each controlled push moves focus into the new top view and each pop restores the revealed view's remembered descendant.",
660
669
  "Mark a preferred initial heading or control with data-nav-focus when the first enabled focusable descendant is not the right target."
661
670
  ]
@@ -671,11 +680,8 @@
671
680
  "kui-nav-stack__chrome-copy",
672
681
  "kui-nav-stack__chrome-copy--bottom",
673
682
  "kui-nav-stack__chrome-copy--exiting",
674
- "kui-nav-stack__lead",
675
- "kui-nav-stack__back",
676
- "kui-nav-stack__back-icon",
683
+ "kui-nav-stack__toolbar",
677
684
  "kui-nav-stack__title",
678
- "kui-nav-stack__actions",
679
685
  "kui-nav-stack__viewport",
680
686
  "kui-nav-stack__view",
681
687
  "kui-nav-stack__view--entering",
@@ -736,6 +742,16 @@
736
742
  "owner": "application",
737
743
  "required": false
738
744
  },
745
+ {
746
+ "id": "optional list collapse state and its restore control",
747
+ "owner": "application",
748
+ "required": false
749
+ },
750
+ {
751
+ "id": "compact list and detail toolbar groups and toolbar configuration",
752
+ "owner": "application",
753
+ "required": false
754
+ },
739
755
  { "id": "back action", "owner": "application", "required": false }
740
756
  ],
741
757
  "wiring": {
@@ -832,6 +848,11 @@
832
848
  "owner": "application",
833
849
  "required": false
834
850
  },
851
+ {
852
+ "id": "tab badge counts or dots and their localized badgeLabel phrases",
853
+ "owner": "application",
854
+ "required": false
855
+ },
835
856
  {
836
857
  "id": "routing and persistence",
837
858
  "owner": "application",
@@ -864,7 +885,8 @@
864
885
  "accessibility": {
865
886
  "obligations": [
866
887
  "Give the tablist an accessible label and keep exactly the active tab in the sequential focus order.",
867
- "Wire selection through the controlled active id while leaving inactive scenes mounted and hidden."
888
+ "Wire selection through the controlled active id while leaving inactive scenes mounted and hidden.",
889
+ "A tab badge is aria-hidden; supply badgeLabel so the tab's accessible name becomes \"<label>, <badgeLabel>\" (it defaults to the badge text). The dot form, badge: true, has no text, so its badgeLabel is required."
868
890
  ]
869
891
  },
870
892
  "cssValueProps": [],
@@ -877,6 +899,7 @@
877
899
  "kui-tab-scaffold__bar",
878
900
  "kui-tab-scaffold__tab",
879
901
  "kui-tab-scaffold__tab-icon",
902
+ "kui-tab-scaffold__tab-badge",
880
903
  "kui-tab-scaffold__tab-label"
881
904
  ],
882
905
  "publicTokens": []
@@ -1007,7 +1030,8 @@
1007
1030
  "--kui-workbench-overlay-max-width",
1008
1031
  "--kui-workbench-overlay-max-height",
1009
1032
  "--kui-workbench-restore-inset",
1010
- "--kui-workbench-restore-z"
1033
+ "--kui-workbench-restore-z",
1034
+ "--kui-workbench-overlay-dismiss-margin"
1011
1035
  ]
1012
1036
  },
1013
1037
  "diagnostics": [],
@@ -1282,7 +1306,7 @@
1282
1306
  "kui-toolbar__trailing"
1283
1307
  ],
1284
1308
  "publicTokens": [
1285
- "--kui-color-border",
1309
+ "--kui-color-neutral-border-normal",
1286
1310
  "--kui-font-sans",
1287
1311
  "--kui-toolbar-divider-color"
1288
1312
  ]
@@ -1346,7 +1370,8 @@
1346
1370
  },
1347
1371
  "accessibility": {
1348
1372
  "obligations": [
1349
- "Name the group when its relationship is not evident from context."
1373
+ "Name the group when its relationship is not evident from context.",
1374
+ "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."
1350
1375
  ]
1351
1376
  },
1352
1377
  "cssValueProps": [],
@@ -1473,7 +1498,19 @@
1473
1498
  "Give the toolbar an accessible name (label is required — it exposes role=\"toolbar\")."
1474
1499
  ]
1475
1500
  },
1476
- "cssValueProps": [],
1501
+ "cssValueProps": [
1502
+ {
1503
+ "path": "inset",
1504
+ "grammar": "length",
1505
+ "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1506
+ "nonStandaloneHelpers": ["plus"],
1507
+ "shorthands": [],
1508
+ "canonicalShorthands": [],
1509
+ "exceptionalShorthands": [],
1510
+ "rawPolicy": "forbid",
1511
+ "examples": ["inset={space(\"xs\")}"]
1512
+ }
1513
+ ],
1477
1514
  "boundaries": {
1478
1515
  "rootClass": "kui-floating-toolbar",
1479
1516
  "publicClasses": ["kui-floating-toolbar"],
@@ -1597,7 +1634,7 @@
1597
1634
  "rootClass": "kui-text",
1598
1635
  "publicClasses": ["kui-text"],
1599
1636
  "publicTokens": [
1600
- "--kui-color-danger-text",
1637
+ "--kui-color-danger-on-quiet",
1601
1638
  "--kui-color-text-quiet",
1602
1639
  "--kui-font-mono",
1603
1640
  "--kui-font-xs",
@@ -1696,7 +1733,7 @@
1696
1733
  "kui-value-table__label"
1697
1734
  ],
1698
1735
  "publicTokens": [
1699
- "--kui-color-border",
1736
+ "--kui-color-neutral-border-normal",
1700
1737
  "--kui-color-surface-lowered",
1701
1738
  "--kui-color-text",
1702
1739
  "--kui-color-text-quiet",
@@ -2070,7 +2107,7 @@
2070
2107
  "rootClass": "kui-list",
2071
2108
  "publicClasses": ["kui-list"],
2072
2109
  "publicTokens": [
2073
- "--kui-color-border",
2110
+ "--kui-color-neutral-border-normal",
2074
2111
  "--kui-layout-item-gap",
2075
2112
  "--kui-list-divider-color",
2076
2113
  "--kui-list-gap"
@@ -2412,11 +2449,83 @@
2412
2449
  "cssValueProps": [],
2413
2450
  "boundaries": {
2414
2451
  "rootClass": "kui-list-inset-text",
2452
+ "publicClasses": ["kui-list-inset-text"],
2453
+ "publicTokens": []
2454
+ },
2455
+ "diagnostics": [],
2456
+ "provenance": {
2457
+ "selection": "ai/component-catalog.json",
2458
+ "composition": "generated-permissive-default"
2459
+ }
2460
+ },
2461
+ {
2462
+ "key": "@kerfjs/ui:content-item",
2463
+ "package": "@kerfjs/ui",
2464
+ "id": "content-item",
2465
+ "name": "ContentItem",
2466
+ "kind": "component",
2467
+ "source": "kerf",
2468
+ "parents": { "mode": "any", "entries": [] },
2469
+ "contexts": ["application-ui"],
2470
+ "zones": [],
2471
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
2472
+ "state": [
2473
+ { "id": "the item content", "owner": "application", "required": false },
2474
+ {
2475
+ "id": "whether the item marks a real distinction that warrants a visible frame",
2476
+ "owner": "application",
2477
+ "required": false
2478
+ },
2479
+ { "id": "corner shape", "owner": "application", "required": false },
2480
+ {
2481
+ "id": "region semantics and accessible name",
2482
+ "owner": "application",
2483
+ "required": false
2484
+ },
2485
+ {
2486
+ "id": "whether the item is a programmatic focus target",
2487
+ "owner": "application",
2488
+ "required": false
2489
+ }
2490
+ ],
2491
+ "wiring": {
2492
+ "required": false,
2493
+ "helpers": [],
2494
+ "obligations": [],
2495
+ "stateAttributes": []
2496
+ },
2497
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
2498
+ "layout": {
2499
+ "roles": ["structure"],
2500
+ "geometry": {
2501
+ "margin": "self",
2502
+ "border": "self",
2503
+ "padding": "self",
2504
+ "notes": [
2505
+ "The 1px border is always reserved and transparent unless frame=\"framed\", so framed and unframed items share the same geometry."
2506
+ ]
2507
+ }
2508
+ },
2509
+ "accessibility": {
2510
+ "obligations": [
2511
+ "An ordinary item adds no role or name; pass ariaLabel only when the item is a distinct named region (it then renders role=\"region\").",
2512
+ "focusTarget makes the item a programmatic focus target (tabindex=\"-1\", never a tab stop), such as a NavStack view's data-nav-focus target.",
2513
+ "The frame is decorative and never the only signal of state."
2514
+ ]
2515
+ },
2516
+ "cssValueProps": [],
2517
+ "boundaries": {
2518
+ "rootClass": "kui-content-item",
2415
2519
  "publicClasses": [
2416
- "kui-list-inset-text",
2417
- "kui-list-inset-text--horizontal"
2520
+ "kui-content-item",
2521
+ "kui-content-item--pill",
2522
+ "kui-content-item--framed"
2418
2523
  ],
2419
- "publicTokens": []
2524
+ "publicTokens": [
2525
+ "--kui-content-item-border",
2526
+ "--kui-content-item-radius",
2527
+ "--kui-content-item-background"
2528
+ ]
2420
2529
  },
2421
2530
  "diagnostics": [],
2422
2531
  "provenance": {
@@ -2848,9 +2957,9 @@
2848
2957
  "kui-token-search__trailing"
2849
2958
  ],
2850
2959
  "publicTokens": [
2851
- "--kui-color-accent",
2852
- "--kui-color-accent-text",
2853
- "--kui-color-border",
2960
+ "--kui-color-brand-fill-normal",
2961
+ "--kui-color-brand-on-quiet",
2962
+ "--kui-color-neutral-border-normal",
2854
2963
  "--kui-color-text-link",
2855
2964
  "--kui-color-surface",
2856
2965
  "--kui-color-text",
@@ -2943,7 +3052,7 @@
2943
3052
  "kui-resizable-region__restore"
2944
3053
  ],
2945
3054
  "publicTokens": [
2946
- "--kui-color-border",
3055
+ "--kui-color-neutral-border-normal",
2947
3056
  "--kui-color-neutral-on-quiet",
2948
3057
  "--kui-color-text-link",
2949
3058
  "--kui-focus-ring",
@@ -3002,7 +3111,10 @@
3002
3111
  "Verify the live value, standard events, focus, and rendered output.",
3003
3112
  "A nonempty label names the internal combobox; otherwise ariaLabel supplies a visually hidden label without adding control height, including custom selected content.",
3004
3113
  "Hint text is visible below the control through Web Awesome's native hint relationship; placeholderText remains the empty value inside the closed control.",
3005
- "Import select/register once; its scoped lifecycle adapter keeps the latest open/close request authoritative across animation reversals, canceled transitions, and removal. Do not add consumer popup timing or position repairs."
3114
+ "Import select/register once; its scoped lifecycle adapter keeps the latest open/close request authoritative across animation reversals, canceled transitions, and removal. Do not add consumer popup timing or position repairs.",
3115
+ "With multiple, the popup stays open while choices toggle (pointer, Enter, or Space) and closes on an outside press, Escape, or focus leaving; each chosen option shows a check, and the closed control summarizes the chosen labels in choice order.",
3116
+ "A multiple icon-only trigger shows its fixed triggerIcon and, while any choice is chosen, an aria-hidden count Badge; the combobox's accessible name ends with the chosen labels in choice order, and its hidden value stays empty.",
3117
+ "Once registered, an icon-only trigger (single or multiple) shows an aria-hidden Web Awesome help tag repeating its accessible name (a single Select adds its current choice) after a 500ms hover and at once on keyboard focus; it hides while the popup is open, on a press, and on Escape, and never joins aria-labelledby. Do not add a title or another tooltip."
3006
3118
  ]
3007
3119
  },
3008
3120
  "cssValueProps": [
@@ -3034,8 +3146,6 @@
3034
3146
  "kui-select__icon"
3035
3147
  ],
3036
3148
  "publicTokens": [
3037
- "--kui-color-brand-fill-normal",
3038
- "--kui-color-brand-on-fill",
3039
3149
  "--kui-color-neutral-border-quiet",
3040
3150
  "--kui-color-neutral-on-quiet",
3041
3151
  "--kui-disclosure-icon-scale",
@@ -3055,6 +3165,63 @@
3055
3165
  "composition": "README.md#web-awesome-theme"
3056
3166
  }
3057
3167
  },
3168
+ {
3169
+ "key": "@kerfjs/ui:popup-menu",
3170
+ "package": "@kerfjs/ui",
3171
+ "id": "popup-menu",
3172
+ "name": "PopupMenu",
3173
+ "kind": "component",
3174
+ "source": "kerf",
3175
+ "parents": { "mode": "any", "entries": [] },
3176
+ "contexts": ["application-ui"],
3177
+ "zones": [],
3178
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
3179
+ "state": [
3180
+ {
3181
+ "id": "commands and their delegated actions",
3182
+ "owner": "application",
3183
+ "required": false
3184
+ },
3185
+ {
3186
+ "id": "which items are enabled",
3187
+ "owner": "application",
3188
+ "required": false
3189
+ },
3190
+ {
3191
+ "id": "reactions to the menu opening or closing",
3192
+ "owner": "application",
3193
+ "required": false
3194
+ }
3195
+ ],
3196
+ "wiring": {
3197
+ "required": false,
3198
+ "helpers": [],
3199
+ "obligations": [],
3200
+ "stateAttributes": []
3201
+ },
3202
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
3203
+ "layout": {
3204
+ "roles": ["controls"],
3205
+ "geometry": { "margin": "none", "border": "child", "padding": "child" }
3206
+ },
3207
+ "accessibility": {
3208
+ "obligations": [
3209
+ "An icon-only trigger requires label, rendered as visually hidden slotted text because a Web Awesome button takes its accessible name from its content; a trigger with visible text is named by that text. Web Awesome provides menu roles, arrow-key navigation, typeahead, and Escape.",
3210
+ "Once registered, an icon-only trigger shows its label as an aria-hidden Web Awesome help tag after a 500ms hover and at once on keyboard focus; it hides while the menu is open, on a press, and on Escape, and never joins aria-labelledby. Do not add a title or another tooltip."
3211
+ ]
3212
+ },
3213
+ "cssValueProps": [],
3214
+ "boundaries": {
3215
+ "rootClass": "kui-popup-menu",
3216
+ "publicClasses": ["kui-popup-menu", "kui-popup-menu__label"],
3217
+ "publicTokens": []
3218
+ },
3219
+ "diagnostics": [],
3220
+ "provenance": {
3221
+ "selection": "ai/component-catalog.json",
3222
+ "composition": "generated-permissive-default"
3223
+ }
3224
+ },
3058
3225
  {
3059
3226
  "key": "@kerfjs/ui:feedback",
3060
3227
  "package": "@kerfjs/ui",