@kerfjs/ui 5.0.0-beta.55 → 5.0.0-beta.57

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 (418) hide show
  1. package/README.md +74 -41
  2. package/ai/application-ui-diagnostic-ids-v1.json +9 -1
  3. package/ai/application-ui-profile-sync.cjs +1 -1
  4. package/ai/application-ui-profile.defaults.json +63 -8
  5. package/ai/application-ui-profile.mjs +1 -1
  6. package/ai/compile-time-contracts-v1.json +2 -2
  7. package/ai/component-catalog.json +407 -80
  8. package/ai/component-catalog.schema.json +2 -0
  9. package/ai/component-class-owners.cjs +83 -0
  10. package/ai/component-composition-extension.d.ts +7 -0
  11. package/ai/component-composition-extension.schema.json +7 -0
  12. package/ai/{component-catalog-v2-overrides.json → component-composition-rules.json} +2 -1
  13. package/ai/{component-catalog-v2.d.ts → component-composition.d.ts} +9 -5
  14. package/ai/{component-catalog-v2.json → component-composition.json} +302 -61
  15. package/ai/{component-catalog-v2.schema.json → component-composition.schema.json} +21 -5
  16. package/ai/components/README.md +170 -0
  17. package/ai/components/application-tabs.md +65 -0
  18. package/ai/components/badge.md +72 -0
  19. package/ai/components/collapsible-panel.md +102 -0
  20. package/ai/components/content-item.md +90 -0
  21. package/ai/components/disclosure-arrow.md +77 -0
  22. package/ai/components/document-baseline.md +75 -0
  23. package/ai/components/empty-state.md +80 -0
  24. package/ai/components/feedback.md +71 -0
  25. package/ai/components/floating-toolbar.md +80 -0
  26. package/ai/components/foundation.md +65 -0
  27. package/ai/components/grid.md +93 -0
  28. package/ai/components/headers.md +63 -0
  29. package/ai/components/layout.md +75 -0
  30. package/ai/components/list-action-row.md +91 -0
  31. package/ai/components/list-header.md +89 -0
  32. package/ai/components/list-inset-control.md +74 -0
  33. package/ai/components/list-inset-text.md +72 -0
  34. package/ai/components/list-item.md +88 -0
  35. package/ai/components/list.md +103 -0
  36. package/ai/components/loading-spinner.md +72 -0
  37. package/ai/components/lucide-icon.md +66 -0
  38. package/ai/components/nav-stack.md +103 -0
  39. package/ai/components/pane.md +100 -0
  40. package/ai/components/popup-menu.md +82 -0
  41. package/ai/components/recipe-app-shell.md +57 -0
  42. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  43. package/ai/components/recipe-compact-toolbar.md +57 -0
  44. package/ai/components/recipe-composer-form.md +57 -0
  45. package/ai/components/recipe-list-detail-dialog.md +57 -0
  46. package/ai/components/recipe-list-workspace-states.md +57 -0
  47. package/ai/components/recipe-loading-inspector.md +57 -0
  48. package/ai/components/recipe-navigation-sidebar.md +57 -0
  49. package/ai/components/recipe-navigation-stack.md +57 -0
  50. package/ai/components/recipe-workspace-header.md +57 -0
  51. package/ai/components/resize.md +101 -0
  52. package/ai/components/row.md +96 -0
  53. package/ai/components/segmented-control.md +82 -0
  54. package/ai/components/select.md +107 -0
  55. package/ai/components/skeleton.md +84 -0
  56. package/ai/components/spacer.md +86 -0
  57. package/ai/components/split-view.md +102 -0
  58. package/ai/components/state-banner.md +92 -0
  59. package/ai/components/sunken-panel.md +79 -0
  60. package/ai/components/surface-scaffold.md +78 -0
  61. package/ai/components/tab-bar.md +112 -0
  62. package/ai/components/tab-scaffold.md +94 -0
  63. package/ai/components/tabs.md +90 -0
  64. package/ai/components/text.md +82 -0
  65. package/ai/components/token-search-field.md +101 -0
  66. package/ai/components/toolbar-control-group.md +100 -0
  67. package/ai/components/toolbar-text.md +76 -0
  68. package/ai/components/toolbar.md +95 -0
  69. package/ai/components/value-table.md +72 -0
  70. package/ai/components/wa-accordion-item.md +55 -0
  71. package/ai/components/wa-accordion.md +65 -0
  72. package/ai/components/wa-animated-image.md +55 -0
  73. package/ai/components/wa-animation.md +55 -0
  74. package/ai/components/wa-avatar.md +55 -0
  75. package/ai/components/wa-badge.md +55 -0
  76. package/ai/components/wa-breadcrumb-item.md +53 -0
  77. package/ai/components/wa-breadcrumb.md +55 -0
  78. package/ai/components/wa-button-group.md +59 -0
  79. package/ai/components/wa-button.md +55 -0
  80. package/ai/components/wa-callout.md +58 -0
  81. package/ai/components/wa-card.md +59 -0
  82. package/ai/components/wa-carousel-item.md +53 -0
  83. package/ai/components/wa-carousel.md +55 -0
  84. package/ai/components/wa-checkbox-group.md +55 -0
  85. package/ai/components/wa-checkbox.md +55 -0
  86. package/ai/components/wa-color-picker.md +55 -0
  87. package/ai/components/wa-comparison.md +55 -0
  88. package/ai/components/wa-copy-button.md +55 -0
  89. package/ai/components/wa-details.md +61 -0
  90. package/ai/components/wa-dialog.md +59 -0
  91. package/ai/components/wa-divider.md +53 -0
  92. package/ai/components/wa-drawer.md +55 -0
  93. package/ai/components/wa-dropdown-item.md +60 -0
  94. package/ai/components/wa-dropdown.md +60 -0
  95. package/ai/components/wa-format-bytes.md +53 -0
  96. package/ai/components/wa-format-date.md +53 -0
  97. package/ai/components/wa-format-number.md +53 -0
  98. package/ai/components/wa-icon.md +58 -0
  99. package/ai/components/wa-include.md +53 -0
  100. package/ai/components/wa-input.md +59 -0
  101. package/ai/components/wa-intersection-observer.md +53 -0
  102. package/ai/components/wa-known-date.md +53 -0
  103. package/ai/components/wa-markdown.md +53 -0
  104. package/ai/components/wa-mutation-observer.md +53 -0
  105. package/ai/components/wa-number-input.md +55 -0
  106. package/ai/components/wa-option.md +59 -0
  107. package/ai/components/wa-otp-input.md +53 -0
  108. package/ai/components/wa-page.md +53 -0
  109. package/ai/components/wa-pagination.md +55 -0
  110. package/ai/components/wa-popover.md +55 -0
  111. package/ai/components/wa-popup.md +53 -0
  112. package/ai/components/wa-progress-bar.md +53 -0
  113. package/ai/components/wa-progress-ring.md +53 -0
  114. package/ai/components/wa-qr-code.md +53 -0
  115. package/ai/components/wa-radio-group.md +59 -0
  116. package/ai/components/wa-radio.md +55 -0
  117. package/ai/components/wa-random-content.md +53 -0
  118. package/ai/components/wa-rating.md +55 -0
  119. package/ai/components/wa-relative-time.md +53 -0
  120. package/ai/components/wa-resize-observer.md +53 -0
  121. package/ai/components/wa-scroller.md +53 -0
  122. package/ai/components/wa-select.md +63 -0
  123. package/ai/components/wa-skeleton.md +53 -0
  124. package/ai/components/wa-slider.md +55 -0
  125. package/ai/components/wa-spinner.md +58 -0
  126. package/ai/components/wa-split-panel.md +58 -0
  127. package/ai/components/wa-switch.md +53 -0
  128. package/ai/components/wa-tab-group.md +69 -0
  129. package/ai/components/wa-tab-panel.md +60 -0
  130. package/ai/components/wa-tab.md +59 -0
  131. package/ai/components/wa-tag.md +59 -0
  132. package/ai/components/wa-textarea.md +53 -0
  133. package/ai/components/wa-time-input.md +55 -0
  134. package/ai/components/wa-toast-item.md +60 -0
  135. package/ai/components/wa-toast.md +60 -0
  136. package/ai/components/wa-tooltip.md +55 -0
  137. package/ai/components/wa-tree-item.md +55 -0
  138. package/ai/components/wa-tree.md +55 -0
  139. package/ai/components/wa-zoomable-frame.md +55 -0
  140. package/ai/components/workbench.md +114 -0
  141. package/ai/public-api-signatures-v1.md +572 -101
  142. package/ai/skill.md +107 -52
  143. package/ai/webawesome-jsx-signatures-v1.md +8 -2
  144. package/analyzer/component-ownership.d.mts +56 -0
  145. package/analyzer/component-ownership.mjs +184 -0
  146. package/analyzer/index.d.mts +3 -0
  147. package/analyzer/index.mjs +274 -20
  148. package/analyzer/selectors.d.mts +21 -0
  149. package/analyzer/selectors.mjs +212 -0
  150. package/dist/app-tab.js +1 -1
  151. package/dist/badge.d.ts +35 -7
  152. package/dist/badge.js +1 -1
  153. package/dist/browser/catalog.js +25 -0
  154. package/dist/browser/collapsible-panel.js +7 -0
  155. package/dist/browser/content-item.js +3 -0
  156. package/dist/browser/nav-stack.js +8 -0
  157. package/dist/browser/select.js +1 -0
  158. package/dist/browser/split-view.js +10 -0
  159. package/dist/browser/tab-scaffold.js +4 -0
  160. package/dist/browser/workbench.js +10 -0
  161. package/dist/catalog-resources.d.ts +12 -1
  162. package/dist/catalog.d.ts +14 -3
  163. package/dist/catalog.js +53 -43
  164. package/dist/catalog.js.map +1 -1
  165. package/dist/{chunk-WZ2GLEY4.js → chunk-2G2ZJQYK.js} +2 -14
  166. package/dist/chunk-2G2ZJQYK.js.map +1 -0
  167. package/dist/{chunk-R754MHXX.js → chunk-553ASUK6.js} +8 -8
  168. package/dist/chunk-553ASUK6.js.map +1 -0
  169. package/dist/{chunk-D7GWXIAS.js → chunk-5I7QGQVT.js} +1 -1
  170. package/dist/chunk-5I7QGQVT.js.map +1 -0
  171. package/dist/{chunk-RNRUVPJ3.js → chunk-63ZWBGE3.js} +3 -2
  172. package/dist/chunk-63ZWBGE3.js.map +1 -0
  173. package/dist/{chunk-44IG7PFV.js → chunk-6CINWX2E.js} +3 -3
  174. package/dist/{chunk-44IG7PFV.js.map → chunk-6CINWX2E.js.map} +1 -1
  175. package/dist/{chunk-MTM43SJO.js → chunk-6YFHCLHG.js} +2 -2
  176. package/dist/chunk-6YFHCLHG.js.map +1 -0
  177. package/dist/{chunk-C2FAYFDE.js → chunk-AGXQQFKZ.js} +2 -2
  178. package/dist/{chunk-C2FAYFDE.js.map → chunk-AGXQQFKZ.js.map} +1 -1
  179. package/dist/{chunk-ATHXW6RP.js → chunk-AHEG27M7.js} +2 -2
  180. package/dist/{chunk-ATHXW6RP.js.map → chunk-AHEG27M7.js.map} +1 -1
  181. package/dist/chunk-BFPBS5Y4.js +250 -0
  182. package/dist/chunk-BFPBS5Y4.js.map +1 -0
  183. package/dist/{chunk-5OLVUEND.js → chunk-DG6G5EPF.js} +4 -6
  184. package/dist/chunk-DG6G5EPF.js.map +1 -0
  185. package/dist/{chunk-LZXQVUGN.js → chunk-EVYKTVBQ.js} +5 -14
  186. package/dist/chunk-EVYKTVBQ.js.map +1 -0
  187. package/dist/{chunk-7GUQYHKA.js → chunk-EZVNC4J6.js} +7 -1
  188. package/dist/chunk-EZVNC4J6.js.map +1 -0
  189. package/dist/{chunk-RNZAKSME.js → chunk-F4QMLOXJ.js} +5 -4
  190. package/dist/chunk-F4QMLOXJ.js.map +1 -0
  191. package/dist/{chunk-EAX2GSS4.js → chunk-G2RKFVRB.js} +54 -20
  192. package/dist/chunk-G2RKFVRB.js.map +1 -0
  193. package/dist/chunk-JCV4GXWB.js +249 -0
  194. package/dist/chunk-JCV4GXWB.js.map +1 -0
  195. package/dist/chunk-K47P7QZC.js +17 -0
  196. package/dist/chunk-K47P7QZC.js.map +1 -0
  197. package/dist/{chunk-HMQ2ZDGG.js → chunk-KROD7KZK.js} +3 -2
  198. package/dist/chunk-KROD7KZK.js.map +1 -0
  199. package/dist/{chunk-5NDQABWK.js → chunk-M7QV3IHH.js} +3 -1
  200. package/dist/chunk-M7QV3IHH.js.map +1 -0
  201. package/dist/chunk-MA73TA6D.js +42 -0
  202. package/dist/chunk-MA73TA6D.js.map +1 -0
  203. package/dist/{chunk-ZMBU522F.js → chunk-MEY33VWB.js} +2 -2
  204. package/dist/{chunk-ZMBU522F.js.map → chunk-MEY33VWB.js.map} +1 -1
  205. package/dist/chunk-MP2GDBQZ.js +50 -0
  206. package/dist/chunk-MP2GDBQZ.js.map +1 -0
  207. package/dist/{chunk-3NBL3OUQ.js → chunk-NAPE7WUS.js} +2 -2
  208. package/dist/chunk-NAPE7WUS.js.map +1 -0
  209. package/dist/{chunk-BSKEH3UC.js → chunk-NBYTIVHS.js} +2 -2
  210. package/dist/{chunk-BSKEH3UC.js.map → chunk-NBYTIVHS.js.map} +1 -1
  211. package/dist/{chunk-T22EM4ET.js → chunk-OUK6QRDR.js} +71 -31
  212. package/dist/chunk-OUK6QRDR.js.map +1 -0
  213. package/dist/chunk-PWXNJS2B.js +115 -0
  214. package/dist/chunk-PWXNJS2B.js.map +1 -0
  215. package/dist/{chunk-GUIHMIT2.js → chunk-QOWG4ZCL.js} +5 -4
  216. package/dist/chunk-QOWG4ZCL.js.map +1 -0
  217. package/dist/{chunk-5I22LMCV.js → chunk-VZOFZPSO.js} +2 -2
  218. package/dist/chunk-VZOFZPSO.js.map +1 -0
  219. package/dist/{chunk-4BIMLITI.js → chunk-WLG6SSNT.js} +5 -3
  220. package/dist/chunk-WLG6SSNT.js.map +1 -0
  221. package/dist/{chunk-NE5JAOQS.js → chunk-WOUF7YXM.js} +3 -3
  222. package/dist/{chunk-NE5JAOQS.js.map → chunk-WOUF7YXM.js.map} +1 -1
  223. package/dist/{chunk-N7FHFNT6.js → chunk-XCO6YCYM.js} +34 -5
  224. package/dist/chunk-XCO6YCYM.js.map +1 -0
  225. package/dist/{chunk-TZ5IHWB2.js → chunk-XDKAYSVD.js} +5 -3
  226. package/dist/chunk-XDKAYSVD.js.map +1 -0
  227. package/dist/collapsible-panel.d.ts +14 -3
  228. package/dist/collapsible-panel.js +13 -16
  229. package/dist/collapsible-panel.js.map +1 -1
  230. package/dist/content-item.d.ts +46 -0
  231. package/dist/content-item.js +4 -0
  232. package/dist/content-item.js.map +1 -0
  233. package/dist/css-values.d.ts +5 -11
  234. package/dist/css-values.js +1 -1
  235. package/dist/disclosure-arrow.d.ts +4 -1
  236. package/dist/disclosure-arrow.js +1 -1
  237. package/dist/floating-toolbar.d.ts +17 -6
  238. package/dist/floating-toolbar.js +1 -1
  239. package/dist/grid.js +1 -1
  240. package/dist/help-tags-register.d.ts +13 -0
  241. package/dist/help-tags-register.js +9 -0
  242. package/dist/help-tags-register.js.map +1 -0
  243. package/dist/index.d.ts +7 -5
  244. package/dist/index.js +29 -26
  245. package/dist/list-action-row.js +2 -1
  246. package/dist/list-header.d.ts +14 -1
  247. package/dist/list-header.js +1 -1
  248. package/dist/list-inset-control.d.ts +1 -1
  249. package/dist/list-inset-control.js +1 -1
  250. package/dist/list-inset-text.d.ts +3 -10
  251. package/dist/list-inset-text.js +1 -1
  252. package/dist/list-item.js +2 -1
  253. package/dist/list.d.ts +10 -3
  254. package/dist/list.js +1 -1
  255. package/dist/nav-stack.d.ts +50 -5
  256. package/dist/nav-stack.js +4 -1
  257. package/dist/pane.d.ts +37 -2
  258. package/dist/pane.js +1 -1
  259. package/dist/{panel-toolbar-BFQxFITu.d.ts → panel-toolbar-BN4x0rth.d.ts} +13 -1
  260. package/dist/popup-menu-register.js +3 -2
  261. package/dist/popup-menu-register.js.map +1 -1
  262. package/dist/popup-menu.js +1 -1
  263. package/dist/row.d.ts +1 -1
  264. package/dist/row.js +1 -1
  265. package/dist/select-register.js +70 -3
  266. package/dist/select-register.js.map +1 -1
  267. package/dist/select.d.ts +46 -8
  268. package/dist/select.js +2 -1
  269. package/dist/{divider-sides-BzB6rphT.d.ts → sides-BPSWde0A.d.ts} +1 -3
  270. package/dist/skeleton.js +1 -1
  271. package/dist/spacer.js +1 -1
  272. package/dist/split-view.d.ts +31 -3
  273. package/dist/split-view.js +34 -5
  274. package/dist/split-view.js.map +1 -1
  275. package/dist/state-banner.js +1 -1
  276. package/dist/styles/app-tab.css +31 -0
  277. package/dist/styles/badge.css +32 -11
  278. package/dist/styles/catalog/components/catalog-example.css +1 -1
  279. package/dist/styles/catalog/components/catalog-stage.css +1 -1
  280. package/dist/styles/collapsible-panel.css +199 -42
  281. package/dist/styles/content-item.css +30 -0
  282. package/dist/styles/floating-toolbar.css +26 -2
  283. package/dist/styles/foundation.css +28 -19
  284. package/dist/styles/layout.css +1 -21
  285. package/dist/styles/list-action-row.css +13 -1
  286. package/dist/styles/list-header.css +0 -12
  287. package/dist/styles/list-inset-text.css +1 -2
  288. package/dist/styles/list-item.css +14 -1
  289. package/dist/styles/list.css +5 -5
  290. package/dist/styles/nav-stack.css +63 -71
  291. package/dist/styles/pane.css +83 -1
  292. package/dist/styles/popup-menu.css +229 -0
  293. package/dist/styles/resizable-region.css +70 -15
  294. package/dist/styles/select.css +60 -19
  295. package/dist/styles/skeleton.css +30 -3
  296. package/dist/styles/split-view.css +31 -32
  297. package/dist/styles/state-banner.css +0 -19
  298. package/dist/styles/surface-scaffold.css +8 -3
  299. package/dist/styles/tab-bar.css +79 -28
  300. package/dist/styles/tab-scaffold.css +60 -14
  301. package/dist/styles/text.css +17 -1
  302. package/dist/styles/token-search-field.css +4 -4
  303. package/dist/styles/toolbar-control-group.css +143 -69
  304. package/dist/styles/toolbar-text.css +21 -0
  305. package/dist/styles/toolbar.css +22 -37
  306. package/dist/styles/value-table.css +19 -2
  307. package/dist/styles/webawesome.css +3 -1
  308. package/dist/styles/workbench.css +145 -42
  309. package/dist/tab-scaffold.d.ts +46 -2
  310. package/dist/tab-scaffold.js +52 -16
  311. package/dist/tab-scaffold.js.map +1 -1
  312. package/dist/token-search-field.d.ts +4 -2
  313. package/dist/token-search-field.js +1 -1
  314. package/dist/toolbar-text.d.ts +7 -1
  315. package/dist/toolbar-text.js +1 -1
  316. package/dist/toolbar.d.ts +20 -5
  317. package/dist/toolbar.js +1 -1
  318. package/dist/{types-D6vzj-VT.d.ts → types-BuHELdXR.d.ts} +39 -6
  319. package/dist/value-table.js +1 -1
  320. package/dist/webawesome.d.ts +7 -1
  321. package/dist/wire-catalog.d.ts +15 -2
  322. package/dist/wire-catalog.js +12 -2
  323. package/dist/wire-catalog.js.map +1 -1
  324. package/dist/wire-scroll-dividers.d.ts +69 -0
  325. package/dist/wire-scroll-dividers.js +3 -0
  326. package/dist/wire-scroll-dividers.js.map +1 -0
  327. package/dist/wire-token-search-fields.js +1 -1
  328. package/dist/workbench.d.ts +60 -22
  329. package/dist/workbench.js +1 -1
  330. package/docs/accessibility.md +116 -7
  331. package/docs/app-layouts.md +18 -8
  332. package/docs/catalog.md +26 -7
  333. package/docs/collapsible-panel.md +32 -9
  334. package/docs/component-contract.md +182 -30
  335. package/docs/component-selection.md +59 -46
  336. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  337. package/docs/design/templates/empty-state/with-action.svg +1 -1
  338. package/docs/design/templates/empty-state-dark.svg +1 -1
  339. package/docs/design/templates/empty-state.svg +1 -1
  340. package/docs/design/templates/list/compact-dark.svg +1 -1
  341. package/docs/design/templates/list/compact.svg +1 -1
  342. package/docs/design/templates/list/stack-dark.svg +1 -1
  343. package/docs/design/templates/list/stack.svg +1 -1
  344. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  345. package/docs/design/templates/list-action-row/default.svg +1 -1
  346. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  347. package/docs/design/templates/list-action-row/selected.svg +1 -1
  348. package/docs/design/templates/list-action-row-dark.svg +1 -1
  349. package/docs/design/templates/list-action-row.svg +1 -1
  350. package/docs/design/templates/list-dark.svg +1 -1
  351. package/docs/design/templates/list-item/default-dark.svg +1 -1
  352. package/docs/design/templates/list-item/default.svg +1 -1
  353. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  354. package/docs/design/templates/list-item/selected.svg +1 -1
  355. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  356. package/docs/design/templates/list-item/trailing.svg +1 -1
  357. package/docs/design/templates/list-item-dark.svg +1 -1
  358. package/docs/design/templates/list-item.svg +1 -1
  359. package/docs/design/templates/list.svg +1 -1
  360. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  361. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  362. package/docs/design/templates/tab-bar-dark.svg +1 -1
  363. package/docs/design/templates/tab-bar.svg +1 -1
  364. package/docs/design/templates/value-table/details-dark.svg +1 -1
  365. package/docs/design/templates/value-table/details.svg +1 -1
  366. package/docs/design/templates/value-table-dark.svg +1 -1
  367. package/docs/design/templates/value-table.svg +1 -1
  368. package/docs/design-philosophy.md +31 -4
  369. package/docs/examples/application-ui-profile.json +4 -4
  370. package/docs/examples/command-palette-adapter.tsx +3 -2
  371. package/docs/examples/{component-catalog-extension-v2.json → component-composition-extension.json} +3 -3
  372. package/docs/layout.md +148 -29
  373. package/docs/nav-stack.md +77 -3
  374. package/docs/recipes.md +4 -3
  375. package/docs/split-view.md +54 -5
  376. package/docs/tab-scaffold.md +73 -2
  377. package/docs/type-contracts.md +21 -20
  378. package/docs/ui-analyzer.md +99 -5
  379. package/docs/ui-doctor.md +10 -0
  380. package/docs/ux-demo.md +2 -2
  381. package/docs/webawesome-theme.md +1 -2
  382. package/docs/workbench.md +57 -11
  383. package/doctor/index.mjs +6 -1
  384. package/llms.txt +117 -24
  385. package/package.json +29 -6
  386. package/ux-demo/recipes/collapsible-sidebar.tsx +3 -3
  387. package/ux-demo/recipes/composer-form.tsx +0 -1
  388. package/ux-demo/recipes/list-detail-dialog.tsx +0 -2
  389. package/ux-demo/recipes/list-workspace-states.tsx +0 -1
  390. package/ux-demo/recipes/loading-inspector.tsx +0 -1
  391. package/ux-demo/recipes/navigation-sidebar.tsx +3 -2
  392. package/ux-demo/recipes/navigation-stack.tsx +3 -2
  393. package/ux-demo/recipes/workspace-header.tsx +0 -1
  394. package/ai/component-catalog-extension-v2.d.ts +0 -7
  395. package/ai/component-catalog-extension-v2.schema.json +0 -7
  396. package/dist/chunk-3NBL3OUQ.js.map +0 -1
  397. package/dist/chunk-4BIMLITI.js.map +0 -1
  398. package/dist/chunk-5I22LMCV.js.map +0 -1
  399. package/dist/chunk-5NDQABWK.js.map +0 -1
  400. package/dist/chunk-5OLVUEND.js.map +0 -1
  401. package/dist/chunk-7GUQYHKA.js.map +0 -1
  402. package/dist/chunk-D7GWXIAS.js.map +0 -1
  403. package/dist/chunk-DQA5FMOX.js +0 -85
  404. package/dist/chunk-DQA5FMOX.js.map +0 -1
  405. package/dist/chunk-EAX2GSS4.js.map +0 -1
  406. package/dist/chunk-GUIHMIT2.js.map +0 -1
  407. package/dist/chunk-HMQ2ZDGG.js.map +0 -1
  408. package/dist/chunk-LZXQVUGN.js.map +0 -1
  409. package/dist/chunk-MTM43SJO.js.map +0 -1
  410. package/dist/chunk-N7FHFNT6.js.map +0 -1
  411. package/dist/chunk-R754MHXX.js.map +0 -1
  412. package/dist/chunk-RNRUVPJ3.js.map +0 -1
  413. package/dist/chunk-RNZAKSME.js.map +0 -1
  414. package/dist/chunk-T22EM4ET.js.map +0 -1
  415. package/dist/chunk-TZ5IHWB2.js.map +0 -1
  416. package/dist/chunk-WZ2GLEY4.js.map +0 -1
  417. package/dist/chunk-XD7DWYXG.js +0 -34
  418. package/dist/chunk-XD7DWYXG.js.map +0 -1
