@kerfjs/ui 5.0.0-beta.74 → 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 (408) hide show
  1. package/README.md +29 -1
  2. package/ai/component-catalog.json +54 -16
  3. package/ai/component-composition.json +18 -6
  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/list.md +3 -2
  11. package/ai/components/lucide-icon.md +20 -1
  12. package/ai/components/select.md +5 -4
  13. package/ai/public-api-signatures-v1.md +101 -61
  14. package/ai/skill.md +35 -4
  15. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  16. package/analyzer/index.mjs +11 -1
  17. package/dist/app-tab.js +1 -1
  18. package/dist/badge.d.ts +5 -3
  19. package/dist/badge.js +1 -1
  20. package/dist/browser/catalog.js +7 -7
  21. package/dist/browser/collapsible-panel.js +3 -3
  22. package/dist/browser/list-header.js +1 -1
  23. package/dist/browser/nav-stack.js +1 -1
  24. package/dist/browser/select.js +1 -1
  25. package/dist/browser/split-view.js +1 -1
  26. package/dist/browser/workbench.js +4 -4
  27. package/dist/catalog-resources.d.ts +6 -6
  28. package/dist/catalog-resources.js +1 -1
  29. package/dist/catalog-resources.js.map +1 -1
  30. package/dist/catalog.d.ts +5 -5
  31. package/dist/catalog.js +13 -13
  32. package/dist/catalog.js.map +1 -1
  33. package/dist/chip.d.ts +3 -2
  34. package/dist/chip.js +1 -1
  35. package/dist/{chunk-I6FTU27I.js → chunk-3RE2JMZU.js} +7 -3
  36. package/dist/chunk-3RE2JMZU.js.map +1 -0
  37. package/dist/{chunk-V4WLBOVJ.js → chunk-5BZBIRQG.js} +4 -4
  38. package/dist/chunk-5BZBIRQG.js.map +1 -0
  39. package/dist/{chunk-VZOFZPSO.js → chunk-5D3WDMIK.js} +4 -4
  40. package/dist/chunk-5D3WDMIK.js.map +1 -0
  41. package/dist/{chunk-IJNYCPAU.js → chunk-5PAVAR4B.js} +3 -3
  42. package/dist/chunk-5PAVAR4B.js.map +1 -0
  43. package/dist/{chunk-2IGHGE3M.js → chunk-72LLWYP2.js} +6 -6
  44. package/dist/chunk-72LLWYP2.js.map +1 -0
  45. package/dist/{chunk-KZRR7NNV.js → chunk-75I3SNUJ.js} +2 -2
  46. package/dist/chunk-75I3SNUJ.js.map +1 -0
  47. package/dist/{chunk-K47P7QZC.js → chunk-7QQ3HE47.js} +2 -2
  48. package/dist/chunk-7QQ3HE47.js.map +1 -0
  49. package/dist/{chunk-33EOFAUN.js → chunk-7QWIJEK5.js} +9 -9
  50. package/dist/chunk-7QWIJEK5.js.map +1 -0
  51. package/dist/{chunk-5I7QGQVT.js → chunk-AN5IWMTM.js} +2 -2
  52. package/dist/chunk-AN5IWMTM.js.map +1 -0
  53. package/dist/{chunk-3BYFWTP3.js → chunk-AOAW55JN.js} +2 -2
  54. package/dist/chunk-AOAW55JN.js.map +1 -0
  55. package/dist/{chunk-RT5WKYX3.js → chunk-ARZ4RSQO.js} +5 -6
  56. package/dist/chunk-ARZ4RSQO.js.map +1 -0
  57. package/dist/{chunk-ZSJOLL3S.js → chunk-BJLXE56E.js} +6 -6
  58. package/dist/chunk-BJLXE56E.js.map +1 -0
  59. package/dist/{chunk-RGS4WX2M.js → chunk-BYHGRKC3.js} +2 -2
  60. package/dist/chunk-BYHGRKC3.js.map +1 -0
  61. package/dist/{chunk-ZLKZFKLW.js → chunk-CEJ5FK6G.js} +2 -2
  62. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  63. package/dist/{chunk-SMZGAPCU.js → chunk-DQDTZE4W.js} +2 -2
  64. package/dist/chunk-DQDTZE4W.js.map +1 -0
  65. package/dist/{chunk-TT5ROTQK.js → chunk-EFDCALR3.js} +2 -2
  66. package/dist/chunk-EFDCALR3.js.map +1 -0
  67. package/dist/{chunk-RVERAFFY.js → chunk-G4VKQP7B.js} +2 -2
  68. package/dist/chunk-G4VKQP7B.js.map +1 -0
  69. package/dist/{chunk-BGD7EHUE.js → chunk-GO2CZX4M.js} +2 -2
  70. package/dist/chunk-GO2CZX4M.js.map +1 -0
  71. package/dist/{chunk-DPAUKNB6.js → chunk-GS2QD3N7.js} +3 -3
  72. package/dist/chunk-GS2QD3N7.js.map +1 -0
  73. package/dist/{chunk-SLWCCHNP.js → chunk-H45DAZBL.js} +2 -2
  74. package/dist/chunk-H45DAZBL.js.map +1 -0
  75. package/dist/{chunk-KFJSNWO4.js → chunk-H7ZJEI3H.js} +3 -3
  76. package/dist/chunk-H7ZJEI3H.js.map +1 -0
  77. package/dist/{chunk-7KHKLG5C.js → chunk-HFLGWMG3.js} +4 -4
  78. package/dist/chunk-HFLGWMG3.js.map +1 -0
  79. package/dist/{chunk-6LAQWWEX.js → chunk-HFQDSSED.js} +6 -6
  80. package/dist/chunk-HFQDSSED.js.map +1 -0
  81. package/dist/{chunk-2RMDP7HQ.js → chunk-HGSTMZZ6.js} +6 -6
  82. package/dist/chunk-HGSTMZZ6.js.map +1 -0
  83. package/dist/{chunk-WF75U3V4.js → chunk-HPREYDKV.js} +2 -2
  84. package/dist/chunk-HPREYDKV.js.map +1 -0
  85. package/dist/{chunk-G4S2QU6V.js → chunk-I4SDIMFA.js} +2 -2
  86. package/dist/chunk-I4SDIMFA.js.map +1 -0
  87. package/dist/{chunk-4SQK27MR.js → chunk-IM3GKYOG.js} +2 -2
  88. package/dist/chunk-IM3GKYOG.js.map +1 -0
  89. package/dist/{chunk-RU2EMR56.js → chunk-IVLTEBBT.js} +8 -8
  90. package/dist/chunk-IVLTEBBT.js.map +1 -0
  91. package/dist/{chunk-ALGYHYXP.js → chunk-J3AWE5I4.js} +2 -2
  92. package/dist/chunk-J3AWE5I4.js.map +1 -0
  93. package/dist/{chunk-OXO2QJWV.js → chunk-JOR5LGYE.js} +2 -2
  94. package/dist/chunk-JOR5LGYE.js.map +1 -0
  95. package/dist/{chunk-SRSJO5QE.js → chunk-LAZLBC2Q.js} +2 -2
  96. package/dist/chunk-LAZLBC2Q.js.map +1 -0
  97. package/dist/{chunk-2G2ZJQYK.js → chunk-LRAIS3YB.js} +9 -3
  98. package/dist/chunk-LRAIS3YB.js.map +1 -0
  99. package/dist/{chunk-AYUHMAI6.js → chunk-MXNIVEVL.js} +2 -2
  100. package/dist/chunk-MXNIVEVL.js.map +1 -0
  101. package/dist/{chunk-4NG4Y2Q6.js → chunk-NJZMR7HM.js} +2 -2
  102. package/dist/chunk-NJZMR7HM.js.map +1 -0
  103. package/dist/{chunk-DG6G5EPF.js → chunk-NMWDHZVM.js} +2 -2
  104. package/dist/chunk-NMWDHZVM.js.map +1 -0
  105. package/dist/{chunk-X5QSICJ3.js → chunk-NS2TBYM4.js} +2 -2
  106. package/dist/chunk-NS2TBYM4.js.map +1 -0
  107. package/dist/{chunk-W2AC6Q2A.js → chunk-NVRJ7C3W.js} +4 -4
  108. package/dist/chunk-NVRJ7C3W.js.map +1 -0
  109. package/dist/{chunk-BFPBS5Y4.js → chunk-O27D24CA.js} +2 -2
  110. package/dist/chunk-O27D24CA.js.map +1 -0
  111. package/dist/{chunk-WTSNV5RG.js → chunk-PQQQXJGV.js} +9 -3
  112. package/dist/chunk-PQQQXJGV.js.map +1 -0
  113. package/dist/{chunk-6DFDTWGG.js → chunk-QYXKMLHO.js} +2 -2
  114. package/dist/chunk-QYXKMLHO.js.map +1 -0
  115. package/dist/{chunk-I3Q7KKYM.js → chunk-S3ECMF23.js} +2 -2
  116. package/dist/chunk-S3ECMF23.js.map +1 -0
  117. package/dist/{chunk-PSHUSWQH.js → chunk-S4ZGTDSG.js} +2 -2
  118. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  119. package/dist/{chunk-L67OYMGE.js → chunk-SJY7KC45.js} +5 -5
  120. package/dist/chunk-SJY7KC45.js.map +1 -0
  121. package/dist/{chunk-DB5ADJKF.js → chunk-VLPE6OPN.js} +2 -2
  122. package/dist/chunk-VLPE6OPN.js.map +1 -0
  123. package/dist/{chunk-NCSWXG7G.js → chunk-VLQUXZKA.js} +9 -3
  124. package/dist/chunk-VLQUXZKA.js.map +1 -0
  125. package/dist/{chunk-B2ZMR7NY.js → chunk-VR7MWD2X.js} +10 -4
  126. package/dist/chunk-VR7MWD2X.js.map +1 -0
  127. package/dist/{chunk-NN6GYOA2.js → chunk-XIZRXI7N.js} +2 -2
  128. package/dist/chunk-XIZRXI7N.js.map +1 -0
  129. package/dist/{chunk-TDN5EE3S.js → chunk-Y6KT7ZTR.js} +2 -2
  130. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  131. package/dist/{chunk-3DOHW3K4.js → chunk-YLJ6X3AC.js} +2 -2
  132. package/dist/chunk-YLJ6X3AC.js.map +1 -0
  133. package/dist/{chunk-YDGNU2OD.js → chunk-ZVYA6TLR.js} +5 -2
  134. package/dist/chunk-ZVYA6TLR.js.map +1 -0
  135. package/dist/collapsible-panel.d.ts +6 -6
  136. package/dist/collapsible-panel.js +3 -3
  137. package/dist/collapsible-panel.js.map +1 -1
  138. package/dist/content-item.d.ts +13 -2
  139. package/dist/content-item.js +1 -1
  140. package/dist/css-values.d.ts +6 -1
  141. package/dist/css-values.js +1 -1
  142. package/dist/device-class.js +1 -1
  143. package/dist/device-class.js.map +1 -1
  144. package/dist/disclosure-arrow.js +1 -1
  145. package/dist/empty-state.js +1 -1
  146. package/dist/floating-toolbar.d.ts +1 -1
  147. package/dist/floating-toolbar.js +1 -1
  148. package/dist/grid.d.ts +10 -3
  149. package/dist/grid.js +1 -1
  150. package/dist/help-tags-register.js +1 -1
  151. package/dist/help-tags-register.js.map +1 -1
  152. package/dist/index.d.ts +27 -26
  153. package/dist/index.js +40 -40
  154. package/dist/list-action-row.js +1 -1
  155. package/dist/list-header.js +1 -1
  156. package/dist/list-inset-control.js +1 -1
  157. package/dist/list-inset-text.js +1 -1
  158. package/dist/list-item.js +1 -1
  159. package/dist/list.d.ts +2 -2
  160. package/dist/list.js +1 -1
  161. package/dist/loading-spinner.d.ts +4 -1
  162. package/dist/loading-spinner.js +1 -1
  163. package/dist/lucide-icon.d.ts +6 -1
  164. package/dist/lucide-icon.js +1 -1
  165. package/dist/nav-stack.d.ts +1 -1
  166. package/dist/nav-stack.js +1 -1
  167. package/dist/pane.js +1 -1
  168. package/dist/popup-menu-register.js +7 -7
  169. package/dist/popup-menu-register.js.map +1 -1
  170. package/dist/popup-menu.js +1 -1
  171. package/dist/resizable-region.d.ts +1 -1
  172. package/dist/resizable-region.js +1 -1
  173. package/dist/row.d.ts +2 -2
  174. package/dist/row.js +1 -1
  175. package/dist/segmented-control.js +1 -1
  176. package/dist/select-register.js +6 -6
  177. package/dist/select-register.js.map +1 -1
  178. package/dist/select.d.ts +1 -1
  179. package/dist/select.js +1 -1
  180. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  181. package/dist/skeleton.js +1 -1
  182. package/dist/spacer.js +1 -1
  183. package/dist/split-view.d.ts +2 -2
  184. package/dist/split-view.js +2 -2
  185. package/dist/split-view.js.map +1 -1
  186. package/dist/state-banner.d.ts +5 -3
  187. package/dist/state-banner.js +1 -1
  188. package/dist/styles/badge.css +1 -1
  189. package/dist/styles/chip.css +1 -1
  190. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  191. package/dist/styles/components/actions/popup-menu/popup-menu.css +285 -0
  192. package/dist/styles/components/actions/toolbar/toolbar.css +392 -0
  193. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +790 -0
  194. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +153 -0
  195. package/dist/styles/components/collections/list/list.css +133 -0
  196. package/dist/styles/components/collections/list-action-row/list-action-row.css +258 -0
  197. package/dist/styles/components/collections/list-header/list-header.css +229 -0
  198. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  199. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  200. package/dist/styles/components/collections/list-item/list-item.css +255 -0
  201. package/dist/styles/components/data-display/value-table/value-table.css +105 -0
  202. package/dist/styles/components/feedback/badge/badge.css +118 -0
  203. package/dist/styles/components/feedback/chip/chip.css +138 -0
  204. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  205. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  206. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  207. package/dist/styles/components/feedback/state-banner/state-banner.css +248 -0
  208. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  209. package/dist/styles/components/forms/select/select.css +454 -0
  210. package/dist/styles/components/forms/token-search-field/token-search-field.css +381 -0
  211. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +575 -0
  212. package/dist/styles/components/layout/grid/grid.css +85 -0
  213. package/dist/styles/components/layout/pane/pane.css +263 -0
  214. package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
  215. package/dist/styles/components/layout/row/row.css +111 -0
  216. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  217. package/dist/styles/components/layout/split-view/split-view.css +146 -0
  218. package/dist/styles/components/layout/workbench/workbench.css +1067 -0
  219. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  220. package/dist/styles/components/navigation/app-tab/app-tab.css +376 -0
  221. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
  222. package/dist/styles/components/navigation/nav-stack/nav-stack.css +237 -0
  223. package/dist/styles/components/navigation/tab-bar/tab-bar.css +183 -0
  224. package/dist/styles/components/navigation/tab-scaffold/tab-scaffold.css +207 -0
  225. package/dist/styles/components/surfaces/content-item/content-item.css +120 -0
  226. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +29 -0
  227. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +56 -0
  228. package/dist/styles/components/typography/text/text.css +139 -0
  229. package/dist/styles/content-item.css +46 -1
  230. package/dist/styles/document.css +10 -0
  231. package/dist/styles/foundation.css +9 -6
  232. package/dist/styles/grid.css +50 -0
  233. package/dist/styles/lucide-icon.css +4 -0
  234. package/dist/styles/webawesome.css +23 -6
  235. package/dist/sunken-panel.d.ts +1 -1
  236. package/dist/sunken-panel.js +1 -1
  237. package/dist/surface-scaffold.js +1 -1
  238. package/dist/tab-bar.js +1 -1
  239. package/dist/tab-scaffold.d.ts +1 -1
  240. package/dist/tab-scaffold.js +1 -1
  241. package/dist/tab-scaffold.js.map +1 -1
  242. package/dist/text.d.ts +12 -8
  243. package/dist/text.js +1 -1
  244. package/dist/token-search-field.d.ts +1 -1
  245. package/dist/token-search-field.js +1 -1
  246. package/dist/{token-search-field-CVGwDn2y.d.ts → token-search-model-DTcTXWMS.d.ts} +54 -54
  247. package/dist/token-search-model.d.ts +1 -1
  248. package/dist/token-search-model.js +1 -1
  249. package/dist/toolbar-control-group.js +1 -1
  250. package/dist/toolbar-text.js +1 -1
  251. package/dist/toolbar.d.ts +1 -1
  252. package/dist/toolbar.js +1 -1
  253. package/dist/value-table.js +1 -1
  254. package/dist/wire-catalog.js +2 -2
  255. package/dist/wire-catalog.js.map +1 -1
  256. package/dist/wire-content-items.js +1 -1
  257. package/dist/wire-content-items.js.map +1 -1
  258. package/dist/wire-nav-stack.js +1 -1
  259. package/dist/wire-nav-stack.js.map +1 -1
  260. package/dist/wire-resizable-regions.js +1 -1
  261. package/dist/wire-scroll-dividers.js +1 -1
  262. package/dist/wire-sidebar.js +1 -1
  263. package/dist/wire-sidebar.js.map +1 -1
  264. package/dist/wire-tab-bars.js +1 -1
  265. package/dist/wire-tab-scaffold.js +1 -1
  266. package/dist/wire-tab-scaffold.js.map +1 -1
  267. package/dist/wire-token-search-fields.d.ts +1 -1
  268. package/dist/wire-token-search-fields.js +1 -1
  269. package/dist/wire-workbench.js +1 -1
  270. package/dist/workbench.d.ts +3 -3
  271. package/dist/workbench.js +1 -1
  272. package/docs/collapsible-panel.md +1 -1
  273. package/docs/component-contract.md +25 -7
  274. package/docs/component-selection.md +19 -5
  275. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  276. package/docs/design/templates/empty-state/filtered.svg +1 -1
  277. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  278. package/docs/design/templates/empty-state/with-action.svg +1 -1
  279. package/docs/design/templates/empty-state-dark.svg +1 -1
  280. package/docs/design/templates/empty-state.svg +1 -1
  281. package/docs/design/templates/list/stack-dark.svg +1 -1
  282. package/docs/design/templates/list/stack.svg +1 -1
  283. package/docs/design/templates/list-dark.svg +1 -1
  284. package/docs/design/templates/list-header/action-dark.svg +1 -1
  285. package/docs/design/templates/list-header/action.svg +1 -1
  286. package/docs/design/templates/list-header/count-dark.svg +1 -1
  287. package/docs/design/templates/list-header/count.svg +1 -1
  288. package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
  289. package/docs/design/templates/list-header/inline-action.svg +1 -1
  290. package/docs/design/templates/list-header/size-l-dark.svg +1 -1
  291. package/docs/design/templates/list-header/size-l.svg +1 -1
  292. package/docs/design/templates/list-header/size-m-dark.svg +1 -1
  293. package/docs/design/templates/list-header/size-m.svg +1 -1
  294. package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
  295. package/docs/design/templates/list-header/size-xl.svg +1 -1
  296. package/docs/design/templates/list-header/size-xs-dark.svg +1 -1
  297. package/docs/design/templates/list-header/size-xs.svg +1 -1
  298. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  299. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  300. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  301. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  302. package/docs/design/templates/list-header-dark.svg +1 -1
  303. package/docs/design/templates/list-header.svg +1 -1
  304. package/docs/design/templates/list.svg +1 -1
  305. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  306. package/docs/design/templates/segmented-control/equal.svg +1 -1
  307. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  308. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  309. package/docs/design/templates/segmented-control-dark.svg +1 -1
  310. package/docs/design/templates/segmented-control.svg +1 -1
  311. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  312. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  313. package/docs/design/templates/tab-bar-dark.svg +1 -1
  314. package/docs/design/templates/tab-bar.svg +1 -1
  315. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  316. package/docs/design/templates/token-search-field/empty.svg +1 -1
  317. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
  318. package/docs/design/templates/token-search-field/tokens.svg +1 -1
  319. package/docs/design/templates/token-search-field-dark.svg +1 -1
  320. package/docs/design/templates/token-search-field.svg +1 -1
  321. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  322. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  323. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  324. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  325. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  326. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  327. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  328. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  329. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  330. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  331. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  332. package/docs/design/templates/toolbar-control-group.svg +1 -1
  333. package/docs/design/templates/toolbar-dark.svg +1 -1
  334. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  335. package/docs/design/templates/toolbar-text/default.svg +1 -1
  336. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  337. package/docs/design/templates/toolbar-text/large.svg +1 -1
  338. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  339. package/docs/design/templates/toolbar-text/small.svg +1 -1
  340. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  341. package/docs/design/templates/toolbar-text.svg +1 -1
  342. package/docs/design/templates/toolbar.svg +1 -1
  343. package/docs/design/templates/value-table/details-dark.svg +1 -1
  344. package/docs/design/templates/value-table/details.svg +1 -1
  345. package/docs/design/templates/value-table-dark.svg +1 -1
  346. package/docs/design/templates/value-table.svg +1 -1
  347. package/docs/document-baseline.md +4 -0
  348. package/docs/layout.md +11 -5
  349. package/docs/sunken-panel.md +7 -7
  350. package/docs/type-contracts.md +17 -17
  351. package/docs/ui-analyzer.md +12 -1
  352. package/docs/ui-doctor.md +12 -2
  353. package/docs/webawesome-theme.md +29 -59
  354. package/doctor/index.mjs +39 -30
  355. package/llms.txt +20 -3
  356. package/package.json +3 -2
  357. package/dist/chunk-2G2ZJQYK.js.map +0 -1
  358. package/dist/chunk-2IGHGE3M.js.map +0 -1
  359. package/dist/chunk-2RMDP7HQ.js.map +0 -1
  360. package/dist/chunk-33EOFAUN.js.map +0 -1
  361. package/dist/chunk-3BYFWTP3.js.map +0 -1
  362. package/dist/chunk-3DOHW3K4.js.map +0 -1
  363. package/dist/chunk-4NG4Y2Q6.js.map +0 -1
  364. package/dist/chunk-4SQK27MR.js.map +0 -1
  365. package/dist/chunk-5I7QGQVT.js.map +0 -1
  366. package/dist/chunk-6DFDTWGG.js.map +0 -1
  367. package/dist/chunk-6LAQWWEX.js.map +0 -1
  368. package/dist/chunk-7KHKLG5C.js.map +0 -1
  369. package/dist/chunk-ALGYHYXP.js.map +0 -1
  370. package/dist/chunk-AYUHMAI6.js.map +0 -1
  371. package/dist/chunk-B2ZMR7NY.js.map +0 -1
  372. package/dist/chunk-BFPBS5Y4.js.map +0 -1
  373. package/dist/chunk-BGD7EHUE.js.map +0 -1
  374. package/dist/chunk-DB5ADJKF.js.map +0 -1
  375. package/dist/chunk-DG6G5EPF.js.map +0 -1
  376. package/dist/chunk-DPAUKNB6.js.map +0 -1
  377. package/dist/chunk-G4S2QU6V.js.map +0 -1
  378. package/dist/chunk-I3Q7KKYM.js.map +0 -1
  379. package/dist/chunk-I6FTU27I.js.map +0 -1
  380. package/dist/chunk-IJNYCPAU.js.map +0 -1
  381. package/dist/chunk-K47P7QZC.js.map +0 -1
  382. package/dist/chunk-KFJSNWO4.js.map +0 -1
  383. package/dist/chunk-KZRR7NNV.js.map +0 -1
  384. package/dist/chunk-L67OYMGE.js.map +0 -1
  385. package/dist/chunk-NCSWXG7G.js.map +0 -1
  386. package/dist/chunk-NN6GYOA2.js.map +0 -1
  387. package/dist/chunk-OXO2QJWV.js.map +0 -1
  388. package/dist/chunk-PSHUSWQH.js.map +0 -1
  389. package/dist/chunk-RGS4WX2M.js.map +0 -1
  390. package/dist/chunk-RT5WKYX3.js.map +0 -1
  391. package/dist/chunk-RU2EMR56.js.map +0 -1
  392. package/dist/chunk-RVERAFFY.js.map +0 -1
  393. package/dist/chunk-SLWCCHNP.js.map +0 -1
  394. package/dist/chunk-SMZGAPCU.js.map +0 -1
  395. package/dist/chunk-SRSJO5QE.js.map +0 -1
  396. package/dist/chunk-TDN5EE3S.js.map +0 -1
  397. package/dist/chunk-TT5ROTQK.js.map +0 -1
  398. package/dist/chunk-V4WLBOVJ.js.map +0 -1
  399. package/dist/chunk-VZOFZPSO.js.map +0 -1
  400. package/dist/chunk-W2AC6Q2A.js.map +0 -1
  401. package/dist/chunk-WF75U3V4.js.map +0 -1
  402. package/dist/chunk-WTSNV5RG.js.map +0 -1
  403. package/dist/chunk-X5QSICJ3.js.map +0 -1
  404. package/dist/chunk-YDGNU2OD.js.map +0 -1
  405. package/dist/chunk-ZLKZFKLW.js.map +0 -1
  406. package/dist/chunk-ZSJOLL3S.js.map +0 -1
  407. package/dist/{panel-toolbar-DDKh4uKd.d.ts → panel-toolbar-CL9tYOkh.d.ts} +1 -1
  408. 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",
