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

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 (404) hide show
  1. package/README.md +29 -1
  2. package/ai/component-catalog.json +23 -11
  3. package/ai/component-composition.json +9 -3
  4. package/ai/components/README.md +1 -1
  5. package/ai/components/badge.md +1 -1
  6. package/ai/components/chip.md +1 -1
  7. package/ai/components/content-item.md +8 -5
  8. package/ai/components/document-baseline.md +2 -2
  9. package/ai/components/grid.md +5 -3
  10. package/ai/components/lucide-icon.md +11 -0
  11. package/ai/public-api-signatures-v1.md +92 -61
  12. package/ai/skill.md +33 -4
  13. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  14. package/analyzer/index.mjs +11 -1
  15. package/dist/app-tab.js +1 -1
  16. package/dist/badge.d.ts +5 -3
  17. package/dist/badge.js +1 -1
  18. package/dist/browser/catalog.js +7 -7
  19. package/dist/browser/collapsible-panel.js +3 -3
  20. package/dist/browser/list-header.js +1 -1
  21. package/dist/browser/nav-stack.js +1 -1
  22. package/dist/browser/select.js +1 -1
  23. package/dist/browser/split-view.js +1 -1
  24. package/dist/browser/workbench.js +4 -4
  25. package/dist/catalog-resources.d.ts +6 -6
  26. package/dist/catalog-resources.js +1 -1
  27. package/dist/catalog-resources.js.map +1 -1
  28. package/dist/catalog.d.ts +5 -5
  29. package/dist/catalog.js +13 -13
  30. package/dist/catalog.js.map +1 -1
  31. package/dist/chip.d.ts +3 -2
  32. package/dist/chip.js +1 -1
  33. package/dist/{chunk-SVLDRGPJ.js → chunk-3RE2JMZU.js} +7 -3
  34. package/dist/chunk-3RE2JMZU.js.map +1 -0
  35. package/dist/{chunk-V4WLBOVJ.js → chunk-5BZBIRQG.js} +4 -4
  36. package/dist/chunk-5BZBIRQG.js.map +1 -0
  37. package/dist/{chunk-SX7FJXPJ.js → chunk-5D3WDMIK.js} +4 -4
  38. package/dist/chunk-5D3WDMIK.js.map +1 -0
  39. package/dist/{chunk-HKVJ5MW3.js → chunk-5PAVAR4B.js} +3 -3
  40. package/dist/chunk-5PAVAR4B.js.map +1 -0
  41. package/dist/{chunk-5TTZPGUY.js → chunk-72LLWYP2.js} +6 -6
  42. package/dist/chunk-72LLWYP2.js.map +1 -0
  43. package/dist/{chunk-JA4J7Y4C.js → chunk-75I3SNUJ.js} +2 -2
  44. package/dist/chunk-75I3SNUJ.js.map +1 -0
  45. package/dist/{chunk-K47P7QZC.js → chunk-7QQ3HE47.js} +2 -2
  46. package/dist/chunk-7QQ3HE47.js.map +1 -0
  47. package/dist/{chunk-O5GM2JAM.js → chunk-7QWIJEK5.js} +9 -9
  48. package/dist/chunk-7QWIJEK5.js.map +1 -0
  49. package/dist/{chunk-5I7QGQVT.js → chunk-AN5IWMTM.js} +2 -2
  50. package/dist/chunk-AN5IWMTM.js.map +1 -0
  51. package/dist/{chunk-3BYFWTP3.js → chunk-AOAW55JN.js} +2 -2
  52. package/dist/chunk-AOAW55JN.js.map +1 -0
  53. package/dist/{chunk-5UGLKFBF.js → chunk-ARZ4RSQO.js} +5 -6
  54. package/dist/chunk-ARZ4RSQO.js.map +1 -0
  55. package/dist/{chunk-TCXDZNCX.js → chunk-BJLXE56E.js} +6 -6
  56. package/dist/chunk-BJLXE56E.js.map +1 -0
  57. package/dist/{chunk-RGS4WX2M.js → chunk-BYHGRKC3.js} +2 -2
  58. package/dist/chunk-BYHGRKC3.js.map +1 -0
  59. package/dist/{chunk-ZLKZFKLW.js → chunk-CEJ5FK6G.js} +2 -2
  60. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  61. package/dist/{chunk-SMZGAPCU.js → chunk-DQDTZE4W.js} +2 -2
  62. package/dist/chunk-DQDTZE4W.js.map +1 -0
  63. package/dist/{chunk-JGIV6ZDA.js → chunk-EFDCALR3.js} +2 -2
  64. package/dist/chunk-EFDCALR3.js.map +1 -0
  65. package/dist/{chunk-FKPKGP2H.js → chunk-G4VKQP7B.js} +2 -2
  66. package/dist/chunk-G4VKQP7B.js.map +1 -0
  67. package/dist/{chunk-TOICTHR2.js → chunk-GO2CZX4M.js} +2 -2
  68. package/dist/chunk-GO2CZX4M.js.map +1 -0
  69. package/dist/{chunk-DPAUKNB6.js → chunk-GS2QD3N7.js} +3 -3
  70. package/dist/chunk-GS2QD3N7.js.map +1 -0
  71. package/dist/{chunk-SLWCCHNP.js → chunk-H45DAZBL.js} +2 -2
  72. package/dist/chunk-H45DAZBL.js.map +1 -0
  73. package/dist/{chunk-DA3HS64I.js → chunk-H7ZJEI3H.js} +3 -3
  74. package/dist/chunk-H7ZJEI3H.js.map +1 -0
  75. package/dist/{chunk-V4GAQ74C.js → chunk-HFLGWMG3.js} +4 -4
  76. package/dist/chunk-HFLGWMG3.js.map +1 -0
  77. package/dist/{chunk-HXTAPIHQ.js → chunk-HFQDSSED.js} +6 -6
  78. package/dist/chunk-HFQDSSED.js.map +1 -0
  79. package/dist/{chunk-GRHJQWV2.js → chunk-HGSTMZZ6.js} +6 -6
  80. package/dist/chunk-HGSTMZZ6.js.map +1 -0
  81. package/dist/{chunk-WF75U3V4.js → chunk-HPREYDKV.js} +2 -2
  82. package/dist/chunk-HPREYDKV.js.map +1 -0
  83. package/dist/{chunk-VA5TN5PR.js → chunk-I4SDIMFA.js} +2 -2
  84. package/dist/chunk-I4SDIMFA.js.map +1 -0
  85. package/dist/{chunk-4SQK27MR.js → chunk-IM3GKYOG.js} +2 -2
  86. package/dist/chunk-IM3GKYOG.js.map +1 -0
  87. package/dist/{chunk-PL26TKNK.js → chunk-IVLTEBBT.js} +8 -8
  88. package/dist/chunk-IVLTEBBT.js.map +1 -0
  89. package/dist/{chunk-ALGYHYXP.js → chunk-J3AWE5I4.js} +2 -2
  90. package/dist/chunk-J3AWE5I4.js.map +1 -0
  91. package/dist/{chunk-OXO2QJWV.js → chunk-JOR5LGYE.js} +2 -2
  92. package/dist/chunk-JOR5LGYE.js.map +1 -0
  93. package/dist/{chunk-SRSJO5QE.js → chunk-LAZLBC2Q.js} +2 -2
  94. package/dist/chunk-LAZLBC2Q.js.map +1 -0
  95. package/dist/{chunk-RFGW735Q.js → chunk-LRAIS3YB.js} +2 -2
  96. package/dist/chunk-LRAIS3YB.js.map +1 -0
  97. package/dist/{chunk-AYUHMAI6.js → chunk-MXNIVEVL.js} +2 -2
  98. package/dist/chunk-MXNIVEVL.js.map +1 -0
  99. package/dist/{chunk-4NG4Y2Q6.js → chunk-NJZMR7HM.js} +2 -2
  100. package/dist/chunk-NJZMR7HM.js.map +1 -0
  101. package/dist/{chunk-DG6G5EPF.js → chunk-NMWDHZVM.js} +2 -2
  102. package/dist/chunk-NMWDHZVM.js.map +1 -0
  103. package/dist/{chunk-X5QSICJ3.js → chunk-NS2TBYM4.js} +2 -2
  104. package/dist/chunk-NS2TBYM4.js.map +1 -0
  105. package/dist/{chunk-4FEVHE7C.js → chunk-NVRJ7C3W.js} +4 -4
  106. package/dist/chunk-NVRJ7C3W.js.map +1 -0
  107. package/dist/{chunk-BFPBS5Y4.js → chunk-O27D24CA.js} +2 -2
  108. package/dist/chunk-O27D24CA.js.map +1 -0
  109. package/dist/{chunk-DUBUXJA3.js → chunk-PQQQXJGV.js} +4 -2
  110. package/dist/chunk-PQQQXJGV.js.map +1 -0
  111. package/dist/{chunk-6DFDTWGG.js → chunk-QYXKMLHO.js} +2 -2
  112. package/dist/chunk-QYXKMLHO.js.map +1 -0
  113. package/dist/{chunk-I3Q7KKYM.js → chunk-S3ECMF23.js} +2 -2
  114. package/dist/chunk-S3ECMF23.js.map +1 -0
  115. package/dist/{chunk-PSHUSWQH.js → chunk-S4ZGTDSG.js} +2 -2
  116. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  117. package/dist/{chunk-OYQIONQF.js → chunk-SJY7KC45.js} +5 -5
  118. package/dist/chunk-SJY7KC45.js.map +1 -0
  119. package/dist/{chunk-NPNSKX3K.js → chunk-VLPE6OPN.js} +2 -2
  120. package/dist/chunk-VLPE6OPN.js.map +1 -0
  121. package/dist/{chunk-NCSWXG7G.js → chunk-VLQUXZKA.js} +9 -3
  122. package/dist/chunk-VLQUXZKA.js.map +1 -0
  123. package/dist/{chunk-EHIMH4J7.js → chunk-VR7MWD2X.js} +10 -4
  124. package/dist/chunk-VR7MWD2X.js.map +1 -0
  125. package/dist/{chunk-NN6GYOA2.js → chunk-XIZRXI7N.js} +2 -2
  126. package/dist/chunk-XIZRXI7N.js.map +1 -0
  127. package/dist/{chunk-TDN5EE3S.js → chunk-Y6KT7ZTR.js} +2 -2
  128. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  129. package/dist/{chunk-LHSUPNSE.js → chunk-YLJ6X3AC.js} +2 -2
  130. package/dist/chunk-YLJ6X3AC.js.map +1 -0
  131. package/dist/{chunk-YDGNU2OD.js → chunk-ZVYA6TLR.js} +5 -2
  132. package/dist/chunk-ZVYA6TLR.js.map +1 -0
  133. package/dist/collapsible-panel.d.ts +6 -6
  134. package/dist/collapsible-panel.js +3 -3
  135. package/dist/collapsible-panel.js.map +1 -1
  136. package/dist/content-item.d.ts +13 -2
  137. package/dist/content-item.js +1 -1
  138. package/dist/css-values.js +1 -1
  139. package/dist/device-class.js +1 -1
  140. package/dist/device-class.js.map +1 -1
  141. package/dist/disclosure-arrow.js +1 -1
  142. package/dist/empty-state.js +1 -1
  143. package/dist/floating-toolbar.d.ts +1 -1
  144. package/dist/floating-toolbar.js +1 -1
  145. package/dist/grid.d.ts +10 -3
  146. package/dist/grid.js +1 -1
  147. package/dist/help-tags-register.js +1 -1
  148. package/dist/help-tags-register.js.map +1 -1
  149. package/dist/index.d.ts +27 -26
  150. package/dist/index.js +40 -40
  151. package/dist/list-action-row.js +1 -1
  152. package/dist/list-header.js +1 -1
  153. package/dist/list-inset-control.js +1 -1
  154. package/dist/list-inset-text.js +1 -1
  155. package/dist/list-item.js +1 -1
  156. package/dist/list.d.ts +2 -2
  157. package/dist/list.js +1 -1
  158. package/dist/loading-spinner.d.ts +4 -2
  159. package/dist/loading-spinner.js +1 -1
  160. package/dist/lucide-icon.d.ts +3 -1
  161. package/dist/lucide-icon.js +1 -1
  162. package/dist/nav-stack.d.ts +1 -1
  163. package/dist/nav-stack.js +1 -1
  164. package/dist/pane.js +1 -1
  165. package/dist/popup-menu-register.js +7 -7
  166. package/dist/popup-menu-register.js.map +1 -1
  167. package/dist/popup-menu.js +1 -1
  168. package/dist/resizable-region.d.ts +1 -1
  169. package/dist/resizable-region.js +1 -1
  170. package/dist/row.d.ts +2 -2
  171. package/dist/row.js +1 -1
  172. package/dist/segmented-control.js +1 -1
  173. package/dist/select-register.js +6 -6
  174. package/dist/select-register.js.map +1 -1
  175. package/dist/select.d.ts +1 -1
  176. package/dist/select.js +1 -1
  177. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  178. package/dist/skeleton.js +1 -1
  179. package/dist/spacer.js +1 -1
  180. package/dist/split-view.d.ts +2 -2
  181. package/dist/split-view.js +2 -2
  182. package/dist/split-view.js.map +1 -1
  183. package/dist/state-banner.d.ts +5 -3
  184. package/dist/state-banner.js +1 -1
  185. package/dist/styles/badge.css +1 -1
  186. package/dist/styles/chip.css +1 -1
  187. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  188. package/dist/styles/components/actions/popup-menu/popup-menu.css +285 -0
  189. package/dist/styles/components/actions/toolbar/toolbar.css +392 -0
  190. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +790 -0
  191. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +153 -0
  192. package/dist/styles/components/collections/list/list.css +133 -0
  193. package/dist/styles/components/collections/list-action-row/list-action-row.css +258 -0
  194. package/dist/styles/components/collections/list-header/list-header.css +229 -0
  195. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  196. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  197. package/dist/styles/components/collections/list-item/list-item.css +255 -0
  198. package/dist/styles/components/data-display/value-table/value-table.css +105 -0
  199. package/dist/styles/components/feedback/badge/badge.css +118 -0
  200. package/dist/styles/components/feedback/chip/chip.css +138 -0
  201. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  202. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  203. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  204. package/dist/styles/components/feedback/state-banner/state-banner.css +248 -0
  205. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  206. package/dist/styles/components/forms/select/select.css +454 -0
  207. package/dist/styles/components/forms/token-search-field/token-search-field.css +381 -0
  208. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +575 -0
  209. package/dist/styles/components/layout/grid/grid.css +85 -0
  210. package/dist/styles/components/layout/pane/pane.css +263 -0
  211. package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
  212. package/dist/styles/components/layout/row/row.css +111 -0
  213. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  214. package/dist/styles/components/layout/split-view/split-view.css +146 -0
  215. package/dist/styles/components/layout/workbench/workbench.css +1067 -0
  216. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  217. package/dist/styles/components/navigation/app-tab/app-tab.css +376 -0
  218. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
  219. package/dist/styles/components/navigation/nav-stack/nav-stack.css +237 -0
  220. package/dist/styles/components/navigation/tab-bar/tab-bar.css +183 -0
  221. package/dist/styles/components/navigation/tab-scaffold/tab-scaffold.css +207 -0
  222. package/dist/styles/components/surfaces/content-item/content-item.css +120 -0
  223. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +29 -0
  224. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +56 -0
  225. package/dist/styles/components/typography/text/text.css +139 -0
  226. package/dist/styles/content-item.css +46 -1
  227. package/dist/styles/document.css +10 -0
  228. package/dist/styles/foundation.css +9 -6
  229. package/dist/styles/grid.css +50 -0
  230. package/dist/styles/lucide-icon.css +4 -0
  231. package/dist/styles/webawesome.css +23 -6
  232. package/dist/sunken-panel.d.ts +1 -1
  233. package/dist/sunken-panel.js +1 -1
  234. package/dist/surface-scaffold.js +1 -1
  235. package/dist/tab-bar.js +1 -1
  236. package/dist/tab-scaffold.d.ts +1 -1
  237. package/dist/tab-scaffold.js +1 -1
  238. package/dist/tab-scaffold.js.map +1 -1
  239. package/dist/text.d.ts +12 -8
  240. package/dist/text.js +1 -1
  241. package/dist/token-search-field.d.ts +1 -1
  242. package/dist/token-search-field.js +1 -1
  243. package/dist/{token-search-field-CVGwDn2y.d.ts → token-search-model-DTcTXWMS.d.ts} +54 -54
  244. package/dist/token-search-model.d.ts +1 -1
  245. package/dist/token-search-model.js +1 -1
  246. package/dist/toolbar-control-group.js +1 -1
  247. package/dist/toolbar-text.js +1 -1
  248. package/dist/toolbar.d.ts +1 -1
  249. package/dist/toolbar.js +1 -1
  250. package/dist/value-table.js +1 -1
  251. package/dist/wire-catalog.js +2 -2
  252. package/dist/wire-catalog.js.map +1 -1
  253. package/dist/wire-content-items.js +1 -1
  254. package/dist/wire-content-items.js.map +1 -1
  255. package/dist/wire-nav-stack.js +1 -1
  256. package/dist/wire-nav-stack.js.map +1 -1
  257. package/dist/wire-resizable-regions.js +1 -1
  258. package/dist/wire-scroll-dividers.js +1 -1
  259. package/dist/wire-sidebar.js +1 -1
  260. package/dist/wire-sidebar.js.map +1 -1
  261. package/dist/wire-tab-bars.js +1 -1
  262. package/dist/wire-tab-scaffold.js +1 -1
  263. package/dist/wire-tab-scaffold.js.map +1 -1
  264. package/dist/wire-token-search-fields.d.ts +1 -1
  265. package/dist/wire-token-search-fields.js +1 -1
  266. package/dist/wire-workbench.js +1 -1
  267. package/dist/workbench.d.ts +3 -3
  268. package/dist/workbench.js +1 -1
  269. package/docs/collapsible-panel.md +1 -1
  270. package/docs/component-contract.md +25 -7
  271. package/docs/component-selection.md +18 -4
  272. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  273. package/docs/design/templates/empty-state/filtered.svg +1 -1
  274. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  275. package/docs/design/templates/empty-state/with-action.svg +1 -1
  276. package/docs/design/templates/empty-state-dark.svg +1 -1
  277. package/docs/design/templates/empty-state.svg +1 -1
  278. package/docs/design/templates/list/stack-dark.svg +1 -1
  279. package/docs/design/templates/list/stack.svg +1 -1
  280. package/docs/design/templates/list-dark.svg +1 -1
  281. package/docs/design/templates/list-header/action-dark.svg +1 -1
  282. package/docs/design/templates/list-header/action.svg +1 -1
  283. package/docs/design/templates/list-header/count-dark.svg +1 -1
  284. package/docs/design/templates/list-header/count.svg +1 -1
  285. package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
  286. package/docs/design/templates/list-header/inline-action.svg +1 -1
  287. package/docs/design/templates/list-header/size-l-dark.svg +1 -1
  288. package/docs/design/templates/list-header/size-l.svg +1 -1
  289. package/docs/design/templates/list-header/size-m-dark.svg +1 -1
  290. package/docs/design/templates/list-header/size-m.svg +1 -1
  291. package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
  292. package/docs/design/templates/list-header/size-xl.svg +1 -1
  293. package/docs/design/templates/list-header/size-xs-dark.svg +1 -1
  294. package/docs/design/templates/list-header/size-xs.svg +1 -1
  295. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  296. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  297. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  298. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  299. package/docs/design/templates/list-header-dark.svg +1 -1
  300. package/docs/design/templates/list-header.svg +1 -1
  301. package/docs/design/templates/list.svg +1 -1
  302. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  303. package/docs/design/templates/segmented-control/equal.svg +1 -1
  304. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  305. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  306. package/docs/design/templates/segmented-control-dark.svg +1 -1
  307. package/docs/design/templates/segmented-control.svg +1 -1
  308. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  309. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  310. package/docs/design/templates/tab-bar-dark.svg +1 -1
  311. package/docs/design/templates/tab-bar.svg +1 -1
  312. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  313. package/docs/design/templates/token-search-field/empty.svg +1 -1
  314. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
  315. package/docs/design/templates/token-search-field/tokens.svg +1 -1
  316. package/docs/design/templates/token-search-field-dark.svg +1 -1
  317. package/docs/design/templates/token-search-field.svg +1 -1
  318. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  319. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  320. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  321. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  322. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  323. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  324. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  325. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  326. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  327. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  328. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  329. package/docs/design/templates/toolbar-control-group.svg +1 -1
  330. package/docs/design/templates/toolbar-dark.svg +1 -1
  331. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  332. package/docs/design/templates/toolbar-text/default.svg +1 -1
  333. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  334. package/docs/design/templates/toolbar-text/large.svg +1 -1
  335. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  336. package/docs/design/templates/toolbar-text/small.svg +1 -1
  337. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  338. package/docs/design/templates/toolbar-text.svg +1 -1
  339. package/docs/design/templates/toolbar.svg +1 -1
  340. package/docs/design/templates/value-table/details-dark.svg +1 -1
  341. package/docs/design/templates/value-table/details.svg +1 -1
  342. package/docs/design/templates/value-table-dark.svg +1 -1
  343. package/docs/design/templates/value-table.svg +1 -1
  344. package/docs/document-baseline.md +4 -0
  345. package/docs/layout.md +11 -5
  346. package/docs/sunken-panel.md +7 -7
  347. package/docs/ui-analyzer.md +12 -1
  348. package/docs/ui-doctor.md +12 -2
  349. package/docs/webawesome-theme.md +29 -59
  350. package/doctor/index.mjs +39 -30
  351. package/llms.txt +18 -1
  352. package/package.json +3 -2
  353. package/dist/chunk-3BYFWTP3.js.map +0 -1
  354. package/dist/chunk-4FEVHE7C.js.map +0 -1
  355. package/dist/chunk-4NG4Y2Q6.js.map +0 -1
  356. package/dist/chunk-4SQK27MR.js.map +0 -1
  357. package/dist/chunk-5I7QGQVT.js.map +0 -1
  358. package/dist/chunk-5TTZPGUY.js.map +0 -1
  359. package/dist/chunk-5UGLKFBF.js.map +0 -1
  360. package/dist/chunk-6DFDTWGG.js.map +0 -1
  361. package/dist/chunk-ALGYHYXP.js.map +0 -1
  362. package/dist/chunk-AYUHMAI6.js.map +0 -1
  363. package/dist/chunk-BFPBS5Y4.js.map +0 -1
  364. package/dist/chunk-DA3HS64I.js.map +0 -1
  365. package/dist/chunk-DG6G5EPF.js.map +0 -1
  366. package/dist/chunk-DPAUKNB6.js.map +0 -1
  367. package/dist/chunk-DUBUXJA3.js.map +0 -1
  368. package/dist/chunk-EHIMH4J7.js.map +0 -1
  369. package/dist/chunk-FKPKGP2H.js.map +0 -1
  370. package/dist/chunk-GRHJQWV2.js.map +0 -1
  371. package/dist/chunk-HKVJ5MW3.js.map +0 -1
  372. package/dist/chunk-HXTAPIHQ.js.map +0 -1
  373. package/dist/chunk-I3Q7KKYM.js.map +0 -1
  374. package/dist/chunk-JA4J7Y4C.js.map +0 -1
  375. package/dist/chunk-JGIV6ZDA.js.map +0 -1
  376. package/dist/chunk-K47P7QZC.js.map +0 -1
  377. package/dist/chunk-LHSUPNSE.js.map +0 -1
  378. package/dist/chunk-NCSWXG7G.js.map +0 -1
  379. package/dist/chunk-NN6GYOA2.js.map +0 -1
  380. package/dist/chunk-NPNSKX3K.js.map +0 -1
  381. package/dist/chunk-O5GM2JAM.js.map +0 -1
  382. package/dist/chunk-OXO2QJWV.js.map +0 -1
  383. package/dist/chunk-OYQIONQF.js.map +0 -1
  384. package/dist/chunk-PL26TKNK.js.map +0 -1
  385. package/dist/chunk-PSHUSWQH.js.map +0 -1
  386. package/dist/chunk-RFGW735Q.js.map +0 -1
  387. package/dist/chunk-RGS4WX2M.js.map +0 -1
  388. package/dist/chunk-SLWCCHNP.js.map +0 -1
  389. package/dist/chunk-SMZGAPCU.js.map +0 -1
  390. package/dist/chunk-SRSJO5QE.js.map +0 -1
  391. package/dist/chunk-SVLDRGPJ.js.map +0 -1
  392. package/dist/chunk-SX7FJXPJ.js.map +0 -1
  393. package/dist/chunk-TCXDZNCX.js.map +0 -1
  394. package/dist/chunk-TDN5EE3S.js.map +0 -1
  395. package/dist/chunk-TOICTHR2.js.map +0 -1
  396. package/dist/chunk-V4GAQ74C.js.map +0 -1
  397. package/dist/chunk-V4WLBOVJ.js.map +0 -1
  398. package/dist/chunk-VA5TN5PR.js.map +0 -1
  399. package/dist/chunk-WF75U3V4.js.map +0 -1
  400. package/dist/chunk-X5QSICJ3.js.map +0 -1
  401. package/dist/chunk-YDGNU2OD.js.map +0 -1
  402. package/dist/chunk-ZLKZFKLW.js.map +0 -1
  403. package/dist/{panel-toolbar-DDKh4uKd.d.ts → panel-toolbar-CL9tYOkh.d.ts} +1 -1
  404. package/dist/{types-BuHELdXR.d.ts → types-C9BubXfz.d.ts} +1 -1
