@kerfjs/ui 5.0.0-beta.95 → 5.0.0-beta.97

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 (385) hide show
  1. package/README.md +95 -55
  2. package/ai/component-catalog.json +1330 -94
  3. package/ai/component-composition-rules.json +11 -0
  4. package/ai/component-composition.d.ts +3 -0
  5. package/ai/component-composition.json +955 -23
  6. package/ai/component-composition.schema.json +4 -0
  7. package/ai/components/README.md +12 -0
  8. package/ai/components/badge.md +6 -2
  9. package/ai/components/choice-chips.md +80 -0
  10. package/ai/components/column-track.md +78 -0
  11. package/ai/components/combobox.md +88 -0
  12. package/ai/components/content-item.md +2 -0
  13. package/ai/components/content-swap.md +78 -0
  14. package/ai/components/corner-status.md +88 -0
  15. package/ai/components/document-baseline.md +3 -1
  16. package/ai/components/edge-activity-indicator.md +81 -0
  17. package/ai/components/file-picker.md +88 -0
  18. package/ai/components/foundation.md +1 -1
  19. package/ai/components/framed-list.md +80 -0
  20. package/ai/components/grid.md +2 -1
  21. package/ai/components/icon-button.md +82 -0
  22. package/ai/components/icon-toggle-button.md +80 -0
  23. package/ai/components/list-action-row.md +20 -7
  24. package/ai/components/list-item.md +17 -7
  25. package/ai/components/list.md +5 -2
  26. package/ai/components/nav-stack.md +2 -1
  27. package/ai/components/popup-menu.md +2 -2
  28. package/ai/components/row.md +1 -1
  29. package/ai/components/select.md +2 -1
  30. package/ai/components/split-button.md +80 -0
  31. package/ai/components/split-view.md +1 -1
  32. package/ai/components/state-banner.md +4 -2
  33. package/ai/components/summary-row.md +85 -0
  34. package/ai/components/sunken-panel.md +1 -1
  35. package/ai/components/surface-scaffold.md +8 -2
  36. package/ai/components/text.md +3 -0
  37. package/ai/components/toolbar-control-group.md +4 -2
  38. package/ai/components/toolbar-text.md +1 -0
  39. package/ai/components/toolbar.md +1 -0
  40. package/ai/components/value-table.md +9 -2
  41. package/ai/components/wa-button-group.md +2 -1
  42. package/ai/components/wa-button.md +5 -1
  43. package/ai/public-api-signatures-v1.md +1063 -52
  44. package/ai/skill.md +55 -53
  45. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  46. package/dist/anchored-surface.d.ts +13 -2
  47. package/dist/anchored-surface.js +1 -1
  48. package/dist/app-tab.js +1 -1
  49. package/dist/badge.d.ts +31 -2
  50. package/dist/badge.js +2 -1
  51. package/dist/browser/choice-chips.js +3 -0
  52. package/dist/browser/column-track.js +3 -0
  53. package/dist/browser/combobox.js +3 -0
  54. package/dist/browser/content-swap.js +3 -0
  55. package/dist/browser/corner-status.js +3 -0
  56. package/dist/browser/edge-activity-indicator.js +3 -0
  57. package/dist/browser/file-picker.js +3 -0
  58. package/dist/browser/framed-list.js +3 -0
  59. package/dist/browser/icon-button.js +4 -0
  60. package/dist/browser/icon-toggle-button.js +4 -0
  61. package/dist/browser/list-action-row.js +1 -0
  62. package/dist/browser/split-button.js +5 -0
  63. package/dist/browser/summary-row.js +3 -0
  64. package/dist/catalog-resources.d.ts +1 -0
  65. package/dist/catalog.d.ts +1 -0
  66. package/dist/catalog.js +16 -13
  67. package/dist/catalog.js.map +1 -1
  68. package/dist/chip.d.ts +1 -0
  69. package/dist/choice-chips.d.ts +58 -0
  70. package/dist/choice-chips.js +3 -0
  71. package/dist/choice-chips.js.map +1 -0
  72. package/dist/chunk-2MSPNRWJ.js +82 -0
  73. package/dist/chunk-2MSPNRWJ.js.map +1 -0
  74. package/dist/{chunk-3PO7JEK7.js → chunk-36TL6BCR.js} +18 -4
  75. package/dist/chunk-36TL6BCR.js.map +1 -0
  76. package/dist/{chunk-MORVLMDG.js → chunk-44A6LP54.js} +3 -3
  77. package/dist/chunk-44A6LP54.js.map +1 -0
  78. package/dist/{chunk-7QQ3HE47.js → chunk-4LOK4634.js} +7 -3
  79. package/dist/chunk-4LOK4634.js.map +1 -0
  80. package/dist/chunk-4UB5Z3ZZ.js +68 -0
  81. package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
  82. package/dist/{chunk-PGL6TXFW.js → chunk-6BRRUPJY.js} +6 -2
  83. package/dist/chunk-6BRRUPJY.js.map +1 -0
  84. package/dist/{chunk-KAJVVN7Q.js → chunk-6NOLL5KG.js} +2 -2
  85. package/dist/{chunk-KAJVVN7Q.js.map → chunk-6NOLL5KG.js.map} +1 -1
  86. package/dist/{chunk-IOS2NXW7.js → chunk-76PWEN5Y.js} +13 -2
  87. package/dist/chunk-76PWEN5Y.js.map +1 -0
  88. package/dist/{chunk-B3TROLC2.js → chunk-7IUEBNCO.js} +7 -3
  89. package/dist/chunk-7IUEBNCO.js.map +1 -0
  90. package/dist/{chunk-75YOTZ25.js → chunk-AYHC62OZ.js} +10 -6
  91. package/dist/chunk-AYHC62OZ.js.map +1 -0
  92. package/dist/{chunk-RZYQFGMM.js → chunk-BBU2SPRE.js} +4 -4
  93. package/dist/{chunk-RZYQFGMM.js.map → chunk-BBU2SPRE.js.map} +1 -1
  94. package/dist/{chunk-QCLLBMLA.js → chunk-BU23Z5HZ.js} +37 -12
  95. package/dist/chunk-BU23Z5HZ.js.map +1 -0
  96. package/dist/{chunk-BYHGRKC3.js → chunk-CMLPFIC5.js} +3 -1
  97. package/dist/chunk-CMLPFIC5.js.map +1 -0
  98. package/dist/{chunk-3XPGJUUQ.js → chunk-D5RGM3XA.js} +3 -2
  99. package/dist/chunk-D5RGM3XA.js.map +1 -0
  100. package/dist/chunk-EIET4QLK.js +51 -0
  101. package/dist/chunk-EIET4QLK.js.map +1 -0
  102. package/dist/chunk-ETCWQLJV.js +85 -0
  103. package/dist/chunk-ETCWQLJV.js.map +1 -0
  104. package/dist/chunk-FDZNYD4C.js +138 -0
  105. package/dist/chunk-FDZNYD4C.js.map +1 -0
  106. package/dist/{chunk-XKZPBRU7.js → chunk-FOQK4F3L.js} +25 -5
  107. package/dist/chunk-FOQK4F3L.js.map +1 -0
  108. package/dist/{chunk-FL6J644M.js → chunk-GJYQ27C2.js} +4 -2
  109. package/dist/chunk-GJYQ27C2.js.map +1 -0
  110. package/dist/{chunk-DL55BSQX.js → chunk-GZE2XVKC.js} +8 -1
  111. package/dist/chunk-GZE2XVKC.js.map +1 -0
  112. package/dist/{chunk-YP2G67S7.js → chunk-HO6FU3G7.js} +2 -2
  113. package/dist/{chunk-YP2G67S7.js.map → chunk-HO6FU3G7.js.map} +1 -1
  114. package/dist/{chunk-3DXHNLME.js → chunk-IGTWXPTN.js} +25 -8
  115. package/dist/chunk-IGTWXPTN.js.map +1 -0
  116. package/dist/chunk-IKS72C6P.js +53 -0
  117. package/dist/chunk-IKS72C6P.js.map +1 -0
  118. package/dist/chunk-JYD7G4RG.js +130 -0
  119. package/dist/chunk-JYD7G4RG.js.map +1 -0
  120. package/dist/{chunk-LAZLBC2Q.js → chunk-KH4KEMSP.js} +33 -2
  121. package/dist/chunk-KH4KEMSP.js.map +1 -0
  122. package/dist/chunk-LL45C7BB.js +122 -0
  123. package/dist/chunk-LL45C7BB.js.map +1 -0
  124. package/dist/chunk-M2NRCFRO.js +45 -0
  125. package/dist/chunk-M2NRCFRO.js.map +1 -0
  126. package/dist/chunk-MJ5RU6XT.js +173 -0
  127. package/dist/chunk-MJ5RU6XT.js.map +1 -0
  128. package/dist/{chunk-GIUOXAVL.js → chunk-P74VXMB6.js} +39 -19
  129. package/dist/chunk-P74VXMB6.js.map +1 -0
  130. package/dist/{chunk-TKDDTLG5.js → chunk-PBT3CPPY.js} +31 -3
  131. package/dist/chunk-PBT3CPPY.js.map +1 -0
  132. package/dist/chunk-PRG4CL3Q.js +88 -0
  133. package/dist/chunk-PRG4CL3Q.js.map +1 -0
  134. package/dist/chunk-QH5KOFNS.js +39 -0
  135. package/dist/chunk-QH5KOFNS.js.map +1 -0
  136. package/dist/{chunk-CD5TOO22.js → chunk-QIAPOWHH.js} +2 -2
  137. package/dist/{chunk-CD5TOO22.js.map → chunk-QIAPOWHH.js.map} +1 -1
  138. package/dist/chunk-QQ3TTWFH.js +29 -0
  139. package/dist/chunk-QQ3TTWFH.js.map +1 -0
  140. package/dist/chunk-QYMJHS4K.js +36 -0
  141. package/dist/chunk-QYMJHS4K.js.map +1 -0
  142. package/dist/chunk-R42D2BAO.js +44 -0
  143. package/dist/chunk-R42D2BAO.js.map +1 -0
  144. package/dist/chunk-S2XULQEK.js +52 -0
  145. package/dist/chunk-S2XULQEK.js.map +1 -0
  146. package/dist/{chunk-NMWDHZVM.js → chunk-S4Y3YTAI.js} +2 -2
  147. package/dist/{chunk-NMWDHZVM.js.map → chunk-S4Y3YTAI.js.map} +1 -1
  148. package/dist/{chunk-O27D24CA.js → chunk-TDMHA7C3.js} +3 -2
  149. package/dist/chunk-TDMHA7C3.js.map +1 -0
  150. package/dist/chunk-U6QYTMDB.js +85 -0
  151. package/dist/chunk-U6QYTMDB.js.map +1 -0
  152. package/dist/{chunk-QQICWWNX.js → chunk-V6W56V3N.js} +18 -7
  153. package/dist/chunk-V6W56V3N.js.map +1 -0
  154. package/dist/chunk-W4IK7AWD.js +73 -0
  155. package/dist/chunk-W4IK7AWD.js.map +1 -0
  156. package/dist/{chunk-TNG3XKHB.js → chunk-Y3LC7JQO.js} +26 -8
  157. package/dist/chunk-Y3LC7JQO.js.map +1 -0
  158. package/dist/chunk-YWQGSUF2.js +84 -0
  159. package/dist/chunk-YWQGSUF2.js.map +1 -0
  160. package/dist/{chunk-MTCTX25G.js → chunk-YXOMI7ES.js} +1 -1
  161. package/dist/chunk-YXOMI7ES.js.map +1 -0
  162. package/dist/chunk-ZKKO4MHC.js +25 -0
  163. package/dist/chunk-ZKKO4MHC.js.map +1 -0
  164. package/dist/collapsible-panel.d.ts +10 -3
  165. package/dist/collapsible-panel.js +8 -5
  166. package/dist/collapsible-panel.js.map +1 -1
  167. package/dist/column-track.d.ts +41 -0
  168. package/dist/column-track.js +4 -0
  169. package/dist/column-track.js.map +1 -0
  170. package/dist/combobox.d.ts +40 -0
  171. package/dist/combobox.js +3 -0
  172. package/dist/combobox.js.map +1 -0
  173. package/dist/content-item.d.ts +21 -4
  174. package/dist/content-item.js +1 -1
  175. package/dist/content-swap.d.ts +34 -0
  176. package/dist/content-swap.js +3 -0
  177. package/dist/content-swap.js.map +1 -0
  178. package/dist/corner-status.d.ts +36 -0
  179. package/dist/corner-status.js +3 -0
  180. package/dist/corner-status.js.map +1 -0
  181. package/dist/edge-activity-indicator.d.ts +28 -0
  182. package/dist/edge-activity-indicator.js +3 -0
  183. package/dist/edge-activity-indicator.js.map +1 -0
  184. package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
  185. package/dist/file-picker.d.ts +47 -0
  186. package/dist/file-picker.js +3 -0
  187. package/dist/file-picker.js.map +1 -0
  188. package/dist/framed-list.d.ts +47 -0
  189. package/dist/framed-list.js +4 -0
  190. package/dist/framed-list.js.map +1 -0
  191. package/dist/grid.js +1 -1
  192. package/dist/help-tags-register.js +1 -1
  193. package/dist/icon-button.d.ts +46 -0
  194. package/dist/icon-button.js +6 -0
  195. package/dist/icon-button.js.map +1 -0
  196. package/dist/icon-toggle-button.d.ts +42 -0
  197. package/dist/icon-toggle-button.js +6 -0
  198. package/dist/icon-toggle-button.js.map +1 -0
  199. package/dist/index.d.ts +23 -6
  200. package/dist/index.js +44 -27
  201. package/dist/list-action-row.d.ts +47 -10
  202. package/dist/list-action-row.js +2 -1
  203. package/dist/list-header.js +1 -1
  204. package/dist/list-inset-text.js +1 -1
  205. package/dist/list-item.d.ts +10 -2
  206. package/dist/list-item.js +1 -1
  207. package/dist/list.d.ts +37 -5
  208. package/dist/list.js +1 -1
  209. package/dist/nav-stack.d.ts +1 -0
  210. package/dist/nav-stack.js +2 -1
  211. package/dist/pane.js +2 -1
  212. package/dist/popup-menu-register.js +18 -1
  213. package/dist/popup-menu-register.js.map +1 -1
  214. package/dist/popup-menu.d.ts +28 -3
  215. package/dist/popup-menu.js +1 -1
  216. package/dist/row.d.ts +6 -2
  217. package/dist/row.js +1 -1
  218. package/dist/select-register.js +1 -1
  219. package/dist/select.js +2 -1
  220. package/dist/split-button.d.ts +57 -0
  221. package/dist/split-button.js +7 -0
  222. package/dist/split-button.js.map +1 -0
  223. package/dist/split-view.d.ts +20 -2
  224. package/dist/split-view.js +22 -1
  225. package/dist/split-view.js.map +1 -1
  226. package/dist/state-banner.d.ts +17 -2
  227. package/dist/state-banner.js +2 -1
  228. package/dist/styles/badge.css +27 -0
  229. package/dist/styles/catalog/components/catalog-example.css +7 -3
  230. package/dist/styles/choice-chips.css +154 -0
  231. package/dist/styles/column-track.css +57 -0
  232. package/dist/styles/combobox.css +113 -0
  233. package/dist/styles/components/actions/icon-button/icon-button.css +22 -0
  234. package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +83 -0
  235. package/dist/styles/components/actions/popup-menu/popup-menu.css +69 -1
  236. package/dist/styles/components/actions/split-button/split-button.css +95 -0
  237. package/dist/styles/components/actions/toolbar/toolbar.css +16 -9
  238. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +152 -48
  239. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +23 -0
  240. package/dist/styles/components/collections/framed-list/framed-list.css +47 -0
  241. package/dist/styles/components/collections/list/list.css +44 -0
  242. package/dist/styles/components/collections/list-action-row/list-action-row.css +53 -0
  243. package/dist/styles/components/collections/list-item/list-item.css +59 -0
  244. package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
  245. package/dist/styles/components/data-display/value-table/value-table.css +76 -0
  246. package/dist/styles/components/feedback/badge/badge.css +27 -0
  247. package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
  248. package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
  249. package/dist/styles/components/feedback/state-banner/state-banner.css +38 -0
  250. package/dist/styles/components/forms/choice-chips/choice-chips.css +154 -0
  251. package/dist/styles/components/forms/combobox/combobox.css +113 -0
  252. package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
  253. package/dist/styles/components/forms/token-search-field/token-search-field.css +30 -1
  254. package/dist/styles/components/layout/column-track/column-track.css +57 -0
  255. package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
  256. package/dist/styles/components/layout/pane/pane.css +2 -8
  257. package/dist/styles/components/layout/workbench/workbench.css +2 -8
  258. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +1 -4
  259. package/dist/styles/components/surfaces/content-item/content-item.css +18 -0
  260. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +1 -4
  261. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +119 -0
  262. package/dist/styles/components/typography/text/text.css +62 -0
  263. package/dist/styles/content-item.css +18 -0
  264. package/dist/styles/content-swap.css +154 -0
  265. package/dist/styles/corner-status.css +60 -0
  266. package/dist/styles/document.css +65 -0
  267. package/dist/styles/edge-activity-indicator.css +127 -0
  268. package/dist/styles/file-picker.css +81 -0
  269. package/dist/styles/foundation.css +8 -0
  270. package/dist/styles/framed-list.css +47 -0
  271. package/dist/styles/icon-button.css +22 -0
  272. package/dist/styles/icon-toggle-button.css +83 -0
  273. package/dist/styles/list-action-row.css +53 -0
  274. package/dist/styles/list-item.css +59 -0
  275. package/dist/styles/list.css +44 -0
  276. package/dist/styles/pane.css +2 -8
  277. package/dist/styles/popup-menu.css +69 -1
  278. package/dist/styles/split-button.css +95 -0
  279. package/dist/styles/state-banner.css +38 -0
  280. package/dist/styles/styles.css +12 -0
  281. package/dist/styles/summary-row.css +161 -0
  282. package/dist/styles/sunken-panel.css +1 -4
  283. package/dist/styles/surface-scaffold.css +119 -0
  284. package/dist/styles/tab-navigator.css +1 -4
  285. package/dist/styles/text.css +62 -0
  286. package/dist/styles/token-search-field.css +30 -1
  287. package/dist/styles/toolbar-control-group.css +152 -48
  288. package/dist/styles/toolbar-text.css +23 -0
  289. package/dist/styles/toolbar.css +16 -9
  290. package/dist/styles/value-table.css +76 -0
  291. package/dist/styles/webawesome.css +4 -4
  292. package/dist/styles/workbench.css +2 -8
  293. package/dist/summary-row.d.ts +56 -0
  294. package/dist/summary-row.js +4 -0
  295. package/dist/summary-row.js.map +1 -0
  296. package/dist/sunken-panel.d.ts +8 -1
  297. package/dist/sunken-panel.js +2 -1
  298. package/dist/surface-scaffold-register.js +7 -1
  299. package/dist/surface-scaffold-register.js.map +1 -1
  300. package/dist/surface-scaffold.d.ts +75 -2
  301. package/dist/surface-scaffold.js +2 -1
  302. package/dist/tab-navigator.js +4 -1
  303. package/dist/tab-navigator.js.map +1 -1
  304. package/dist/text.d.ts +39 -4
  305. package/dist/text.js +1 -1
  306. package/dist/toolbar-control-group.d.ts +8 -1
  307. package/dist/toolbar-control-group.js +1 -1
  308. package/dist/toolbar-text.d.ts +14 -1
  309. package/dist/toolbar-text.js +1 -1
  310. package/dist/toolbar.d.ts +14 -3
  311. package/dist/toolbar.js +1 -1
  312. package/dist/value-table.d.ts +20 -2
  313. package/dist/value-table.js +1 -1
  314. package/dist/wire-catalog.d.ts +1 -0
  315. package/dist/wire-comboboxes.d.ts +26 -0
  316. package/dist/wire-comboboxes.js +3 -0
  317. package/dist/wire-comboboxes.js.map +1 -0
  318. package/dist/wire-corner-status.d.ts +11 -0
  319. package/dist/wire-corner-status.js +3 -0
  320. package/dist/wire-corner-status.js.map +1 -0
  321. package/dist/wire-file-pickers.d.ts +26 -0
  322. package/dist/wire-file-pickers.js +3 -0
  323. package/dist/wire-file-pickers.js.map +1 -0
  324. package/dist/wire-list-reorder.d.ts +41 -0
  325. package/dist/wire-list-reorder.js +3 -0
  326. package/dist/wire-list-reorder.js.map +1 -0
  327. package/dist/wire-token-search-fields.js +1 -1
  328. package/dist/workbench.d.ts +1 -0
  329. package/dist/workbench.js +2 -1
  330. package/docs/accessibility.md +45 -2
  331. package/docs/anchored-surface.md +15 -7
  332. package/docs/app-layouts.md +2 -1
  333. package/docs/component-contract.md +30 -6
  334. package/docs/component-selection.md +165 -13
  335. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  336. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  337. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  338. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  339. package/docs/design/templates/choice-chips-dark.svg +1 -0
  340. package/docs/design/templates/choice-chips.svg +1 -0
  341. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  342. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  343. package/docs/design/templates/list-action-row-dark.svg +1 -1
  344. package/docs/design/templates/list-action-row.svg +1 -1
  345. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  346. package/docs/design/templates/state-banner/strip.svg +1 -0
  347. package/docs/design/templates/state-banner-dark.svg +1 -1
  348. package/docs/design/templates/state-banner.svg +1 -1
  349. package/docs/design/templates.md +1 -1
  350. package/docs/document-baseline.md +51 -0
  351. package/docs/layout.md +52 -1
  352. package/docs/split-view.md +20 -2
  353. package/docs/sunken-panel.md +13 -0
  354. package/docs/surface-scaffold.md +66 -1
  355. package/docs/ux-demo.md +1 -0
  356. package/docs/webawesome-theme.md +6 -2
  357. package/llms.txt +138 -16
  358. package/package.json +89 -1
  359. package/dist/chunk-3DXHNLME.js.map +0 -1
  360. package/dist/chunk-3PO7JEK7.js.map +0 -1
  361. package/dist/chunk-3XPGJUUQ.js.map +0 -1
  362. package/dist/chunk-4Y4L5YEI.js +0 -66
  363. package/dist/chunk-4Y4L5YEI.js.map +0 -1
  364. package/dist/chunk-75YOTZ25.js.map +0 -1
  365. package/dist/chunk-7QQ3HE47.js.map +0 -1
  366. package/dist/chunk-A7DYEERU.js +0 -59
  367. package/dist/chunk-A7DYEERU.js.map +0 -1
  368. package/dist/chunk-B3TROLC2.js.map +0 -1
  369. package/dist/chunk-BYHGRKC3.js.map +0 -1
  370. package/dist/chunk-DL55BSQX.js.map +0 -1
  371. package/dist/chunk-FL6J644M.js.map +0 -1
  372. package/dist/chunk-GIUOXAVL.js.map +0 -1
  373. package/dist/chunk-IOS2NXW7.js.map +0 -1
  374. package/dist/chunk-J3AWE5I4.js +0 -50
  375. package/dist/chunk-J3AWE5I4.js.map +0 -1
  376. package/dist/chunk-LAZLBC2Q.js.map +0 -1
  377. package/dist/chunk-MORVLMDG.js.map +0 -1
  378. package/dist/chunk-MTCTX25G.js.map +0 -1
  379. package/dist/chunk-O27D24CA.js.map +0 -1
  380. package/dist/chunk-PGL6TXFW.js.map +0 -1
  381. package/dist/chunk-QCLLBMLA.js.map +0 -1
  382. package/dist/chunk-QQICWWNX.js.map +0 -1
  383. package/dist/chunk-TKDDTLG5.js.map +0 -1
  384. package/dist/chunk-TNG3XKHB.js.map +0 -1
  385. package/dist/chunk-XKZPBRU7.js.map +0 -1