@@ -33,11 +33,11 @@
33
33
  "neutral, brand, pop, success, warning, or danger tone",
34
34
  "quiet, solid, or outline appearance",
35
35
  "pill or rounded shape",
36
- "compact or default size",
36
+ "compact or default size, or a text-free dot (size: 'dot')",
37
37
  "labeled or decorative duplicate"
38
38
  ],
39
39
  "accessibility": [
40
- "Badge is non-interactive. Supply label when visible content is abbreviated, and ariaHidden when it repeats an accessible name owned by the surrounding component.",
40
+ "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.",
41
41
  "Keep meaningful text visible because tone is supplementary."
42
42
  ],
43
43
  "geometry": {
@@ -133,6 +133,31 @@
133
133
  "publicExports": [
134
134
  "DisclosureArrow"
135
135
  ],
136
+ "cssValueProps": [
137
+ {
138
+ "path": "size",
139
+ "grammar": "length",
140
+ "helpers": [
141
+ "px",
142
+ "rem",
143
+ "em",
144
+ "pct",
145
+ "space",
146
+ "lengthVar",
147
+ "calc"
148
+ ],
149
+ "nonStandaloneHelpers": [
150
+ "plus"
151
+ ],
152
+ "shorthands": [],
153
+ "canonicalShorthands": [],
154
+ "exceptionalShorthands": [],
155
+ "rawPolicy": "forbid",
156
+ "examples": [
157
+ "size={remify(24)}"
158
+ ]
159
+ }
160
+ ],
136
161
  "useWhen": [
137
162
  "Add a shortest-path rotating indicator to a control that owns open and closed state; author replacement icon content facing right before direction transforms are applied."
138
163
  ],
@@ -331,18 +356,6 @@
331
356
  "--kui-color-danger-on-normal",
332
357
  "--kui-color-danger-on-loud",
333
358
  "--kui-color-danger-on-fill",
334
- "--kui-color-border",
335
- "--kui-color-border-quiet",
336
- "--kui-color-accent",
337
- "--kui-color-accent-text",
338
- "--kui-color-pop",
339
- "--kui-color-pop-text",
340
- "--kui-color-success",
341
- "--kui-color-success-text",
342
- "--kui-color-warning",
343
- "--kui-color-warning-text",
344
- "--kui-color-danger",
345
- "--kui-color-danger-text",
346
359
  "--kui-focus-ring",
347
360
  "--kui-shadow-s",
348
361
  "--kui-shadow-l"
@@ -407,6 +420,9 @@
407
420
  "publicClasses": [
408
421
  "kui-app-root"
409
422
  ],
423
+ "placeableClasses": [
424
+ "kui-app-root"
425
+ ],
410
426
  "publicTokens": [],
411
427
  "links": {
412
428
  "catalogRoute": "?component=document-baseline",
@@ -421,7 +437,9 @@
421
437
  "kind": "composition",
422
438
  "source": "kerf",
423
439
  "description": "Unpadded panes, 24px content stacks, and self-contained 8/1/8 content items for application layout boundaries.",
424
- "uses": [],
440
+ "uses": [
441
+ "content-item"
442
+ ],
425
443
  "purpose": "Provide one reusable pane, toolbar, content stack, and content-item geometry across sidebars, main areas, and dialogs.",
426
444
  "publicExports": [],
427
445
  "useWhen": [
@@ -442,8 +460,6 @@
442
460
  "variants": [
443
461
  "toolbar + content",
444
462
  "toolbar + content + footer",
445
- "rounded content item",
446
- "pill content item",
447
463
  "hidden inline-start pane restored from main-toolbar leading",
448
464
  "hidden inline-end pane restored from main-toolbar trailing"
449
465
  ],
@@ -465,8 +481,12 @@
465
481
  "wiring": [],
466
482
  "publicClasses": [
467
483
  "kui-content",
468
- "kui-content-item",
469
- "kui-content-item--pill",
484
+ "kui-control-cluster",
485
+ "kui-inline-metadata",
486
+ "kui-scroll-owner"
487
+ ],
488
+ "placeableClasses": [
489
+ "kui-content",
470
490
  "kui-control-cluster",
471
491
  "kui-inline-metadata",
472
492
  "kui-scroll-owner"
@@ -497,11 +517,13 @@
497
517
  "uses": [],
498
518
  "purpose": "Organize a sidebar, main area, inspector, or dialog column into fixed vertical header/footer chrome around one scrolling content owner.",
499
519
  "publicExports": [
500
- "Pane"
520
+ "Pane",
521
+ "wireScrollDividers"
501
522
  ],
502
523
  "useWhen": [
503
524
  "An application column needs shared header, content, and optional footer organization with exactly one scrolling content owner.",
504
- "A pane boundary needs an opt-in separator on any combination of logical sides."
525
+ "A pane boundary needs an opt-in separator on any combination of logical sides.",
526
+ "Pinned chrome needs a divider from the scrolling content only while content is scrolled beneath it (wireScrollDividers)."
505
527
  ],
506
528
  "avoidWhen": [
507
529
  "Do not use Pane as a padded card or add a competing scroll owner around its content slot.",
@@ -520,7 +542,8 @@
520
542
  "header, content, and footer children",
521
543
  "which logical boundaries show separators",
522
544
  "which sides may compensate for device safe areas in an app-owned arrangement (safeAreaEdges)",
523
- "responsive placement and visibility"
545
+ "responsive placement and visibility",
546
+ "whether the chrome dividers follow the scroll, always show, or never show (chromeDividers)"
524
547
  ],
525
548
  "variants": [
526
549
  "content only",
@@ -529,7 +552,9 @@
529
552
  "block-start separator",
530
553
  "block-end separator",
531
554
  "inline-start separator",
532
- "inline-end separator"
555
+ "inline-end separator",
556
+ "chrome dividers only while scrolled (default, wired by wireScrollDividers)",
557
+ "always or no chrome dividers"
533
558
  ],
534
559
  "accessibility": [
535
560
  "Choose semantic root and content elements that match the region and provide labels for landmark elements.",
@@ -551,7 +576,25 @@
551
576
  "browser-condition-css"
552
577
  ]
553
578
  },
554
- "wiring": [],
579
+ "wiring": [
580
+ {
581
+ "export": "wireScrollDividers",
582
+ "import": "@kerfjs/ui/wire-scroll-dividers",
583
+ "required": false,
584
+ "stateAttributes": [
585
+ {
586
+ "name": "data-scroll-overflow",
587
+ "on": "kui-pane__content",
588
+ "meaning": "The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it."
589
+ },
590
+ {
591
+ "name": "data-scroll-divider",
592
+ "on": "kui-pane__header and kui-pane__footer",
593
+ "meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
594
+ }
595
+ ]
596
+ }
597
+ ],
555
598
  "publicClasses": [
556
599
  "kui-pane",
557
600
  "kui-pane__content",
@@ -581,11 +624,14 @@
581
624
  "source": "kerf",
582
625
  "description": "A controlled one-pane navigation stack that keeps prior views mounted, slides content on push and pop, cross-fades per-view chrome, and moves/restores focus.",
583
626
  "uses": [
627
+ "toolbar",
628
+ "toolbar-control-group",
584
629
  "toolbar-text"
585
630
  ],
586
631
  "purpose": "Present a single linear or drill-down flow while preserving each prior view's state, scroll position, and place in the stack.",
587
632
  "publicExports": [
588
633
  "NavStackView",
634
+ "NavStackToolbarConfig",
589
635
  "NavStackProps",
590
636
  "NavStack"
591
637
  ],
@@ -614,17 +660,25 @@
614
660
  "view content and titles",
615
661
  "push and pop actions",
616
662
  "preferred initial focus targets when DOM order is insufficient",
617
- "per-view bottom toolbar content or a persistent fallback"
663
+ "per-view bottom toolbar content or a persistent fallback",
664
+ "per-view leading, center, and trailing top-toolbar groups",
665
+ "top-toolbar configuration, title size, and heading level",
666
+ "whether the chrome and bottom-toolbar dividers follow the scroll, always show, or never show (chromeDividers)"
618
667
  ],
619
668
  "variants": [
620
669
  "single root view",
621
670
  "pushed detail view",
622
671
  "toolbar hidden",
672
+ "configured top toolbar",
673
+ "custom back icon or visible back text",
623
674
  "per-view bottom toolbar",
624
- "persistent bottom-toolbar fallback"
675
+ "persistent bottom-toolbar fallback",
676
+ "chrome and bottom-toolbar dividers only while the active view scrolls beneath them (wired by wireScrollDividers)",
677
+ "permanent or no chrome dividers (chromeDividers always or none)"
625
678
  ],
626
679
  "accessibility": [
627
- "Give the stack region an accessible label and every back control a stable action label.",
680
+ "Give the stack region an accessible label and every back control a stable action label; visible backText names the control itself.",
681
+ "Set toolbarConfig.headingLevel when the view title is the page's or section's heading landmark.",
628
682
  "Use wireNavStack so each controlled push moves focus into the new top view and each pop restores the revealed view's remembered descendant.",
629
683
  "Mark a preferred initial heading or control with data-nav-focus when the first enabled focusable descendant is not the right target."
630
684
  ],
@@ -633,14 +687,16 @@
633
687
  "border": "conditional",
634
688
  "padding": "child",
635
689
  "notes": [
636
- "The stack owns its full-height chrome and viewport; each view owns its internal content padding and scrollable content."
690
+ "The stack owns its full-height chrome and viewport; each view owns its internal content padding and scrollable content.",
691
+ "The top chrome's bottom line and the bottom toolbar's top line are scroll state (wireScrollDividers), drawn as an overlaid 1px pseudo-element on the chrome and the bottom toolbar's always-present 1px top border, so neither moves the chrome or the content."
637
692
  ]
638
693
  },
639
694
  "delivery": {
640
695
  "moduleImport": "@kerfjs/ui/nav-stack",
696
+ "browserImport": "@kerfjs/ui/nav-stack",
641
697
  "manualCssImport": "@kerfjs/ui/nav-stack.css",
642
698
  "sideEffects": [
643
- "manual-css"
699
+ "browser-condition-css"
644
700
  ]
645
701
  },
646
702
  "wiring": [
@@ -665,6 +721,23 @@
665
721
  "meaning": "\"true\" on a popped view the helper briefly re-inserts to slide it out."
666
722
  }
667
723
  ]
724
+ },
725
+ {
726
+ "export": "wireScrollDividers",
727
+ "import": "@kerfjs/ui/wire-scroll-dividers",
728
+ "required": false,
729
+ "stateAttributes": [
730
+ {
731
+ "name": "data-scroll-overflow",
732
+ "on": "the active kui-nav-stack__view, or the kui-pane__content of a sole Pane in it",
733
+ "meaning": "The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it."
734
+ },
735
+ {
736
+ "name": "data-scroll-divider",
737
+ "on": "kui-nav-stack__chrome and kui-nav-stack__bottom",
738
+ "meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
739
+ }
740
+ ]
668
741
  }
