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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/README.md +29 -1
  2. package/ai/component-catalog.json +23 -11
  3. package/ai/component-composition.json +9 -3
  4. package/ai/components/README.md +1 -1
  5. package/ai/components/badge.md +1 -1
  6. package/ai/components/chip.md +1 -1
  7. package/ai/components/content-item.md +8 -5
  8. package/ai/components/document-baseline.md +2 -2
  9. package/ai/components/grid.md +5 -3
  10. package/ai/components/lucide-icon.md +11 -0
  11. package/ai/public-api-signatures-v1.md +92 -61
  12. package/ai/skill.md +33 -4
  13. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  14. package/analyzer/index.mjs +11 -1
  15. package/dist/app-tab.js +1 -1
  16. package/dist/badge.d.ts +5 -3
  17. package/dist/badge.js +1 -1
  18. package/dist/browser/catalog.js +7 -7
  19. package/dist/browser/collapsible-panel.js +3 -3
  20. package/dist/browser/list-header.js +1 -1
  21. package/dist/browser/nav-stack.js +1 -1
  22. package/dist/browser/select.js +1 -1
  23. package/dist/browser/split-view.js +1 -1
  24. package/dist/browser/workbench.js +4 -4
  25. package/dist/catalog-resources.d.ts +6 -6
  26. package/dist/catalog-resources.js +1 -1
  27. package/dist/catalog-resources.js.map +1 -1
  28. package/dist/catalog.d.ts +5 -5
  29. package/dist/catalog.js +13 -13
  30. package/dist/catalog.js.map +1 -1
  31. package/dist/chip.d.ts +3 -2
  32. package/dist/chip.js +1 -1
  33. package/dist/{chunk-SVLDRGPJ.js → chunk-3RE2JMZU.js} +7 -3
  34. package/dist/chunk-3RE2JMZU.js.map +1 -0
  35. package/dist/{chunk-V4WLBOVJ.js → chunk-5BZBIRQG.js} +4 -4
  36. package/dist/chunk-5BZBIRQG.js.map +1 -0
  37. package/dist/{chunk-SX7FJXPJ.js → chunk-5D3WDMIK.js} +4 -4
  38. package/dist/chunk-5D3WDMIK.js.map +1 -0
  39. package/dist/{chunk-HKVJ5MW3.js → chunk-5PAVAR4B.js} +3 -3
  40. package/dist/chunk-5PAVAR4B.js.map +1 -0
  41. package/dist/{chunk-5TTZPGUY.js → chunk-72LLWYP2.js} +6 -6
  42. package/dist/chunk-72LLWYP2.js.map +1 -0
  43. package/dist/{chunk-JA4J7Y4C.js → chunk-75I3SNUJ.js} +2 -2
  44. package/dist/chunk-75I3SNUJ.js.map +1 -0
  45. package/dist/{chunk-K47P7QZC.js → chunk-7QQ3HE47.js} +2 -2
  46. package/dist/chunk-7QQ3HE47.js.map +1 -0
  47. package/dist/{chunk-O5GM2JAM.js → chunk-7QWIJEK5.js} +9 -9
  48. package/dist/chunk-7QWIJEK5.js.map +1 -0
  49. package/dist/{chunk-5I7QGQVT.js → chunk-AN5IWMTM.js} +2 -2
  50. package/dist/chunk-AN5IWMTM.js.map +1 -0
  51. package/dist/{chunk-3BYFWTP3.js → chunk-AOAW55JN.js} +2 -2
  52. package/dist/chunk-AOAW55JN.js.map +1 -0
  53. package/dist/{chunk-5UGLKFBF.js → chunk-ARZ4RSQO.js} +5 -6
  54. package/dist/chunk-ARZ4RSQO.js.map +1 -0
  55. package/dist/{chunk-TCXDZNCX.js → chunk-BJLXE56E.js} +6 -6
  56. package/dist/chunk-BJLXE56E.js.map +1 -0
  57. package/dist/{chunk-RGS4WX2M.js → chunk-BYHGRKC3.js} +2 -2
  58. package/dist/chunk-BYHGRKC3.js.map +1 -0
  59. package/dist/{chunk-ZLKZFKLW.js → chunk-CEJ5FK6G.js} +2 -2
  60. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  61. package/dist/{chunk-SMZGAPCU.js → chunk-DQDTZE4W.js} +2 -2
  62. package/dist/chunk-DQDTZE4W.js.map +1 -0
  63. package/dist/{chunk-JGIV6ZDA.js → chunk-EFDCALR3.js} +2 -2
  64. package/dist/chunk-EFDCALR3.js.map +1 -0
  65. package/dist/{chunk-FKPKGP2H.js → chunk-G4VKQP7B.js} +2 -2
  66. package/dist/chunk-G4VKQP7B.js.map +1 -0
  67. package/dist/{chunk-TOICTHR2.js → chunk-GO2CZX4M.js} +2 -2
  68. package/dist/chunk-GO2CZX4M.js.map +1 -0
  69. package/dist/{chunk-DPAUKNB6.js → chunk-GS2QD3N7.js} +3 -3
  70. package/dist/chunk-GS2QD3N7.js.map +1 -0
  71. package/dist/{chunk-SLWCCHNP.js → chunk-H45DAZBL.js} +2 -2
  72. package/dist/chunk-H45DAZBL.js.map +1 -0
  73. package/dist/{chunk-DA3HS64I.js → chunk-H7ZJEI3H.js} +3 -3
  74. package/dist/chunk-H7ZJEI3H.js.map +1 -0
  75. package/dist/{chunk-V4GAQ74C.js → chunk-HFLGWMG3.js} +4 -4
  76. package/dist/chunk-HFLGWMG3.js.map +1 -0
  77. package/dist/{chunk-HXTAPIHQ.js → chunk-HFQDSSED.js} +6 -6
  78. package/dist/chunk-HFQDSSED.js.map +1 -0
  79. package/dist/{chunk-GRHJQWV2.js → chunk-HGSTMZZ6.js} +6 -6
  80. package/dist/chunk-HGSTMZZ6.js.map +1 -0
  81. package/dist/{chunk-WF75U3V4.js → chunk-HPREYDKV.js} +2 -2
  82. package/dist/chunk-HPREYDKV.js.map +1 -0
  83. package/dist/{chunk-VA5TN5PR.js → chunk-I4SDIMFA.js} +2 -2
  84. package/dist/chunk-I4SDIMFA.js.map +1 -0
  85. package/dist/{chunk-4SQK27MR.js → chunk-IM3GKYOG.js} +2 -2
  86. package/dist/chunk-IM3GKYOG.js.map +1 -0
  87. package/dist/{chunk-PL26TKNK.js → chunk-IVLTEBBT.js} +8 -8
  88. package/dist/chunk-IVLTEBBT.js.map +1 -0
  89. package/dist/{chunk-ALGYHYXP.js → chunk-J3AWE5I4.js} +2 -2
  90. package/dist/chunk-J3AWE5I4.js.map +1 -0
  91. package/dist/{chunk-OXO2QJWV.js → chunk-JOR5LGYE.js} +2 -2
  92. package/dist/chunk-JOR5LGYE.js.map +1 -0
  93. package/dist/{chunk-SRSJO5QE.js → chunk-LAZLBC2Q.js} +2 -2
  94. package/dist/chunk-LAZLBC2Q.js.map +1 -0
  95. package/dist/{chunk-RFGW735Q.js → chunk-LRAIS3YB.js} +2 -2
  96. package/dist/chunk-LRAIS3YB.js.map +1 -0
  97. package/dist/{chunk-AYUHMAI6.js → chunk-MXNIVEVL.js} +2 -2
  98. package/dist/chunk-MXNIVEVL.js.map +1 -0
  99. package/dist/{chunk-4NG4Y2Q6.js → chunk-NJZMR7HM.js} +2 -2
  100. package/dist/chunk-NJZMR7HM.js.map +1 -0
  101. package/dist/{chunk-DG6G5EPF.js → chunk-NMWDHZVM.js} +2 -2
  102. package/dist/chunk-NMWDHZVM.js.map +1 -0
  103. package/dist/{chunk-X5QSICJ3.js → chunk-NS2TBYM4.js} +2 -2
  104. package/dist/chunk-NS2TBYM4.js.map +1 -0
  105. package/dist/{chunk-4FEVHE7C.js → chunk-NVRJ7C3W.js} +4 -4
  106. package/dist/chunk-NVRJ7C3W.js.map +1 -0
  107. package/dist/{chunk-BFPBS5Y4.js → chunk-O27D24CA.js} +2 -2
  108. package/dist/chunk-O27D24CA.js.map +1 -0
  109. package/dist/{chunk-DUBUXJA3.js → chunk-PQQQXJGV.js} +4 -2
  110. package/dist/chunk-PQQQXJGV.js.map +1 -0
  111. package/dist/{chunk-6DFDTWGG.js → chunk-QYXKMLHO.js} +2 -2
  112. package/dist/chunk-QYXKMLHO.js.map +1 -0
  113. package/dist/{chunk-I3Q7KKYM.js → chunk-S3ECMF23.js} +2 -2
  114. package/dist/chunk-S3ECMF23.js.map +1 -0
  115. package/dist/{chunk-PSHUSWQH.js → chunk-S4ZGTDSG.js} +2 -2
  116. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  117. package/dist/{chunk-OYQIONQF.js → chunk-SJY7KC45.js} +5 -5
  118. package/dist/chunk-SJY7KC45.js.map +1 -0
  119. package/dist/{chunk-NPNSKX3K.js → chunk-VLPE6OPN.js} +2 -2
  120. package/dist/chunk-VLPE6OPN.js.map +1 -0
  121. package/dist/{chunk-NCSWXG7G.js → chunk-VLQUXZKA.js} +9 -3
  122. package/dist/chunk-VLQUXZKA.js.map +1 -0
  123. package/dist/{chunk-EHIMH4J7.js → chunk-VR7MWD2X.js} +10 -4
  124. package/dist/chunk-VR7MWD2X.js.map +1 -0
  125. package/dist/{chunk-NN6GYOA2.js → chunk-XIZRXI7N.js} +2 -2
  126. package/dist/chunk-XIZRXI7N.js.map +1 -0
  127. package/dist/{chunk-TDN5EE3S.js → chunk-Y6KT7ZTR.js} +2 -2
  128. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  129. package/dist/{chunk-LHSUPNSE.js → chunk-YLJ6X3AC.js} +2 -2
  130. package/dist/chunk-YLJ6X3AC.js.map +1 -0
  131. package/dist/{chunk-YDGNU2OD.js → chunk-ZVYA6TLR.js} +5 -2
  132. package/dist/chunk-ZVYA6TLR.js.map +1 -0
  133. package/dist/collapsible-panel.d.ts +6 -6
  134. package/dist/collapsible-panel.js +3 -3
  135. package/dist/collapsible-panel.js.map +1 -1
  136. package/dist/content-item.d.ts +13 -2
  137. package/dist/content-item.js +1 -1
  138. package/dist/css-values.js +1 -1
  139. package/dist/device-class.js +1 -1
  140. package/dist/device-class.js.map +1 -1
  141. package/dist/disclosure-arrow.js +1 -1
  142. package/dist/empty-state.js +1 -1
  143. package/dist/floating-toolbar.d.ts +1 -1
  144. package/dist/floating-toolbar.js +1 -1
  145. package/dist/grid.d.ts +10 -3
  146. package/dist/grid.js +1 -1
  147. package/dist/help-tags-register.js +1 -1
  148. package/dist/help-tags-register.js.map +1 -1
  149. package/dist/index.d.ts +27 -26
  150. package/dist/index.js +40 -40
  151. package/dist/list-action-row.js +1 -1
  152. package/dist/list-header.js +1 -1
  153. package/dist/list-inset-control.js +1 -1
  154. package/dist/list-inset-text.js +1 -1
  155. package/dist/list-item.js +1 -1
  156. package/dist/list.d.ts +2 -2
  157. package/dist/list.js +1 -1
  158. package/dist/loading-spinner.d.ts +4 -2
  159. package/dist/loading-spinner.js +1 -1
  160. package/dist/lucide-icon.d.ts +3 -1
  161. package/dist/lucide-icon.js +1 -1
  162. package/dist/nav-stack.d.ts +1 -1
  163. package/dist/nav-stack.js +1 -1
  164. package/dist/pane.js +1 -1
  165. package/dist/popup-menu-register.js +7 -7
  166. package/dist/popup-menu-register.js.map +1 -1
  167. package/dist/popup-menu.js +1 -1
  168. package/dist/resizable-region.d.ts +1 -1
  169. package/dist/resizable-region.js +1 -1
  170. package/dist/row.d.ts +2 -2
  171. package/dist/row.js +1 -1
  172. package/dist/segmented-control.js +1 -1
  173. package/dist/select-register.js +6 -6
  174. package/dist/select-register.js.map +1 -1
  175. package/dist/select.d.ts +1 -1
  176. package/dist/select.js +1 -1
  177. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  178. package/dist/skeleton.js +1 -1
  179. package/dist/spacer.js +1 -1
  180. package/dist/split-view.d.ts +2 -2
  181. package/dist/split-view.js +2 -2
  182. package/dist/split-view.js.map +1 -1
  183. package/dist/state-banner.d.ts +5 -3
  184. package/dist/state-banner.js +1 -1
  185. package/dist/styles/badge.css +1 -1
  186. package/dist/styles/chip.css +1 -1
  187. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  188. package/dist/styles/components/actions/popup-menu/popup-menu.css +285 -0
  189. package/dist/styles/components/actions/toolbar/toolbar.css +392 -0
  190. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +790 -0
  191. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +153 -0
  192. package/dist/styles/components/collections/list/list.css +133 -0
  193. package/dist/styles/components/collections/list-action-row/list-action-row.css +258 -0
  194. package/dist/styles/components/collections/list-header/list-header.css +229 -0
  195. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  196. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  197. package/dist/styles/components/collections/list-item/list-item.css +255 -0
  198. package/dist/styles/components/data-display/value-table/value-table.css +105 -0
  199. package/dist/styles/components/feedback/badge/badge.css +118 -0
  200. package/dist/styles/components/feedback/chip/chip.css +138 -0
  201. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  202. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  203. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  204. package/dist/styles/components/feedback/state-banner/state-banner.css +248 -0
  205. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  206. package/dist/styles/components/forms/select/select.css +454 -0
  207. package/dist/styles/components/forms/token-search-field/token-search-field.css +381 -0
  208. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +575 -0
  209. package/dist/styles/components/layout/grid/grid.css +85 -0
  210. package/dist/styles/components/layout/pane/pane.css +263 -0
  211. package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
  212. package/dist/styles/components/layout/row/row.css +111 -0
  213. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  214. package/dist/styles/components/layout/split-view/split-view.css +146 -0
  215. package/dist/styles/components/layout/workbench/workbench.css +1067 -0
  216. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  217. package/dist/styles/components/navigation/app-tab/app-tab.css +376 -0
  218. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
  219. package/dist/styles/components/navigation/nav-stack/nav-stack.css +237 -0
  220. package/dist/styles/components/navigation/tab-bar/tab-bar.css +183 -0
  221. package/dist/styles/components/navigation/tab-scaffold/tab-scaffold.css +207 -0
  222. package/dist/styles/components/surfaces/content-item/content-item.css +120 -0
  223. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +29 -0
  224. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +56 -0
  225. package/dist/styles/components/typography/text/text.css +139 -0
  226. package/dist/styles/content-item.css +46 -1
  227. package/dist/styles/document.css +10 -0
  228. package/dist/styles/foundation.css +9 -6
  229. package/dist/styles/grid.css +50 -0
  230. package/dist/styles/lucide-icon.css +4 -0
  231. package/dist/styles/webawesome.css +23 -6
  232. package/dist/sunken-panel.d.ts +1 -1
  233. package/dist/sunken-panel.js +1 -1
  234. package/dist/surface-scaffold.js +1 -1
  235. package/dist/tab-bar.js +1 -1
  236. package/dist/tab-scaffold.d.ts +1 -1
  237. package/dist/tab-scaffold.js +1 -1
  238. package/dist/tab-scaffold.js.map +1 -1
  239. package/dist/text.d.ts +12 -8
  240. package/dist/text.js +1 -1
  241. package/dist/token-search-field.d.ts +1 -1
  242. package/dist/token-search-field.js +1 -1
  243. package/dist/{token-search-field-CVGwDn2y.d.ts → token-search-model-DTcTXWMS.d.ts} +54 -54
  244. package/dist/token-search-model.d.ts +1 -1
  245. package/dist/token-search-model.js +1 -1
  246. package/dist/toolbar-control-group.js +1 -1
  247. package/dist/toolbar-text.js +1 -1
  248. package/dist/toolbar.d.ts +1 -1
  249. package/dist/toolbar.js +1 -1
  250. package/dist/value-table.js +1 -1
  251. package/dist/wire-catalog.js +2 -2
  252. package/dist/wire-catalog.js.map +1 -1
  253. package/dist/wire-content-items.js +1 -1
  254. package/dist/wire-content-items.js.map +1 -1
  255. package/dist/wire-nav-stack.js +1 -1
  256. package/dist/wire-nav-stack.js.map +1 -1
  257. package/dist/wire-resizable-regions.js +1 -1
  258. package/dist/wire-scroll-dividers.js +1 -1
  259. package/dist/wire-sidebar.js +1 -1
  260. package/dist/wire-sidebar.js.map +1 -1
  261. package/dist/wire-tab-bars.js +1 -1
  262. package/dist/wire-tab-scaffold.js +1 -1
  263. package/dist/wire-tab-scaffold.js.map +1 -1
  264. package/dist/wire-token-search-fields.d.ts +1 -1
  265. package/dist/wire-token-search-fields.js +1 -1
  266. package/dist/wire-workbench.js +1 -1
  267. package/dist/workbench.d.ts +3 -3
  268. package/dist/workbench.js +1 -1
  269. package/docs/collapsible-panel.md +1 -1
  270. package/docs/component-contract.md +25 -7
  271. package/docs/component-selection.md +18 -4
  272. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  273. package/docs/design/templates/empty-state/filtered.svg +1 -1
  274. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  275. package/docs/design/templates/empty-state/with-action.svg +1 -1
  276. package/docs/design/templates/empty-state-dark.svg +1 -1
  277. package/docs/design/templates/empty-state.svg +1 -1
  278. package/docs/design/templates/list/stack-dark.svg +1 -1
  279. package/docs/design/templates/list/stack.svg +1 -1
  280. package/docs/design/templates/list-dark.svg +1 -1
  281. package/docs/design/templates/list-header/action-dark.svg +1 -1
  282. package/docs/design/templates/list-header/action.svg +1 -1
  283. package/docs/design/templates/list-header/count-dark.svg +1 -1
  284. package/docs/design/templates/list-header/count.svg +1 -1
  285. package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
  286. package/docs/design/templates/list-header/inline-action.svg +1 -1
  287. package/docs/design/templates/list-header/size-l-dark.svg +1 -1
  288. package/docs/design/templates/list-header/size-l.svg +1 -1
  289. package/docs/design/templates/list-header/size-m-dark.svg +1 -1
  290. package/docs/design/templates/list-header/size-m.svg +1 -1
  291. package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
  292. package/docs/design/templates/list-header/size-xl.svg +1 -1
  293. package/docs/design/templates/list-header/size-xs-dark.svg +1 -1
  294. package/docs/design/templates/list-header/size-xs.svg +1 -1
  295. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  296. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  297. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  298. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  299. package/docs/design/templates/list-header-dark.svg +1 -1
  300. package/docs/design/templates/list-header.svg +1 -1
  301. package/docs/design/templates/list.svg +1 -1
  302. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  303. package/docs/design/templates/segmented-control/equal.svg +1 -1
  304. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  305. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  306. package/docs/design/templates/segmented-control-dark.svg +1 -1
  307. package/docs/design/templates/segmented-control.svg +1 -1
  308. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  309. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  310. package/docs/design/templates/tab-bar-dark.svg +1 -1
  311. package/docs/design/templates/tab-bar.svg +1 -1
  312. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  313. package/docs/design/templates/token-search-field/empty.svg +1 -1
  314. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
  315. package/docs/design/templates/token-search-field/tokens.svg +1 -1
  316. package/docs/design/templates/token-search-field-dark.svg +1 -1
  317. package/docs/design/templates/token-search-field.svg +1 -1
  318. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  319. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  320. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  321. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  322. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  323. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  324. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  325. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  326. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  327. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  328. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  329. package/docs/design/templates/toolbar-control-group.svg +1 -1
  330. package/docs/design/templates/toolbar-dark.svg +1 -1
  331. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  332. package/docs/design/templates/toolbar-text/default.svg +1 -1
  333. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  334. package/docs/design/templates/toolbar-text/large.svg +1 -1
  335. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  336. package/docs/design/templates/toolbar-text/small.svg +1 -1
  337. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  338. package/docs/design/templates/toolbar-text.svg +1 -1
  339. package/docs/design/templates/toolbar.svg +1 -1
  340. package/docs/design/templates/value-table/details-dark.svg +1 -1
  341. package/docs/design/templates/value-table/details.svg +1 -1
  342. package/docs/design/templates/value-table-dark.svg +1 -1
  343. package/docs/design/templates/value-table.svg +1 -1
  344. package/docs/document-baseline.md +4 -0
  345. package/docs/layout.md +11 -5
  346. package/docs/sunken-panel.md +7 -7
  347. package/docs/ui-analyzer.md +12 -1
  348. package/docs/ui-doctor.md +12 -2
  349. package/docs/webawesome-theme.md +29 -59
  350. package/doctor/index.mjs +39 -30
  351. package/llms.txt +18 -1
  352. package/package.json +3 -2
  353. package/dist/chunk-3BYFWTP3.js.map +0 -1
  354. package/dist/chunk-4FEVHE7C.js.map +0 -1
  355. package/dist/chunk-4NG4Y2Q6.js.map +0 -1
  356. package/dist/chunk-4SQK27MR.js.map +0 -1
  357. package/dist/chunk-5I7QGQVT.js.map +0 -1
  358. package/dist/chunk-5TTZPGUY.js.map +0 -1
  359. package/dist/chunk-5UGLKFBF.js.map +0 -1
  360. package/dist/chunk-6DFDTWGG.js.map +0 -1
  361. package/dist/chunk-ALGYHYXP.js.map +0 -1
  362. package/dist/chunk-AYUHMAI6.js.map +0 -1
  363. package/dist/chunk-BFPBS5Y4.js.map +0 -1
  364. package/dist/chunk-DA3HS64I.js.map +0 -1
  365. package/dist/chunk-DG6G5EPF.js.map +0 -1
  366. package/dist/chunk-DPAUKNB6.js.map +0 -1
  367. package/dist/chunk-DUBUXJA3.js.map +0 -1
  368. package/dist/chunk-EHIMH4J7.js.map +0 -1
  369. package/dist/chunk-FKPKGP2H.js.map +0 -1
  370. package/dist/chunk-GRHJQWV2.js.map +0 -1
  371. package/dist/chunk-HKVJ5MW3.js.map +0 -1
  372. package/dist/chunk-HXTAPIHQ.js.map +0 -1
  373. package/dist/chunk-I3Q7KKYM.js.map +0 -1
  374. package/dist/chunk-JA4J7Y4C.js.map +0 -1
  375. package/dist/chunk-JGIV6ZDA.js.map +0 -1
  376. package/dist/chunk-K47P7QZC.js.map +0 -1
  377. package/dist/chunk-LHSUPNSE.js.map +0 -1
  378. package/dist/chunk-NCSWXG7G.js.map +0 -1
  379. package/dist/chunk-NN6GYOA2.js.map +0 -1
  380. package/dist/chunk-NPNSKX3K.js.map +0 -1
  381. package/dist/chunk-O5GM2JAM.js.map +0 -1
  382. package/dist/chunk-OXO2QJWV.js.map +0 -1
  383. package/dist/chunk-OYQIONQF.js.map +0 -1
  384. package/dist/chunk-PL26TKNK.js.map +0 -1
  385. package/dist/chunk-PSHUSWQH.js.map +0 -1
  386. package/dist/chunk-RFGW735Q.js.map +0 -1
  387. package/dist/chunk-RGS4WX2M.js.map +0 -1
  388. package/dist/chunk-SLWCCHNP.js.map +0 -1
  389. package/dist/chunk-SMZGAPCU.js.map +0 -1
  390. package/dist/chunk-SRSJO5QE.js.map +0 -1
  391. package/dist/chunk-SVLDRGPJ.js.map +0 -1
  392. package/dist/chunk-SX7FJXPJ.js.map +0 -1
  393. package/dist/chunk-TCXDZNCX.js.map +0 -1
  394. package/dist/chunk-TDN5EE3S.js.map +0 -1
  395. package/dist/chunk-TOICTHR2.js.map +0 -1
  396. package/dist/chunk-V4GAQ74C.js.map +0 -1
  397. package/dist/chunk-V4WLBOVJ.js.map +0 -1
  398. package/dist/chunk-VA5TN5PR.js.map +0 -1
  399. package/dist/chunk-WF75U3V4.js.map +0 -1
  400. package/dist/chunk-X5QSICJ3.js.map +0 -1
  401. package/dist/chunk-YDGNU2OD.js.map +0 -1
  402. package/dist/chunk-ZLKZFKLW.js.map +0 -1
  403. package/dist/{panel-toolbar-DDKh4uKd.d.ts → panel-toolbar-CL9tYOkh.d.ts} +1 -1
  404. package/dist/{types-BuHELdXR.d.ts → types-C9BubXfz.d.ts} +1 -1