package/README.md CHANGED
@@ -9,6 +9,31 @@ When adding a first-party public component, follow the
9
9
  entry drives one validator across package, build, barrel, CSS, demo, route, and
10
10
  AI signature projections, with a non-mutating dry-run report.
11
11
 
12
+ ### Shared semantic tones
13
+
14
+ `SemanticTone` is the shared color-role type for `Badge`, `Chip`, `StateBanner`,
15
+ and semantic `ContentItem` appearances: `neutral`, `info`, `pop`, `success`,
16
+ `warning`, and `danger`. Import it as a type from `@kerfjs/ui`,
17
+ `@kerfjs/ui/badge`, `@kerfjs/ui/state-banner`, or `@kerfjs/ui/content-item`.
18
+ Use `info` for the role backed by the existing `--kui-color-brand-*` tokens.
19
+ Migrate Badge/Chip `tone="brand"` to `tone="info"`; `BadgeTone` and
20
+ `StateBannerTone` remain deprecated aliases of `SemanticTone`.
21
+
22
+ ## Source organization
23
+
24
+ The flat files directly under `src/` are stable package entry facades. Keep
25
+ component implementation and CSS together under
26
+ `src/components/<family>/<component>/`. Put support code used by one component
27
+ in its `internal/`, `model/`, `register/`, or `wiring/` folder. Shared types and
28
+ utilities live under `src/shared/`; wiring that spans several components lives
29
+ under `src/wiring/`; Web Awesome integration code lives under
30
+ `src/integrations/`. Catalog-only implementation remains under `src/catalog/`.
31
+
32
+ Choose an existing family by the component role, and add a family only when no
33
+ current one fits. Public JavaScript and CSS subpaths remain flat through their
34
+ root facades. `npm run check:source-organization` rejects implementation added
35
+ back to the root or component-local support code placed in the wrong folder.
36
+
12
37
  Browser verification always builds current source: both `npm run test:e2e`