669
742
  ],
670
743
  "publicClasses": [
@@ -675,11 +748,6 @@
675
748
  "kui-nav-stack__chrome-copy",
676
749
  "kui-nav-stack__chrome-copy--bottom",
677
750
  "kui-nav-stack__chrome-copy--exiting",
678
- "kui-nav-stack__lead",
679
- "kui-nav-stack__back",
680
- "kui-nav-stack__back-icon",
681
- "kui-nav-stack__title",
682
- "kui-nav-stack__actions",
683
751
  "kui-nav-stack__viewport",
684
752
  "kui-nav-stack__view",
685
753
  "kui-nav-stack__view--entering",
@@ -709,7 +777,9 @@
709
777
  "publicExports": [
710
778
  "SplitView",
711
779
  "SplitViewProps",
712
- "SplitViewResizable"
780
+ "SplitViewResizable",
781
+ "SplitViewCompactStack",
782
+ "SplitViewCompactViewToolbars"
713
783
  ],
714
784
  "useWhen": [
715
785
  "Selection in a primary list updates a related detail pane and both should remain visible on roomy device classes.",
@@ -736,13 +806,17 @@
736
806
  "selected item and detail-active state",
737
807
  "list and detail content",
738
808
  "optional list width and persistence",
809
+ "optional list collapse state and its restore control",
810
+ "compact list and detail toolbar groups, toolbar configuration, and chrome dividers",
739
811
  "back action"
740
812
  ],
741
813
  "variants": [
742
814
  "fixed roomy split",
743
815
  "resizable roomy split",
816
+ "collapsed resizable list with a restore control",
744
817
  "compact list",
745
- "compact detail"
818
+ "compact detail",
819
+ "compact stack with configured toolbars"
746
820
  ],
747
821
  "accessibility": [
748
822
  "Give the overall split and both meaningful panes accessible labels.",
@@ -758,9 +832,10 @@
758
832
  },
759
833
  "delivery": {
760
834
  "moduleImport": "@kerfjs/ui/split-view",
835
+ "browserImport": "@kerfjs/ui/split-view",
761
836
  "manualCssImport": "@kerfjs/ui/split-view.css",
762
837
  "sideEffects": [
763
- "manual-css"
838
+ "browser-condition-css"
764
839
  ]
765
840
  },
766
841
  "wiring": [
@@ -826,7 +901,9 @@
826
901
  "kind": "component",
827
902
  "source": "kerf",
828
903
  "description": "A controlled compact-device bottom tab scaffold that keeps every tab scene mounted so its navigation and scroll state survive selection changes.",
829
- "uses": [],
904
+ "uses": [
905
+ "badge"
906
+ ],
830
907
  "purpose": "Switch among two to five co-equal top-level destinations on compact devices while preserving each destination's independent content state.",
831
908
  "publicExports": [
832
909
  "TabScaffoldTab",
@@ -856,31 +933,39 @@
856
933
  "appOwns": [
857
934
  "controlled active tab id",
858
935
  "tab labels, icons, and content",
936
+ "tab badge counts or dots and their localized badgeLabel phrases",
859
937
  "routing and persistence",
860
- "responsive replacement on larger device classes"
938
+ "responsive replacement on larger device classes",
939
+ "whether the bar divider follows the scroll, always shows, or never shows (chromeDividers)"
861
940
  ],
862
941
  "variants": [
863
942
  "text-only tabs",
864
943
  "icon and text tabs",
865
- "one NavStack per tab"
944
+ "badged tabs (count or text-free dot)",
945
+ "one NavStack per tab",
946
+ "bar divider only while the active scene continues below it (wired by wireScrollDividers)",
947
+ "permanent or no bar divider (chromeDividers always or none)"
866
948
  ],
867
949
  "accessibility": [
868
950
  "Give the tablist an accessible label and keep exactly the active tab in the sequential focus order.",
869
- "Wire selection through the controlled active id while leaving inactive scenes mounted and hidden."
951
+ "Wire selection through the controlled active id while leaving inactive scenes mounted and hidden.",
952
+ "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."
870
953
  ],
871
954
  "geometry": {
872
955
  "margin": "none",
873
- "border": "self",
956
+ "border": "conditional",
874
957
  "padding": "self",
875
958
  "notes": [
876
- "The scaffold owns the full-height scene region and safe-area-aware bottom bar; scene content owns its internal geometry."
959
+ "The scaffold owns the full-height scene region and safe-area-aware bottom bar; scene content owns its internal geometry.",
960
+ "The bar's top line is scroll state (wireScrollDividers): it shows only while the active scene's content continues below the bar, by coloring the bar's always-present 1px top border."
877
961
  ]
878
962
  },
879
963
  "delivery": {
880
964
  "moduleImport": "@kerfjs/ui/tab-scaffold",
965
+ "browserImport": "@kerfjs/ui/tab-scaffold",
881
966
  "manualCssImport": "@kerfjs/ui/tab-scaffold.css",
882
967
  "sideEffects": [
883
- "manual-css"
968
+ "browser-condition-css"
884
969
  ]
885
970
  },
886
971
  "wiring": [
@@ -888,6 +973,23 @@
888
973
  "export": "wireTabScaffold",
889
974
  "import": "@kerfjs/ui/wire-tab-scaffold",
890
975
  "required": true
976
+ },
977
+ {
978
+ "export": "wireScrollDividers",
979
+ "import": "@kerfjs/ui/wire-scroll-dividers",
980
+ "required": false,
981
+ "stateAttributes": [
982
+ {
983
+ "name": "data-scroll-overflow",
984
+ "on": "the active kui-tab-scaffold__scene, or what scrolls inside it (a sole NavStack's active view or a sole Pane's content)",
985
+ "meaning": "The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it."
986
+ },
987
+ {
988
+ "name": "data-scroll-divider",
989
+ "on": "kui-tab-scaffold__bar",
990
+ "meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
991
+ }
992
+ ]
891
993
  }
892
994
  ],
893
995
  "publicClasses": [
@@ -897,6 +999,7 @@
897
999
  "kui-tab-scaffold__bar",
898
1000
  "kui-tab-scaffold__tab",
899
1001
  "kui-tab-scaffold__tab-icon",
1002
+ "kui-tab-scaffold__tab-badge",
900
1003
  "kui-tab-scaffold__tab-label"
901
1004
  ],
902
1005
  "publicTokens": [],
@@ -967,7 +1070,8 @@
967
1070
  "clipped, scrolling, or popup-visible content",
968
1071
  "inline, overlay, or hidden responsive presentation",
969
1072
  "narrow or compact single-track responsive fill",
970
- "safe-area restore control"
1073
+ "safe-area restore control",
1074
+ "chrome dividers only while scrolled (wired by wireScrollDividers)"
971
1075
  ],
972
1076
  "accessibility": [
973
1077
  "Give the Workbench and each meaningful rail or drawer an accessible label.",
@@ -986,9 +1090,10 @@
986
1090
  },
987
1091
  "delivery": {
988
1092
  "moduleImport": "@kerfjs/ui/workbench",
1093
+ "browserImport": "@kerfjs/ui/workbench",
989
1094
  "manualCssImport": "@kerfjs/ui/workbench.css",
990
1095
  "sideEffects": [
991
- "manual-css"
1096
+ "browser-condition-css"
992
1097
  ]
993
1098
  },
994
1099
  "wiring": [
@@ -1008,6 +1113,23 @@
1008
1113
  "meaning": "Present on a resizable rail or the drawer while a pointer drag resizes it."
1009
1114
  }
1010
1115
  ]
