@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
@@ -1,6 +1,6 @@
1
1
  # Public API signatures for the UI authoring corpus
2
2
 
3
- Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.74` and `kerfjs@5.0.0-beta.74`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
3
+ Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.76` and `kerfjs@5.0.0-beta.76`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
4
4
 
5
5
  ## `@kerfjs/ui/css-values`
6
6
 
@@ -110,8 +110,13 @@ declare function colorVar(name: `--${string}`, fallback?: CssColor): CssColor;
110
110
  * accepts only {@link CssForegroundColor}, such as `SelectChoice.color`.
111
111
  */
112
112
  declare function foregroundColorVar(name: `--${string}`, fallback?: CssForegroundColor): CssForegroundColor;
113
+ /**
114
+ * Use an application-chosen CSS color for foreground content. The browser
115
+ * resolves the color syntax; this checks only that it is one declaration value.
116
+ */
117
+ declare function foregroundColor(value: string): CssForegroundColor;
113
118
 
114
- export { type CssColor, type CssFlex, type CssFlexBasis, type CssFlexKeyword, type CssForegroundColor, type CssLength, type CssLengthExpression, type CssSize, type CssSizeKeyword, type CssValue, type UiColor, type UiColorName, type UiForegroundColorName, type UiSpaceName, calc, colorVar, em, flex, foregroundColorVar, lengthVar, pct, plus, px, rem, remify, space, uiColor };
119
+ export { type CssColor, type CssFlex, type CssFlexBasis, type CssFlexKeyword, type CssForegroundColor, type CssLength, type CssLengthExpression, type CssSize, type CssSizeKeyword, type CssValue, type UiColor, type UiColorName, type UiForegroundColorName, type UiSpaceName, calc, colorVar, em, flex, foregroundColor, foregroundColorVar, lengthVar, pct, plus, px, rem, remify, space, uiColor };
115
120
  ```
116
121
 
117
122
  ## `@kerfjs/ui/disclosure-arrow`
@@ -142,9 +147,9 @@ export { DisclosureArrow, type DisclosureArrowProps, type DisclosureDirection };
142
147
 
143
148
  ```ts
144
149
  import * as kerfjs from 'kerfjs';
145
- import { PaneSeparatorSide } from './pane.js';
146
150
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
147
151
  import { S as Sides } from './sides-BPSWde0A.js';
152
+ import { PaneSeparatorSide } from './pane.js';
148
153
 
149
154
  type ToolbarPosition = 'header' | 'footer';