13
38
  and direct focused Playwright commands run the catalog/conformance preflights
14
39
  and production build before preview. See the [UX catalog contract](./docs/ux-demo.md).
@@ -497,7 +522,8 @@ or scope variables directly on a component instance.
497
522
 
498
523
  Applications can separately opt into `@kerfjs/ui/document.css` for border-box
499
524
  sizing, token-backed body typography/colors, zero body margin, plain-link color,
500
- and a definite full-height chain. Add `class="kui-app-root"` to the one direct
525
+ inherited native table-cell and form-control font metrics, and a definite
526
+ full-height chain. Add `class="kui-app-root"` to the one direct
501
527
  mount container when a percentage-height application shell must fill the
502
528
  viewport. This global baseline is deliberately absent from `styles.css` and
503
529
  component browser imports. See [Document baseline](./docs/document-baseline.md).
@@ -766,3 +792,5 @@ For dimensions that should scale with the root font size, author pixels with
766
792
  baseline. Keep intentional 1px borders in pixels and contextual `em` values
767
793
  explicit. `npm run build` emits standard CSS to `dist/styles`; `npm run dev`
768
794
  applies the same transform directly to source styles and hot-reloads edits.
795
+
796
+ Lowered surfaces and decorative neutral fills/borders use translucent shared theme colors. Nested surfaces compound naturally; demos compose public components without per-depth overrides. See [contextual transparency](docs/webawesome-theme.md#contextual-transparency).
@@ -37,7 +37,7 @@
37
37
  "accessible label for abbreviated content"
38
38
  ],