1116
+ },
1117
+ {
1118
+ "export": "wireScrollDividers",
1119
+ "import": "@kerfjs/ui/wire-scroll-dividers",
1120
+ "required": false,
1121
+ "stateAttributes": [
1122
+ {
1123
+ "name": "data-scroll-overflow",
1124
+ "on": "kui-pane__content of each panel and work-area Pane",
1125
+ "meaning": "The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it."
1126
+ },
1127
+ {
1128
+ "name": "data-scroll-divider",
1129
+ "on": "kui-pane__header and kui-pane__footer of each panel and work-area Pane",
1130
+ "meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
1131
+ }
1132
+ ]
1011
1133
  }
1012
1134
  ],
1013
1135
  "publicClasses": [
@@ -1100,7 +1222,8 @@
1100
1222
  "hidden separator",
1101
1223
  "slide, fade-slide, or instant content",
1102
1224
  "clipped, scrolling, or popup-visible content",
1103
- "safe-area restore control"
1225
+ "safe-area restore control",
1226
+ "chrome dividers only while scrolled (wired by wireScrollDividers)"
1104
1227
  ],
1105
1228
  "accessibility": [
1106
1229
  "Give the panel region and every collapse or restore control an accessible label.",
@@ -1116,9 +1239,10 @@
1116
1239
  },