@@ -0,0 +1,139 @@
1
+ .kui-text {
2
+ padding: var(--kui-layout-item-padding, 0.5rem);
3
+ box-sizing: border-box;
4
+ border: 1px solid transparent;
5
+ margin: 0;
6
+ white-space: normal;
7
+ overflow-wrap: normal;
8
+ }
9
+
10
+ /* Match the themed Web Awesome form-control label without introducing a
11
+ native <label> that would falsely point at a non-form preview. */
12
+ .kui-text__field-label {
13
+ box-sizing: border-box;
14
+ min-width: 0;
15
+ padding-inline: calc(
16
+ var(--wa-form-control-border-width, 1px) +
17
+ var(--wa-form-control-padding-inline, 0.5rem)
18
+ );
19
+ margin: 0 0 0.5em;
20
+ color: var(--kui-color-neutral-on-quiet, var(--wa-color-text-quiet));
21
+ font-size: var(--kui-font-xs, var(--wa-font-size-xs));
22
+ font-weight: 650;
23
+ letter-spacing: 0.04em;
24
+ line-height: var(--wa-line-height-condensed);
25
+ text-transform: uppercase;
26
+ }
27
+
28
+ .kui-text[data-wrap="anywhere"] {
29
+ overflow-wrap: anywhere;
30
+ }
31
+
32
+ .kui-text[data-wrap="nowrap"] {
33
+ white-space: nowrap;
34
+ }
35
+
36
+ .kui-text[data-wrap="truncate"] {
37
+ min-width: 0;
38
+ overflow: hidden;
39
+ text-overflow: ellipsis;
40
+ white-space: nowrap;
41
+ }
42
+
43
+ span.kui-text[data-wrap="truncate"] {
44
+ display: inline-block;
45
+ max-width: 100%;
46
+ }
47
+
48
+ .kui-text__clamp {
49
+ display: -webkit-box;
50
+ overflow: hidden;
51
+ -webkit-box-orient: vertical;
52
+ -webkit-line-clamp: var(--_kui-text-max-lines);
53
+ }
54
+
55
+ .kui-text[data-tone="quiet"] {
56
+ color: var(--kui-color-text-quiet);
57
+ }
58
+
59
+ .kui-text[data-tone="danger"] {
60
+ color: var(--kui-color-danger-on-quiet);
61
+ }
62
+
63
+ .kui-text[data-size="compact"] {
64
+ font-size: var(--kui-font-xs);
65
+ }
66
+
67
+ .kui-text[data-size="large"] {
68
+ font-size: var(--kui-font-l);
69
+ }
70
+
71
+ .kui-text[data-size="xlarge"] {
72
+ font-size: var(--kui-font-2xl);
73
+ }
74
+
75
+ .kui-text[data-font="monospace"] {
76
+ font-family: var(--kui-font-mono);
77
+ }
78
+
79
+ .kui-text[data-border="none"] {
80
+ border: 0;
81
+ }
82
+
83
+ .kui-text[data-flush="true"] {
84
+ padding: 0;
85
+ border: 0;
86
+ }
87
+
88
+ .kui-text[data-line-height="tight"] {
89
+ line-height: 1.2;
90
+ }
91
+
92
+ span.kui-text {
93
+ margin: 0;
94
+ border: 0;
95
+ padding: 0;
96
+ }
97
+
98
+ /* A ListHeader's label: the title's single text child, set as a compact,
99
+ uppercase, single-line label that truncates with an ellipsis. The title is
100
+ a div around a heading or, for a toggle header, the toggle button around
101
+ an inline span. */
102
+ .kui-list-header__title > .kui-text {
103
+ min-width: 0;
104
+ margin: 0;
105
+ overflow: hidden;
106
+ font-size: var(--kui-font-xs);
107
+ font-weight: 650;
108
+ letter-spacing: 0.04em;
109
+ text-overflow: ellipsis;
110
+ text-transform: uppercase;
111
+ white-space: nowrap;
112
+ }
113
+
114
+ .kui-list-header[data-size="xs"] .kui-list-header__title > .kui-text {
115
+ font-size: var(--kui-font-2xs);
116
+ text-transform: capitalize;
117
+ }
118
+
119
+ .kui-list-header:is([data-size="m"], [data-size="l"], [data-size="xl"])
120
+ .kui-list-header__title
121
+ > .kui-text {
122
+ font-family: var(--wa-font-family-heading, var(--kui-font-sans));
123
+ font-weight: var(--wa-font-weight-heading, 600);
124
+ letter-spacing: normal;
125
+ line-height: var(--wa-line-height-condensed, 1.2);
126
+ text-transform: none;
127
+ }
128
+
129
+ .kui-list-header[data-size="m"] .kui-list-header__title > .kui-text {
130
+ font-size: var(--kui-font-m);
131
+ }
132
+
133
+ .kui-list-header[data-size="l"] .kui-list-header__title > .kui-text {
134
+ font-size: var(--kui-font-l);
135
+ }
136
+
137
+ .kui-list-header[data-size="xl"] .kui-list-header__title > .kui-text {
138
+ font-size: var(--kui-font-xl);
139
+ }
@@ -13,6 +13,7 @@
13
13
  --kui-content-item-radius,