150
155
  interface ToolbarProps {
@@ -358,8 +363,8 @@ export { ToolbarActionLink, type ToolbarActionLinkProps, ToolbarControlGroup, ty
358
363
 
359
364
  ```ts
360
365
  import * as kerfjs from 'kerfjs';
361
- import { CssLength } from './css-values.js';
362
366
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
367
+ import { CssLength } from './css-values.js';
363
368
 
364
369
  /** Where a {@link FloatingToolbar} floats within its positioned container. */
365
370
  type FloatingToolbarPosition = 'bottom' | 'bottom-start' | 'bottom-end' | 'top' | 'top-start' | 'top-end';
@@ -626,11 +631,11 @@ export { ListHeader, type ListHeaderProps };
626
631
 
627
632
  ```ts
628
633
  import * as kerfjs from 'kerfjs';
629
- import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
634
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
630
635
  import { H as HorizontalAlignment, L as ListVerticalAlignment } from './flex-alignment-4ms8ZbV8.js';
631
636
  export { V as VerticalAlignment } from './flex-alignment-4ms8ZbV8.js';
632
- import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
633
637
  import { S as Sides } from './sides-BPSWde0A.js';
638
+ import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
634
639
 
635
640
  type ListRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
636
641
  'data-component'?: never;
@@ -893,7 +898,10 @@ export { ListInsetText, type ListInsetTextProps, Sides };
893
898
  ```ts
894
899
  import * as kerfjs from 'kerfjs';
895
900
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
901
+ import { S as SemanticTone } from './semantic-tone-CdW013KF.js';
896
902
 
903
+ /** Base surface treatment or semantic status colors. */
904
+ type ContentItemAppearance = 'transparent' | 'surface' | SemanticTone;
897
905
  /** Whether the item's always-reserved 1px border is transparent or visible. */
898
906
  type ContentItemFrame = 'none' | 'framed';
899
907
  /** Corner shape: the 12px rounded rectangle or the 22px pill. */
@@ -902,9 +910,11 @@ type ContentItemShape = 'rounded' | 'pill';
902
910
  type ContentItemSelectionMode = 'none' | 'single' | 'multiple' | 'toggle';
903
911
  type ContentItemRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
904
912
  'data-component'?: never;
913
+ 'data-appearance'?: never;
905
914
  }>;
906
915
  type ContentItemInteractiveRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
907
916
  'data-component'?: never;
917
+ 'data-appearance'?: never;
908
918
  'data-action'?: never;
909
919
  'data-item-id'?: never;
910
920
  'data-interactive'?: never;
@@ -914,6 +924,12 @@ type ContentItemInteractiveRootAttributes = Readonly<Record<`data-${string}`, st
914
924
  'data-kui-pressed'?: never;
915
925
  }>;
916
926
  interface ContentItemBaseProps {
927
+ /**
928
+ * Coordinated background, border, and foreground colors. `transparent`
929
+ * preserves the surrounding surface; `surface` paints the base surface;
930
+ * semantic values match StateBanner. Defaults to `transparent`.
931
+ */
932
+ appearance?: ContentItemAppearance;
917
933
  /** Item content; a plain string is allowed for bare copy. */
918
934
  children?: KerfUiContent | string;
919
935
  /**
@@ -969,9 +985,9 @@ type ContentItemProps = ContentItemBaseProps & ({
969
985
  * border (transparent unless `framed`), 8px padding, and a rounded or pill
970
986
  * radius. It owns that whole geometry, so wrappers must not add more.
971
987
  */
972
- declare function ContentItem({ children, frame, flush, shape, title, ariaLabel, focusTarget, interactive, action, itemId, selectionMode, selected, disabled, className, rootAttributes, slot, }: ContentItemProps): kerfjs.SafeHtml;
988
+ declare function ContentItem({ appearance, children, frame, flush, shape, title, ariaLabel, focusTarget, interactive, action, itemId, selectionMode, selected, disabled, className, rootAttributes, slot, }: ContentItemProps): kerfjs.SafeHtml;
973
989
 
974
- export { ContentItem, type ContentItemFrame, type ContentItemProps, type ContentItemSelectionMode, type ContentItemShape };
990
+ export { ContentItem, type ContentItemAppearance, type ContentItemFrame, type ContentItemProps, type ContentItemSelectionMode, type ContentItemShape, SemanticTone };
975
991
  ```
976
992
 
977
993
  ## `@kerfjs/ui/value-table`
@@ -1249,10 +1265,10 @@ export { type ScrollDividerTarget, type WireScrollDividersOptions, wireScrollDiv
1249
1265
 
1250
1266
  ```ts
1251
1267
  import * as kerfjs from 'kerfjs';
1252
- import { PaneAppearance } from './pane.js';
1253
1268
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1254
1269
  import { ToolbarConfig } from './toolbar.js';
1255
1270
  import { ToolbarTextSize, HeadingLevel } from './toolbar-text.js';
1271
+ import { PaneAppearance } from './pane.js';
1256
1272
  import './sides-BPSWde0A.js';
1257
1273
 
1258
1274
  /**
@@ -1371,12 +1387,12 @@ export { type WireNavStackOptions, wireNavStack };
1371
1387
 
1372
1388
  ```ts
1373
1389
  import * as kerfjs from 'kerfjs';
1390
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1374
1391
  import { NavStackProps, NavStackView } from './nav-stack.js';
1375
1392
  import { ResizableRegionProps } from './resizable-region.js';
1376
- import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1377
- import './pane.js';
1378
1393
  import './toolbar.js';
1379
1394
  import './sides-BPSWde0A.js';
1395
+ import './pane.js';
1380
1396
  import './toolbar-text.js';
1381
1397
  import './css-values.js';
1382
1398
 
@@ -1563,16 +1579,16 @@ export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlac
1563
1579
 
1564
1580
  ```ts
1565
1581
  import { SafeHtml } from 'kerfjs';
1582
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1566
1583
  import { ListConfig } from './list.js';
1567
1584
  import { NavStackProps } from './nav-stack.js';
1568
1585
  import { PaneConfig } from './pane.js';
1569
1586
  import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
1570
- import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1587
+ import { a as PanelToolbar, b as PanelChromePlacement, c as PanelBottomToolbar, d as PanelToggle } from './panel-toolbar-CL9tYOkh.js';
1571
1588
  import { ToolbarConfig } from './toolbar.js';
1572
- import { a as PanelToolbar, b as PanelChromePlacement, c as PanelBottomToolbar, d as PanelToggle } from './panel-toolbar-DDKh4uKd.js';
1573
- import './css-values.js';
1574
1589
  import './flex-alignment-4ms8ZbV8.js';
1575
1590
  import './sides-BPSWde0A.js';
1591
+ import './css-values.js';
1576
1592
  import './toolbar-text.js';
1577
1593
  import './lucide-icon.js';
1578
1594
  import 'lucide';
@@ -1957,18 +1973,18 @@ export { type WireWorkbenchOptions, type WireWorkbenchPanel, type WorkbenchPanel
1957
1973
 
1958
1974
  ```ts
1959
1975
  import { SafeHtml } from 'kerfjs';
1976
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1977
+ import { P as PanelSide, a as PanelToolbar, b as PanelChromePlacement, c as PanelBottomToolbar, d as PanelToggle } from './panel-toolbar-CL9tYOkh.js';
1978
+ export { e as collapsiblePanelToggleIcon } from './panel-toolbar-CL9tYOkh.js';
1960
1979
  import { ListConfig } from './list.js';
1961
1980
  import { PaneConfig } from './pane.js';
1962
- import { P as PanelSide, a as PanelToolbar, b as PanelChromePlacement, c as PanelBottomToolbar, d as PanelToggle } from './panel-toolbar-DDKh4uKd.js';
1963
- export { e as collapsiblePanelToggleIcon } from './panel-toolbar-DDKh4uKd.js';
1964
1981
  import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
1965
- import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1966
- import './css-values.js';
1967
- import './flex-alignment-4ms8ZbV8.js';
1982
+ import './toolbar.js';
1968
1983
  import './sides-BPSWde0A.js';
1969
1984
  import './lucide-icon.js';
1970
1985
  import 'lucide';
1971
- import './toolbar.js';
1986
+ import './css-values.js';
1987
+ import './flex-alignment-4ms8ZbV8.js';
1972
1988
 
1973
1989
  /** Which edge a {@link CollapsiblePanel} docks to. */
1974
1990
  type CollapsiblePanelSide = PanelSide;
@@ -2163,8 +2179,8 @@ export { type SidebarStorage, type WireSidebarOptions, type WireSidebarPanel, wi
2163
2179
 
2164
2180
  ```ts
2165
2181
  import { SafeHtml } from 'kerfjs';
2166
- import { PaneAppearance } from './pane.js';
2167
2182
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2183
+ import { PaneAppearance } from './pane.js';
2168
2184
 
2169
2185
  interface TabScaffoldTabBase<Id extends string> {
2170
2186
  id: Id;
@@ -2264,8 +2280,8 @@ export { type WireTabScaffoldOptions, wireTabScaffold };
2264
2280
 
2265
2281
  ```ts
2266
2282
  import { SafeHtml } from 'kerfjs';
2267
- import { CssLength } from './css-values.js';
2268
2283
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2284
+ import { CssLength } from './css-values.js';
2269
2285
 
2270
2286
  type ResizableRegionAxis = 'horizontal' | 'vertical';
2271
2287
  type ResizableRegionEdge = 'start' | 'end';
@@ -2410,20 +2426,20 @@ export { DEFAULT_BREAKPOINTS, type DeviceBreakpoints, type DeviceClass, type Dev
2410
2426
  ```ts
2411
2427
  import * as kerfjs from 'kerfjs';
2412
2428
  import { SafeHtml } from 'kerfjs';
2413
- import { a as CatalogProps } from './types-BuHELdXR.js';
2414
- export { b as CatalogBrand, c as CatalogEntry, d as CatalogRelated, C as CatalogResource, e as CatalogSecondaryGroup, f as CatalogSection, g as CatalogStageRootAttributes } from './types-BuHELdXR.js';
2429
+ import { a as CatalogProps } from './types-C9BubXfz.js';
2430
+ export { b as CatalogBrand, c as CatalogEntry, d as CatalogRelated, C as CatalogResource, e as CatalogSecondaryGroup, f as CatalogSection, g as CatalogStageRootAttributes } from './types-C9BubXfz.js';
2415
2431
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2416
2432
  import './toolbar.js';
2417
- import './pane.js';
2418
2433
  import './sides-BPSWde0A.js';
2434
+ import './pane.js';
2419
2435
  import './workbench.js';
2420
2436
  import './list.js';
2421
- import './css-values.js';
2422
2437
  import './flex-alignment-4ms8ZbV8.js';
2438
+ import './css-values.js';
2423
2439
  import './nav-stack.js';
2424
2440
  import './toolbar-text.js';
2425
2441
  import './resizable-region.js';
2426
- import './panel-toolbar-DDKh4uKd.js';
2442
+ import './panel-toolbar-CL9tYOkh.js';
2427
2443
  import './lucide-icon.js';
2428
2444
  import 'lucide';
2429
2445
 
@@ -2505,20 +2521,20 @@ export { Catalog, CatalogExample, type CatalogExampleAlign, type CatalogExampleP
2505
2521
  ## `@kerfjs/ui/catalog-resources`
2506
2522
 
2507
2523
  ```ts
2508
- import { C as CatalogResource } from './types-BuHELdXR.js';
2509
- import './semantic-content-BbzjvSu9.js';
2510
- import 'kerfjs';
2524
+ import { C as CatalogResource } from './types-C9BubXfz.js';
2511
2525
  import './toolbar.js';
2512
- import './pane.js';
2526
+ import 'kerfjs';
2527
+ import './semantic-content-BbzjvSu9.js';
2513
2528
  import './sides-BPSWde0A.js';
2529
+ import './pane.js';
2514
2530
  import './workbench.js';
2515
2531
  import './list.js';
2516
- import './css-values.js';
2517
2532
  import './flex-alignment-4ms8ZbV8.js';
2533
+ import './css-values.js';
2518
2534
  import './nav-stack.js';
2519
2535
  import './toolbar-text.js';
2520
2536
  import './resizable-region.js';
2521
- import './panel-toolbar-DDKh4uKd.js';
2537
+ import './panel-toolbar-CL9tYOkh.js';
2522
2538
  import './lucide-icon.js';
2523
2539
  import 'lucide';
2524
2540
 
@@ -2684,9 +2700,9 @@ export { SegmentedControl, type SegmentedControlAppearance, type SegmentedContro
2684
2700
 
2685
2701
  ```ts
2686
2702
  import { SafeHtml } from 'kerfjs';
2703
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2687
2704
  import { CssForegroundColor } from './css-values.js';
2688
2705
  import { LucideNode } from './lucide-icon.js';
2689
- import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2690
2706
  import 'lucide';
2691
2707
 
2692
2708
  interface SelectChoice<Value extends string = string> {
@@ -2815,8 +2831,10 @@ export { Select, type SelectChoice, type SelectFocusRingOwner, type SelectMultip
2815
2831
  ```ts
2816
2832
  import { SafeHtml } from 'kerfjs';
2817
2833
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2834
+ import { S as SemanticTone } from './semantic-tone-CdW013KF.js';
2818
2835
 
2819
- type StateBannerTone = 'neutral' | 'info' | 'pop' | 'success' | 'warning' | 'danger';
2836
+ /** @deprecated Use SemanticTone. */
2837
+ type StateBannerTone = SemanticTone;
2820
2838
  type StateBannerUrgency = 'status' | 'alert';
2821
2839
  type StateBannerCopyLayout = 'inline' | 'stacked';
2822
2840
  type StateBannerActionPlacement = 'trailing' | 'below';
@@ -2827,7 +2845,7 @@ interface StateBannerProps {
2827
2845
  badge?: string;
2828
2846
  icon?: SafeHtml;
2829
2847
  action?: KerfUiContent;
2830
- tone?: StateBannerTone;
2848
+ tone?: SemanticTone;
2831
2849
  urgency?: StateBannerUrgency;
2832
2850
  /** Keep the detail beside the title, or give it its own line. */
2833
2851
  copyLayout?: StateBannerCopyLayout;
@@ -2841,7 +2859,7 @@ interface StateBannerProps {
2841
2859
  }
2842
2860
  declare function StateBanner({ title, detail, badge, icon, action, tone, urgency, copyLayout, actionPlacement, className, placeholder, slot, }: StateBannerProps): SafeHtml;
2843
2861
 
2844
- export { StateBanner, type StateBannerActionPlacement, type StateBannerCopyLayout, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
2862
+ export { SemanticTone, StateBanner, type StateBannerActionPlacement, type StateBannerCopyLayout, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
2845
2863
  ```
2846
2864
 
2847
2865
  ## `@kerfjs/ui/empty-state`
@@ -2869,12 +2887,15 @@ export { EmptyState, type EmptyStateProps };
2869
2887
 
2870
2888
  ```ts
2871
2889
  import * as kerfjs from 'kerfjs';
2890
+ import { CssForegroundColor } from './css-values.js';
2872
2891
  import { LucideIconSize } from './lucide-icon.js';
2873
2892
  import 'lucide';
2874
2893
 
2875
2894
  type LoadingSpinnerSize = LucideIconSize;
2876
2895
  interface LoadingSpinnerProps {
2877
2896
  className?: string;
2897
+ /** Foreground color; omit to inherit the surrounding text color. */
2898
+ color?: CssForegroundColor;
2878
2899
  label?: string;
2879
2900
  /** Named icon scale or positive pixel size, converted to rem. Omit for 1em. */
2880
2901
  size?: LoadingSpinnerSize;
@@ -2882,7 +2903,7 @@ interface LoadingSpinnerProps {
2882
2903
  slot?: string;
2883
2904
  }
2884
2905
  /** Stable viewBox-centered progress ring based on svg-spinners' MIT-licensed 180-ring. */
2885
- declare function LoadingSpinner({ className, label, size, slot, }: LoadingSpinnerProps): kerfjs.SafeHtml;
2906
+ declare function LoadingSpinner({ className, color, label, size, slot, }: LoadingSpinnerProps): kerfjs.SafeHtml;
2886
2907
 
2887
2908
  export { LoadingSpinner, type LoadingSpinnerProps, type LoadingSpinnerSize };
2888
2909
  ```
@@ -2927,8 +2948,8 @@ export { Skeleton, type SkeletonProps };
2927
2948
 
2928
2949
  ```ts
2929
2950
  import * as kerfjs from 'kerfjs';
2930
- import { CssFlexKeyword, CssFlex } from './css-values.js';
2931
2951
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2952
+ import { CssFlexKeyword, CssFlex } from './css-values.js';
2932
2953
 
2933
2954
  type SunkenPanelShape = 'rounded' | 'square';
2934
2955
  interface SunkenPanelProps {
@@ -2958,16 +2979,16 @@ export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
2958
2979
  ## `@kerfjs/ui/token-search-field`
2959
2980
 
2960
2981
  ```ts
2982
+ export { T as TokenSearchEditorAttributes, a as TokenSearchField, b as TokenSearchFieldProps, c as TokenSearchFieldValue, j as TokenSearchToken, k as TokenSearchTrailingAction, p as placeTokenSearchCaret, r as readTokenSearchField } from './token-search-model-DTcTXWMS.js';
2961
2983
  import 'kerfjs';
2962
2984
  import './semantic-content-BbzjvSu9.js';
2963
- export { T as TokenSearchEditorAttributes, a as TokenSearchField, b as TokenSearchFieldProps, c as TokenSearchFieldValue, j as TokenSearchToken, k as TokenSearchTrailingAction, p as placeTokenSearchCaret, r as readTokenSearchField } from './token-search-field-CVGwDn2y.js';
2964
2985
  ```
2965
2986
 
2966
2987
  ## `@kerfjs/ui/wire-token-search-fields`
2967
2988
 
2968
2989
  ```ts
2969
2990
  import { Signal } from 'kerfjs';
2970
- import { d as TokenSearchModel } from './token-search-field-CVGwDn2y.js';
2991
+ import { d as TokenSearchModel } from './token-search-model-DTcTXWMS.js';
2971
2992
  import './semantic-content-BbzjvSu9.js';
2972
2993
 
2973
2994
  interface TokenSearchSubmit {
@@ -3164,14 +3185,16 @@ export { type ActionHandler, type DelegateActionsOptions, action, delegateAction
3164
3185
 
3165
3186
  ```ts
3166
3187
  import { SafeHtml } from 'kerfjs';
3188
+ import { S as SemanticTone } from './semantic-tone-CdW013KF.js';
3167
3189
 
3168
- type BadgeTone = 'neutral' | 'brand' | 'pop' | 'success' | 'warning' | 'danger';
3190
+ /** @deprecated Use SemanticTone. */
3191
+ type BadgeTone = SemanticTone;
3169
3192
  type BadgeAppearance = 'quiet' | 'solid' | 'outline';
3170
3193
  type BadgeShape = 'pill' | 'rounded';
3171
3194
  /** Size of a text badge. A text-free dot is the separate `size: 'dot'` form. */
3172
3195
  type BadgeSize = 'compact' | 'default';
3173
3196
  interface BadgeCommonProps {
3174
- tone?: BadgeTone;
3197
+ tone?: SemanticTone;
3175
3198
  className?: string;
3176
3199
  /** Native named-slot assignment when composed inside a web component. */
3177
3200
  slot?: string;
@@ -3214,19 +3237,20 @@ type BadgeProps = BadgeTextProps | BadgeDotProps;
3214
3237
  /** Compact, non-interactive metadata whose tone, emphasis, and shape are configured by props. */
3215
3238
  declare function Badge(props: BadgeProps): SafeHtml;
3216
3239
 
3217
- export { Badge, type BadgeAppearance, type BadgeDotProps, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeTextProps, type BadgeTone };
3240
+ export { Badge, type BadgeAppearance, type BadgeDotProps, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeTextProps, type BadgeTone, SemanticTone };
3218
3241
  ```
3219
3242
 
3220
3243
  ## `@kerfjs/ui/chip`
3221
3244
 
3222
3245
  ```ts
3223
3246
  import { SafeHtml } from 'kerfjs';
3224
- import { BadgeTone, BadgeAppearance, BadgeShape, BadgeSize } from './badge.js';
3247
+ import { S as SemanticTone } from './semantic-tone-CdW013KF.js';
3248
+ import { BadgeAppearance, BadgeShape, BadgeSize } from './badge.js';
3225
3249
 
3226
3250
  interface ChipCommonProps {
3227
3251
  /** Decorative leading icon, normally an unsized LucideIcon. */
3228
3252
  icon?: SafeHtml;
3229
- tone?: BadgeTone;
3253
+ tone?: SemanticTone;
3230
3254
  appearance?: BadgeAppearance;
3231
3255
  shape?: BadgeShape;
3232
3256
  size?: BadgeSize;
@@ -3262,6 +3286,7 @@ export { Chip, type ChipProps };
3262
3286
  ```ts
3263
3287
  import * as kerfjs from 'kerfjs';
3264
3288
  import { IconNode } from 'lucide';
3289
+ import { CssForegroundColor } from './css-values.js';
3265
3290
 
3266
3291
  type LucideNode = IconNode;
3267
3292
  type LucideIconSize = 'xs' | 's' | 'm' | 'l' | 'xl' | number;
@@ -3271,6 +3296,10 @@ interface LucideIconProps {
3271
3296
  /** Outline by default; solid fills compatible glyphs with the current text color. */
3272
3297
  appearance?: 'outline' | 'solid';
3273
3298
  className?: string;
3299
+ /** Foreground color; omit to inherit the surrounding text color. */
3300
+ color?: CssForegroundColor;
3301
+ /** Flow with surrounding text instead of occupying a block. */
3302
+ inline?: boolean;
3274
3303
  label?: string;
3275
3304
  /** Named icon scale or positive pixel size, converted to rem. Omit for 1em. */
3276
3305
  size?: LucideIconSize;
@@ -3278,7 +3307,7 @@ interface LucideIconProps {
3278
3307
  slot?: string;
3279
3308
  }
3280
3309
  /** Render a Lucide-compatible icon node without copying icon SVG strings. */
3281
- declare function LucideIcon({ icon, name, appearance, className, label, size, slot, }: LucideIconProps): kerfjs.SafeHtml;
3310
+ declare function LucideIcon({ icon, name, appearance, className, color, inline, label, size, slot, }: LucideIconProps): kerfjs.SafeHtml;
3282
3311
 
3283
3312
  export { LucideIcon, type LucideIconProps, type LucideIconSize, type LucideNode };
3284
3313
  ```
@@ -3324,6 +3353,15 @@ export { DialogSurface, type DialogSurfacePresentation, type DialogSurfaceProps,
3324
3353
  import * as kerfjs from 'kerfjs';
3325
3354
  import { KerfBaseAttrs } from 'kerfjs/jsx-runtime';
3326
3355
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3356
+ import { CssForegroundColor } from './css-values.js';
3357
+
3358
+ type FieldLabelProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
3359
+ children: string;
3360
+ class?: string;
3361
+ className?: string;
3362
+ };
3363
+ /** Visible field heading for a read-only preview; use its id with aria-labelledby on the preview group. */
3364
+ declare function FieldLabel({ children, class: classValue, className, ...attributes }: FieldLabelProps): kerfjs.SafeHtml;
3327
3365
 
3328
3366
  type TextVariant = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';
3329
3367
  type TextTone = 'default' | 'quiet' | 'danger';
@@ -3333,18 +3371,13 @@ type TextBorder = 'transparent' | 'none';
3333
3371
  type TextLineHeight = 'default' | 'tight';
3334
3372
  type TextWrap = 'normal' | 'anywhere' | 'nowrap' | 'truncate';
3335
3373
  type TextContent = KerfUiContent | string | number | readonly TextContent[];
3336
- type FieldLabelProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
3337
- children: string;
3338
- class?: string;
3339
- className?: string;
3340
- };
3341
- /** Visible field heading for a read-only preview; use its id with aria-labelledby on the preview group. */
3342
- declare function FieldLabel({ children, class: classValue, className, ...attributes }: FieldLabelProps): kerfjs.SafeHtml;
3343
3374
  type TextCommonProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
3344
3375
  /** Native heading, paragraph, or inline span element to render. Defaults to `p`. */
3345
3376
  variant?: TextVariant;
3346
3377
  /** Semantic foreground treatment. Defaults to the inherited foreground. */
3347
3378
  tone?: TextTone;
3379
+ /** Foreground color; overrides tone when supplied, or inherits when omitted. */
3380
+ color?: CssForegroundColor;
3348
3381
  /** Text sizing independent of the native semantic element. */
3349
3382
  size?: TextSize;
3350
3383
  /** Font family independent of the native semantic element. */
@@ -3374,7 +3407,7 @@ type TextProps = TextCommonProps & ({
3374
3407
  * content-item padding; `span` adds no box geometry.
3375
3408
  * All ordinary native heading/paragraph attributes pass through to the element.
3376
3409
  */
3377
- declare function Text({ variant: Variant, tone, size, font, border, flush, lineHeight, wrap, maxLines, children, class: classValue, className, ...attributes }: TextProps): kerfjs.SafeHtml;
3410
+ declare function Text({ variant: Variant, tone, color, size, font, border, flush, lineHeight, wrap, maxLines, children, class: classValue, className, style, ...attributes }: TextProps): kerfjs.SafeHtml;
3378
3411
 
3379
3412
  export { FieldLabel, type FieldLabelProps, Text, type TextBorder, type TextContent, type TextFont, type TextLineHeight, type TextProps, type TextSize, type TextTone, type TextVariant, type TextWrap };
3380
3413
  ```
@@ -3383,10 +3416,10 @@ export { FieldLabel, type FieldLabelProps, Text, type TextBorder, type TextConte
3383
3416
 
3384
3417
  ```ts
3385
3418
  import * as kerfjs from 'kerfjs';
3386
- import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
3387
- import { H as HorizontalAlignment, V as VerticalAlignment } from './flex-alignment-4ms8ZbV8.js';
3388
3419
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3420
+ import { H as HorizontalAlignment, V as VerticalAlignment } from './flex-alignment-4ms8ZbV8.js';
3389
3421
  import { S as Sides } from './sides-BPSWde0A.js';
3422
+ import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
3390
3423
 
3391
3424
  type RowRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
3392
3425
  'data-component'?: never;
@@ -3436,8 +3469,9 @@ export { CssFlex, CssFlexKeyword, CssLength, HorizontalAlignment, Row, type RowP
3436
3469
 
3437
3470
  ```ts
3438
3471
  import * as kerfjs from 'kerfjs';
3439
- import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
3440
3472
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3473
+ import { S as Sides } from './sides-BPSWde0A.js';
3474
+ import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
3441
3475
 
3442
3476
  type GridRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
3443
3477
  'data-component'?: never;
@@ -3446,6 +3480,8 @@ type GridRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
3446
3480
  'data-auto-fill'?: never;
3447
3481
  'data-flex'?: never;
3448
3482
  'data-fill'?: never;
3483
+ 'data-text-insets'?: never;
3484
+ 'data-control-insets'?: never;
3449
3485
  }>;
3450
3486
  interface GridCommonProps {
3451
3487
  children?: KerfUiContent;
@@ -3463,6 +3499,10 @@ interface GridCommonProps {
3463
3499
  * flex layout use `flex` instead. Defaults to false.
3464
3500
  */
3465
3501
  fill?: boolean;
3502
+ /** Physical sides that receive the standard 17px text inset. */
3503
+ textInsets?: Sides;
3504
+ /** Physical sides that receive the standard 8px control inset. Text insets win on overlap. */
3505
+ controlInsets?: Sides;
3466
3506
  className?: string;
3467
3507
  /** Safe `data-*` metadata; Grid-owned structural attributes remain protected. */
3468
3508
  rootAttributes?: GridRootAttributes;
@@ -3482,9 +3522,9 @@ type GridProps = GridCommonProps & ({
3482
3522
  autoFill?: boolean;
3483
3523
  });
3484
3524
  /** Render equal tracks with a fixed count or a responsive minimum width. */
3485
- declare function Grid({ children, selectionMode, ariaLabel, columns, minColumnWidth, autoFill, gap, flex, fill, className, rootAttributes, slot, }: GridProps): kerfjs.SafeHtml;
3525
+ declare function Grid({ children, selectionMode, ariaLabel, columns, minColumnWidth, autoFill, gap, flex, fill, textInsets, controlInsets, className, rootAttributes, slot, }: GridProps): kerfjs.SafeHtml;
3486
3526
 
3487
- export { CssFlex, CssFlexKeyword, CssLength, Grid, type GridProps, UiSpaceName };
3527
+ export { CssFlex, CssFlexKeyword, CssLength, Grid, type GridProps, Sides, UiSpaceName };
3488
3528
  ```
3489
3529
 
3490
3530
  ## `@kerfjs/ui/spacer`
@@ -3513,7 +3553,7 @@ export { CssLength, Spacer, type SpacerProps, UiSpaceName };
3513
3553
  ## `@kerfjs/ui/token-search-model`
3514
3554
 
3515
3555
  ```ts
3556
+ export { d as TokenSearchModel, e as TokenSearchModelOptions, f as TokenSearchResolvedToken, g as TokenSearchRule, h as TokenSearchState, i as TokenSearchSuggestion, l as createTokenSearchModel } from './token-search-model-DTcTXWMS.js';
3516
3557
  import 'kerfjs';
3517
- export { d as TokenSearchModel, e as TokenSearchModelOptions, f as TokenSearchResolvedToken, g as TokenSearchRule, h as TokenSearchState, i as TokenSearchSuggestion, l as createTokenSearchModel } from './token-search-field-CVGwDn2y.js';
3518
3558
  import './semantic-content-BbzjvSu9.js';
3519
3559
  ```
package/ai/skill.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: kerf-ui
3
3
  description: Build interfaces with kerfjs and the @kerfjs/ui production component package. Use whenever code imports @kerfjs/ui or a task asks for Kerf UI components.
4
- kerf-ui-skill-version: 1.50.0
4
+ kerf-ui-skill-version: 1.51.0
5
5
  ---
6
6
 
7
7
  # Building with @kerfjs/ui
@@ -21,6 +21,16 @@ documented dynamic-data widening. Do not extend those diagnostics to child
21
21
  markup, live DOM relationships, disposer invocation, or other conditions that
22
22
  TypeScript cannot prove from one call.
23
23
 
24
+ ### Shared semantic tones
25
+
26
+ `SemanticTone` is the shared color-role type for `Badge`, `Chip`, `StateBanner`,
27
+ and semantic `ContentItem` appearances: `neutral`, `info`, `pop`, `success`,
28
+ `warning`, and `danger`. Import it as a type from `@kerfjs/ui`,
29
+ `@kerfjs/ui/badge`, `@kerfjs/ui/state-banner`, or `@kerfjs/ui/content-item`.
30
+ Use `info` for the role backed by the existing `--kui-color-brand-*` tokens.
31
+ Migrate Badge/Chip `tone="brand"` to `tone="info"`; `BadgeTone` and
32
+ `StateBannerTone` remain deprecated aliases of `SemanticTone`.
33
+
24
34
  ## Components own their styles; configure, never override
25
35
 
26
36
  This is the rule every Kerf UI surface follows, and applications and
@@ -33,6 +43,11 @@ component packages built on Kerf UI must follow it too:
33
43
  selects a `.kui-*` class, a `[data-component]` root, a `wa-*` element a Kerf
34
44
  component renders, or its `::part()`s, and no hook class added to a
35
45
  component's root so that it can be restyled.
46
+ - **Owned implementation details are available.** A component may render raw
47
+ HTML or Web Awesome elements and style those elements when it creates them,
48
+ controls their state, and keeps the selectors in its own stylesheet. That
49
+ permission stops at every nested Kerf or application component boundary;
50
+ ownership follows the child component, even when the parent rendered it.
36
51
  - **Configuration, not overrides.** Do not write another component's private
37
52
  `--_kui-*` variables or reach for its `--kui-*` tokens to change layout,
38
53
  size, padding, or framing when a prop exists. Theme tokens are for theming
@@ -49,6 +64,11 @@ wa-dropdown.kui-popup-menu { … }` lives with PopupMenu). A parent may key its
49
64
  you need, report it (open an upstream feature request) instead of
50
65
  overriding. Your own components follow the same rule: expose configuration,
51
66
  and let each component own its styles.
67
+ - **Thin compositions usually need no CSS.** A component that only chooses and
68
+ connects other components should configure their props and slots without a
69
+ stylesheet. Add CSS only for raw elements or layout that the composition
70
+ itself owns; never use a composition stylesheet to normalize or override its
71
+ children.
52
72
 
53
73
  `kerf-ui-analyze` and `kerf-ui-doctor` enforce this downstream: `KUI-L019`
54
74
  (a rule whose subject is a cataloged component), `KUI-L020` (another
@@ -62,9 +82,12 @@ when none exists, report the component gap rather than suppressing the finding.
62
82
  For compact known activity, give `LoadingSpinner` its `size` prop (`xs` through
63
83
  `xl`, or a positive pixel number) instead of styling its SVG; omitted size is
64
84
  1em.
65
- For an application's own cataloged components, opt into Doctor's
66
- `"ownership": "component"` and declare each entry's `styleSources` so sibling
67
- components cannot style one another; package ownership remains the default.
85
+ For an application's own components, configure Doctor with
86
+ `"ownership": "component"`, `"implicitComponentOwnership": true`, and
87
+ `"ownershipContext": "any-package"`; declare each catalog entry's
88
+ `styleSources` so sibling components cannot style one another. Package
89
+ ownership remains the compatibility default and does not establish those
90
+ application-level boundaries.
68
91
 
69
92
  Read `../docs/webawesome-theme.md` when using Web Awesome components or changing
70
93
  shared theme tokens. When overriding a loud fill
@@ -172,6 +195,8 @@ For selectable document tiles, set `Grid selectionMode="multiple"` and
172
195
  `ariaLabel`, render `ContentItem selectionMode="multiple"` children, and wire
173
196
  `wireContentItems` for arrows, Home/End, and card activation. The app owns the
174
197
  selection set and each tile's nested controls.
198
+ `textInsets` adds the standard 17px physical-side content inset; `controlInsets`
199
+ adds 8px. Text insets win on any overlapping side, matching Row and List.
175
200
 
176
201
  For a complete shell, sidebar, workspace header, list-detail dialog, composer
177
202
  form, list-state lifecycle, or mixed-control toolbar, start from the runnable
@@ -262,6 +287,7 @@ Use `Toolbar responsive="trailing-priority"` when an expanded trailing search ne
262
287
  Set `--kui-toolbar-inset: 0px` on an embedded Toolbar to remove its outer padding while retaining `--kui-toolbar-gap` between zones. The same inset token controls the minimum-height allowance; safe-area padding still applies at claimed edges.
263
288
 
264
289
  For compact dialog copy, use `Text flush lineHeight="tight"`; for compact metadata, use `ValueTable density="compact"` and its public row columns/padding/gap tokens. `ToolbarText size="xsmall"` fits a dense rail heading. A `TokenSearchField` editor shrinks inside a narrow group by default; set `--kui-token-search-editor-min-width` when a minimum is needed. A full-height shell uses the one `.kui-app-root` mount container documented in `docs/document-baseline.md`.
290
+ When importing the opt-in `@kerfjs/ui/document.css` baseline, native `th`, `td`, `button`, `input`, `select`, and `textarea` inherit the surrounding font family, size, and line height; table headers retain their native emphasis. Load application typography overrides after the baseline.
265
291
 
266
292
  For a read-only field preview that replaces a Web Awesome input, use `FieldLabel` from `@kerfjs/ui/text` above the preview. Put it in `ListInsetControl sides="trl"` beside a `ContentItem` value; give it an id and use `aria-labelledby` on the preview group. The app owns preview/edit state and hint copy.
267
293
 
@@ -309,6 +335,9 @@ For prominent content text, use `Text size="large"`; use `size="xlarge"` for dis
309
335
 
310
336
  For removable tags use `Chip`, with `removeAction` for delegated handling and a specific `removeLabel` for the native button. `itemId` identifies the tag; the app owns removal. `size="compact"` and `disabled` replace app styling of raw `wa-tag` internals. Use `Badge` for non-interactive metadata.
311
337
 
338
+ For an icon with a specific meaning, set `LucideIcon.color` using `uiColor('warning-on-quiet')` or another foreground token. Use `foregroundColorVar('--app-icon-color')` for an app-owned property or `foregroundColor('#8b5cf6')` for a direct custom CSS color. Omit the prop to inherit text color. Outline stroke and solid fill both follow the chosen color; size, appearance, label, and slot remain separate props. Avoid pale fill tokens as foregrounds.
339
+ Set `LucideIcon.inline` when an icon belongs within `Text` or another sentence; the SVG flows as `inline-block` instead of its default block layout. It retains its inherited 1em size unless you set `size`.
340
+
312
341
  For `Select`, mark an unavailable choice with `disabled` and optionally `disabledReason`. In a multiple Select, `selectAllLabel` and `clearLabel` opt in to localized footer actions that select enabled choices or clear the selection through normal input/change events; the app still owns the controlled `value`.
313
342
 
314
343
  For nested action menus, use `PopupMenuItem.submenu` with item, heading, and divider entries; headings and dividers do not enter keyboard navigation. Items support `checked`, `icon`, `details`, `disabledReason`, and `tone`. The app owns choice state. For a right-click menu, use `PopupMenu` with `context: true` and call `openPopupMenuAt` from the app's `contextmenu` handler; the package positions and opens the menu. Call `closePopupMenu` for programmatic dismissal.
@@ -320,3 +349,5 @@ lifecycle: the latest request wins through open/close reversals, canceled
320
349
  transitions, and removal. Native value, keyboard, dismissal, and anchor placement
321
350
  remain with Web Awesome. Do not add popup delays, position repairs, or animation
322
351
  completion handlers in consumers. Raw `wa-select` elements remain native.
352
+
353
+ Neutral lowered surfaces and decorative neutral fills/borders are translucent theme colors; compose nested public components directly. Default/raised canvases, foregrounds, focus indicators, and loud contrast-bearing fills remain opaque. Do not assign depth-specific component tokens in demo wrappers.
@@ -1,6 +1,6 @@
1
1
  # Web Awesome JSX signatures for the UI authoring corpus
2
2
 
3
- Generated from the emitted `@kerfjs/ui@5.0.0-beta.74` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
3
+ Generated from the emitted `@kerfjs/ui@5.0.0-beta.76` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
4
4
 
5
5
  ```ts
6
6
  import { KerfCustomElement } from 'kerfjs/jsx-runtime';
@@ -15,6 +15,7 @@ import ts from 'typescript';
15
15
  import { loadApplicationUiProfile } from '../ai/application-ui-profile.mjs';
16
16
  import { isUiTraversalExcluded } from '../traversal-exclusions.mjs';
17
17
  import {
18
+ classOwnerFor,
18
19
  componentLabel,
19
20
  componentName,
20
21
  componentOwnershipFacts,
@@ -1636,7 +1637,13 @@ function inspectTsx(
1636
1637
  );
1637
1638
  if (entry && isForeign(entry))
1638
1639
  for (const className of classes.values) {
1639
- if (ownsClassBlock(facts.ownership, className, componentMode))
1640
+ // A class owned by the surrounding application is still a hook when
1641
+ // placed on another component's root. Only the component's own
1642
+ // public class is safe to style here.
1643
+ if (
1644
+ classOwnerFor(facts.ownership, className, componentMode)?.key ===
1645
+ entry.key
1646
+ )
1640
1647
  continue;
1641
1648
  const styled = cssFacts.get(className)?.styled;
1642
1649
  if (!styled) continue;
@@ -1717,6 +1724,9 @@ function inspectTsx(
1717
1724
  inset: inset || parent?.inset,
1718
1725
  label: entry?.key ?? tag,
1719
1726
  });
1727
+ // JSX supplied through a prop (for example Toolbar.leading) is still
1728
+ // rendered markup and must be checked like ordinary children.
1729
+ ts.forEachChild(opening.attributes, visit);
1720
1730
  if (ts.isJsxElement(node))
1721
1731
  for (const child of node.children) visit(child);
1722
1732
  stack.pop();