1117
1240
  "delivery": {
1118
1241
  "moduleImport": "@kerfjs/ui/collapsible-panel",
1242
+ "browserImport": "@kerfjs/ui/collapsible-panel",
1119
1243
  "manualCssImport": "@kerfjs/ui/collapsible-panel.css",
1120
1244
  "sideEffects": [
1121
- "manual-css"
1245
+ "browser-condition-css"
1122
1246
  ]
1123
1247
  },
1124
1248
  "wiring": [
@@ -1143,6 +1267,23 @@
1143
1267
  "meaning": "Keeps the injected compact-overlay backdrop through the application's re-render; the helper creates and removes the backdrop itself."
1144
1268
  }
1145
1269
  ]
1270
+ },
1271
+ {
1272
+ "export": "wireScrollDividers",
1273
+ "import": "@kerfjs/ui/wire-scroll-dividers",
1274
+ "required": false,
1275
+ "stateAttributes": [
1276
+ {
1277
+ "name": "data-scroll-overflow",
1278
+ "on": "kui-pane__content of each panel and work-area Pane",
1279
+ "meaning": "The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it."
1280
+ },
1281
+ {
1282
+ "name": "data-scroll-divider",
1283
+ "on": "kui-pane__header and kui-pane__footer of each panel and work-area Pane",
1284
+ "meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
1285
+ }
1286
+ ]
1146
1287
  }
