@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,790 @@
1
+ .kui-toolbar-control-group {
2
+ --kui-toolbar-control-background: var(--kui-color-neutral-fill-normal);
3
+ --kui-toolbar-control-border: var(--kui-color-neutral-border-normal);
4
+ --kui-toolbar-control-color: var(--kui-color-neutral-on-quiet);
5
+ --kui-toolbar-control-hover-background: var(--kui-color-surface);
6
+ --kui-toolbar-control-selected-background: var(--kui-color-surface);
7
+ --kui-toolbar-control-selected-border: var(--kui-color-neutral-border-normal);
8
+ --kui-toolbar-control-selected-color: var(--kui-color-brand-on-quiet);
9
+ --kui-toolbar-control-selected-shadow: var(--kui-shadow-s);
10
+ --kui-toolbar-control-pressed-background: var(--kui-color-neutral-fill-loud);
11
+ --kui-toolbar-control-pressed-border: var(--kui-color-neutral-border-loud);
12
+ --kui-toolbar-control-pressed-color: var(--kui-color-neutral-on-loud);
13
+ --kui-toolbar-group-radius: var(
14
+ --kui-layout-pill-radius,
15
+ calc(1px + 1.3125rem)
16
+ );
17
+ --kui-control-highlight-radius: max(
18
+ 0px,
19
+ calc(
20
+ var(--kui-toolbar-group-radius) - var(--kui-layout-highlight-inset, 2px)
21
+ )
22
+ );
23
+ --kui-toolbar-item-radius: var(--kui-control-highlight-radius);
24
+ /* Context the group provides to a composed child (an icon-only Select, in
25
+ select.css): the control slot the child fills so it is inset evenly on
26
+ every side and the group-owned focus ring stays concentric with the
27
+ visible control. The group sizes to the child's width. A default slot is
28
+ 40px tall inside the 2px inset; a compact slot is the full 32px padding
29
+ box, and a lone compact child also overlaps the 1px inline padding. The
30
+ values are named after the group that provides them; the child reads
31
+ them from its own stylesheet. */
32
+ --_kui-toolbar-control-group-slot-height: 2.5rem;
33
+ --_kui-toolbar-control-group-slot-overlap: 0px;
34
+ --_kui-toolbar-control-group-slot-radius: var(--kui-toolbar-item-radius);
35
+ display: inline-flex;
36
+ position: relative;
37
+ height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
38
+ min-width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
39
+ padding: 1px;
40
+ box-sizing: border-box;
41
+ border: 1px solid var(--kui-toolbar-control-border);
42
+ border-radius: var(--kui-toolbar-group-radius);
43
+ color: var(--kui-toolbar-control-color);
44
+ background: var(--kui-toolbar-control-background);
45
+ align-items: center;
46
+ flex: 0 0 auto;
47
+ gap: 0;
48
+ }
49
+
50
+ .kui-toolbar-control-group[data-busy="true"] > svg,
51
+ .kui-toolbar-control-group[data-busy="true"]
52
+ > :not(.kui-toolbar-control-group__busy-spinner)
53
+ svg {
54
+ visibility: hidden;
55
+ }
56
+
57
+ .kui-toolbar-control-group__busy-spinner {
58
+ position: absolute;
59
+ inset-block-start: 50%;
60
+ inset-inline-start: 50%;
61
+ display: grid;
62
+ width: 1rem;
63
+ height: 1rem;
64
+ transform: translate(-50%, -50%);
65
+ place-items: center;
66
+ pointer-events: none;
67
+ }
68
+
69
+ .kui-toolbar-control-group__busy-status {
70
+ position: absolute;
71
+ width: 1px;
72
+ height: 1px;
73
+ overflow: hidden;
74
+ clip-path: inset(50%);
75
+ white-space: nowrap;
76
+ }
77
+
78
+ /* In a Toolbar zone, a group shorter than the toolbar's control band (the
79
+ `--_kui-toolbar-band` the Toolbar provides) takes half the difference as a
80
+ top margin, so it centers in the band by its own size. */
81
+ :is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing)
82
+ > .kui-toolbar-control-group {
83
+ margin-block-start: max(
84
+ 0px,
85
+ calc(
86
+ (
87
+ var(--_kui-toolbar-band) -
88
+ var(--kui-toolbar-group-size, calc(2px + 2.625rem))
89
+ ) /
90
+ 2
91
+ )
92
+ );
93
+ }
94
+
95
+ .kui-toolbar-control-group[data-visibility="compact-only"] {
96
+ display: none;
97
+ }
98
+
99
+ @container kui-toolbar (max-width: 44rem) {
100
+ .kui-toolbar-control-group[data-visibility="compact-only"] {
101
+ display: inline-flex;
102
+ }
103
+ }
104
+
105
+ @container kui-toolbar (max-width: 14rem) {
106
+ .kui-toolbar-control-group[data-visibility="hide-collapsed-tiny"][data-expanded="false"] {
107
+ display: none;
108
+ }
109
+ }
110
+
111
+ /* An expanded trailing control owns the compact row when sibling groups opt
112
+ into yielding. Scoping to the trailing zone keeps independent center and
113
+ leading controls visible, and the siblings return when it closes. */
114
+ @container kui-toolbar (max-width: 30rem) {
115
+ .kui-toolbar__trailing:has(> .kui-toolbar-control-group[data-expanded="true"])
116
+ > .kui-toolbar-control-group[data-visibility="yield-to-expanded-sibling"]:not(
117
+ [data-expanded="true"]
118
+ ) {
119
+ display: none;
120
+ }
121
+ }
122
+
123
+ /* `shape="rounded"` swaps the default pill radius for the design system's softer
124
+ rounded rectangle. The shared highlight contract derives every inner hover or
125
+ selected surface from this outer radius and the group's full inset. */
126
+ .kui-toolbar-control-group[data-shape="rounded"] {
127
+ --kui-toolbar-group-radius: var(
128
+ --kui-layout-rounded-radius,
129
+ calc(1px + 0.6875rem)
130
+ );
131
+ }
132
+
133
+ .kui-toolbar-control-group[data-tone="dark"] {
134
+ --kui-toolbar-control-background: color-mix(
135
+ in srgb,
136
+ var(--kui-color-neutral-fill-loud) 72%,
137
+ transparent
138
+ );
139
+ --kui-toolbar-control-border: var(--kui-toolbar-control-dark-border, #353536);
140
+ --kui-toolbar-control-color: var(--kui-color-neutral-on-loud);
141
+ --kui-toolbar-control-hover-background: color-mix(
142
+ in srgb,
143
+ var(--kui-color-surface) 28%,
144
+ transparent
145
+ );
146
+ }
147
+ .kui-toolbar-control-group[data-size="compact"] {
148
+ --kui-toolbar-group-size: 2.125rem;
149
+ --_kui-toolbar-control-group-slot-height: 2rem;
150
+ --_kui-toolbar-control-group-slot-overlap: 1px;
151
+ --_kui-toolbar-control-group-slot-radius: max(
152
+ 0px,
153
+ calc(var(--kui-toolbar-group-radius) - 1px)
154
+ );
155
+ gap: 4px; /* Compensating for -2px margins */
156
+ }
157
+ .kui-toolbar-control-group[data-density="tight"] {
158
+ --kui-layout-item-padding: 0.3125rem;
159
+ }
160
+ .kui-toolbar-control-group[data-overflow="scroll"] {
161
+ max-width: 100%;
162
+ overflow-x: auto;
163
+ }
164
+ .kui-toolbar-control-group[data-overflow="wrap"] {
165
+ max-width: 100%;
166
+ height: auto;
167
+ flex-wrap: wrap;
168
+ }
169
+ :is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing)
170
+ > .kui-toolbar-control-group[data-overflow="wrap"] {
171
+ margin-block-start: 0;
172
+ align-self: center;
173
+ }
174
+ .kui-toolbar-control-group[data-content="search"] {
175
+ width: min(var(--kui-token-search-expanded-width, 30rem), 100%);
176
+ max-width: 100%;
177
+ height: auto;
178
+ min-width: 0;
179
+ overflow: hidden;
180
+ flex: 0 1 auto;
181
+ transition:
182
+ width 0.25s ease,
183
+ background-color 0.2s ease,
184
+ border-color 0.2s ease;
185
+ }
186
+
187
+ .kui-toolbar-control-group[data-content="search"]:has(
188
+ > .kui-token-search[data-expanded="true"][data-fill="true"]
189
+ ) {
190
+ width: 100%;
191
+ flex: 1 1 auto;
192
+ }
193
+
194
+ .kui-toolbar-control-group[data-content="search"]:has(
195
+ .kui-token-search__suggestions
196
+ ) {
197
+ overflow: visible;
198
+ }
199
+ .kui-toolbar-control-group[data-content="search"][data-expanded="false"] {
200
+ width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
201
+ flex: 0 0 auto;
202
+ }
203
+
204
+ .kui-toolbar-control-group[data-content="search"]:has(
205
+ > .kui-token-search[data-expanded="false"][data-fill="true"]
206
+ ) {
207
+ width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
208
+ flex: 0 0 auto;
209
+ }
210
+
211
+ .kui-toolbar-control-group[data-sizing="grow"][data-expanded="true"] {
212
+ --_kui-toolbar-group-grow-search-width: 100%;
213
+ width: auto;
214
+ min-width: var(--kui-toolbar-group-grow-basis, 19rem);
215
+ flex: 1 1 var(--kui-toolbar-group-grow-basis, 19rem);
216
+ }
217
+ .kui-toolbar-control-group[data-sizing="fill"] {
218
+ width: 100%;
219
+ min-width: 0;
220
+ flex: 1 1 100%;
221
+ }
222
+
223
+ /* Auto margin consumes the free space before this group on its flex line;
224
+ when the expanded fill search takes a whole line, the margin resolves to 0. */
225
+ .kui-toolbar[data-responsive="stack"]
226
+ > :is(.kui-toolbar__center, .kui-toolbar__trailing)
227
+ > .kui-toolbar-control-group[data-placement="end"] {
228
+ margin-inline-start: auto;
229
+ }
230
+
231
+ /* A fill search crosses from the preceding control line to its own line.
232
+ Move its visual down one control band as it opens without changing layout. */
233
+ .kui-toolbar[data-responsive="stack"]
234
+ > :is(.kui-toolbar__center, .kui-toolbar__trailing)
235
+ > .kui-toolbar-control-group[data-content="search"][data-sizing="fill"][data-expanded="true"] {
236
+ animation: kui-toolbar-fill-search-enter 0.25s ease-out both;
237
+ }
238
+
239
+ @keyframes kui-toolbar-fill-search-enter {
240
+ from {
241
+ transform: translateY(
242
+ calc(
243
+ -1 * (var(--_kui-toolbar-band) + var(--kui-toolbar-gap, 0.5rem))
244
+ )
245
+ );
246
+ }
247
+ to {
248
+ transform: translateY(0);
249
+ }
250
+ }
251
+
252
+ @container kui-toolbar (max-width: 30rem) {
253
+ .kui-toolbar-control-group[data-sizing="grow"][data-expanded="true"] {
254
+ width: 100%;
255
+ min-width: 0;
256
+ flex: 1 1 100%;
257
+ }
258
+ }
259
+ .kui-toolbar-control-group[data-content="text"]
260
+ > :is(button, wa-button, .kui-toolbar-action-link),
261
+ .kui-toolbar-control-group[data-content="mixed"]
262
+ > :is(button, wa-button, .kui-toolbar-action-link) {
263
+ min-width: max-content;
264
+ }
265
+ .kui-toolbar-control-group[data-content="mixed"] > button {
266
+ display: flex;
267
+ gap: var(--kui-space-xs);
268
+ }
269
+ .kui-toolbar-control-group[data-content="mixed"]
270
+ wa-button:not(:where(.kui-popup-menu > *)) {
271
+ line-height: normal;
272
+ }
273
+ /* Toolbar controls never wrap. Web Awesome's label part is a plain block, so a
274
+ slotted icon (a block SVG) and its text would otherwise stack vertically —
275
+ lay them out on one row the way native mixed buttons already are. */
276
+ .kui-toolbar-control-group
277
+ wa-button:not(:where(.kui-popup-menu > *))::part(label) {
278
+ display: inline-flex;
279
+ align-items: center;
280
+ gap: var(--kui-space-xs);
281
+ white-space: nowrap;
282
+ }
283
+ .kui-toolbar-control-group[data-content="avatar"][data-scrim="true"] {
284
+ --kui-toolbar-control-background: color-mix(
285
+ in srgb,
286
+ var(--kui-color-neutral-fill-loud) 64%,
287
+ transparent
288
+ );
289
+ --kui-toolbar-control-color: var(--kui-color-neutral-on-loud);
290
+ }
291
+ .kui-toolbar-control-group[data-selected-tone="neutral"] {
292
+ --kui-toolbar-control-selected-color: var(--kui-color-neutral-on-normal);
293
+ --kui-toolbar-control-selected-background: var(
294
+ --kui-color-neutral-fill-normal
295
+ );
296
+ }
297
+ .kui-toolbar-control-group[data-selected-tone="pop"] {
298
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
299
+ }
300
+ .kui-toolbar-control-group[data-selected-chrome="filled"] {
301
+ --kui-toolbar-control-selected-shadow: none;
302
+ --kui-toolbar-control-selected-border: transparent;
303
+ --kui-toolbar-control-selected-background: var(--kui-color-brand-fill-normal);
304
+ --kui-toolbar-control-selected-color: var(--kui-color-brand-on-normal);
305
+ }
306
+ .kui-toolbar-control-group[data-selected-chrome="outline"] {
307
+ --kui-toolbar-control-selected-shadow: none;
308
+ --kui-toolbar-control-selected-background: transparent;
309
+ --kui-toolbar-control-selected-border: var(--kui-color-brand-border-normal);
310
+ }
311
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="filled"] {
312
+ --kui-toolbar-control-selected-background: var(--kui-color-pop-fill-normal);
313
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-normal);
314
+ }
315
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="outline"] {
316
+ --kui-toolbar-control-selected-border: var(--kui-color-pop-border-normal);
317
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
318
+ }
319
+
320
+ .kui-toolbar-control-group[data-appearance="borderless"] {
321
+ /* A borderless group has no base fill to lift from, so the default
322
+ surface-colored hover/selected background is invisible against the page.
323
+ Use a visible neutral tint so buttons still show hover/press feedback
324
+ (KF-WZDQS8). */
325
+ --kui-toolbar-control-hover-background: var(--kui-color-neutral-fill-normal);
326
+ --kui-toolbar-control-selected-background: var(
327
+ --kui-color-neutral-fill-normal
328
+ );
329
+ border-color: transparent;
330
+ background: transparent;
331
+ }
332
+
333
+ /* The group lays out its own native and raw Web Awesome children. A composed
334
+ PopupMenu (`wa-dropdown.kui-popup-menu`) or Select sizes itself in the
335
+ group's context from its own stylesheet (popup-menu.css, select.css); the
336
+ group names those children by class only to key its own state on them. */
337
+ .kui-toolbar-control-group > :is(button, wa-button, .kui-toolbar-action-link),
338
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu) {
339
+ flex: 0 0 auto;
340
+ }
341
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu) {
342
+ display: inline-flex;
343
+ }
344
+
345
+ .kui-toolbar-control-group > button {
346
+ appearance: none;
347
+ display: grid;
348
+ min-width: 2.5rem;
349
+ height: 2.5rem;
350
+ padding: 0 var(--kui-layout-item-padding, 0.5rem);
351
+ box-sizing: border-box;
352
+ border: 1px solid transparent;
353
+ border-radius: var(
354
+ --kui-toolbar-item-radius,
355
+ var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
356
+ );
357
+ color: inherit;
358
+ background: transparent;
359
+ cursor: pointer;
360
+ font: inherit;
361
+ place-items: center;
362
+ }
363
+
364
+ .kui-toolbar-control-group > button:disabled {
365
+ opacity: 0.5;
366
+ cursor: not-allowed;
367
+ }
368
+
369
+ .kui-toolbar-control-group > button:not(:disabled):hover {
370
+ border-color: var(--kui-toolbar-control-border);
371
+ background: var(--kui-toolbar-control-hover-background);
372
+ }
373
+
374
+ .kui-toolbar-control-group > .kui-toolbar-action-link {
375
+ position: relative;
376
+ display: inline-flex;
377
+ min-width: 2.5rem;
378
+ height: 2.5rem;
379
+ padding-inline: var(--kui-layout-item-padding, 0.5rem);
380
+ box-sizing: border-box;
381
+ border: 1px solid transparent;
382
+ border-radius: var(
383
+ --kui-toolbar-item-radius,
384
+ var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
385
+ );
386
+ color: inherit;
387
+ background: transparent;
388
+ align-items: center;
389
+ justify-content: center;
390
+ gap: var(--kui-space-2xs);
391
+ text-decoration: none;
392
+ white-space: nowrap;
393
+ }
394
+
395
+ .kui-toolbar-control-group > .kui-toolbar-action-link:hover {
396
+ border-color: var(--kui-toolbar-control-border);
397
+ background: var(--kui-toolbar-control-hover-background);
398
+ }
399
+
400
+ .kui-toolbar-action-link code {
401
+ position: absolute;
402
+ inset-block-start: 0;
403
+ inset-inline-start: 0;
404
+ width: 1px;
405
+ height: 1px;
406
+ padding: 0;
407
+ overflow: hidden;
408
+ border: 0;
409
+ clip-path: inset(50%);
410
+ white-space: nowrap;
411
+ }
412
+
413
+ /* An icon tile: a non-interactive icon placed directly in a group (a panel
414
+ heading's identity glyph) takes the same 40px slot and 16px visual as an
415
+ icon button, so it centers in the group and lines up with button icons,
416
+ without a hover surface or a focusable control that does nothing. */
417
+ .kui-toolbar-control-group > svg {
418
+ display: block;
419
+ width: 1rem;
420
+ height: 1rem;
421
+ padding: 0.75rem;
422
+ box-sizing: content-box;
423
+ flex: 0 0 auto;
424
+ }
425
+
426
+ .kui-toolbar-control-group > button svg,
427
+ .kui-toolbar-control-group wa-button:not(:where(.kui-popup-menu > *)) > svg,
428
+ .kui-toolbar-control-group > .kui-toolbar-action-link svg {
429
+ display: block;
430
+ width: 1rem;
431
+ height: 1rem;
432
+ }
433
+
434
+ /* Nested Web Awesome buttons take the group's control height, not the theme's
435
+ 44px standalone control height. The group's `wa-button` rules style only raw
436
+ buttons: a composed PopupMenu's trigger (`.kui-popup-menu > wa-button`) is
437
+ excluded inside a zero-specificity `:where()` and takes the same metrics
438
+ from popup-menu.css. */
439
+ .kui-toolbar-control-group wa-button:not(:where(.kui-popup-menu > *)) {
440
+ --wa-form-control-height: 2.5rem;
441
+ }
442
+ .kui-toolbar-control-group[data-size="compact"]
443
+ wa-button:not(:where(.kui-popup-menu > *)) {
444
+ --wa-form-control-height: 2rem;
445
+ }
446
+
447
+ .kui-toolbar-control-group > wa-button,
448
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu),
449
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu) > wa-button,
450
+ .kui-toolbar-control-group
451
+ > wa-dropdown:not(.kui-popup-menu)
452
+ > wa-button::part(base) {
453
+ min-width: 2.5rem;
454
+ height: 2.5rem;
455
+ }
456
+ .kui-toolbar-control-group[data-size="compact"] > button,
457
+ .kui-toolbar-control-group[data-size="compact"] > .kui-toolbar-action-link,
458
+ .kui-toolbar-control-group[data-size="compact"] > wa-button,
459
+ .kui-toolbar-control-group[data-size="compact"]
460
+ > wa-dropdown:not(.kui-popup-menu),
461
+ .kui-toolbar-control-group[data-size="compact"]
462
+ > wa-dropdown:not(.kui-popup-menu)
463
+ > wa-button,
464
+ .kui-toolbar-control-group[data-size="compact"]
465
+ > wa-dropdown:not(.kui-popup-menu)
466
+ > wa-button::part(base),
467
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
468
+ wa-dropdown:not(.kui-popup-menu)
469
+ wa-button,
470
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
471
+ wa-dropdown:not(.kui-popup-menu)
472
+ wa-button::part(base) {
473
+ min-width: 2rem;
474
+ height: 2rem;
475
+ min-height: 2rem;
476
+ }
477
+
478
+ /* A compact icon button is a 32px circle like its compact wa-button and
479
+ Select siblings; the default 8px inline padding around a 16px icon made its
480
+ selected highlight a 34x32 oval. */
481
+ .kui-toolbar-control-group[data-size="compact"][data-content="icon"] > button {
482
+ padding-inline: 0;
483
+ }
484
+
485
+ /* `standard` keeps each menu's own standard inset: a raw wa-dropdown takes the
486
+ 8px surface inset, while a PopupMenu keeps the Select listbox inset it
487
+ shares (popup-menu.css). The explicit compact and list-zero choices apply to
488
+ every nested menu; a PopupMenu applies them to itself (popup-menu.css). */
489
+ .kui-toolbar-control-group[data-menu-inset="standard"]
490
+ wa-dropdown:not(.kui-popup-menu)::part(menu) {
491
+ padding: var(--kui-wa-surface-inset, 0.5rem);
492
+ }
493
+ .kui-toolbar-control-group[data-menu-inset="compact"]
494
+ wa-dropdown:not(.kui-popup-menu)::part(menu) {
495
+ padding: 0.25rem;
496
+ }
497
+ .kui-toolbar-control-group[data-menu-inset="list-zero"]
498
+ wa-dropdown:not(.kui-popup-menu)::part(menu) {
499
+ padding: 0;
500
+ }
501
+
502
+ /* Compact mixed controls keep the default horizontal breathing room. Their
503
+ raised selection grows over the group's own border instead of becoming a
504
+ smaller inset lozenge, while negative margins keep the outer geometry and
505
+ neighboring trigger position stable. */
506
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"] {
507
+ --kui-layout-item-padding: 0.5rem;
508
+ }
509
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
510
+ > button[aria-pressed="true"] {
511
+ position: relative;
512
+ z-index: 1;
513
+ height: var(--kui-toolbar-group-size);
514
+ margin: -2px;
515
+ border-radius: var(--kui-toolbar-group-radius);
516
+ }
517
+
518
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
519
+ > wa-dropdown:not(.kui-popup-menu),
520
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
521
+ > wa-button {
522
+ margin: -2px;
523
+ }
524
+
525
+ /* A compact icon-only trigger may stay square, but a mixed-content dropdown
526
+ trigger must grow for its slotted label plus Web Awesome's caret. Otherwise
527
+ the fixed 32px base centers both outside its host, painting the label across
528
+ the separator and the caret beyond the group border. */
529
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
530
+ > wa-dropdown:not(.kui-popup-menu)
531
+ > wa-button,
532
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
533
+ > wa-dropdown:not(.kui-popup-menu)
534
+ > wa-button::part(base) {
535
+ min-width: max-content;
536
+ }
537
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
538
+ > wa-dropdown:not(.kui-popup-menu)
539
+ > wa-button::part(base) {
540
+ width: max-content;
541
+ }
542
+
543
+ .kui-toolbar-control-group[data-single="true"]
544
+ > wa-dropdown:not(.kui-popup-menu)
545
+ > wa-button::part(base) {
546
+ width: max-content;
547
+ }
548
+
549
+ .kui-toolbar-control-group wa-button:not(:where(.kui-popup-menu > *)) {
550
+ display: inline-flex;
551
+ line-height: 0;
552
+ align-items: center;
553
+ justify-content: center;
554
+ --wa-color-fill-quiet: transparent;
555
+ }
556
+
557
+ .kui-toolbar-control-group
558
+ wa-button:not(:where(.kui-popup-menu > *))::part(base) {
559
+ /* Match min-width to the 40px height so an icon-only button's highlight is at
560
+ least a circle, not a vertical oval — the host is 40px wide but the base
561
+ part was sizing to its ~32px content. Text/caret buttons grow past it. */
562
+ min-width: 2.5rem;
563
+ min-height: 2.5rem;
564
+ box-sizing: border-box;
565
+ border: 1px solid transparent;
566
+ border-radius: var(
567
+ --kui-toolbar-item-radius,
568
+ var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
569
+ );
570
+ }
571
+
572
+ .kui-toolbar-control-group
573
+ wa-button:not(:where(.kui-popup-menu > *)):hover::part(base) {
574
+ border-color: var(--kui-toolbar-control-border);
575
+ background-color: var(--kui-toolbar-control-hover-background);
576
+ }
577
+
578
+ .kui-toolbar-control-group[data-single="true"]:has(
579
+ > :is(
580
+ button:not(:disabled),
581
+ wa-button,
582
+ .kui-popup-menu,
583
+ wa-dropdown:not(.kui-popup-menu),
584
+ .kui-select,
585
+ .kui-toolbar-action-link
586
+ )
587
+ ):hover {
588
+ background-color: var(--kui-toolbar-control-hover-background);
589
+ }
590
+
591
+ .kui-toolbar-control-group[data-single="true"]
592
+ > :is(button, wa-button, .kui-toolbar-action-link):hover,
593
+ .kui-toolbar-control-group[data-single="true"]
594
+ wa-button:not(:where(.kui-popup-menu > *)):hover::part(base) {
595
+ border-color: transparent;
596
+ background: transparent;
597
+ }
598
+
599
+ /* A group holding exactly one control behaves like `single` even without the
600
+ flag: the whole group background changes on hover instead of highlighting an
601
+ inner layer inset from the border (KF-J9P1ZD — a heading toolbar's lone Close/
602
+ Done action). */
603
+ .kui-toolbar-control-group:not([data-single="true"]):has(
604
+ > :is(
605
+ button:not(:disabled),
606
+ wa-button,
607
+ .kui-select,
608
+ .kui-toolbar-action-link
609
+ ):only-child
610
+ ):hover {
611
+ background-color: var(--kui-toolbar-control-hover-background);
612
+ }
613
+
614
+ .kui-toolbar-control-group:not([data-single="true"]):has(
615
+ > :is(button, wa-button, .kui-toolbar-action-link):only-child
616
+ )
617
+ > :is(button, wa-button, .kui-toolbar-action-link):hover,
618
+ .kui-toolbar-control-group:not([data-single="true"]):has(
619
+ > :is(button, wa-button):only-child
620
+ )
621
+ > wa-button:hover::part(base) {
622
+ border-color: transparent;
623
+ background: transparent;
624
+ }
625
+
626
+ /* A toolbar Select beside other controls highlights its own pill on hover
627
+ (select.css); a lone Select instead lifts the whole group (above). */
628
+
629
+ /* A plain <button> child paints its own box for the selected state. */
630
+ .kui-toolbar-control-group[data-single="false"] > button[aria-pressed="true"] {
631
+ border-color: var(--kui-toolbar-control-selected-border);
632
+ color: var(--kui-toolbar-control-selected-color);
633
+ background: var(--kui-toolbar-control-selected-background);
634
+ box-shadow: var(--kui-toolbar-control-selected-shadow);
635
+ }
636
+
637
+ /* A wa-button's visual is ::part(base), not the outer 40px host box (which has no
638
+ pill radius). Paint the selected background/border/shadow on ::part(base) —
639
+ mirroring the hover rule — so the selected state matches the pill radius/size
640
+ and stays inside the group's border instead of overflowing it as an oversized
641
+ square (KF-5BDDQ9). The selected text color rides on the host and inherits in. */
642
+ .kui-toolbar-control-group[data-single="false"]
643
+ > wa-button[aria-pressed="true"] {
644
+ color: var(--kui-toolbar-control-selected-color);
645
+ }
646
+ .kui-toolbar-control-group[data-single="false"]
647
+ > wa-button[aria-pressed="true"]::part(base) {
648
+ border-color: var(--kui-toolbar-control-selected-border);
649
+ background: var(--kui-toolbar-control-selected-background);
650
+ box-shadow: var(--kui-toolbar-control-selected-shadow);
651
+ }
652
+
653
+ .kui-toolbar-control-group
654
+ > :is(button, wa-button, .kui-toolbar-action-link):focus-visible {
655
+ outline: var(--kui-focus-ring);
656
+ outline-offset: 1px;
657
+ }
658
+
659
+ /* With per-control rings, a composed Select paints its own ring (select.css). */
660
+
661
+ .kui-toolbar-control-group[data-focus-ring="outline"]:focus-within:not(
662
+ :where(
663
+ :has(
664
+ .kui-select[open],
665
+ .kui-popup-menu[open],
666
+ wa-dropdown:not(.kui-popup-menu)[open]
667
+ )
668
+ )
669
+ ) {
670
+ outline: var(--kui-focus-ring);
671
+ outline-offset: 1px;
672
+ }
673
+
674
+ .kui-toolbar-control-group[data-focus-ring="halo"]:focus-within:not(
675
+ :where(
676
+ :has(
677
+ .kui-select[open],
678
+ .kui-popup-menu[open],
679
+ wa-dropdown:not(.kui-popup-menu)[open]
680
+ )
681
+ )
682
+ ) {
683
+ border-color: var(--kui-color-text-link);
684
+ box-shadow: 0 0 0 3px
685
+ color-mix(in srgb, var(--kui-color-text-link) 22%, transparent);
686
+ }
687
+
688
+ /* A group-owned ring (outline or halo) is off while a Select listbox or a
689
+ PopupMenu inside the group is open: the open popup shows focus, as the
690
+ per-control Select and PopupMenu triggers already do, and the ring returns
691
+ when the popup closes with focus still in the group. The exclusion sits in
692
+ a forgiving :where(), so an engine without :has() keeps the ring.
693
+
694
+ Chromium and WebKit do not propagate :focus-within from a focused
695
+ light-DOM child through a host's popup shadow tree, so a focused light-DOM
696
+ descendant also owns the group ring. Kept as separate rules so an engine
697
+ without :has() keeps the :focus-within ring. */
698
+ .kui-toolbar-control-group[data-focus-ring="outline"]:has(:focus):not(
699
+ :where(
700
+ :has(
701
+ .kui-select[open],
702
+ .kui-popup-menu[open],
703
+ wa-dropdown:not(.kui-popup-menu)[open]
704
+ )
705
+ )
706
+ ) {
707
+ outline: var(--kui-focus-ring);
708
+ outline-offset: 1px;
709
+ }
710
+
711
+ .kui-toolbar-control-group[data-focus-ring="halo"]:has(:focus):not(
712
+ :where(
713
+ :has(
714
+ .kui-select[open],
715
+ .kui-popup-menu[open],
716
+ wa-dropdown:not(.kui-popup-menu)[open]
717
+ )
718
+ )
719
+ ) {
720
+ border-color: var(--kui-color-text-link);
721
+ box-shadow: 0 0 0 3px
722
+ color-mix(in srgb, var(--kui-color-text-link) 22%, transparent);
723
+ }
724
+
725
+ .kui-toolbar-control-group[data-button-appearance="push"][data-single="true"]:has(
726
+ > :is(button, wa-button)[aria-pressed="true"]
727
+ ) {
728
+ --kui-toolbar-control-color: var(--kui-toolbar-control-pressed-color);
729
+ border-color: var(--kui-toolbar-control-pressed-border);
730
+ color: var(--kui-toolbar-control-pressed-color);
731
+ background: var(--kui-toolbar-control-pressed-background);
732
+ }
733
+
734
+ .kui-toolbar-control-group[data-button-appearance="push"][data-single="true"]
735
+ > :is(button, wa-button)[aria-pressed="true"] {
736
+ color: var(--kui-toolbar-control-pressed-color);
737
+ }
738
+
739
+ @media (prefers-reduced-motion: reduce) {
740
+ .kui-toolbar-control-group[data-content="search"] {
741
+ transition-duration: 0s;
742
+ }
743
+
744
+ .kui-toolbar[data-responsive="stack"]
745
+ > :is(.kui-toolbar__center, .kui-toolbar__trailing)
746
+ > .kui-toolbar-control-group[data-content="search"][data-sizing="fill"][data-expanded="true"] {
747
+ animation: none;
748
+ }
749
+ }
750
+
751
+ /* Avatar controls paint the image as chrome rather than inserting a replaced
752
+ <img> into the control. `background-size: contain` is the background-image
753
+ equivalent of `object-fit: contain`: the whole avatar remains visible. A
754
+ lone control belongs to the outer group surface; in a group of choices the
755
+ image belongs only to the selected highlight. */
756
+ .kui-toolbar-control-group[data-content="avatar"] {
757
+ background-position: center;
758
+ background-repeat: no-repeat;
759
+ background-size: contain;
760
+ }
761
+
762
+ .kui-toolbar-control-group[data-content="avatar"]:is(
763
+ [data-single="true"],
764
+ :has(> :is(button, wa-button):only-child)
765
+ ) {
766
+ background-image: var(--kui-toolbar-avatar-image);
767
+ }
768
+
769
+ .kui-toolbar-control-group[data-content="avatar"]:is(
770
+ [data-single="true"],
771
+ :has(> :is(button, wa-button):only-child)
772
+ )
773
+ > :is(button, wa-button) {
774
+ color: transparent;
775
+ }
776
+
777
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
778
+ :has(> :is(button, wa-button):only-child)
779
+ )
780
+ > button[aria-pressed="true"],
781
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
782
+ :has(> :is(button, wa-button):only-child)
783
+ )
784
+ > wa-button[aria-pressed="true"]::part(base) {
785
+ color: transparent;
786
+ background-image: var(--kui-toolbar-avatar-image);
787
+ background-position: center;
788
+ background-repeat: no-repeat;
789
+ background-size: contain;
790
+ }