@@ -155,11 +155,13 @@
155
155
  ],
156
156
  "appOwns": [
157
157
  "icon choice",
158
- "meaningful label"
158
+ "meaningful label",
159
+ "optional foreground color"
159
160
  ],
160
161
  "variants": [
161
162
  "decorative",
162
163
  "labeled",
164
+ "inline text flow",
163
165
  "outline (default appearance)",
164
166
  "solid (appearance=solid)"
165
167
  ],
@@ -168,6 +170,16 @@
168
170
  "title": "Solid selected glyph",
169
171
  "description": "The solid appearance fills a compatible Lucide glyph with currentColor while retaining its stroke and accessible name policy.",
170
172
  "code": "<LucideIcon icon={Star} name=\"star\" appearance=\"solid\" />"
173
+ },
174
+ {
175
+ "title": "Semantic icon color",
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.",
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>"
171
183
  }
172
184
  ],
173
185
  "accessibility": [
@@ -460,12 +472,12 @@
460
472
  "category": "Foundation",
461
473
  "kind": "composition",
462
474
  "source": "kerf",
463
- "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.",
464
476
  "uses": [],
465
477
  "purpose": "Let an application opt into Kerf UI-owned document defaults and a definite full-height chain for a percentage-height application shell.",
466
478
  "publicExports": [],
467
479
  "useWhen": [
468
- "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.",
469
481
  "A full-height shell (Workbench, SplitView, NavStack, or TabScaffold) mounts into one direct container: put .kui-app-root on that container."
470
482
  ],
471
483
  "avoidWhen": [
@@ -2348,7 +2360,7 @@
2348
2360
  "category": "Structure",
2349
2361
  "kind": "component",
2350
2362
  "source": "kerf",
2351
- "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.",
2352
2364
  "uses": [],
2353
2365
  "purpose": "Arrange related siblings in equal-width columns with either a fixed count or automatic container-width collapse.",
2354
2366
  "publicExports": [
@@ -2477,7 +2489,7 @@
2477
2489
  "appOwns": [
2478
2490
  "child semantics and content",
2479
2491
  "fixed column count or responsive minimum width",
2480
- "typed gap and flex choices"
2492
+ "typed gap, flex, and physical-side inset choices"
2481
2493
  ],
2482
2494
  "variants": [
2483
2495
  "any positive safe-integer equal-track count",
@@ -2485,6 +2497,7 @@
2485
2497
  "named none/2xs/xs/s/m/l/xl token gap",
2486
2498
  "typed CssLength gap",
2487
2499
  "boolean, finite-keyword, or typed CssFlex flex",
2500
+ "top/right/bottom/left text and control inset combinations",
2488
2501
  "fill: the layout root fills a definite-height parent",
2489
2502
  "rootAttributes: safe data-* metadata on the root",
2490
2503
  "selectionMode=multiple: labeled multi-select grid for ContentItem tiles"
@@ -2497,8 +2510,9 @@
2497
2510
  "geometry": {
2498
2511
  "margin": "none",
2499
2512
  "border": "none",
2500
- "padding": "none",
2513
+ "padding": "conditional",
2501
2514
  "notes": [
2515
+ "textInsets adds 17px and controlInsets adds 8px on selected physical sides; text wins on overlap.",
2502
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."
2503
2517
  ]
2504
2518
  },
@@ -2707,6 +2721,17 @@
2707
2721
  "calc",
2708
2722
  "flex"
2709
2723
  ],
2724
+ "publicExportImports": {
2725
+ "px": "@kerfjs/ui/css-values",
2726
+ "rem": "@kerfjs/ui/css-values",
2727
+ "em": "@kerfjs/ui/css-values",
2728
+ "pct": "@kerfjs/ui/css-values",
2729
+ "space": "@kerfjs/ui/css-values",
2730
+ "lengthVar": "@kerfjs/ui/css-values",
2731
+ "plus": "@kerfjs/ui/css-values",
2732
+ "calc": "@kerfjs/ui/css-values",
2733
+ "flex": "@kerfjs/ui/css-values"
2734
+ },
2710
2735
  "cssValueProps": [
2711
2736
  {
2712
2737
  "path": "gap",
@@ -3356,22 +3381,23 @@
3356
3381
  "category": "Structure",
3357
3382
  "kind": "component",
3358
3383
  "source": "kerf",
3359
- "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.",
3360
3385
  "uses": [],
3361
- "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.",
3362
3387
  "publicExports": [
3363
3388
  "ContentItem"
3364
3389
  ],
3365
3390
  "useWhen": [
3366
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.",
3367
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.",
3368
3394
  "A content item should follow a pill control's 22px radius: pass shape=\"pill\".",
3369
3395
  "A selectable rich card needs nested controls: use selectionMode=\"multiple\" inside a labeled List multi-select grid."
3370
3396
  ],
3371
3397
  "avoidWhen": [
3372
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.",
3373
3399
  "Do not frame an item only to make it look contained; hierarchy comes from alignment, spacing, and type first.",
3374
- "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.",
3375
3401
  "Do not use it for bare text alone; use ListInsetText, which adds the same inset without claiming a surface."
3376
3402
  ],
3377
3403
  "alternatives": [
@@ -3394,6 +3420,7 @@
3394
3420
  "appOwns": [
3395
3421
  "the item content",
3396
3422
  "whether the item marks a real distinction that warrants a visible frame",
3423
+ "whether the item needs a surface or semantic appearance",
3397
3424
  "corner shape",
3398
3425
  "region semantics and accessible name",
3399
3426
  "whether the item is a programmatic focus target",
@@ -3404,6 +3431,8 @@
3404
3431
  "framed rounded item",
3405
3432
  "pill item",
3406
3433
  "framed pill item",
3434
+ "base surface item",
3435
+ "neutral, info, pop, success, warning, or danger semantic item",
3407
3436
  "named focus-target region",
3408
3437
  "multi-select rich grid row"
3409
3438
  ],
@@ -3418,7 +3447,7 @@
3418
3447
  "border": "self",
3419
3448
  "padding": "self",
3420
3449
  "notes": [
3421
- "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."
3422
3451
  ]
3423
3452
  },
3424
3453
  "delivery": {
@@ -4171,15 +4200,23 @@
4171
4200
  "Select",
4172
4201
  "uiColor",
4173
4202
  "colorVar",
4174
- "foregroundColorVar"
4203
+ "foregroundColorVar",
4204
+ "foregroundColor"
4175
4205
  ],
4206
+ "publicExportImports": {
4207
+ "uiColor": "@kerfjs/ui/css-values",
4208
+ "colorVar": "@kerfjs/ui/css-values",
4209
+ "foregroundColorVar": "@kerfjs/ui/css-values",
4210
+ "foregroundColor": "@kerfjs/ui/css-values"
4211
+ },
4176
4212
  "cssValueProps": [
4177
4213
  {
4178
4214
  "path": "choices[].color",
4179
4215
  "grammar": "color",
4180
4216
  "helpers": [
4181
4217
  "uiColor",
4182
- "foregroundColorVar"
4218
+ "foregroundColorVar",
4219
+ "foregroundColor"
4183
4220
  ],
4184
4221
  "shorthands": [],
4185
4222
  "canonicalShorthands": [],
@@ -4187,13 +4224,14 @@
4187
4224
  "rawPolicy": "forbid",
4188
4225
  "examples": [
4189
4226
  "color: uiColor(\"success-on-quiet\")",
4190
- "color: foregroundColorVar(\"--app-choice-color\")"
4227
+ "color: foregroundColorVar(\"--app-choice-color\")",
4228
+ "color: foregroundColor(\"rebeccapurple\")"
4191
4229
  ]
4192
4230
  }
4193
4231
  ],
4194
4232
  "useWhen": [
4195
4233
  "Choose a controlled value from a moderate or long list, including grouped and icon-bearing choices.",
4196
- "Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, or foregroundColorVar() for an app-owned property. Fill tokens such as success are backgrounds that leave the icon nearly invisible, so they, lengths, raw color strings, and unqualified colorVar() values are rejected."
4234
+ "Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, foregroundColorVar() for an app-owned property, or foregroundColor() for a direct custom CSS color. Fill tokens such as success are backgrounds that leave the icon nearly invisible, so they, lengths, raw color strings, and unqualified colorVar() values are rejected."
4197
4235
  ],
4198
4236
  "avoidWhen": [
4199
4237
  "Do not use for commands or a small choice set that should stay visible."
@@ -126,7 +126,12 @@
126
126
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
127
127
  "state": [
128
128
  { "id": "icon choice", "owner": "application", "required": false },
129
- { "id": "meaningful label", "owner": "application", "required": false }
129
+ { "id": "meaningful label", "owner": "application", "required": false },
130
+ {
131
+ "id": "optional foreground color",
132
+ "owner": "application",
133
+ "required": false
134
+ }
130
135
  ],
131
136
  "wiring": {
132
137
  "required": false,
@@ -2102,7 +2107,7 @@
2102
2107
  "required": false
2103
2108
  },
2104
2109
  {
2105
- "id": "typed gap and flex choices",
2110
+ "id": "typed gap, flex, and physical-side inset choices",
2106
2111
  "owner": "application",
2107
2112
  "required": false
2108
2113
  }
@@ -2119,8 +2124,9 @@
2119
2124
  "geometry": {
2120
2125
  "margin": "none",
2121
2126
  "border": "none",
2122
- "padding": "none",
2127
+ "padding": "conditional",
2123
2128
  "notes": [
2129
+ "textInsets adds 17px and controlInsets adds 8px on selected physical sides; text wins on overlap.",
2124
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."
2125
2131
  ]
2126
2132
  }
@@ -2781,6 +2787,11 @@
2781
2787
  "owner": "application",
2782
2788
  "required": false
2783
2789
  },
2790
+ {
2791
+ "id": "whether the item needs a surface or semantic appearance",
2792
+ "owner": "application",
2793
+ "required": false
2794
+ },
2784
2795
  { "id": "corner shape", "owner": "application", "required": false },
2785
2796
  {
2786
2797
  "id": "region semantics and accessible name",
@@ -2812,7 +2823,7 @@
2812
2823
  "border": "self",
2813
2824
  "padding": "self",
2814
2825
  "notes": [
2815
- "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."
2816
2827
  ]
2817
2828
  }
2818
2829
  },
@@ -3494,14 +3505,15 @@
3494
3505
  {
3495
3506
  "path": "choices[].color",
3496
3507
  "grammar": "color",
3497
- "helpers": ["uiColor", "foregroundColorVar"],
3508
+ "helpers": ["uiColor", "foregroundColorVar", "foregroundColor"],
3498
3509
  "shorthands": [],
3499
3510
  "canonicalShorthands": [],
3500
3511
  "exceptionalShorthands": [],
3501
3512
  "rawPolicy": "forbid",
3502
3513
  "examples": [
3503
3514
  "color: uiColor(\"success-on-quiet\")",
3504
- "color: foregroundColorVar(\"--app-choice-color\")"
3515
+ "color: foregroundColorVar(\"--app-choice-color\")",
3516
+ "color: foregroundColor(\"rebeccapurple\")"
3505
3517
  ]
3506
3518
  }
3507
3519
  ],
@@ -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
@@ -26,14 +26,15 @@ Standardize vertical component layout, optional physical-side text/control inset
26
26
 
27
27
  ## Imports
28
28
 
29
- - JavaScript: `@kerfjs/ui/list` — exports `List`, `px`, `rem`, `em`, `pct`, `space`, `lengthVar`, `plus`, `calc`, `flex`.
29
+ - JavaScript: `@kerfjs/ui/list` — exports `List`.
30
+ - JavaScript: `@kerfjs/ui/css-values` — exports `px`, `rem`, `em`, `pct`, `space`, `lengthVar`, `plus`, `calc`, `flex`.
30
31
  - CSS: the browser build of `@kerfjs/ui/list` pulls its CSS automatically; import `@kerfjs/ui/list.css` manually only without the `browser` export condition.
31
32
  - Wiring: `wireScrollDividers` from `@kerfjs/ui/wire-scroll-dividers` (optional).
32
33
  - Declared side effects: browser-condition-css.
33
34
 
34
35
  ## Props
35
36
 
36
- Exact prop names and types: [`@kerfjs/ui/list`](../public-api-signatures-v1.md#kerfjsuilist), [`@kerfjs/ui/wire-scroll-dividers`](../public-api-signatures-v1.md#kerfjsuiwire-scroll-dividers) in `public-api-signatures-v1.md`. Do not infer props from examples.
37
+ Exact prop names and types: [`@kerfjs/ui/list`](../public-api-signatures-v1.md#kerfjsuilist), [`@kerfjs/ui/css-values`](../public-api-signatures-v1.md#kerfjsuicss-values), [`@kerfjs/ui/wire-scroll-dividers`](../public-api-signatures-v1.md#kerfjsuiwire-scroll-dividers) in `public-api-signatures-v1.md`. Do not infer props from examples.
37
38
 
38
39
  **Variants (configure, do not restyle):**
39
40
 
@@ -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
 
@@ -43,7 +44,7 @@ Exact prop names and types: [`@kerfjs/ui/lucide-icon`](../public-api-signatures-
43
44
 
44
45
  ## State and wiring
45
46
 
46
- **The app owns:** icon choice; meaningful label.
47
+ **The app owns:** icon choice; meaningful label; optional foreground color.
47
48
 
48
49
  No wiring helper.
49
50
 
@@ -65,6 +66,24 @@ The solid appearance fills a compatible Lucide glyph with currentColor while ret
65
66
  <LucideIcon icon={Star} name="star" appearance="solid" />
66
67
  ```
67
68
 
69
+ ### Semantic icon color
70
+
71
+ 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.
72
+
73
+ ```tsx
74
+ <LucideIcon icon={Bell} name="alert" color={uiColor('warning-on-quiet')} />
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
+
68
87
  ## Styling boundary
69
88
 
70
89
  The component owns its own styles. Configure it through its props and variants; do not override its internals.
@@ -11,7 +11,7 @@ Controlled Web Awesome select with typed single or multiple values, disabled cho
11
11
  Choose one or more controlled values, keep unavailable choices visible, and optionally select all enabled choices or clear a multiple selection.
12
12
 
13
13
  - Choose a controlled value from a moderate or long list, including grouped and icon-bearing choices.
14
- - Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, or foregroundColorVar() for an app-owned property. Fill tokens such as success are backgrounds that leave the icon nearly invisible, so they, lengths, raw color strings, and unqualified colorVar() values are rejected.
14
+ - Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, foregroundColorVar() for an app-owned property, or foregroundColor() for a direct custom CSS color. Fill tokens such as success are backgrounds that leave the icon nearly invisible, so they, lengths, raw color strings, and unqualified colorVar() values are rejected.
15
15
 
16
16
  **Not when:**
17
17
 
@@ -25,14 +25,15 @@ Choose one or more controlled values, keep unavailable choices visible, and opti
25
25
 
26
26
  ## Imports
27
27
 
28
- - JavaScript: `@kerfjs/ui/select` — exports `Select`, `uiColor`, `colorVar`, `foregroundColorVar`.
28
+ - JavaScript: `@kerfjs/ui/select` — exports `Select`.
29
+ - JavaScript: `@kerfjs/ui/css-values` — exports `uiColor`, `colorVar`, `foregroundColorVar`, `foregroundColor`.
29
30
  - CSS: the browser build of `@kerfjs/ui/select` pulls its CSS automatically; import `@kerfjs/ui/select.css` manually only without the `browser` export condition.
30
31
  - Registration: import `@kerfjs/ui/select/register` once (a side effect).
31
32
  - Declared side effects: custom-element-registration.
32
33
 
33
34
  ## Props
34
35
 
35
- Exact prop names and types: [`@kerfjs/ui/select`](../public-api-signatures-v1.md#kerfjsuiselect) in `public-api-signatures-v1.md`. Do not infer props from examples.
36
+ Exact prop names and types: [`@kerfjs/ui/select`](../public-api-signatures-v1.md#kerfjsuiselect), [`@kerfjs/ui/css-values`](../public-api-signatures-v1.md#kerfjsuicss-values) in `public-api-signatures-v1.md`. Do not infer props from examples.
36
37
 
37
38
  **Variants (configure, do not restyle):**
38
39
 
@@ -58,7 +59,7 @@ Exact prop names and types: [`@kerfjs/ui/select`](../public-api-signatures-v1.md
58
59
 
59
60
  **CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
60
61
 
61
- - `choices[].color`: color grammar; raw values: forbid; helpers `uiColor`, `foregroundColorVar` — e.g. `color: uiColor("success-on-quiet")`
62
+ - `choices[].color`: color grammar; raw values: forbid; helpers `uiColor`, `foregroundColorVar`, `foregroundColor` — e.g. `color: uiColor("success-on-quiet")`
62
63
 
63
64
  ## Composition
64
65