1147
1288
  ],
1148
1289
  "publicClasses": [
@@ -1272,8 +1413,8 @@
1272
1413
  "which screen edges an app bar or bottom bar outside a Pane header or footer claims for device safe areas (safeAreaEdges)"
1273
1414
  ],
1274
1415
  "variants": [
1275
- "bottom divider (default)",
1276
- "no dividers",
1416
+ "no dividers (default)",
1417
+ "scroll dividers when named as wireScrollDividers targets chrome",
1277
1418
  "top/right/bottom/left divider combinations",
1278
1419
  "centered content",
1279
1420
  "stacked zones at compact or narrow widths",
@@ -1301,7 +1442,25 @@
1301
1442
  "browser-condition-css"
1302
1443
  ]
1303
1444
  },
1304
- "wiring": [],
1445
+ "wiring": [
1446
+ {
1447
+ "export": "wireScrollDividers",
1448
+ "import": "@kerfjs/ui/wire-scroll-dividers",
1449
+ "required": false,
1450
+ "stateAttributes": [
1451
+ {
1452
+ "name": "data-scroll-overflow",
1453
+ "on": "the targets scroller",
1454
+ "meaning": "The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it."
1455
+ },
1456
+ {
1457
+ "name": "data-scroll-divider",
1458
+ "on": "a Toolbar named as targets chrome",
1459
+ "meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
1460
+ }
1461
+ ]
1462
+ }
1463
+ ],
1305
1464
  "publicClasses": [
1306
1465
  "kui-toolbar",
1307
1466
  "kui-toolbar__center",
@@ -1309,7 +1468,7 @@
1309
1468
  "kui-toolbar__trailing"
1310
1469
  ],
1311
1470
  "publicTokens": [
1312
- "--kui-color-border",
1471
+ "--kui-color-neutral-border-normal",
1313
1472
  "--kui-font-sans",
1314
1473
  "--kui-toolbar-divider-color"
1315
1474
  ],
@@ -1338,7 +1497,7 @@
1338
1497
  "useWhen": [
1339
1498
  "Group related controls inside a toolbar with a supported visual treatment.",
1340
1499
  "Use ToolbarActionLink for navigation or external resources that must retain native anchor semantics inside a group.",
1341
- "Fill it with plain <button> controls (the group styles > button fully); use wa-button only for a Web Awesome feature such as a wa-dropdown popup trigger.",
1500
+ "Fill it with plain <button> controls (the group styles > button fully); use wa-button only for a Web Awesome feature. A popup menu is a PopupMenu in a single group with nestedDropdown; it renders its own trigger, so never hand-write wa-dropdown markup. Nothing wraps inside a group: an icon sits beside its label on one row and no trigger gets a fixed width.",
1342
1501
  "For an avatar control, set content=avatar and avatarImage instead of inserting an img; one button paints the group and multiple buttons paint only the pressed highlight."
1343
1502
  ],
1344
1503
  "avoidWhen": [
@@ -1380,7 +1539,8 @@
1380
1539
  "contained avatar background on a single group or selected multi-button highlight"
1381
1540
  ],