14
14
  var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
15
15
  );
16
+ color: var(--kui-content-item-foreground, inherit);
16
17
  background: var(--kui-content-item-background, transparent);
17
18
  }
18
19
 
@@ -34,8 +35,50 @@
34
35
  --kui-content-item-border: var(--kui-color-neutral-border-normal);
35
36
  }
36
37
 
38
+ .kui-content-item[data-appearance="surface"] {
39
+ --kui-content-item-border: var(--kui-color-neutral-border-normal);
40
+ --kui-content-item-background: var(--kui-color-surface);
41
+ --kui-content-item-foreground: var(--kui-color-neutral-on-normal);
42
+ }
43
+
44
+ .kui-content-item[data-appearance="neutral"] {
45
+ --kui-content-item-border: var(--kui-color-neutral-border-normal);
46
+ --kui-content-item-background: var(--kui-color-neutral-fill-quiet);
47
+ --kui-content-item-foreground: var(--kui-color-neutral-on-normal);
48
+ }
49
+
50
+ .kui-content-item[data-appearance="info"] {
51
+ --kui-content-item-border: var(--kui-color-brand-border-quiet);
52
+ --kui-content-item-background: var(--kui-color-brand-fill-quiet);
53
+ --kui-content-item-foreground: var(--kui-color-brand-on-fill);
54
+ }
55
+
56
+ .kui-content-item[data-appearance="pop"] {
57
+ --kui-content-item-border: var(--kui-color-pop-border-normal);
58
+ --kui-content-item-background: var(--kui-color-pop-fill-quiet);
59
+ --kui-content-item-foreground: var(--kui-color-pop-on-fill);
60
+ }
61
+
62
+ .kui-content-item[data-appearance="success"] {
63
+ --kui-content-item-border: var(--kui-color-success-border-normal);
64
+ --kui-content-item-background: var(--kui-color-success-fill-quiet);
65
+ --kui-content-item-foreground: var(--kui-color-success-on-fill);
66
+ }
67
+
68
+ .kui-content-item[data-appearance="warning"] {
69
+ --kui-content-item-border: var(--kui-color-warning-border-normal);
70
+ --kui-content-item-background: var(--kui-color-warning-fill-quiet);
71
+ --kui-content-item-foreground: var(--kui-color-warning-on-fill);
72
+ }
73
+
74
+ .kui-content-item[data-appearance="danger"] {
75
+ --kui-content-item-border: var(--kui-color-danger-border-quiet);
76
+ --kui-content-item-background: var(--kui-color-danger-fill-quiet);
77
+ --kui-content-item-foreground: var(--kui-color-danger-on-fill);
78
+ }
79
+
37
80
  .kui-content-item[data-interactive="true"] {
38
- color: var(--kui-color-neutral-on-normal);
81
+ color: var(--kui-content-item-foreground, var(--kui-color-neutral-on-normal));
39
82
  cursor: pointer;
40
83
  }