39
39
  "variants": [
40
- "neutral, brand, pop, success, warning, or danger tone",
40
+ "neutral, info, pop, success, warning, or danger tone",
41
41
  "quiet, solid, or outline appearance",
42
42
  "pill or rounded shape",
43
43
  "compact or default size, or a text-free dot (size: 'dot')",
@@ -96,7 +96,7 @@
96
96
  "disabled policy"
97
97
  ],
98
98
  "variants": [
99
- "neutral, brand, pop, success, warning, or danger tone",
99
+ "neutral, info, pop, success, warning, or danger tone",
100
100
  "quiet, solid, or outline appearance",
101
101
  "pill or rounded shape",
102
102
  "compact or default size",
@@ -161,6 +161,7 @@
161
161
  "variants": [
162
162
  "decorative",
163
163
  "labeled",
164
+ "inline text flow",
164
165
  "outline (default appearance)",
165
166
  "solid (appearance=solid)"
166
167
  ],
@@ -174,6 +175,11 @@
174
175
  "title": "Semantic icon color",
175
176
  "description": "Set an icon foreground with a semantic color token; omit color to inherit from surrounding text. Use foregroundColor() for a custom CSS color or foregroundColorVar() for an app variable.",
176
177
  "code": "<LucideIcon icon={Bell} name=\"alert\" color={uiColor('warning-on-quiet')} />"
178
+ },
179
+ {
180
+ "title": "Inline with text",
181
+ "description": "Let a decorative icon flow inside Text or other prose while preserving its inherited 1em size.",
182
+ "code": "<Text>Ready <LucideIcon icon={Bell} name=\"notification\" inline /> now.</Text>"
177
183
  }