1382
1541
  "accessibility": [
1383
- "Name the group when its relationship is not evident from context."
1542
+ "Name the group when its relationship is not evident from context.",
1543
+ "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."
1384
1544
  ],
1385
1545
  "geometry": {
1386
1546
  "margin": "none",
@@ -1515,6 +1675,31 @@
1515
1675
  "publicExports": [
1516
1676
  "FloatingToolbar"
1517
1677
  ],
1678
+ "cssValueProps": [
1679
+ {
1680
+ "path": "inset",
1681
+ "grammar": "length",
1682
+ "helpers": [
1683
+ "px",
1684
+ "rem",
1685
+ "em",
1686
+ "pct",
1687
+ "space",
1688
+ "lengthVar",
1689
+ "calc"
1690
+ ],
1691
+ "nonStandaloneHelpers": [
1692
+ "plus"
1693
+ ],
1694
+ "shorthands": [],
1695
+ "canonicalShorthands": [],
1696
+ "exceptionalShorthands": [],
1697
+ "rawPolicy": "forbid",
1698
+ "examples": [
1699
+ "inset={space(\"xs\")}"
1700
+ ]
1701
+ }
1702
+ ],
1518
1703
  "useWhen": [
1519
1704
  "Float a small cluster of controls (e.g. a drawer restore) over scrolling content without covering dialogs."
1520
1705
  ],
@@ -1713,7 +1898,7 @@
1713
1898
  "kui-text"
1714
1899
  ],
1715
1900
  "publicTokens": [
1716
- "--kui-color-danger-text",
1901
+ "--kui-color-danger-on-quiet",
1717
1902
  "--kui-color-text-quiet",
1718
1903
  "--kui-font-mono",
1719
1904
  "--kui-font-xs",
@@ -1834,7 +2019,7 @@
1834
2019
  "kui-value-table__label"
1835
2020
  ],
1836
2021
  "publicTokens": [
1837
- "--kui-color-border",
2022
+ "--kui-color-neutral-border-normal",
1838
2023
  "--kui-color-surface-lowered",
1839
2024
  "--kui-color-text",
1840
2025
  "--kui-color-text-quiet",
@@ -2442,7 +2627,8 @@
2442
2627
  "top/right/bottom/left divider combinations",
2443
2628
  "top/right/bottom/left text and control inset combinations",
2444
2629
  "fill: the layout root fills a definite-height parent",
2445
- "rootAttributes: safe data-* metadata on the root"
2630
+ "rootAttributes: safe data-* metadata on the root",
2631
+ "scroll dividers when named as wireScrollDividers targets chrome"
2446
2632
  ],
2447
2633
  "accessibility": [
2448
2634
  "List adds layout only and no list role; children retain responsibility for their native or ARIA semantics.",
@@ -2463,12 +2649,30 @@
2463
2649
  "browser-condition-css"
2464
2650
  ]
2465
2651
  },
2466
- "wiring": [],
2652
+ "wiring": [
2653
+ {
2654
+ "export": "wireScrollDividers",
2655
+ "import": "@kerfjs/ui/wire-scroll-dividers",
2656
+ "required": false,
2657
+ "stateAttributes": [
2658
+ {
2659
+ "name": "data-scroll-overflow",
2660
+ "on": "the targets scroller",
2661
+ "meaning": "The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it."
2662
+ },
2663
+ {
2664
+ "name": "data-scroll-divider",
2665
+ "on": "a List named as targets chrome",
2666
+ "meaning": "The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it."
2667
+ }
2668
+ ]
2669
+ }
2670
+ ],
2467
2671
  "publicClasses": [
2468
2672
  "kui-list"
2469
2673
  ],
2470
2674
  "publicTokens": [
2471
- "--kui-color-border",
2675
+ "--kui-color-neutral-border-normal",
2472
2676
  "--kui-layout-item-gap",
2473
2677
  "--kui-list-divider-color",
2474
2678
  "--kui-list-gap"
@@ -2551,14 +2755,12 @@
2551
2755
  "kui-list-header",
2552
2756
  "kui-list-header__action",
2553
2757
  "kui-list-header__action-layer",
2554
- "kui-list-header__label",
2555
2758
  "kui-list-header__title",
2556
2759
  "kui-list-header__toggle"
2557
2760
  ],
2558
2761
  "publicTokens": [
2559
2762
  "--kui-color-neutral-border-quiet",
2560
2763
  "--kui-focus-ring",
2561
- "--kui-font-xs",
2562
2764
  "--kui-list-header-action-icon-size",
2563
2765
  "--kui-list-header-color",
2564
2766
  "--kui-layout-inline-margin",
@@ -2900,8 +3102,7 @@
2900
3102
  ],
2901
3103
  "variants": [
2902
3104
  "all-side inset by default",
2903
- "top/right/bottom/left inset combinations",
2904
- "deprecated horizontalOnly compatibility alias for sides=\"rl\""
3105
+ "top/right/bottom/left inset combinations"
2905
3106
  ],
2906
3107
  "accessibility": [
2907
3108
  "A layout wrapper only; it adds no role or name."
@@ -2920,8 +3121,7 @@
2920
3121
  },
2921
3122
  "wiring": [],
2922
3123
  "publicClasses": [
2923
- "kui-list-inset-text",
2924
- "kui-list-inset-text--horizontal"
3124
+ "kui-list-inset-text"
2925
3125
  ],
2926
3126
  "publicTokens": [],
2927
3127
  "links": {
@@ -2930,6 +3130,103 @@
2930
3130
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
2931
3131
  }
2932
3132
  },
3133
+ {
3134
+ "id": "content-item",
3135
+ "name": "ContentItem",
3136
+ "category": "Structure",
3137
+ "kind": "component",
3138
+ "source": "kerf",
3139
+ "description": "One self-contained content child with the shared 8px margin + 1px border + 8px padding geometry, a typed frame, and a rounded or pill shape.",
3140
+ "uses": [],
3141
+ "purpose": "Render one self-contained .kui-content child that owns its 8px inline margin, real 1px border, 8px padding, and radius, with framing and shape chosen by typed props instead of hand-written modifier classes.",
3142
+ "publicExports": [
3143
+ "ContentItem"
3144
+ ],
3145
+ "useWhen": [
3146
+ "An ordinary surface-like child of a Pane or .kui-content stack needs the shared content-item geometry so its content edge lands at the standard 17px inset.",
3147
+ "A content item marks a real distinction and must read as visibly bounded: pass frame=\"framed\" (the border is always reserved, so geometry does not change).",
3148
+ "A content item should follow a pill control's 22px radius: pass shape=\"pill\"."
3149
+ ],
3150
+ "avoidWhen": [
3151
+ "Do not wrap a component that already owns content-item geometry (ListItem, ListHeader, StateBanner, Toolbar, ValueTable) or pad around a ContentItem; either double-insets.",
3152
+ "Do not frame an item only to make it look contained; hierarchy comes from alignment, spacing, and type first.",
3153
+ "Do not use it as a filled or lowered card; use SunkenPanel for a lowered surface.",
3154
+ "Do not use it for bare text alone; use ListInsetText, which adds the same inset without claiming a surface."
3155
+ ],
3156
+ "alternatives": [
3157
+ {
3158
+ "id": "list-inset-text",
3159
+ "relationship": "nearest",
3160
+ "when": "Use ListInsetText when bare text only needs to align with neighboring content items."
3161
+ },
3162
+ {
3163
+ "id": "sunken-panel",
3164
+ "relationship": "nearest",
3165
+ "when": "Use SunkenPanel for a lowered, filled surface around a vertical stack."
3166
+ },
3167
+ {
3168
+ "id": "layout",
3169
+ "relationship": "composes-with",
3170
+ "when": "Place ContentItem children in a Pane or .kui-content stack, which owns the 24px major rhythm."
3171
+ }
3172
+ ],
3173
+ "appOwns": [
3174
+ "the item content",
3175
+ "whether the item marks a real distinction that warrants a visible frame",
3176
+ "corner shape",
3177
+ "region semantics and accessible name",
3178
+ "whether the item is a programmatic focus target"
3179
+ ],
3180
+ "variants": [
3181
+ "unframed rounded item",
3182
+ "framed rounded item",
3183
+ "pill item",
3184
+ "framed pill item",
3185
+ "named focus-target region"
3186
+ ],
3187
+ "accessibility": [
3188
+ "An ordinary item adds no role or name; pass ariaLabel only when the item is a distinct named region (it then renders role=\"region\").",
3189
+ "focusTarget makes the item a programmatic focus target (tabindex=\"-1\", never a tab stop), such as a NavStack view's data-nav-focus target.",
3190
+ "The frame is decorative and never the only signal of state."
3191
+ ],
3192
+ "geometry": {
3193
+ "margin": "self",
3194
+ "border": "self",
3195
+ "padding": "self",
3196
+ "notes": [
3197
+ "The 1px border is always reserved and transparent unless frame=\"framed\", so framed and unframed items share the same geometry."
3198
+ ]
3199
+ },
3200
+ "delivery": {
3201
+ "browserImport": "@kerfjs/ui/content-item",
3202
+ "manualCssImport": "@kerfjs/ui/content-item.css",
3203
+ "sideEffects": [
3204
+ "browser-condition-css"
3205
+ ]
3206
+ },
3207
+ "wiring": [],
3208
+ "publicClasses": [
3209
+ "kui-content-item",
3210
+ "kui-content-item--pill",
3211
+ "kui-content-item--framed"
3212
+ ],
3213
+ "placeableClasses": [
3214
+ "kui-content-item",
3215
+ "kui-content-item--pill",
3216
+ "kui-content-item--framed"
3217
+ ],
3218
+ "rootElement": "div",
3219
+ "publicTokens": [
3220
+ "--kui-content-item-border",
3221
+ "--kui-content-item-radius",
3222
+ "--kui-content-item-background"
3223
+ ],
3224
+ "links": {
3225
+ "catalogRoute": "?component=content-item",
3226
+ "documentation": "docs/layout.md",
3227
+ "recipe": "docs/layout.md#content-items"
3228
+ }
3229
+ },
2933
3230
  {
2934
3231
  "id": "application-tabs",
2935
3232
  "name": "Application tabs",
@@ -3139,7 +3436,8 @@
3139
3436
  "rail, segmented, and inspector presentation",
3140
3437
  "intrinsic or fill allocation",
3141
3438
  "separate or adjacent trailing action",
3142
- "far-edge end action"
3439
+ "far-edge end action",
3440
+ "overflow dividers on each side with tabs scrolled out of view (wired by wireScrollDividers)"
3143
3441
  ],