@@ -0,0 +1,88 @@
1
+ # FilePicker
2
+
3
+ <!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
4
+
5
+ `@kerfjs/ui:file-picker` · Kerf UI · component · Controls
6
+
7
+ A compact browse trigger and a dashed drop zone around native file inputs, with wiring that reports chosen and dropped files.
8
+
9
+ ## When to use
10
+
11
+ Let people choose or drop files (attachments, evidence, imports) without app CSS: a link-toned browse trigger and a dashed drop target that highlights while dragging, both around visually hidden native file inputs.
12
+
13
+ - People attach or import files by browsing or by dropping them onto a target.
14
+
15
+ **Not when:**
16
+
17
+ - Do not style a native file input or label from app CSS; use these components.
18
+ - Do not rely on the drop zone alone; it also opens the chooser when clicked or activated from the keyboard.
19
+
20
+ **Alternatives:**
21
+
22
+ - [Button](./wa-button.md) (prefer-over) — A button cannot open the native chooser without script; the trigger is a label around the input.
23
+
24
+ ## Imports
25
+
26
+ - JavaScript: `@kerfjs/ui/file-picker` — exports `FilePickerTrigger`, `FileDropZone`, `wireFilePickers`, `fileMatchesAccept`.
27
+ - CSS: the browser build of `@kerfjs/ui/file-picker` pulls its CSS automatically; import `@kerfjs/ui/file-picker.css` manually only without the `browser` export condition.
28
+ - Wiring: `wireFilePickers` from `@kerfjs/ui/wire-file-pickers` (required).
29
+ - Declared side effects: browser-condition-css.
30
+
31
+ ## Props
32
+
33
+ Exact prop names and types: [`@kerfjs/ui/file-picker`](../public-api-signatures-v1.md#kerfjsuifile-picker) in `public-api-signatures-v1.md`. Do not infer props from examples.
34
+
35
+ **Variants (configure, do not restyle):**
36
+
37
+ - browse trigger
38
+ - drop zone
39
+ - dragging
40
+ - disabled
41
+ - accept filter
42
+ - multiple or single
43
+
44
+ ## Composition
45
+
46
+ - Parents: any.
47
+ - Contexts: `application-ui`.
48
+ - Children: unrestricted.
49
+
50
+ ## State and wiring
51
+
52
+ **The app owns:** what happens to the reported files (upload, validation, limits); the list of chosen files; copy and accepted types.
53
+
54
+ **Wiring:** `wireFilePickers` is required.
55
+
56
+ - Reports chosen and dropped files and accepts drops on the zone; without it drops open the file in the browser.
57
+
58
+ **Wiring-owned state attributes** — never render, remove, or branch on these as app state:
59
+
60
+ - `data-dragging` on `kui-file-picker (drop zone)` (`wireFilePickers`): "true" while files are dragged over the zone.
61
+
62
+ ## Geometry
63
+
64
+ Margin: self · border: self · padding: self (layout role: controls). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
65
+
66
+ - The drop zone carries the 8px content-item inline margin; the trigger is a compact 32px inline control.
67
+
68
+ ## Accessibility
69
+
70
+ - Each control is a label around a real file input that receives keyboard focus; the visible control shows the focus ring. Give the input an accessibleLabel when the visible copy is short.
71
+
72
+ ## Styling boundary
73
+
74
+ The component owns its own styles. Configure it through its props and variants; do not override its internals.
75
+
76
+ Public class hooks (select for layout placement only, never to change the component's look): `kui-file-picker`, `kui-file-picker__title`, `kui-file-picker__detail`, `kui-file-picker__input`, `kui-file-picker__icon`.
77
+
78
+ Never put `kui-file-picker`, `kui-file-picker__title`, `kui-file-picker__detail`, `kui-file-picker__input`, `kui-file-picker__icon` on an element you write; render `FilePickerTrigger` or `FileDropZone` instead (`KUI-L103`).
79
+
80
+ Public tokens it reads: `--kui-color-text-link`, `--kui-color-brand-fill-quiet`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-text`, `--kui-focus-ring`, `--kui-font-xs`, `--kui-font-2xs`, `--kui-font-weight-semibold`, `--kui-layout-inline-margin`, `--kui-layout-rounded-radius`, `--kui-radius-pill`, `--kui-space-2xs`, `--kui-space-s`, `--kui-space-xs`. Set a token only where its public contract allows; prefer a prop.
81
+
82
+ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
83
+
84
+ ## Related
85
+
86
+ - Components: [Button](./wa-button.md).
87
+ - Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
88
+ - UX catalog route: `?component=file-picker`.
@@ -55,7 +55,7 @@ Margin: none · border: none · padding: none (layout role: foundation). `self`
55
55
 
56
56
  The component owns its own styles. Configure it through its props and variants; do not override its internals.
57
57
 
58
- Public tokens it reads: `--kui-font-sans`, `--kui-font-mono`, `--kui-font-2xs`, `--kui-font-xs`, `--kui-font-s`, `--kui-font-m`, `--kui-font-l`, `--kui-font-xl`, `--kui-font-2xl`, `--kui-font-weight-semibold`, `--kui-space-none`, `--kui-space-2xs`, `--kui-space-xs`, `--kui-space-s`, `--kui-space-m`, `--kui-space-l`, `--kui-space-xl`, `--kui-bp-mobile`, `--kui-bp-tablet`, `--kui-bp-desktop`, `--kui-bp-xl-desktop`, `--kui-layout-inline-margin`, `--kui-layout-item-border-width`, `--kui-layout-item-padding`, `--kui-layout-item-gap`, `--kui-layout-content-gap`, `--kui-layout-control-gap`, `--kui-layout-metadata-gap`, `--kui-layout-highlight-inset`, `--kui-layout-rounded-radius`, `--kui-layout-pill-radius`, `--kui-toolbar-group-inner-size`, `--kui-toolbar-group-size`, `--kui-toolbar-gap`, `--kui-safe-area-block-start`, `--kui-safe-area-block-end`, `--kui-safe-area-inline-start`, `--kui-safe-area-inline-end`, `--kui-radius-s`, `--kui-radius-m`, `--kui-radius-l`, `--kui-radius-circle`, `--kui-radius-pill`, `--kui-disclosure-icon-scale`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-color-surface-lowered`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-color-text-link`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-loud`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-loud`, `--kui-color-brand-on-quiet`, `--kui-color-brand-on-normal`, `--kui-color-brand-on-loud`, `--kui-color-brand-on-fill`, `--kui-color-pop-fill-loud`, `--kui-color-pop-fill-quiet`, `--kui-color-pop-fill-normal`, `--kui-color-pop-border-quiet`, `--kui-color-pop-border-normal`, `--kui-color-pop-border-loud`, `--kui-color-pop-on-quiet`, `--kui-color-pop-on-normal`, `--kui-color-pop-on-loud`, `--kui-color-pop-on-fill`, `--kui-color-success-fill-loud`, `--kui-color-success-fill-quiet`, `--kui-color-success-fill-normal`, `--kui-color-success-border-quiet`, `--kui-color-success-border-normal`, `--kui-color-success-border-loud`, `--kui-color-success-on-quiet`, `--kui-color-success-on-normal`, `--kui-color-success-on-loud`, `--kui-color-success-on-fill`, `--kui-color-warning-fill-loud`, `--kui-color-warning-fill-quiet`, `--kui-color-warning-fill-normal`, `--kui-color-warning-border-quiet`, `--kui-color-warning-border-normal`, `--kui-color-warning-border-loud`, `--kui-color-warning-on-quiet`, `--kui-color-warning-on-normal`, `--kui-color-warning-on-loud`, `--kui-color-warning-on-fill`, `--kui-color-danger-fill-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-fill-normal`, `--kui-color-danger-border-quiet`, `--kui-color-danger-border-normal`, `--kui-color-danger-border-loud`, `--kui-color-danger-on-quiet`, `--kui-color-danger-on-normal`, `--kui-color-danger-on-loud`, `--kui-color-danger-on-fill`, `--kui-focus-ring`, `--kui-shadow-s`, `--kui-shadow-l`. Set a token only where its public contract allows; prefer a prop.
58
+ Public tokens it reads: `--kui-font-sans`, `--kui-font-mono`, `--kui-font-2xs`, `--kui-font-xs`, `--kui-font-s`, `--kui-font-m`, `--kui-font-l`, `--kui-font-xl`, `--kui-font-2xl`, `--kui-font-weight-semibold`, `--kui-space-none`, `--kui-space-2xs`, `--kui-space-xs`, `--kui-space-s`, `--kui-space-m`, `--kui-space-l`, `--kui-space-xl`, `--kui-bp-mobile`, `--kui-bp-tablet`, `--kui-bp-desktop`, `--kui-bp-xl-desktop`, `--kui-layout-inline-margin`, `--kui-layout-item-border-width`, `--kui-layout-item-padding`, `--kui-layout-item-gap`, `--kui-layout-content-gap`, `--kui-layout-control-gap`, `--kui-layout-metadata-gap`, `--kui-layout-highlight-inset`, `--kui-layout-rounded-radius`, `--kui-layout-pill-radius`, `--kui-toolbar-group-inner-size`, `--kui-toolbar-group-size`, `--kui-toolbar-gap`, `--kui-safe-area-block-start`, `--kui-safe-area-block-end`, `--kui-safe-area-inline-start`, `--kui-safe-area-inline-end`, `--kui-radius-s`, `--kui-radius-m`, `--kui-radius-l`, `--kui-radius-circle`, `--kui-radius-pill`, `--kui-disclosure-icon-scale`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-color-surface-lowered`, `--kui-sunken-texture`, `--kui-sunken-surface`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-color-text-link`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-loud`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-loud`, `--kui-color-brand-on-quiet`, `--kui-color-brand-on-normal`, `--kui-color-brand-on-loud`, `--kui-color-brand-on-fill`, `--kui-color-pop-fill-loud`, `--kui-color-pop-fill-quiet`, `--kui-color-pop-fill-normal`, `--kui-color-pop-border-quiet`, `--kui-color-pop-border-normal`, `--kui-color-pop-border-loud`, `--kui-color-pop-on-quiet`, `--kui-color-pop-on-normal`, `--kui-color-pop-on-loud`, `--kui-color-pop-on-fill`, `--kui-color-success-fill-loud`, `--kui-color-success-fill-quiet`, `--kui-color-success-fill-normal`, `--kui-color-success-border-quiet`, `--kui-color-success-border-normal`, `--kui-color-success-border-loud`, `--kui-color-success-on-quiet`, `--kui-color-success-on-normal`, `--kui-color-success-on-loud`, `--kui-color-success-on-fill`, `--kui-color-warning-fill-loud`, `--kui-color-warning-fill-quiet`, `--kui-color-warning-fill-normal`, `--kui-color-warning-border-quiet`, `--kui-color-warning-border-normal`, `--kui-color-warning-border-loud`, `--kui-color-warning-on-quiet`, `--kui-color-warning-on-normal`, `--kui-color-warning-on-loud`, `--kui-color-warning-on-fill`, `--kui-color-danger-fill-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-fill-normal`, `--kui-color-danger-border-quiet`, `--kui-color-danger-border-normal`, `--kui-color-danger-border-loud`, `--kui-color-danger-on-quiet`, `--kui-color-danger-on-normal`, `--kui-color-danger-on-loud`, `--kui-color-danger-on-fill`, `--kui-focus-ring`, `--kui-shadow-s`, `--kui-shadow-l`. Set a token only where its public contract allows; prefer a prop.
59
59
 
60
60
  Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
61
61
 
@@ -0,0 +1,80 @@
1
+ # FramedList
2
+
3
+ <!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
4
+
5
+ `@kerfjs/ui:framed-list` · Kerf UI · component · Structure
6
+
7
+ An inset-grouped list: one rounded, bordered frame with dividers between rows of arbitrary content.
8
+
9
+ ## When to use
10
+
11
+ Group settings-style rows of arbitrary content (copy, keycaps, controls) in one framed surface with between-row dividers and an optional highlighted row, without app list CSS.
12
+
13
+ - Settings rows, account or source cards, or shortcut lists group several rows of arbitrary content in one framed surface.
14
+
15
+ **Not when:**
16
+
17
+ - Do not use for read-only label/value facts; use ValueTable.
18
+ - Do not use for selectable navigation rows; use List with ListItem.
19
+ - Do not pad or border its rows from application CSS; FramedListRow owns the inset and divider.
20
+
21
+ **Alternatives:**
22
+
23
+ - [ValueTable](./value-table.md) (nearest) — Use ValueTable when every row is a label and a value.
24
+ - [List](./list.md) (nearest) — Use List with ListItem for navigation or selectable rows.
25
+
26
+ ## Imports
27
+
28
+ - JavaScript: `@kerfjs/ui/framed-list` — exports `FramedList`, `FramedListRow`.
29
+ - CSS: the browser build of `@kerfjs/ui/framed-list` pulls its CSS automatically; import `@kerfjs/ui/framed-list.css` manually only without the `browser` export condition.
30
+ - Declared side effects: browser-condition-css.
31
+
32
+ ## Props
33
+
34
+ Exact prop names and types: [`@kerfjs/ui/framed-list`](../public-api-signatures-v1.md#kerfjsuiframed-list) in `public-api-signatures-v1.md`. Do not infer props from examples.
35
+
36
+ **Variants (configure, do not restyle):**
37
+
38
+ - lowered surface
39
+ - base surface
40
+ - highlighted row
41
+
42
+ ## Composition
43
+
44
+ - Parents: any.
45
+ - Contexts: `application-ui`.
46
+ - Children: unrestricted.
47
+
48
+ ## State and wiring
49
+
50
+ **The app owns:** row content and its controls; which row is highlighted; the list's accessible name.
51
+
52
+ No wiring helper.
53
+
54
+ ## Geometry
55
+
56
+ Margin: self · border: self · padding: self (layout role: structure). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
57
+
58
+ - Rows own the 8px inset and the inset 1px divider above them; the frame owns the 8px margin, border, and radius.
59
+
60
+ ## Accessibility
61
+
62
+ - Renders a list (ul role=list, li rows); pass label when no heading names it. Highlight is visual; carry its meaning in row content or a control's state.
63
+
64
+ ## Styling boundary
65
+
66
+ The component owns its own styles. Configure it through its props and variants; do not override its internals.
67
+
68
+ Public class hooks (select for layout placement only, never to change the component's look): `kui-framed-list`, `kui-framed-list__row`.
69
+
70
+ Never put `kui-framed-list`, `kui-framed-list__row` on an element you write; render `FramedList` instead (`KUI-L103`).
71
+
72
+ Public tokens it reads: `--kui-framed-list-border`, `--kui-color-neutral-border-normal`, `--kui-color-surface-lowered`, `--kui-color-surface`, `--kui-color-brand-fill-quiet`, `--kui-layout-inline-margin`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`. Set a token only where its public contract allows; prefer a prop.
73
+
74
+ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
75
+
76
+ ## Related
77
+
78
+ - Components: [ValueTable](./value-table.md), [List](./list.md).
79
+ - Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
80
+ - UX catalog route: `?component=framed-list`.
@@ -27,6 +27,7 @@ Arrange related siblings in equal-width columns with either a fixed count or aut
27
27
  - [Row](./row.md) (axis-alternative) — Use Row for one horizontal flex line, alignment, or wrapping rather than fixed equal tracks.
28
28
  - [List](./list.md) (axis-alternative) — Use List when the main layout axis is vertical.
29
29
  - [ResizableRegion](./resize.md) (interactive-alternative) — Use ResizableRegion when people must adjust the boundary between tracks.
30
+ - [ColumnTrack](./column-track.md) (nearest) — Use ColumnTrack for a board of columns that scroll sideways or page instead of wrapping.
30
31
 
31
32
  ## Imports
32
33
 
@@ -95,6 +96,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
95
96
 
96
97
  ## Related
97
98
 
98
- - Components: [Row](./row.md), [List](./list.md), [ResizableRegion](./resize.md).
99
+ - Components: [Row](./row.md), [List](./list.md), [ResizableRegion](./resize.md), [ColumnTrack](./column-track.md).
99
100
  - Docs: [`docs/layout.md`](../../docs/layout.md), [`docs/layout.md#grid`](../../docs/layout.md#grid).
100
101
  - UX catalog route: `?component=grid`.
@@ -0,0 +1,82 @@
1
+ # IconButton
2
+
3
+ <!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
4
+
5
+ `@kerfjs/ui:icon-button` · Kerf UI · component · Controls
6
+
7
+ Square, icon-only Web Awesome button with a LucideIcon and a required accessible name.
8
+
9
+ ## When to use
10
+
11
+ Render an icon-only action as a square one form-control height on each side, so it matches an adjacent wa-input or Select, without ::part overrides.
12
+
13
+ - An icon-only action stands alone or beside a form field, such as a Browse button next to a path input.
14
+
15
+ **Not when:**
16
+
17
+ - Do not use inside a ToolbarControlGroup; the group owns its controls' geometry, so compose a native button with a LucideIcon there.
18
+ - Do not use when the action needs a visible text label; use wa-button with text.
19
+ - Do not override wa-button::part(base) width, min-height, or padding to square an icon button; use IconButton.
20
+
21
+ **Alternatives:**
22
+
23
+ - [Button](./wa-button.md) (prefer-over) — Web Awesome squares a button only for a lone wa-icon; with a LucideIcon use IconButton.
24
+ - [ListInsetControl](./list-inset-control.md) (composes-with) — Beside a field in a ListInsetControl the square keeps its size and aligns with the field below its label.
25
+
26
+ ## Imports
27
+
28
+ - JavaScript: `@kerfjs/ui/icon-button` — exports `IconButton`.
29
+ - CSS: the browser build of `@kerfjs/ui/icon-button` pulls its CSS automatically; import `@kerfjs/ui/icon-button.css` manually only without the `browser` export condition.
30
+ - Theme CSS: import `@kerfjs/ui/webawesome.css` once.
31
+ - Registration: import `@awesome.me/webawesome/dist/components/button/button.js` once (a side effect).
32
+ - Declared side effects: browser-condition-css, custom-element-registration.
33
+
34
+ ## Props
35
+
36
+ Exact prop names and types: [`@kerfjs/ui/icon-button`](../public-api-signatures-v1.md#kerfjsuiicon-button) in `public-api-signatures-v1.md`. Do not infer props from examples.
37
+
38
+ **Variants (configure, do not restyle):**
39
+
40
+ - default appearance
41
+ - plain
42
+ - outlined
43
+ - danger variant
44
+ - disabled
45
+ - xs, s, m, l, or xl size
46
+
47
+ ## Composition
48
+
49
+ - Parents: any.
50
+ - Contexts: `application-ui`.
51
+ - Children: unrestricted.
52
+ - Built from: [Button](./wa-button.md), [LucideIcon](./lucide-icon.md).
53
+
54
+ ## State and wiring
55
+
56
+ **The app owns:** the delegated action; the accessible name; appearance, variant, and size choice.
57
+
58
+ No wiring helper.
59
+
60
+ ## Geometry
61
+
62
+ Margin: none · border: self · padding: self (layout role: controls). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
63
+
64
+ ## Accessibility
65
+
66
+ - label is required and names the button through its LucideIcon (role img), since the button shows no text.
67
+
68
+ ## Styling boundary
69
+
70
+ The component owns its own styles. Configure it through its props and variants; do not override its internals.
71
+
72
+ Public class hooks (select for layout placement only, never to change the component's look): `kui-icon-button`.
73
+
74
+ Never put `kui-icon-button` on an element you write; render `IconButton` instead (`KUI-L103`).
75
+
76
+ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
77
+
78
+ ## Related
79
+
80
+ - Components: [Button](./wa-button.md), [LucideIcon](./lucide-icon.md), [ListInsetControl](./list-inset-control.md).
81
+ - Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
82
+ - UX catalog route: `?component=icon-button`.
@@ -0,0 +1,80 @@
1
+ # IconToggleButton
2
+
3
+ <!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
4
+
5
+ `@kerfjs/ui:icon-toggle-button` · Kerf UI · component · Controls
6
+
7
+ A standalone icon-only toggle with a single contained toolbar group's geometry and pressed chrome.
8
+
9
+ ## When to use
10
+
11
+ Render an icon-only aria-pressed toggle in content or a pane footer, where a Toolbar does not belong, with the 44px contained geometry and raised pressed face of a single ToolbarControlGroup.
12
+
13
+ - An icon-only on/off control (show a panel, a conversation) sits in content or a pane footer outside any Toolbar.
14
+
15
+ **Not when:**
16
+
17
+ - Do not use inside a Toolbar; compose a ToolbarControlGroup there.
18
+ - Do not use for a momentary action; use IconButton.
19
+ - Do not use for one-of-several choices; use SegmentedControl.
20
+
21
+ **Alternatives:**
22
+
23
+ - [ToolbarControlGroup](./toolbar-control-group.md) (nearest) — Inside a Toolbar, a single ToolbarControlGroup with a pressed button is the same control.
24
+ - [IconButton](./icon-button.md) (nearest) — Use IconButton for a momentary icon-only action.
25
+
26
+ ## Imports
27
+
28
+ - JavaScript: `@kerfjs/ui/icon-toggle-button` — exports `IconToggleButton`.
29
+ - CSS: the browser build of `@kerfjs/ui/icon-toggle-button` pulls its CSS automatically; import `@kerfjs/ui/icon-toggle-button.css` manually only without the `browser` export condition.
30
+ - Declared side effects: browser-condition-css.
31
+
32
+ ## Props
33
+
34
+ Exact prop names and types: [`@kerfjs/ui/icon-toggle-button`](../public-api-signatures-v1.md#kerfjsuiicon-toggle-button) in `public-api-signatures-v1.md`. Do not infer props from examples.
35
+
36
+ **Variants (configure, do not restyle):**
37
+
38
+ - pressed
39
+ - unpressed
40
+ - pill or rounded shape
41
+ - disabled
42
+
43
+ ## Composition
44
+
45
+ - Parents: any.
46
+ - Contexts: `application-ui`.
47
+ - Children: unrestricted.
48
+ - Built from: [LucideIcon](./lucide-icon.md).
49
+
50
+ ## State and wiring
51
+
52
+ **The app owns:** the pressed state and its delegated action; the accessible name.
53
+
54
+ No wiring helper.
55
+
56
+ ## Geometry
57
+
58
+ Margin: none · border: self · padding: self (layout role: controls). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
59
+
60
+ ## Accessibility
61
+
62
+ - Native button with aria-pressed and a required aria-label; with help tags registered it shows that label on hover and keyboard focus.
63
+
64
+ ## Styling boundary
65
+
66
+ The component owns its own styles. Configure it through its props and variants; do not override its internals.
67
+
68
+ Public class hooks (select for layout placement only, never to change the component's look): `kui-icon-toggle-button`, `kui-icon-toggle-button__face`.
69
+
70
+ Never put `kui-icon-toggle-button`, `kui-icon-toggle-button__face` on an element you write; render `IconToggleButton` instead (`KUI-L103`).
71
+
72
+ Public tokens it reads: `--kui-color-neutral-border-normal`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-surface`, `--kui-color-brand-on-quiet`, `--kui-shadow-s`, `--kui-focus-ring`, `--kui-layout-pill-radius`, `--kui-layout-rounded-radius`, `--kui-layout-highlight-inset`. Set a token only where its public contract allows; prefer a prop.
73
+
74
+ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
75
+
76
+ ## Related
77
+
78
+ - Components: [LucideIcon](./lucide-icon.md), [ToolbarControlGroup](./toolbar-control-group.md), [IconButton](./icon-button.md).
79
+ - Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
80
+ - UX catalog route: `?component=icon-toggle-button`.
@@ -4,13 +4,14 @@
4
4
 
5
5
  `@kerfjs/ui:list-action-row` · Kerf UI · component · Navigation
6
6
 
7
- Configurable navigation rows with structured labels, status/busy metadata, density, group dividers, and sibling primary/trailing native-button actions.
7
+ Configurable navigation rows with structured labels, status/busy metadata, density, group dividers, and a primary native-button action beside a sibling trailing native button or trailing overflow PopupMenu.
8
8
 
9
9
  ## When to use
10
10
 
11
11
  Keep a selectable primary row action and an independently named trailing action as sibling native controls inside one noninteractive visual row.
12
12
 
13
13
  - A navigation or item row needs both a primary selectable action and an independently focusable trailing action.
14
+ - A command row needs a trailing "…" overflow menu (trailingMenu), optionally also opened at the pointer from the row's contextmenu with openPopupMenuAt.
14
15
 
15
16
  **Not when:**
16
17
 
@@ -26,11 +27,13 @@ Keep a selectable primary row action and an independently named trailing action
26
27
 
27
28
  - JavaScript: `@kerfjs/ui/list-action-row` — exports `ListActionRow`.
28
29
  - CSS: the browser build of `@kerfjs/ui/list-action-row` pulls its CSS automatically; import `@kerfjs/ui/list-action-row.css` manually only without the `browser` export condition.
30
+ - Wiring: `wireListReorder` from `@kerfjs/ui/wire-list-reorder` (optional).
31
+ - Wiring: `reorderListItems` from `@kerfjs/ui/wire-list-reorder` (optional).
29
32
  - Declared side effects: browser-condition-css.
30
33
 
31
34
  ## Props
32
35
 
33
- Exact prop names and types: [`@kerfjs/ui/list-action-row`](../public-api-signatures-v1.md#kerfjsuilist-action-row) in `public-api-signatures-v1.md`. Do not infer props from examples.
36
+ Exact prop names and types: [`@kerfjs/ui/list-action-row`](../public-api-signatures-v1.md#kerfjsuilist-action-row), [`@kerfjs/ui/wire-list-reorder`](../public-api-signatures-v1.md#kerfjsuiwire-list-reorder) in `public-api-signatures-v1.md`. Do not infer props from examples.
34
37
 
35
38
  **Variants (configure, do not restyle):**
36
39
 
@@ -44,7 +47,10 @@ Exact prop names and types: [`@kerfjs/ui/list-action-row`](../public-api-signatu
44
47
  - description and status
45
48
  - busy while retaining content
46
49
  - interaction-revealed trailing action
50
+ - trailing overflow menu
47
51
  - before, after, or paired group divider
52
+ - position-aware divided-list corners: flat wherever a divider line (this row's or a neighbor's) meets the edge
53
+ - draggable row with dragging and drop-before / drop-after insertion states
48
54
 
49
55
  **CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
50
56
 
@@ -55,13 +61,18 @@ Exact prop names and types: [`@kerfjs/ui/list-action-row`](../public-api-signatu
55
61
  - Parents: any.
56
62
  - Contexts: `application-ui`.
57
63
  - Children: unrestricted.
58
- - Built from: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md).
64
+ - Built from: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [PopupMenu](./popup-menu.md).
59
65
 
60
66
  ## State and wiring
61
67
 
62
- **The app owns:** routing; selection; action handling; domain data attributes; popover or context-menu policy.
68
+ **The app owns:** routing; selection; action handling; domain data attributes; popover or context-menu policy; row order.
63
69
 
64
- No wiring helper.
70
+ **Wiring:** `wireListReorder`, `reorderListItems` is optional.
71
+
72
+ **Wiring-owned state attributes** — never render, remove, or branch on these as app state:
73
+
74
+ - `data-dragging` on `ListActionRow rows being dragged` (`wireListReorder`): "true" on every row a pointer drag is moving (the dragged row, or every selected row of its list when the dragged row is selected). Same attribute the `dragging` prop renders.
75
+ - `data-drop-position` on `ListActionRow row under the pointer` (`wireListReorder`): "before" or "after": the edge of this row the dragged rows would land beside. Same attribute the `dropPosition` prop renders.
65
76
 
66
77
  ## Geometry
67
78
 
@@ -70,7 +81,9 @@ Margin: self · border: self · padding: self (layout role: navigation). `self`
70
81
  ## Accessibility
71
82
 
72
83
  - The noninteractive root contains two sibling native buttons in primary-then-trailing focus order; each button has its own action, item identity, accessible name, and disabled state.
84
+ - A trailingMenu replaces the trailing button with a PopupMenu trigger in the same position: an icon-only button named by trailingMenu.label that exposes aria-haspopup="menu" and aria-expanded, moves focus into the menu, and returns focus to the trigger on Escape or a choice.
73
85
  - Selection semantics are exposed only by the primary button; label, icon, and trailingActionIcon are dormant SafeHtml and must not contain interactive descendants; never place an interactive descendant in ListItem.trailing.
86
+ - A draggable row is dragged by its noninteractive root; with wireListReorder, Alt+Shift+ArrowUp/ArrowDown on its primary button moves it, and focus returns to that button after the application re-renders.
74
87
 
75
88
  ## Styling boundary
76
89
 
@@ -80,12 +93,12 @@ Public class hooks (select for layout placement only, never to change the compon
80
93
 
81
94
  Never put `kui-list-action-row`, `kui-list-action-row__icon`, `kui-list-action-row__label`, `kui-list-action-row__primary-label`, `kui-list-action-row__description`, `kui-list-action-row__status`, `kui-list-action-row__primary`, `kui-list-action-row__trailing-action` on an element you write; render `ListActionRow` instead (`KUI-L103`).
82
95
 
83
- Public tokens it reads: `--kui-color-brand-border-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-quiet`, `--kui-focus-ring`, `--kui-layout-inline-margin`, `--kui-layout-item-gap`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`, `--kui-radius-pill`, `--kui-list-action-row-background`, `--kui-list-action-row-border`, `--kui-list-action-row-color`, `--kui-list-action-row-hover-background`, `--kui-list-action-row-hover-border`, `--kui-list-action-row-selected-background`, `--kui-list-action-row-selected-border`, `--kui-list-action-row-selected-color`, `--kui-list-action-row-trailing-hover-background`, `--kui-list-group-divider-color`, `--kui-font-xs`. Set a token only where its public contract allows; prefer a prop.
96
+ Public tokens it reads: `--kui-color-brand-border-loud`, `--kui-color-brand-border-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-quiet`, `--kui-focus-ring`, `--kui-layout-inline-margin`, `--kui-layout-item-gap`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`, `--kui-radius-pill`, `--kui-list-action-row-background`, `--kui-list-action-row-border`, `--kui-list-action-row-color`, `--kui-list-action-row-dragging-opacity`, `--kui-list-action-row-drop-indicator`, `--kui-list-action-row-drop-indicator-width`, `--kui-list-action-row-hover-background`, `--kui-list-action-row-hover-border`, `--kui-list-action-row-selected-background`, `--kui-list-action-row-selected-border`, `--kui-list-action-row-selected-color`, `--kui-list-action-row-trailing-hover-background`, `--kui-list-group-divider-color`, `--kui-font-xs`. Set a token only where its public contract allows; prefer a prop.
84
97
 
85
98
  Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
86
99
 
87
100
  ## Related
88
101
 
89
- - Components: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [ListItem](./list-item.md), [AppTab](./tabs.md).
102
+ - Components: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [PopupMenu](./popup-menu.md), [ListItem](./list-item.md), [AppTab](./tabs.md).
90
103
  - Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
91
104
  - UX catalog route: `?component=list-action-row`.
@@ -20,16 +20,19 @@ Selectable, disabled, trailing, and multiline action or link rows.
20
20
  **Alternatives:**
21
21
 
22
22
  - [ListActionRow](./list-action-row.md) (nearest) — The trailing region must be independently interactive.
23
+ - [SummaryRow](./summary-row.md) (nearest) — Use SummaryRow for dense selectable item summaries with metadata.
23
24
 
24
25
  ## Imports
25
26
 
26
- - JavaScript: `@kerfjs/ui/list-item` — exports `ListItem`, `ListItemLink`.
27
+ - JavaScript: `@kerfjs/ui/list-item` — exports `ListItem`, `ListItemLink`, `wireListReorder`, `reorderListItems`.
27
28
  - CSS: the browser build of `@kerfjs/ui/list-item` pulls its CSS automatically; import `@kerfjs/ui/list-item.css` manually only without the `browser` export condition.
29
+ - Wiring: `wireListReorder` from `@kerfjs/ui/wire-list-reorder` (optional).
30
+ - Wiring: `reorderListItems` from `@kerfjs/ui/wire-list-reorder` (optional).
28
31
  - Declared side effects: browser-condition-css.
29
32
 
30
33
  ## Props
31
34
 
32
- Exact prop names and types: [`@kerfjs/ui/list-item`](../public-api-signatures-v1.md#kerfjsuilist-item) in `public-api-signatures-v1.md`. Do not infer props from examples.
35
+ Exact prop names and types: [`@kerfjs/ui/list-item`](../public-api-signatures-v1.md#kerfjsuilist-item), [`@kerfjs/ui/wire-list-reorder`](../public-api-signatures-v1.md#kerfjsuiwire-list-reorder) in `public-api-signatures-v1.md`. Do not infer props from examples.
33
36
 
34
37
  **Variants (configure, do not restyle):**
35
38
 
@@ -44,9 +47,11 @@ Exact prop names and types: [`@kerfjs/ui/list-item`](../public-api-signatures-v1
44
47
  - spacious density
45
48
  - centered icon beside a multiline label
46
49
  - drag-target state
50
+ - draggable row with dragging and drop-before / drop-after insertion states
47
51
  - description and status
48
52
  - busy while retaining content
49
53
  - before, after, or paired group divider
54
+ - position-aware divided-list corners: flat wherever a divider line (this row's or a neighbor's) meets the edge
50
55
 
51
56
  **CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
52
57
 
@@ -61,9 +66,14 @@ Exact prop names and types: [`@kerfjs/ui/list-item`](../public-api-signatures-v1
61
66
 
62
67
  ## State and wiring
63
68
 
64
- **The app owns:** routing; link destinations; selection; permissions; action handling; domain data attributes.
69
+ **The app owns:** routing; link destinations; selection; permissions; action handling; domain data attributes; row order.
65
70
 
66
- No wiring helper.
71
+ **Wiring:** `wireListReorder`, `reorderListItems` is optional.
72
+
73
+ **Wiring-owned state attributes** — never render, remove, or branch on these as app state:
74
+
75
+ - `data-dragging` on `ListItem / ListItemLink rows being dragged` (`wireListReorder`): "true" on every row a pointer drag is moving (the dragged row, or every selected row of its list when the dragged row is selected). Same attribute the `dragging` prop renders.
76
+ - `data-drop-position` on `ListItem / ListItemLink row under the pointer` (`wireListReorder`): "before" or "after": the edge of this row the dragged rows would land beside. Same attribute the `dropPosition` prop renders.
67
77
 
68
78
  ## Geometry
69
79
 
@@ -73,7 +83,7 @@ Margin: self · border: self · padding: self (layout role: navigation). `self`
73
83
 
74
84
  ## Accessibility
75
85
 
76
- - ListItem uses native button activation and pressed maps to aria-pressed; ListItemLink uses native anchor activation and external opens a new tab with safe rel and an announced default label. Both map selected to aria-current; disabled or loading links omit href and leave the tab order. rootAttributes cannot add role=menuitem or replace owned ARIA; trailing is dormant content and must not contain controls.
86
+ - ListItem uses native button activation and pressed maps to aria-pressed; ListItemLink uses native anchor activation and external opens a new tab with safe rel and an announced default label. Both map selected to aria-current; disabled or loading links omit href and leave the tab order. rootAttributes cannot add role=menuitem or replace owned ARIA; trailing is dormant content and must not contain controls. A draggable row reorders by pointer drag or, with wireListReorder, Alt+Shift+ArrowUp/ArrowDown; a placeholder is never draggable.
77
87
 
78
88
  ## Styling boundary
79
89
 
@@ -83,12 +93,12 @@ Public class hooks (select for layout placement only, never to change the compon
83
93
 
84
94
  Never put `kui-list-item`, `kui-list-item__icon`, `kui-list-item__label`, `kui-list-item__primary-label`, `kui-list-item__description`, `kui-list-item__status`, `kui-list-item__trailing` on an element you write; render `ListItem` instead (`KUI-L103`).
85
95
 
86
- Public tokens it reads: `--kui-color-brand-border-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-focus-ring`, `--kui-list-item-color`, `--kui-list-item-background`, `--kui-list-item-align-items`, `--kui-list-item-border-width`, `--kui-list-item-border`, `--kui-list-item-columns`, `--kui-list-item-drag-target-background`, `--kui-list-item-drag-target-outline`, `--kui-list-item-drag-target-outline-offset`, `--kui-list-item-gap`, `--kui-list-item-hover-background`, `--kui-list-item-hover-border`, `--kui-list-item-icon-color`, `--kui-list-item-icon-size`, `--kui-list-item-label-max-width`, `--kui-list-item-label-weight`, `--kui-list-item-min-height`, `--kui-list-item-padding-block`, `--kui-list-item-padding-inline`, `--kui-list-item-radius`, `--kui-list-item-selected-background`, `--kui-list-item-selected-border`, `--kui-list-item-selected-color`, `--kui-list-item-trailing-color`, `--kui-list-group-divider-color`, `--kui-font-xs`, `--kui-layout-inline-margin`, `--kui-layout-item-gap`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`. Set a token only where its public contract allows; prefer a prop.
96
+ Public tokens it reads: `--kui-color-brand-border-loud`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-radius-pill`, `--kui-focus-ring`, `--kui-list-item-color`, `--kui-list-item-background`, `--kui-list-item-align-items`, `--kui-list-item-border-width`, `--kui-list-item-border`, `--kui-list-item-columns`, `--kui-list-item-drag-target-background`, `--kui-list-item-drag-target-outline`, `--kui-list-item-drag-target-outline-offset`, `--kui-list-item-dragging-opacity`, `--kui-list-item-drop-indicator`, `--kui-list-item-drop-indicator-width`, `--kui-list-item-gap`, `--kui-list-item-hover-background`, `--kui-list-item-hover-border`, `--kui-list-item-icon-color`, `--kui-list-item-icon-size`, `--kui-list-item-label-max-width`, `--kui-list-item-label-weight`, `--kui-list-item-min-height`, `--kui-list-item-padding-block`, `--kui-list-item-padding-inline`, `--kui-list-item-radius`, `--kui-list-item-selected-background`, `--kui-list-item-selected-border`, `--kui-list-item-selected-color`, `--kui-list-item-trailing-color`, `--kui-list-group-divider-color`, `--kui-font-xs`, `--kui-layout-inline-margin`, `--kui-layout-item-gap`, `--kui-layout-item-padding`, `--kui-layout-rounded-radius`. Set a token only where its public contract allows; prefer a prop.
87
97
 
88
98
  Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
89
99
 
90
100
  ## Related
91
101
 
92
- - Components: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [ListActionRow](./list-action-row.md).
102
+ - Components: [LucideIcon](./lucide-icon.md), [LoadingSpinner](./loading-spinner.md), [ListActionRow](./list-action-row.md), [SummaryRow](./summary-row.md).
93
103
  - Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
94
104
  - UX catalog route: `?component=list-item`.
@@ -44,12 +44,14 @@ Exact prop names and types: [`@kerfjs/ui/list`](../public-api-signatures-v1.md#k
44
44
  - typed CssLength gap
45
45
  - boolean, finite-keyword, or typed CssFlex flex
46
46
  - scrollable
47
+ - base or raised solid surface
48
+ - document reading inset
47
49
  - left/center/right/full horizontal alignment
48
50
  - top/middle/bottom/full vertical alignment
49
51
  - top/right/bottom/left divider combinations
50
52
  - top/right/bottom/left text and control inset combinations
51
53
  - fill: the layout root fills a definite-height parent
52
- - rootAttributes: safe data-\* metadata on the root
54
+ - rootAttributes: safe data-\*, aria-\*, and structural role on the root
53
55
  - scroll dividers when named as wireScrollDividers targets chrome
54
56
  - multi-select grid for rich ContentItem rows
55
57
 
@@ -86,6 +88,7 @@ Margin: none · border: conditional · padding: conditional (layout role: naviga
86
88
 
87
89
  - List adds layout only and no list role by default; selectionMode="multiple" makes it an aria-multiselectable grid with a required ariaLabel for selectable ContentItem rows.
88
90
  - Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll.
91
+ - A focused scrollable List (a keyboard-focusable scroller) draws the theme focus ring inset and rounded inside its own box, so a rounded or clipping parent never cuts it off; do not restyle its focus.
89
92
 
90
93
  ## Styling boundary
91
94
 
@@ -95,7 +98,7 @@ Public class hooks (select for layout placement only, never to change the compon
95
98
 
96
99
  Never put `kui-list` on an element you write; render `List` instead (`KUI-L103`).
97
100
 
98
- Public tokens it reads: `--kui-color-neutral-border-normal`, `--kui-layout-item-gap`, `--kui-list-divider-color`, `--kui-list-gap`. Set a token only where its public contract allows; prefer a prop.
101
+ Public tokens it reads: `--kui-color-neutral-border-normal`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-layout-item-gap`, `--kui-list-divider-color`, `--kui-list-gap`, `--kui-space-l`, `--kui-space-m`, `--kui-space-xl`. Set a token only where its public contract allows; prefer a prop.
99
102
 
100
103
  Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
101
104
 
@@ -22,6 +22,7 @@ Present a single linear or drill-down flow while preserving each prior view's st
22
22
 
23
23
  - [SplitView](./split-view.md) (roomy-alternative) — Promote a list-to-detail stack to SplitView once both regions fit together.
24
24
  - [TabNavigator](./tab-navigator.md) (composes-with) — Use one NavStack as each TabNavigator tab's persistent content.
25
+ - [ContentSwap](./content-swap.md) (nearest) — Use ContentSwap to swap content in place inside one region without navigation chrome.
25
26
 
26
27
  ## Imports
27
28
 
@@ -100,6 +101,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
100
101
 
101
102
  ## Related
102
103
 
103
- - Components: [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [SplitView](./split-view.md), [TabNavigator](./tab-navigator.md).
104
+ - Components: [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [SplitView](./split-view.md), [TabNavigator](./tab-navigator.md), [ContentSwap](./content-swap.md).
104
105
  - Docs: [`docs/nav-stack.md`](../../docs/nav-stack.md), [`docs/app-layouts.md#decision-matrix`](../../docs/app-layouts.md#decision-matrix).
105
106
  - UX catalog route: `?component=nav-stack`.
@@ -24,7 +24,7 @@ A typed action menu with nested choices, selected state, and optional pointer-an
24
24
 
25
25
  ## Imports
26
26
 
27
- - JavaScript: `@kerfjs/ui/popup-menu` — exports `PopupMenu`, `openPopupMenuAt`, `closePopupMenu`.
27
+ - JavaScript: `@kerfjs/ui/popup-menu` — exports `PopupMenu`, `openPopupMenu`, `openPopupMenuAt`, `closePopupMenu`.
28
28
  - CSS: the browser build of `@kerfjs/ui/popup-menu` pulls its CSS automatically; import `@kerfjs/ui/popup-menu.css` manually only without the `browser` export condition.
29
29
  - Theme CSS: import `@kerfjs/ui/webawesome.css` once.
30
30
  - Registration: import `@kerfjs/ui/popup-menu/register` once (a side effect).
@@ -45,7 +45,7 @@ Exact prop names and types: [`@kerfjs/ui/popup-menu`](../public-api-signatures-v
45
45
  - nested actions
46
46
  - checked choices and trailing details
47
47
  - danger tone and disabled reasons
48
- - context trigger
48
+ - context trigger with a rendered anchor point and a zero-footprint anchor host
49
49
  - placement
50
50
 
51
51
  ## Composition
@@ -47,7 +47,7 @@ Exact prop names and types: [`@kerfjs/ui/row`](../public-api-signatures-v1.md#ke
47
47
  - nowrap or wrapping
48
48
  - top/right/bottom/left text and control inset combinations
49
49
  - fill: the layout root fills a definite-height parent
50
- - rootAttributes: safe data-\* metadata on the root
50
+ - rootAttributes: safe data-\*, aria-\*, and structural role metadata on the root
51
51
 
52
52
  **CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
53
53
 
@@ -23,6 +23,7 @@ Choose one or more controlled values, keep unavailable choices visible, and opti
23
23
  - [SegmentedControl](./segmented-control.md) (nearest)
24
24
  - [Select](./wa-select.md) (prefer-over)
25
25
  - [Dropdown](./wa-dropdown.md) (prefer-over)
26
+ - [Combobox](./combobox.md) (nearest) — Use Combobox when people may type to filter or create a new value.
26
27
 
27
28
  ## Imports
28
29
 
@@ -110,6 +111,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
110
111
 
111
112
  ## Related
112
113
 
113
- - Components: [LucideIcon](./lucide-icon.md), [Badge](./badge.md), [Select](./wa-select.md), [Option](./wa-option.md), [SegmentedControl](./segmented-control.md), [Dropdown](./wa-dropdown.md).
114
+ - Components: [LucideIcon](./lucide-icon.md), [Badge](./badge.md), [Select](./wa-select.md), [Option](./wa-option.md), [SegmentedControl](./segmented-control.md), [Dropdown](./wa-dropdown.md), [Combobox](./combobox.md).
114
115
  - Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#web-awesome-overlap-policy`](../../docs/component-selection.md#web-awesome-overlap-policy).
115
116
  - UX catalog route: `?component=select`.