178
184
  ],
179
185
  "accessibility": [
@@ -466,12 +472,12 @@
466
472
  "category": "Foundation",
467
473
  "kind": "composition",
468
474
  "source": "kerf",
469
- "description": "Opt-in document-level defaults: border-box sizing, body margin/font/surface, link color, and the html → body → .kui-app-root full-height chain.",
475
+ "description": "Opt-in document-level defaults: border-box sizing, body margin/font/surface, native table-cell and form-control font metrics, link color, and the html → body → .kui-app-root full-height chain.",
470
476
  "uses": [],
471
477
  "purpose": "Let an application opt into Kerf UI-owned document defaults and a definite full-height chain for a percentage-height application shell.",
472
478
  "publicExports": [],
473
479
  "useWhen": [
474
- "An application wants Kerf UI to own document-level box sizing, body typography, surface, and link color.",
480
+ "An application wants Kerf UI to own document-level box sizing, body typography, native table-cell and form-control font metrics, surface, and link color.",
475
481
  "A full-height shell (Workbench, SplitView, NavStack, or TabScaffold) mounts into one direct container: put .kui-app-root on that container."
476
482
  ],
477
483
  "avoidWhen": [
@@ -2354,7 +2360,7 @@
2354
2360
  "category": "Structure",
2355
2361
  "kind": "component",
2356
2362
  "source": "kerf",
2357
- "description": "Equal-width columns with a fixed count or a minimum-width responsive mode, typed gaps, and optional flex participation.",
2363
+ "description": "Equal-width columns with a fixed count or a minimum-width responsive mode, typed gaps, physical-side text/control insets, and optional flex participation.",
2358
2364
  "uses": [],
2359
2365
  "purpose": "Arrange related siblings in equal-width columns with either a fixed count or automatic container-width collapse.",
2360
2366
  "publicExports": [
@@ -2483,7 +2489,7 @@
2483
2489
  "appOwns": [
2484
2490
  "child semantics and content",
2485
2491
  "fixed column count or responsive minimum width",
2486
- "typed gap and flex choices"
2492
+ "typed gap, flex, and physical-side inset choices"
2487
2493
  ],
2488
2494
  "variants": [
2489
2495
  "any positive safe-integer equal-track count",
@@ -2491,6 +2497,7 @@
2491
2497
  "named none/2xs/xs/s/m/l/xl token gap",
2492
2498
  "typed CssLength gap",
2493
2499
  "boolean, finite-keyword, or typed CssFlex flex",
2500
+ "top/right/bottom/left text and control inset combinations",
2494
2501
  "fill: the layout root fills a definite-height parent",
2495
2502
  "rootAttributes: safe data-* metadata on the root",
2496
2503
  "selectionMode=multiple: labeled multi-select grid for ContentItem tiles"
@@ -2503,8 +2510,9 @@
2503
2510
  "geometry": {
2504
2511
  "margin": "none",
2505
2512
  "border": "none",
2506
- "padding": "none",
2513
+ "padding": "conditional",
2507
2514
  "notes": [
2515
+ "textInsets adds 17px and controlInsets adds 8px on selected physical sides; text wins on overlap.",
2508
2516
  "Fixed tracks use minmax(0, 1fr); responsive tracks use auto-fit with a minimum width capped at 100%, preserving equal distribution without narrow overflow."
2509
2517
  ]
2510
2518
  },
@@ -3373,22 +3381,23 @@
3373
3381
  "category": "Structure",
3374
3382
  "kind": "component",
3375
3383
  "source": "kerf",
3376
- "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.",
3384
+ "description": "One self-contained content child with shared geometry plus typed transparent, surface, or semantic appearance, frame, and shape choices.",
3377
3385
  "uses": [],
3378
- "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.",
3386
+ "purpose": "Render one self-contained .kui-content child that owns its 8px inline margin, real 1px border, 8px padding, radius, and optional coordinated surface colors.",
3379
3387
  "publicExports": [
3380
3388
  "ContentItem"
3381
3389
  ],
3382
3390
  "useWhen": [
3383
3391
  "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.",
3384
3392
  "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).",
3393
+ "A content item needs the base surface or a coordinated semantic status treatment: pass appearance=\"surface\" or a semantic appearance such as success or danger.",
3385
3394
  "A content item should follow a pill control's 22px radius: pass shape=\"pill\".",
3386
3395
  "A selectable rich card needs nested controls: use selectionMode=\"multiple\" inside a labeled List multi-select grid."
3387
3396
  ],
3388
3397
  "avoidWhen": [
3389
3398
  "Do not wrap a component that already owns content-item geometry (ListItem, ListHeader, StateBanner, Toolbar, ValueTable) or pad around a ContentItem; either double-insets.",
3390
3399
  "Do not frame an item only to make it look contained; hierarchy comes from alignment, spacing, and type first.",
3391
- "Do not use it as a filled or lowered card; use SunkenPanel for a lowered surface.",
3400
+ "Do not use its surface appearance for a lowered inset panel around a stack; use SunkenPanel for that structure.",
3392
3401
  "Do not use it for bare text alone; use ListInsetText, which adds the same inset without claiming a surface."
3393
3402
  ],
3394
3403
  "alternatives": [
@@ -3411,6 +3420,7 @@
3411
3420
  "appOwns": [
3412
3421
  "the item content",
3413
3422
  "whether the item marks a real distinction that warrants a visible frame",
3423
+ "whether the item needs a surface or semantic appearance",
3414
3424
  "corner shape",
3415
3425
  "region semantics and accessible name",
3416
3426
  "whether the item is a programmatic focus target",
@@ -3421,6 +3431,8 @@
3421
3431
  "framed rounded item",
3422
3432
  "pill item",
3423
3433
  "framed pill item",
3434
+ "base surface item",
3435
+ "neutral, info, pop, success, warning, or danger semantic item",
3424
3436
  "named focus-target region",
3425
3437
  "multi-select rich grid row"
3426
3438
  ],
@@ -3435,7 +3447,7 @@
3435
3447
  "border": "self",
3436
3448
  "padding": "self",
3437
3449
  "notes": [
3438
- "The 1px border is always reserved and transparent unless frame=\"framed\", so framed and unframed items share the same geometry."
3450
+ "The 1px border is always reserved; transparent items paint it only when frame=\"framed\", while surface and semantic appearances coordinate its color with their background and foreground."
3439
3451
  ]
3440
3452
  },
3441
3453
  "delivery": {
@@ -2107,7 +2107,7 @@
2107
2107
  "required": false
2108
2108
  },
2109
2109
  {
2110
- "id": "typed gap and flex choices",
2110
+ "id": "typed gap, flex, and physical-side inset choices",
2111
2111
  "owner": "application",
2112
2112
  "required": false
2113
2113
  }
@@ -2124,8 +2124,9 @@
2124
2124
  "geometry": {
2125
2125
  "margin": "none",
2126
2126
  "border": "none",
2127
- "padding": "none",
2127
+ "padding": "conditional",
2128
2128
  "notes": [
2129
+ "textInsets adds 17px and controlInsets adds 8px on selected physical sides; text wins on overlap.",
2129
2130
  "Fixed tracks use minmax(0, 1fr); responsive tracks use auto-fit with a minimum width capped at 100%, preserving equal distribution without narrow overflow."
2130
2131
  ]
2131
2132
  }
@@ -2786,6 +2787,11 @@
2786
2787
  "owner": "application",
2787
2788
  "required": false
2788
2789
  },
2790
+ {
2791
+ "id": "whether the item needs a surface or semantic appearance",
2792
+ "owner": "application",
2793
+ "required": false
2794
+ },
2789
2795
  { "id": "corner shape", "owner": "application", "required": false },
2790
2796
  {
2791
2797
  "id": "region semantics and accessible name",
@@ -2817,7 +2823,7 @@
2817
2823
  "border": "self",
2818
2824
  "padding": "self",
2819
2825
  "notes": [
2820
- "The 1px border is always reserved and transparent unless frame=\"framed\", so framed and unframed items share the same geometry."
2826
+ "The 1px border is always reserved; transparent items paint it only when frame=\"framed\", while surface and semantic appearances coordinate its color with their background and foreground."
2821
2827
  ]
2822
2828
  }
2823
2829
  },
@@ -38,7 +38,7 @@ Exact prop and callback types live in [`public-api-signatures-v1.md`](../public-
38
38
  - [Spacer](./spacer.md) — Express an intentional empty dimension or consume remaining flex space without application-owned spacer markup or raw CSS lengths.
39
39
  - [ListInsetControl](./list-inset-control.md) — Apply the standard 8px outer margin to all physical sides of a self-bordered control by default, or only the sides selected with the canonical Sides contract.
40
40
  - [ListInsetText](./list-inset-text.md) — Apply the full 8px margin + 1px transparent border + 8px padding to all physical sides of bare text by default, or only the sides selected with the canonical Sides contract.
41
- - [ContentItem](./content-item.md) — 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.
41
+ - [ContentItem](./content-item.md) — Render one self-contained .kui-content child that owns its 8px inline margin, real 1px border, 8px padding, radius, and optional coordinated surface colors.
42
42
 
43
43
  ## Kerf UI — Navigation
44
44
 
@@ -29,7 +29,7 @@ Exact prop names and types: [`@kerfjs/ui/badge`](../public-api-signatures-v1.md#
29
29
 
30
30
  **Variants (configure, do not restyle):**
31
31
 
32
- - neutral, brand, pop, success, warning, or danger tone
32
+ - neutral, info, pop, success, warning, or danger tone
33
33
  - quiet, solid, or outline appearance
34
34
  - pill or rounded shape
35
35
  - compact or default size, or a text-free dot (size: 'dot')
@@ -29,7 +29,7 @@ Exact prop names and types: [`@kerfjs/ui/chip`](../public-api-signatures-v1.md#k
29
29
 
30
30
  **Variants (configure, do not restyle):**
31
31
 
32
- - neutral, brand, pop, success, warning, or danger tone
32
+ - neutral, info, pop, success, warning, or danger tone
33
33
  - quiet, solid, or outline appearance
34
34
  - pill or rounded shape
35
35
  - compact or default size
@@ -4,14 +4,15 @@
4
4
 
5
5
  `@kerfjs/ui:content-item` · Kerf UI · component · Structure
6
6
 
7
- One self-contained content child with the shared 8px margin + 1px border + 8px padding geometry, a typed frame, and a rounded or pill shape.
7
+ One self-contained content child with shared geometry plus typed transparent, surface, or semantic appearance, frame, and shape choices.
8
8
 
9
9
  ## When to use
10
10
 
11
- 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.
11
+ Render one self-contained .kui-content child that owns its 8px inline margin, real 1px border, 8px padding, radius, and optional coordinated surface colors.
12
12
 
13
13
  - 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.
14
14
  - 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).
15
+ - A content item needs the base surface or a coordinated semantic status treatment: pass appearance="surface" or a semantic appearance such as success or danger.
15
16
  - A content item should follow a pill control's 22px radius: pass shape="pill".
16
17
  - A selectable rich card needs nested controls: use selectionMode="multiple" inside a labeled List multi-select grid.
17
18
 
@@ -19,7 +20,7 @@ Render one self-contained .kui-content child that owns its 8px inline margin, re
19
20
 
20
21
  - Do not wrap a component that already owns content-item geometry (ListItem, ListHeader, StateBanner, Toolbar, ValueTable) or pad around a ContentItem; either double-insets.
21
22
  - Do not frame an item only to make it look contained; hierarchy comes from alignment, spacing, and type first.
22
- - Do not use it as a filled or lowered card; use SunkenPanel for a lowered surface.
23
+ - Do not use its surface appearance for a lowered inset panel around a stack; use SunkenPanel for that structure.
23
24
  - Do not use it for bare text alone; use ListInsetText, which adds the same inset without claiming a surface.
24
25
 
25
26
  **Alternatives:**
@@ -44,6 +45,8 @@ Exact prop names and types: [`@kerfjs/ui/content-item`](../public-api-signatures
44
45
  - framed rounded item
45
46
  - pill item
46
47
  - framed pill item
48
+ - base surface item
49
+ - neutral, info, pop, success, warning, or danger semantic item
47
50
  - named focus-target region
48
51
  - multi-select rich grid row
49
52
 
@@ -55,7 +58,7 @@ Exact prop names and types: [`@kerfjs/ui/content-item`](../public-api-signatures
55
58
 
56
59
  ## State and wiring
57
60
 
58
- **The app owns:** the item content; whether the item marks a real distinction that warrants a visible frame; corner shape; region semantics and accessible name; whether the item is a programmatic focus target; the selection set and Shift/Cmd extension for multi-select rich cards.
61
+ **The app owns:** the item content; whether the item marks a real distinction that warrants a visible frame; whether the item needs a surface or semantic appearance; corner shape; region semantics and accessible name; whether the item is a programmatic focus target; the selection set and Shift/Cmd extension for multi-select rich cards.
59
62
 
60
63
  No wiring helper.
61
64
 
@@ -63,7 +66,7 @@ No wiring helper.
63
66
 
64
67
  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.
65
68
 
66
- - The 1px border is always reserved and transparent unless frame="framed", so framed and unframed items share the same geometry.
69
+ - The 1px border is always reserved; transparent items paint it only when frame="framed", while surface and semantic appearances coordinate its color with their background and foreground.
67
70
 
68
71
  ## Accessibility
69
72
 
@@ -4,13 +4,13 @@
4
4
 
5
5
  `@kerfjs/ui:document-baseline` · Kerf UI · CSS composition · Foundation
6
6
 
7
- Opt-in document-level defaults: border-box sizing, body margin/font/surface, link color, and the html → body → .kui-app-root full-height chain.
7
+ Opt-in document-level defaults: border-box sizing, body margin/font/surface, native table-cell and form-control font metrics, link color, and the html → body → .kui-app-root full-height chain.
8
8
 
9
9
  ## When to use
10
10
 
11
11
  Let an application opt into Kerf UI-owned document defaults and a definite full-height chain for a percentage-height application shell.
12
12
 
13
- - An application wants Kerf UI to own document-level box sizing, body typography, surface, and link color.
13
+ - An application wants Kerf UI to own document-level box sizing, body typography, native table-cell and form-control font metrics, surface, and link color.
14
14
  - A full-height shell (Workbench, SplitView, NavStack, or TabScaffold) mounts into one direct container: put .kui-app-root on that container.
15
15
 
16
16
  **Not when:**
@@ -4,7 +4,7 @@
4
4
 
5
5
  `@kerfjs/ui:grid` · Kerf UI · component · Structure
6
6
 
7
- Equal-width columns with a fixed count or a minimum-width responsive mode, typed gaps, and optional flex participation.
7
+ Equal-width columns with a fixed count or a minimum-width responsive mode, typed gaps, physical-side text/control insets, and optional flex participation.
8
8
 
9
9
  ## When to use
10
10
 
@@ -45,6 +45,7 @@ Exact prop names and types: [`@kerfjs/ui/grid`](../public-api-signatures-v1.md#k
45
45
  - named none/2xs/xs/s/m/l/xl token gap
46
46
  - typed CssLength gap
47
47
  - boolean, finite-keyword, or typed CssFlex flex
48
+ - top/right/bottom/left text and control inset combinations
48
49
  - fill: the layout root fills a definite-height parent
49
50
  - rootAttributes: safe data-\* metadata on the root
50
51
  - selectionMode=multiple: labeled multi-select grid for ContentItem tiles
@@ -63,14 +64,15 @@ Exact prop names and types: [`@kerfjs/ui/grid`](../public-api-signatures-v1.md#k
63
64
 
64
65
  ## State and wiring
65
66
 
66
- **The app owns:** child semantics and content; fixed column count or responsive minimum width; typed gap and flex choices.
67
+ **The app owns:** child semantics and content; fixed column count or responsive minimum width; typed gap, flex, and physical-side inset choices.
67
68
 
68
69
  No wiring helper.
69
70
 
70
71
  ## Geometry
71
72
 
72
- Margin: none · border: none · padding: none (layout role: structure). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
73
+ Margin: none · border: none · padding: conditional (layout role: structure). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
73
74
 
75
+ - textInsets adds 17px and controlInsets adds 8px on selected physical sides; text wins on overlap.
74
76
  - Fixed tracks use minmax(0, 1fr); responsive tracks use auto-fit with a minimum width capped at 100%, preserving equal distribution without narrow overflow.
75
77
 
76
78
  ## Accessibility
@@ -32,6 +32,7 @@ Exact prop names and types: [`@kerfjs/ui/lucide-icon`](../public-api-signatures-
32
32
 
33
33
  - decorative
34
34
  - labeled
35
+ - inline text flow
35
36
  - outline (default appearance)
36
37
  - solid (appearance=solid)
37
38
 
@@ -73,6 +74,16 @@ Set an icon foreground with a semantic color token; omit color to inherit from s
73
74
  <LucideIcon icon={Bell} name="alert" color={uiColor('warning-on-quiet')} />
74
75
  ```
75
76
 
77
+ ### Inline with text
78
+
79
+ Let a decorative icon flow inside Text or other prose while preserving its inherited 1em size.
80
+
81
+ ```tsx
82
+ <Text>
83
+ Ready <LucideIcon icon={Bell} name="notification" inline /> now.
84
+ </Text>
85
+ ```
86
+
76
87
  ## Styling boundary
77
88
 
78
89
  The component owns its own styles. Configure it through its props and variants; do not override its internals.