3144
3442
  "accessibility": [
3145
3443
  "Keep exactly one selected tab at tabindex 0 and preserve the wiring keyboard model."
@@ -3186,6 +3484,23 @@
3186
3484
  "export": "reorderTabs",
3187
3485
  "import": "@kerfjs/ui/wire-tab-bars",
3188
3486
  "required": false
3487
+ },
3488
+ {
3489
+ "export": "wireScrollDividers",
3490
+ "import": "@kerfjs/ui/wire-scroll-dividers",
3491
+ "required": false,
3492
+ "stateAttributes": [
3493
+ {
3494
+ "name": "data-scroll-overflow",
3495
+ "on": "kui-tab-bar__tabs",
3496
+ "meaning": "The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it."
3497
+ },
3498
+ {
3499
+ "name": "data-scroll-divider",
3500
+ "on": "chrome named in wireScrollDividers targets (a TabBar strip has none)",
3501
+ "meaning": "The sides, in t/r/b/l order, on which that chrome currently draws its scroll divider. Re-applied if a re-render drops it."
3502
+ }
3503
+ ]
3189
3504
  }
3190
3505
  ],
3191
3506
  "publicClasses": [
@@ -3197,7 +3512,8 @@
3197
3512
  ],
3198
3513
  "publicTokens": [
3199
3514
  "--kui-tab-bar-background",
3200
- "--kui-tab-bar-border"
3515
+ "--kui-tab-bar-border",
3516
+ "--kui-tab-bar-divider-color"
3201
3517
  ],
3202
3518
  "links": {
3203
3519
  "catalogRoute": "?component=tab-bar",
@@ -3412,9 +3728,9 @@
3412
3728
  "kui-token-search__trailing"
3413
3729
  ],
3414
3730
  "publicTokens": [
3415
- "--kui-color-accent",
3416
- "--kui-color-accent-text",
3417
- "--kui-color-border",
3731
+ "--kui-color-brand-fill-normal",
3732
+ "--kui-color-brand-on-quiet",
3733
+ "--kui-color-neutral-border-normal",
3418
3734
  "--kui-color-text-link",
3419
3735
  "--kui-color-surface",
3420
3736
  "--kui-color-text",
@@ -3544,7 +3860,7 @@
3544
3860
  "kui-resizable-region__restore"
3545
3861
  ],
3546
3862
  "publicTokens": [
3547
- "--kui-color-border",
3863
+ "--kui-color-neutral-border-normal",
3548
3864
  "--kui-color-neutral-on-quiet",
3549
3865
  "--kui-color-text-link",
3550
3866
  "--kui-focus-ring",
@@ -3571,9 +3887,10 @@
3571
3887
  "category": "Controls",
3572
3888
  "kind": "component",
3573
3889
  "source": "kerf",
3574
- "description": "Controlled Web Awesome select with typed form, toolbar, navigation, compact, icon-only, truncating, hint, and grouped-choice presentations.",
3890
+ "description": "Controlled Web Awesome select with typed single or multiple values and form, toolbar, navigation, compact, icon-only, truncating, hint, and grouped-choice presentations.",
3575
3891
  "uses": [
3576
3892
  "lucide-icon",
3893
+ "badge",
3577
3894
  "wa-select",
3578
3895
  "wa-option"
3579
3896
  ],
@@ -3643,13 +3960,18 @@
3643
3960
  "default or compact size",
3644
3961
  "label or icon-only selected presentation",
3645
3962
  "select- or group-owned focus ring",
3646
- "label maximum width and truncation"
3963
+ "label maximum width and truncation",
3964
+ "multiple selection",
3965
+ "multiple icon-only filter trigger with a fixed triggerIcon"
3647
3966
  ],
3648
3967
  "accessibility": [
3649
3968
  "Verify the live value, standard events, focus, and rendered output.",
3650
3969
  "A nonempty label names the internal combobox; otherwise ariaLabel supplies a visually hidden label without adding control height, including custom selected content.",
3651
3970
  "Hint text is visible below the control through Web Awesome's native hint relationship; placeholderText remains the empty value inside the closed control.",
3652
- "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."
3971
+ "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.",
3972
+ "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.",
3973
+ "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.",
3974
+ "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."
3653
3975
  ],
3654
3976
  "geometry": {
3655
3977
  "margin": "none",
@@ -3677,8 +3999,6 @@
3677
3999
  "kui-select__icon"
3678
4000
  ],
3679
4001
  "publicTokens": [
3680
- "--kui-color-brand-fill-normal",
3681
- "--kui-color-brand-on-fill",
3682
4002
  "--kui-color-neutral-border-quiet",
3683
4003
  "--kui-color-neutral-on-quiet",
3684
4004
  "--kui-disclosure-icon-scale",
@@ -3740,7 +4060,8 @@
3740
4060
  "placement"
3741
4061
  ],
3742
4062
  "accessibility": [
3743
- "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."
4063
+ "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.",
4064
+ "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."
3744
4065
  ],
3745
4066
  "geometry": {
3746
4067
  "margin": "none",
@@ -5317,6 +5638,9 @@
5317
5638
  "publicClasses": [
5318
5639
  "hide-actions"
5319
5640
  ],
5641
+ "placeableClasses": [
5642
+ "hide-actions"
5643
+ ],
5320
5644
  "geometry": {
5321
5645
  "margin": "none",
5322
5646
  "border": "child",
@@ -7095,7 +7419,8 @@
7095
7419
  "toolbar",
7096
7420
  "toolbar-control-group",
7097
7421
  "lucide-icon",
7098
- "layout"
7422
+ "layout",
7423
+ "content-item"
7099
7424
  ],
7100
7425
  "useWhen": [
7101
7426
  "A workspace sidebar needs the shared toolbar/content/footer pane model, 24px major section rhythm, and 44px row and utility-action targets."
@@ -7368,7 +7693,8 @@
7368
7693
  "row",
7369
7694
  "text",
7370
7695
  "lucide-icon",
7371
- "layout"
7696
+ "layout",
7697
+ "content-item"
7372
7698
  ],
7373
7699
  "useWhen": [
7374
7700
  "A flow drills from a list into detail and back on one pane, at any device size or inside a dialog."
@@ -7466,7 +7792,8 @@
7466
7792
  "toolbar-text",
7467
7793
  "value-table",
7468
7794
  "lucide-icon",
7469
- "layout"
7795
+ "layout",
7796
+ "content-item"
7470
7797
  ],
7471
7798
  "useWhen": [
7472
7799
  "A rail or drawer must collapse and expand outside a full Workbench shell, keeping the app's collapsed signals, sizes, and content while the wire owns toggle, focus, the compact overlay, and persistence."