41
84
 
@@ -48,6 +91,7 @@
48
91
  ) {
49
92
  --kui-content-item-border: var(--kui-color-neutral-border-normal);
50
93
  --kui-content-item-background: var(--kui-color-neutral-fill-normal);
94
+ --kui-content-item-foreground: var(--kui-color-neutral-on-normal);
51
95
  }
52
96
 
53
97
  .kui-content-item[data-interactive="true"]:active:not([data-disabled="true"]) {
@@ -61,6 +105,7 @@
61
105
  .kui-content-item[data-interactive="true"][data-selected="true"] {
62
106
  --kui-content-item-border: var(--kui-color-brand-border-quiet);
63
107
  --kui-content-item-background: var(--kui-color-brand-fill-normal);
108
+ --kui-content-item-foreground: var(--kui-color-brand-on-fill);
64
109
  }
65
110
 
66
111
  .kui-content-item[data-interactive="true"]:focus-visible {
@@ -10,6 +10,10 @@ body,
10
10
  height: 100%;
11
11
  }
12
12
 
13
+ html {
14
+ background: var(--kui-color-surface);
15
+ }
16
+
13
17
  body {
14
18
  margin: 0;
15
19
  color: var(--kui-color-text);
@@ -18,6 +22,12 @@ body {
18
22
  line-height: 1.45;
19
23
  }
20
24
 
25
+ :where(button, input, select, textarea, th, td) {
26
+ font-family: inherit;
27
+ font-size: inherit;
28
+ line-height: inherit;
29
+ }
30
+
21
31
  :where(a) {
22
32
  color: var(--kui-color-text-link);
23
33
  }
@@ -126,7 +126,10 @@
126
126
  );
127
127
  --kui-color-surface-lowered: var(
128
128
  --wa-color-surface-lowered,
129
- light-dark(#f2f2f7, #111113)
129
+ light-dark(
130
+ rgb(0 0 98.076923 / 0.05098),
131
+ rgb(228.157895 228.157895 255 / 0.07451)
132
+ )
130
133
  );
131
134
  --kui-color-text: var(--wa-color-text-normal, light-dark(#1d1d1f, #f5f5f7));
132
135
  --kui-color-text-quiet: var(
@@ -144,7 +147,7 @@
144
147
  );
145
148
  --kui-color-neutral-fill-normal: var(
146
149
  --wa-color-neutral-fill-normal,
147
- light-dark(#e5e5ea, #3a3a3c)
150
+ light-dark(rgb(0 0 49.038462 / 0.101961), rgb(253 253 255 / 0.133333))
148
151
  );
149
152
  --kui-color-neutral-fill-loud: var(
150
153
  --wa-color-neutral-fill-loud,
@@ -152,19 +155,19 @@
152
155
  );
153
156
  --kui-color-neutral-border-quiet: var(
154
157
  --wa-color-neutral-border-quiet,
155
- light-dark(#e5e5ea, #38383a)
158
+ light-dark(rgb(0 0 49.038462 / 0.101961), rgb(253 253 255 / 0.124444))
156
159
  );
157
160
  --kui-color-neutral-border-normal: var(
158
161
  --wa-color-neutral-border-normal,
159
- light-dark(#d1d1d6, #48484a)
162
+ light-dark(rgb(0 0 27.717391 / 0.180392), rgb(253 253 255 / 0.195556))
160
163
  );
161
164
  --kui-color-neutral-border-loud: var(
162
165
  --wa-color-neutral-border-loud,
163
- light-dark(#aeaeb2, #636366)
166
+ light-dark(rgb(0 0 12.592593 / 0.317647), rgb(249.875 249.875 255 / 0.32))
164
167
  );
165
168
  --kui-color-neutral-on-quiet: var(
166
169
  --wa-color-neutral-on-quiet,
167
- var(--kui-color-text-quiet)
170
+ light-dark(#626267, #c2c2c6)
168
171
  );
169
172
  --kui-color-neutral-on-normal: var(
170
173
  --wa-color-neutral-on-normal,
@@ -4,16 +4,66 @@
4
4
  inherits its ancestor's; the inline style overrides them per prop. */
5
5
  --_kui-grid-gap: var(--kui-grid-gap);
6
6
  --_kui-grid-flex: 0 1 auto;
7
+ --_kui-grid-inset-top: 0;
8
+ --_kui-grid-inset-right: 0;
9
+ --_kui-grid-inset-bottom: 0;
10
+ --_kui-grid-inset-left: 0;
7
11
 
8
12
  display: grid;
9
13
  min-width: 0;
10
14
  min-height: 0;
11
15
  box-sizing: border-box;
16
+ padding: var(--_kui-grid-inset-top, 0) var(--_kui-grid-inset-right, 0)
17
+ var(--_kui-grid-inset-bottom, 0) var(--_kui-grid-inset-left, 0);
12
18
  flex: var(--_kui-grid-flex, initial);
13
19
  grid-template-columns: repeat(var(--_kui-grid-columns), minmax(0, 1fr));
14
20
  gap: var(--_kui-grid-gap, var(--kui-grid-gap));
15
21
  }
16
22
 
23
+ .kui-grid[data-control-insets*="t"] {
24
+ --_kui-grid-inset-top: var(--kui-layout-inline-margin, 0.5rem);
25
+ }
26
+
27
+ .kui-grid[data-control-insets*="r"] {
28
+ --_kui-grid-inset-right: var(--kui-layout-inline-margin, 0.5rem);
29
+ }
30
+
31
+ .kui-grid[data-control-insets*="b"] {
32
+ --_kui-grid-inset-bottom: var(--kui-layout-inline-margin, 0.5rem);
33
+ }
34
+
35
+ .kui-grid[data-control-insets*="l"] {
36
+ --_kui-grid-inset-left: var(--kui-layout-inline-margin, 0.5rem);
37
+ }
38
+
39
+ .kui-grid[data-text-insets*="t"] {
40
+ --_kui-grid-inset-top: calc(
41
+ var(--kui-layout-inline-margin, 0.5rem) + 1px +
42
+ var(--kui-layout-item-padding, 0.5rem)
43
+ );
44
+ }
45
+
46
+ .kui-grid[data-text-insets*="r"] {
47
+ --_kui-grid-inset-right: calc(
48
+ var(--kui-layout-inline-margin, 0.5rem) + 1px +
49
+ var(--kui-layout-item-padding, 0.5rem)
50
+ );
51
+ }
52
+
53
+ .kui-grid[data-text-insets*="b"] {
54
+ --_kui-grid-inset-bottom: calc(
55
+ var(--kui-layout-inline-margin, 0.5rem) + 1px +
56
+ var(--kui-layout-item-padding, 0.5rem)
57
+ );
58
+ }
59
+
60
+ .kui-grid[data-text-insets*="l"] {
61
+ --_kui-grid-inset-left: calc(
62
+ var(--kui-layout-inline-margin, 0.5rem) + 1px +
63
+ var(--kui-layout-item-padding, 0.5rem)
64
+ );
65
+ }
66
+
17
67
  .kui-grid[data-min-column-width="true"] {
18
68
  grid-template-columns: repeat(
19
69
  auto-fit,
@@ -5,6 +5,10 @@
5
5
  flex: none;
6
6
  }
7
7
 
8
+ [data-lucide][data-inline="true"] {
9
+ display: inline-block;
10
+ }
11
+
8
12
  [data-lucide][data-size] {
9
13
  width: var(--_kui-lucide-size);
10
14
  height: var(--_kui-lucide-size);
@@ -26,8 +26,16 @@
26
26
  /* Hot Sheet 2's macOS system palette, with a compatible dark appearance. */
27
27
  --wa-color-surface-raised: light-dark(#fff, #2c2c2e);
28
28
  --wa-color-surface-default: light-dark(#fff, #1c1c1e);
29
- --wa-color-surface-lowered: light-dark(#f2f2f7, #111113);
30
- --wa-color-surface-border: light-dark(#d1d1d6, #48484a);
29
+ /* Translucent lowered layers adapt to their backdrop at every nesting depth.
30
+ Default/raised surfaces stay opaque canvas and overlay anchors. */
31
+ --wa-color-surface-lowered: light-dark(
32
+ rgb(0 0 98.076923 / 0.05098),
33
+ rgb(228.157895 228.157895 255 / 0.07451)
34
+ );
35
+ --wa-color-surface-border: light-dark(
36
+ rgb(0 0 27.717391 / 0.180392),
37
+ rgb(253 253 255 / 0.195556)
38
+ );
31
39
 
32
40
  --wa-color-text-normal: light-dark(#1d1d1f, #f5f5f7);
33
41
  --wa-color-text-quiet: light-dark(#6e6e73, #aeaeb2);
@@ -83,12 +91,21 @@
83
91
  --wa-color-brand-on-loud: light-dark(#fff, #111113);
84
92
 
85
93
  --wa-color-neutral-fill-quiet: var(--wa-color-surface-lowered);
86
- --wa-color-neutral-fill-normal: light-dark(#e5e5ea, #3a3a3c);
94
+ --wa-color-neutral-fill-normal: light-dark(
95
+ rgb(0 0 49.038462 / 0.101961),
96
+ rgb(253 253 255 / 0.133333)
97
+ );
87
98
  --wa-color-neutral-fill-loud: light-dark(#48484a, #e5e5ea);
88
- --wa-color-neutral-border-quiet: light-dark(#e5e5ea, #38383a);
99
+ --wa-color-neutral-border-quiet: light-dark(
100
+ rgb(0 0 49.038462 / 0.101961),
101
+ rgb(253 253 255 / 0.124444)
102
+ );
89
103
  --wa-color-neutral-border-normal: var(--wa-color-surface-border);
90
- --wa-color-neutral-border-loud: light-dark(#aeaeb2, #636366);
91
- --wa-color-neutral-on-quiet: var(--wa-color-text-quiet);
104
+ --wa-color-neutral-border-loud: light-dark(
105
+ rgb(0 0 12.592593 / 0.317647),
106
+ rgb(249.875 249.875 255 / 0.32)
107
+ );
108
+ --wa-color-neutral-on-quiet: light-dark(#626267, #c2c2c6);
92
109
  --wa-color-neutral-on-normal: var(--wa-color-text-normal);
93
110
  --wa-color-neutral-on-loud: var(--wa-color-surface-default);
94
111
 
@@ -1,6 +1,6 @@
1
1
  import * as kerfjs from 'kerfjs';
2
- import { CssFlexKeyword, CssFlex } from './css-values.js';
3
2
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
+ import { CssFlexKeyword, CssFlex } from './css-values.js';
4
4
 
5
5
  type SunkenPanelShape = 'rounded' | 'square';
6
6
  interface SunkenPanelProps {
@@ -1,3 +1,3 @@
1
- export { SunkenPanel } from './chunk-WF75U3V4.js';
1
+ export { SunkenPanel } from './chunk-HPREYDKV.js';
2
2
 
3
3
  //# sourceMappingURL=sunken-panel.js.map
@@ -1,3 +1,3 @@
1
- export { DialogSurface, PopupSurface } from './chunk-NN6GYOA2.js';
1
+ export { DialogSurface, PopupSurface } from './chunk-XIZRXI7N.js';
2
2
 
3
3
  //# sourceMappingURL=surface-scaffold.js.map
package/dist/tab-bar.js CHANGED
@@ -1,3 +1,3 @@
1
- export { TabBar } from './chunk-OXO2QJWV.js';
1
+ export { TabBar } from './chunk-JOR5LGYE.js';
2
2
 
3
3
  //# sourceMappingURL=tab-bar.js.map
@@ -1,6 +1,6 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
- import { PaneAppearance } from './pane.js';
3
2
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
+ import { PaneAppearance } from './pane.js';
4
4
 
5
5
  interface TabScaffoldTabBase<Id extends string> {
6
6
  id: Id;
@@ -1,4 +1,4 @@
1
- import { Badge } from './chunk-ALGYHYXP.js';
1
+ import { Badge } from './chunk-J3AWE5I4.js';
2
2
  import { jsxs, jsx } from 'kerfjs/jsx-runtime';
3
3
 
4
4
  function TabScaffold({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tab-scaffold.tsx"],"names":[],"mappings":"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","file":"tab-scaffold.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { Badge } from './badge.js';\nimport type { PaneAppearance } from './pane.js';\nimport type { KerfUiContent } from './semantic-content.js';\n\ninterface TabScaffoldTabBase<Id extends string> {\n id: Id;\n label: string;\n /** Decorative icon shown above the label in the bottom bar. */\n icon?: SafeHtml;\n /** The tab's content — typically a `NavStack` so each tab keeps its own stack. */\n content: KerfUiContent;\n /** Background of this scene's scrolling work surface. */\n appearance?: PaneAppearance;\n}\n\n/** A tab with an optional count or short-status badge. */\ninterface TabScaffoldTabCountBadge {\n /**\n * Optional count or short status shown as a solid danger `Badge` at the\n * top-trailing corner of the tab icon (the iOS tab-bar badge). Omitted, `''`,\n * or non-finite numbers render no badge. The visual badge is `aria-hidden`;\n * its meaning reaches assistive technology through `badgeLabel`.\n *\n * Pass `true` instead for the text-free dot (new content without a count).\n */\n badge?: string | number;\n /**\n * Localized phrase folded into the tab's accessible name as\n * `\"<label>, <badgeLabel>\"` (for example `\"3 unread\"` → `\"Inbox, 3 unread\"`).\n * Defaults to the badge text itself. Ignored when no badge renders.\n */\n badgeLabel?: string;\n}\n\n/** A tab with the text-free dot badge (new content without a count). */\ninterface TabScaffoldTabDotBadge {\n /**\n * `true` shows a solid danger dot `Badge` at the top-trailing corner of the\n * tab icon — the iOS tab-bar dot for new content without a count.\n */\n badge: true;\n /**\n * Required localized phrase folded into the tab's accessible name as\n * `\"<label>, <badgeLabel>\"` (for example `\"New activity\"` →\n * `\"Feed, New activity\"`). A dot has no text, so this is its only meaning.\n */\n badgeLabel: string;\n}\n\n/** One bottom-bar destination: its label, optional icon and badge, and content. */\nexport type TabScaffoldTab<Id extends string = string> =\n TabScaffoldTabBase<Id> & (TabScaffoldTabCountBadge | TabScaffoldTabDotBadge);\n\nexport interface TabScaffoldProps<Id extends string = string> {\n id: string;\n /** Accessible name for the tab bar. */\n label: string;\n tabs: readonly TabScaffoldTab<Id>[];\n /** The controlled active tab id (the app owns selection). */\n active: NoInfer<Id>;\n /**\n * The line over the tab bar, where it meets the active scene. `scroll`\n * (default) shows it only while more of the scene's content lies below —\n * never at the scroll end or when the content fits — once\n * `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is wired above\n * the scaffold; unwired, it does not show. `always` shows it without the\n * wiring; `none` never, even when wired. The line is the bar's own 1px top\n * border, so no state moves the bar or a tab.\n */\n chromeDividers?: 'scroll' | 'always' | 'none';\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A mobile-first, iOS-like bottom tab scaffold: a bottom tab bar that switches\n * between major sections, each tab keeping its own content (usually a `NavStack`)\n * mounted so its stack and scroll survive a switch. Controlled — the app owns\n * `active`; wire selection with `@kerfjs/ui/wire-tab-scaffold`'s `wireTabScaffold`.\n * On larger classes, promote the tabs to a `Workbench` rail or sidebar instead of\n * a bottom bar. See `docs/23-app-layouts.md` §3.4.\n */\nexport function TabScaffold<Id extends string>({\n id,\n label,\n tabs,\n active,\n chromeDividers = 'scroll',\n className = '',\n slot,\n}: TabScaffoldProps<Id>) {\n return (\n <section\n class={`kui-tab-scaffold ${className}`.trim()}\n id={id}\n data-component=\"tab-scaffold\"\n data-tab-scaffold-id={id}\n data-chrome-dividers={\n chromeDividers === 'always' || chromeDividers === 'none'\n ? chromeDividers\n : undefined\n }\n slot={slot}\n >\n <div class=\"kui-tab-scaffold__scenes\">\n {tabs.map((tab) => (\n <div\n class=\"kui-tab-scaffold__scene\"\n data-tab-scaffold-scene={tab.id}\n data-active={String(tab.id === active)}\n data-appearance={tab.appearance === 'sunken' ? 'sunken' : undefined}\n aria-hidden={String(tab.id !== active)}\n >\n {tab.content}\n </div>\n ))}\n </div>\n <nav class=\"kui-tab-scaffold__bar\" role=\"tablist\" aria-label={label}>\n {tabs.map((tab) => {\n const dot = tab.badge === true;\n const badgeText = dot ? undefined : normalizeBadge(tab.badge);\n const hasBadge = dot || badgeText !== undefined;\n const badge = hasBadge && (\n <span\n class=\"kui-tab-scaffold__tab-badge\"\n data-badge-kind={dot ? 'dot' : 'text'}\n >\n {badgeText === undefined ? (\n <Badge tone=\"danger\" size=\"dot\" ariaHidden />\n ) : (\n <Badge\n tone=\"danger\"\n appearance=\"solid\"\n size=\"compact\"\n ariaHidden\n >\n {badgeText}\n </Badge>\n )}\n </span>\n );\n // A dot has no text fallback: without a usable badgeLabel (reachable\n // only from untyped callers) the tab keeps its plain accessible name.\n const badgeLabel = hasBadge\n ? tab.badgeLabel?.trim() || badgeText\n : undefined;\n return (\n <button\n type=\"button\"\n class=\"kui-tab-scaffold__tab\"\n role=\"tab\"\n data-tab-scaffold-tab={tab.id}\n aria-selected={String(tab.id === active)}\n tabindex={tab.id === active ? '0' : '-1'}\n aria-label={\n badgeLabel === undefined\n ? undefined\n : `${tab.label}, ${badgeLabel}`\n }\n data-has-badge={hasBadge ? 'true' : undefined}\n >\n {tab.icon ? (\n <span class=\"kui-tab-scaffold__tab-icon\" aria-hidden=\"true\">\n {tab.icon}\n {badge}\n </span>\n ) : (\n badge\n )}\n <span class=\"kui-tab-scaffold__tab-label\">{tab.label}</span>\n </button>\n );\n })}\n </nav>\n </section>\n );\n}\n\nfunction normalizeBadge(\n badge: string | number | undefined,\n): string | undefined {\n if (typeof badge === 'number')\n return Number.isFinite(badge) ? String(badge) : undefined;\n if (typeof badge === 'string' && badge.trim()) return badge.trim();\n return undefined;\n}\n"]}
1
+ {"version":3,"sources":["../src/components/navigation/tab-scaffold/tab-scaffold.tsx"],"names":[],"mappings":"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","file":"tab-scaffold.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { Badge } from '../../feedback/badge/badge.js';\nimport type { PaneAppearance } from '../../layout/pane/pane.js';\n\ninterface TabScaffoldTabBase<Id extends string> {\n id: Id;\n label: string;\n /** Decorative icon shown above the label in the bottom bar. */\n icon?: SafeHtml;\n /** The tab's content — typically a `NavStack` so each tab keeps its own stack. */\n content: KerfUiContent;\n /** Background of this scene's scrolling work surface. */\n appearance?: PaneAppearance;\n}\n\n/** A tab with an optional count or short-status badge. */\ninterface TabScaffoldTabCountBadge {\n /**\n * Optional count or short status shown as a solid danger `Badge` at the\n * top-trailing corner of the tab icon (the iOS tab-bar badge). Omitted, `''`,\n * or non-finite numbers render no badge. The visual badge is `aria-hidden`;\n * its meaning reaches assistive technology through `badgeLabel`.\n *\n * Pass `true` instead for the text-free dot (new content without a count).\n */\n badge?: string | number;\n /**\n * Localized phrase folded into the tab's accessible name as\n * `\"<label>, <badgeLabel>\"` (for example `\"3 unread\"` → `\"Inbox, 3 unread\"`).\n * Defaults to the badge text itself. Ignored when no badge renders.\n */\n badgeLabel?: string;\n}\n\n/** A tab with the text-free dot badge (new content without a count). */\ninterface TabScaffoldTabDotBadge {\n /**\n * `true` shows a solid danger dot `Badge` at the top-trailing corner of the\n * tab icon — the iOS tab-bar dot for new content without a count.\n */\n badge: true;\n /**\n * Required localized phrase folded into the tab's accessible name as\n * `\"<label>, <badgeLabel>\"` (for example `\"New activity\"` →\n * `\"Feed, New activity\"`). A dot has no text, so this is its only meaning.\n */\n badgeLabel: string;\n}\n\n/** One bottom-bar destination: its label, optional icon and badge, and content. */\nexport type TabScaffoldTab<Id extends string = string> =\n TabScaffoldTabBase<Id> & (TabScaffoldTabCountBadge | TabScaffoldTabDotBadge);\n\nexport interface TabScaffoldProps<Id extends string = string> {\n id: string;\n /** Accessible name for the tab bar. */\n label: string;\n tabs: readonly TabScaffoldTab<Id>[];\n /** The controlled active tab id (the app owns selection). */\n active: NoInfer<Id>;\n /**\n * The line over the tab bar, where it meets the active scene. `scroll`\n * (default) shows it only while more of the scene's content lies below —\n * never at the scroll end or when the content fits — once\n * `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is wired above\n * the scaffold; unwired, it does not show. `always` shows it without the\n * wiring; `none` never, even when wired. The line is the bar's own 1px top\n * border, so no state moves the bar or a tab.\n */\n chromeDividers?: 'scroll' | 'always' | 'none';\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A mobile-first, iOS-like bottom tab scaffold: a bottom tab bar that switches\n * between major sections, each tab keeping its own content (usually a `NavStack`)\n * mounted so its stack and scroll survive a switch. Controlled — the app owns\n * `active`; wire selection with `@kerfjs/ui/wire-tab-scaffold`'s `wireTabScaffold`.\n * On larger classes, promote the tabs to a `Workbench` rail or sidebar instead of\n * a bottom bar. See `docs/23-app-layouts.md` §3.4.\n */\nexport function TabScaffold<Id extends string>({\n id,\n label,\n tabs,\n active,\n chromeDividers = 'scroll',\n className = '',\n slot,\n}: TabScaffoldProps<Id>) {\n return (\n <section\n class={`kui-tab-scaffold ${className}`.trim()}\n id={id}\n data-component=\"tab-scaffold\"\n data-tab-scaffold-id={id}\n data-chrome-dividers={\n chromeDividers === 'always' || chromeDividers === 'none'\n ? chromeDividers\n : undefined\n }\n slot={slot}\n >\n <div class=\"kui-tab-scaffold__scenes\">\n {tabs.map((tab) => (\n <div\n class=\"kui-tab-scaffold__scene\"\n data-tab-scaffold-scene={tab.id}\n data-active={String(tab.id === active)}\n data-appearance={tab.appearance === 'sunken' ? 'sunken' : undefined}\n aria-hidden={String(tab.id !== active)}\n >\n {tab.content}\n </div>\n ))}\n </div>\n <nav class=\"kui-tab-scaffold__bar\" role=\"tablist\" aria-label={label}>\n {tabs.map((tab) => {\n const dot = tab.badge === true;\n const badgeText = dot ? undefined : normalizeBadge(tab.badge);\n const hasBadge = dot || badgeText !== undefined;\n const badge = hasBadge && (\n <span\n class=\"kui-tab-scaffold__tab-badge\"\n data-badge-kind={dot ? 'dot' : 'text'}\n >\n {badgeText === undefined ? (\n <Badge tone=\"danger\" size=\"dot\" ariaHidden />\n ) : (\n <Badge\n tone=\"danger\"\n appearance=\"solid\"\n size=\"compact\"\n ariaHidden\n >\n {badgeText}\n </Badge>\n )}\n </span>\n );\n // A dot has no text fallback: without a usable badgeLabel (reachable\n // only from untyped callers) the tab keeps its plain accessible name.\n const badgeLabel = hasBadge\n ? tab.badgeLabel?.trim() || badgeText\n : undefined;\n return (\n <button\n type=\"button\"\n class=\"kui-tab-scaffold__tab\"\n role=\"tab\"\n data-tab-scaffold-tab={tab.id}\n aria-selected={String(tab.id === active)}\n tabindex={tab.id === active ? '0' : '-1'}\n aria-label={\n badgeLabel === undefined\n ? undefined\n : `${tab.label}, ${badgeLabel}`\n }\n data-has-badge={hasBadge ? 'true' : undefined}\n >\n {tab.icon ? (\n <span class=\"kui-tab-scaffold__tab-icon\" aria-hidden=\"true\">\n {tab.icon}\n {badge}\n </span>\n ) : (\n badge\n )}\n <span class=\"kui-tab-scaffold__tab-label\">{tab.label}</span>\n </button>\n );\n })}\n </nav>\n </section>\n );\n}\n\nfunction normalizeBadge(\n badge: string | number | undefined,\n): string | undefined {\n if (typeof badge === 'number')\n return Number.isFinite(badge) ? String(badge) : undefined;\n if (typeof badge === 'string' && badge.trim()) return badge.trim();\n return undefined;\n}\n"]}
package/dist/text.d.ts CHANGED
@@ -1,6 +1,15 @@
1
1
  import * as kerfjs from 'kerfjs';
2
2
  import { KerfBaseAttrs } from 'kerfjs/jsx-runtime';
3
3
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
4
+ import { CssForegroundColor } from './css-values.js';
5
+
6
+ type FieldLabelProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
7
+ children: string;
8
+ class?: string;
9
+ className?: string;
10
+ };
11
+ /** Visible field heading for a read-only preview; use its id with aria-labelledby on the preview group. */
12
+ declare function FieldLabel({ children, class: classValue, className, ...attributes }: FieldLabelProps): kerfjs.SafeHtml;
4
13
 
5
14
  type TextVariant = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';
6
15
  type TextTone = 'default' | 'quiet' | 'danger';
@@ -10,18 +19,13 @@ type TextBorder = 'transparent' | 'none';
10
19
  type TextLineHeight = 'default' | 'tight';
11
20
  type TextWrap = 'normal' | 'anywhere' | 'nowrap' | 'truncate';
12
21
  type TextContent = KerfUiContent | string | number | readonly TextContent[];
13
- type FieldLabelProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
14
- children: string;
15
- class?: string;
16
- className?: string;
17
- };
18
- /** Visible field heading for a read-only preview; use its id with aria-labelledby on the preview group. */
19
- declare function FieldLabel({ children, class: classValue, className, ...attributes }: FieldLabelProps): kerfjs.SafeHtml;
20
22
  type TextCommonProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
21
23
  /** Native heading, paragraph, or inline span element to render. Defaults to `p`. */
22
24
  variant?: TextVariant;
23
25
  /** Semantic foreground treatment. Defaults to the inherited foreground. */
24
26
  tone?: TextTone;
27
+ /** Foreground color; overrides tone when supplied, or inherits when omitted. */
28
+ color?: CssForegroundColor;
25
29
  /** Text sizing independent of the native semantic element. */
26
30
  size?: TextSize;
27
31
  /** Font family independent of the native semantic element. */
@@ -51,6 +55,6 @@ type TextProps = TextCommonProps & ({
51
55
  * content-item padding; `span` adds no box geometry.
52
56
  * All ordinary native heading/paragraph attributes pass through to the element.
53
57
  */
54
- declare function Text({ variant: Variant, tone, size, font, border, flush, lineHeight, wrap, maxLines, children, class: classValue, className, ...attributes }: TextProps): kerfjs.SafeHtml;
58
+ declare function Text({ variant: Variant, tone, color, size, font, border, flush, lineHeight, wrap, maxLines, children, class: classValue, className, style, ...attributes }: TextProps): kerfjs.SafeHtml;
55
59
 
56
60
  export { FieldLabel, type FieldLabelProps, Text, type TextBorder, type TextContent, type TextFont, type TextLineHeight, type TextProps, type TextSize, type TextTone, type TextVariant, type TextWrap };
package/dist/text.js CHANGED
@@ -1,3 +1,3 @@
1
- export { FieldLabel, Text } from './chunk-YDGNU2OD.js';
1
+ export { FieldLabel, Text } from './chunk-ZVYA6TLR.js';
2
2
 
3
3
  //# sourceMappingURL=text.js.map
@@ -1,3 +1,3 @@
1
+ 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';
1
2
  import 'kerfjs';
2
3
  import './semantic-content-BbzjvSu9.js';
3
- 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';
@@ -1,4 +1,4 @@
1
- export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-FKPKGP2H.js';
1
+ export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-G4VKQP7B.js';
2
2
 
3
3
 
4
4