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

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 (443) hide show
  1. package/README.md +41 -1
  2. package/ai/component-catalog.json +235 -30
  3. package/ai/component-composition.json +131 -14
  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/components/nav-stack.md +1 -0
  12. package/ai/components/select.md +1 -0
  13. package/ai/components/split-view.md +1 -0
  14. package/ai/components/text.md +4 -2
  15. package/ai/components/toolbar-control-group.md +20 -3
  16. package/ai/components/toolbar-text.md +19 -4
  17. package/ai/components/toolbar.md +10 -4
  18. package/ai/public-api-signatures-v1.md +141 -66
  19. package/ai/skill.md +58 -5
  20. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  21. package/analyzer/index.mjs +11 -1
  22. package/dist/app-tab.js +1 -1
  23. package/dist/badge.d.ts +5 -3
  24. package/dist/badge.js +1 -1
  25. package/dist/browser/catalog.js +7 -7
  26. package/dist/browser/collapsible-panel.js +3 -3
  27. package/dist/browser/list-header.js +1 -1
  28. package/dist/browser/nav-stack.js +1 -1
  29. package/dist/browser/select.js +1 -1
  30. package/dist/browser/split-view.js +1 -1
  31. package/dist/browser/workbench.js +4 -4
  32. package/dist/catalog-resources.d.ts +6 -6
  33. package/dist/catalog-resources.js +1 -1
  34. package/dist/catalog-resources.js.map +1 -1
  35. package/dist/catalog.d.ts +5 -5
  36. package/dist/catalog.js +13 -13
  37. package/dist/catalog.js.map +1 -1
  38. package/dist/chip.d.ts +3 -2
  39. package/dist/chip.js +1 -1
  40. package/dist/{chunk-SVLDRGPJ.js → chunk-3RE2JMZU.js} +7 -3
  41. package/dist/chunk-3RE2JMZU.js.map +1 -0
  42. package/dist/{chunk-YDGNU2OD.js → chunk-4Y4L5YEI.js} +7 -2
  43. package/dist/chunk-4Y4L5YEI.js.map +1 -0
  44. package/dist/{chunk-V4WLBOVJ.js → chunk-5BZBIRQG.js} +4 -4
  45. package/dist/chunk-5BZBIRQG.js.map +1 -0
  46. package/dist/{chunk-SX7FJXPJ.js → chunk-5D3WDMIK.js} +4 -4
  47. package/dist/chunk-5D3WDMIK.js.map +1 -0
  48. package/dist/{chunk-O5GM2JAM.js → chunk-6VQPLV3O.js} +9 -9
  49. package/dist/chunk-6VQPLV3O.js.map +1 -0
  50. package/dist/{chunk-JA4J7Y4C.js → chunk-75I3SNUJ.js} +2 -2
  51. package/dist/chunk-75I3SNUJ.js.map +1 -0
  52. package/dist/{chunk-K47P7QZC.js → chunk-7QQ3HE47.js} +2 -2
  53. package/dist/chunk-7QQ3HE47.js.map +1 -0
  54. package/dist/{chunk-5I7QGQVT.js → chunk-AN5IWMTM.js} +2 -2
  55. package/dist/chunk-AN5IWMTM.js.map +1 -0
  56. package/dist/{chunk-3BYFWTP3.js → chunk-AOAW55JN.js} +2 -2
  57. package/dist/chunk-AOAW55JN.js.map +1 -0
  58. package/dist/{chunk-5UGLKFBF.js → chunk-ARZ4RSQO.js} +5 -6
  59. package/dist/chunk-ARZ4RSQO.js.map +1 -0
  60. package/dist/{chunk-TCXDZNCX.js → chunk-BJLXE56E.js} +6 -6
  61. package/dist/chunk-BJLXE56E.js.map +1 -0
  62. package/dist/{chunk-RGS4WX2M.js → chunk-BYHGRKC3.js} +2 -2
  63. package/dist/chunk-BYHGRKC3.js.map +1 -0
  64. package/dist/{chunk-ZLKZFKLW.js → chunk-CEJ5FK6G.js} +2 -2
  65. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  66. package/dist/{chunk-SMZGAPCU.js → chunk-DQDTZE4W.js} +2 -2
  67. package/dist/chunk-DQDTZE4W.js.map +1 -0
  68. package/dist/{chunk-JGIV6ZDA.js → chunk-EFDCALR3.js} +2 -2
  69. package/dist/chunk-EFDCALR3.js.map +1 -0
  70. package/dist/{chunk-FKPKGP2H.js → chunk-G4VKQP7B.js} +2 -2
  71. package/dist/chunk-G4VKQP7B.js.map +1 -0
  72. package/dist/{chunk-DPAUKNB6.js → chunk-GS2QD3N7.js} +3 -3
  73. package/dist/chunk-GS2QD3N7.js.map +1 -0
  74. package/dist/{chunk-SLWCCHNP.js → chunk-H45DAZBL.js} +2 -2
  75. package/dist/chunk-H45DAZBL.js.map +1 -0
  76. package/dist/{chunk-DA3HS64I.js → chunk-H7ZJEI3H.js} +3 -3
  77. package/dist/chunk-H7ZJEI3H.js.map +1 -0
  78. package/dist/{chunk-V4GAQ74C.js → chunk-HFLGWMG3.js} +4 -4
  79. package/dist/chunk-HFLGWMG3.js.map +1 -0
  80. package/dist/{chunk-HXTAPIHQ.js → chunk-HFQDSSED.js} +6 -6
  81. package/dist/chunk-HFQDSSED.js.map +1 -0
  82. package/dist/{chunk-WF75U3V4.js → chunk-HPREYDKV.js} +2 -2
  83. package/dist/chunk-HPREYDKV.js.map +1 -0
  84. package/dist/{chunk-VA5TN5PR.js → chunk-I4SDIMFA.js} +2 -2
  85. package/dist/chunk-I4SDIMFA.js.map +1 -0
  86. package/dist/{chunk-4SQK27MR.js → chunk-IM3GKYOG.js} +2 -2
  87. package/dist/chunk-IM3GKYOG.js.map +1 -0
  88. package/dist/{chunk-ALGYHYXP.js → chunk-J3AWE5I4.js} +2 -2
  89. package/dist/chunk-J3AWE5I4.js.map +1 -0
  90. package/dist/{chunk-OXO2QJWV.js → chunk-JOR5LGYE.js} +2 -2
  91. package/dist/chunk-JOR5LGYE.js.map +1 -0
  92. package/dist/{chunk-SRSJO5QE.js → chunk-LAZLBC2Q.js} +2 -2
  93. package/dist/chunk-LAZLBC2Q.js.map +1 -0
  94. package/dist/{chunk-RFGW735Q.js → chunk-LRAIS3YB.js} +2 -2
  95. package/dist/chunk-LRAIS3YB.js.map +1 -0
  96. package/dist/{chunk-PL26TKNK.js → chunk-M6BWQMQY.js} +8 -8
  97. package/dist/chunk-M6BWQMQY.js.map +1 -0
  98. package/dist/{chunk-AYUHMAI6.js → chunk-MXNIVEVL.js} +2 -2
  99. package/dist/chunk-MXNIVEVL.js.map +1 -0
  100. package/dist/{chunk-4NG4Y2Q6.js → chunk-NJZMR7HM.js} +2 -2
  101. package/dist/chunk-NJZMR7HM.js.map +1 -0
  102. package/dist/{chunk-DG6G5EPF.js → chunk-NMWDHZVM.js} +2 -2
  103. package/dist/chunk-NMWDHZVM.js.map +1 -0
  104. package/dist/{chunk-X5QSICJ3.js → chunk-NS2TBYM4.js} +2 -2
  105. package/dist/chunk-NS2TBYM4.js.map +1 -0
  106. package/dist/{chunk-5TTZPGUY.js → chunk-NVKRZ5DI.js} +6 -6
  107. package/dist/chunk-NVKRZ5DI.js.map +1 -0
  108. package/dist/{chunk-4FEVHE7C.js → chunk-NVRJ7C3W.js} +4 -4
  109. package/dist/chunk-NVRJ7C3W.js.map +1 -0
  110. package/dist/{chunk-BFPBS5Y4.js → chunk-O27D24CA.js} +2 -2
  111. package/dist/chunk-O27D24CA.js.map +1 -0
  112. package/dist/{chunk-DUBUXJA3.js → chunk-PQQQXJGV.js} +4 -2
  113. package/dist/chunk-PQQQXJGV.js.map +1 -0
  114. package/dist/{chunk-6DFDTWGG.js → chunk-QYXKMLHO.js} +2 -2
  115. package/dist/chunk-QYXKMLHO.js.map +1 -0
  116. package/dist/{chunk-TOICTHR2.js → chunk-RRCD3A6G.js} +14 -6
  117. package/dist/chunk-RRCD3A6G.js.map +1 -0
  118. package/dist/{chunk-I3Q7KKYM.js → chunk-S3ECMF23.js} +2 -2
  119. package/dist/chunk-S3ECMF23.js.map +1 -0
  120. package/dist/{chunk-PSHUSWQH.js → chunk-S4ZGTDSG.js} +2 -2
  121. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  122. package/dist/{chunk-HKVJ5MW3.js → chunk-VHXHLZ6R.js} +12 -3
  123. package/dist/chunk-VHXHLZ6R.js.map +1 -0
  124. package/dist/{chunk-NPNSKX3K.js → chunk-VLPE6OPN.js} +2 -2
  125. package/dist/chunk-VLPE6OPN.js.map +1 -0
  126. package/dist/{chunk-NCSWXG7G.js → chunk-VLQUXZKA.js} +9 -3
  127. package/dist/chunk-VLQUXZKA.js.map +1 -0
  128. package/dist/{chunk-EHIMH4J7.js → chunk-VR7MWD2X.js} +10 -4
  129. package/dist/chunk-VR7MWD2X.js.map +1 -0
  130. package/dist/chunk-WJN3V2H5.js +256 -0
  131. package/dist/chunk-WJN3V2H5.js.map +1 -0
  132. package/dist/{chunk-NN6GYOA2.js → chunk-XIZRXI7N.js} +2 -2
  133. package/dist/chunk-XIZRXI7N.js.map +1 -0
  134. package/dist/{chunk-TDN5EE3S.js → chunk-Y6KT7ZTR.js} +2 -2
  135. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  136. package/dist/{chunk-LHSUPNSE.js → chunk-YLJ6X3AC.js} +2 -2
  137. package/dist/chunk-YLJ6X3AC.js.map +1 -0
  138. package/dist/{chunk-OYQIONQF.js → chunk-Z4EPMX25.js} +5 -5
  139. package/dist/chunk-Z4EPMX25.js.map +1 -0
  140. package/dist/{chunk-GRHJQWV2.js → chunk-Z6PE5T7N.js} +6 -6
  141. package/dist/chunk-Z6PE5T7N.js.map +1 -0
  142. package/dist/collapsible-panel.d.ts +6 -6
  143. package/dist/collapsible-panel.js +3 -3
  144. package/dist/collapsible-panel.js.map +1 -1
  145. package/dist/content-item.d.ts +13 -2
  146. package/dist/content-item.js +1 -1
  147. package/dist/css-values.js +1 -1
  148. package/dist/device-class.js +1 -1
  149. package/dist/device-class.js.map +1 -1
  150. package/dist/disclosure-arrow.js +1 -1
  151. package/dist/empty-state.js +1 -1
  152. package/dist/floating-toolbar.d.ts +1 -1
  153. package/dist/floating-toolbar.js +1 -1
  154. package/dist/grid.d.ts +10 -3
  155. package/dist/grid.js +1 -1
  156. package/dist/help-tags-register.js +1 -1
  157. package/dist/help-tags-register.js.map +1 -1
  158. package/dist/index.d.ts +28 -26
  159. package/dist/index.js +41 -40
  160. package/dist/list-action-row.js +1 -1
  161. package/dist/list-header.d.ts +1 -0
  162. package/dist/list-header.js +1 -1
  163. package/dist/list-inset-control.js +1 -1
  164. package/dist/list-inset-text.js +1 -1
  165. package/dist/list-item.js +1 -1
  166. package/dist/list.d.ts +2 -2
  167. package/dist/list.js +1 -1
  168. package/dist/loading-spinner.d.ts +4 -2
  169. package/dist/loading-spinner.js +1 -1
  170. package/dist/lucide-icon.d.ts +3 -1
  171. package/dist/lucide-icon.js +1 -1
  172. package/dist/nav-stack.d.ts +2 -1
  173. package/dist/nav-stack.js +1 -1
  174. package/dist/pane.js +1 -1
  175. package/dist/popup-menu-register.js +7 -7
  176. package/dist/popup-menu-register.js.map +1 -1
  177. package/dist/popup-menu.js +1 -1
  178. package/dist/resizable-region.d.ts +1 -1
  179. package/dist/resizable-region.js +1 -1
  180. package/dist/row.d.ts +2 -2
  181. package/dist/row.js +1 -1
  182. package/dist/segmented-control.js +1 -1
  183. package/dist/select-register.js +9 -6
  184. package/dist/select-register.js.map +1 -1
  185. package/dist/select.d.ts +2 -1
  186. package/dist/select.js +1 -1
  187. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  188. package/dist/skeleton.js +1 -1
  189. package/dist/spacer.js +1 -1
  190. package/dist/split-view.d.ts +2 -2
  191. package/dist/split-view.js +2 -2
  192. package/dist/split-view.js.map +1 -1
  193. package/dist/state-banner.d.ts +5 -3
  194. package/dist/state-banner.js +1 -1
  195. package/dist/styles/badge.css +1 -1
  196. package/dist/styles/chip.css +1 -1
  197. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  198. package/dist/styles/components/actions/popup-menu/popup-menu.css +285 -0
  199. package/dist/styles/components/actions/toolbar/toolbar.css +424 -0
  200. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +841 -0
  201. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +164 -0
  202. package/dist/styles/components/collections/list/list.css +133 -0
  203. package/dist/styles/components/collections/list-action-row/list-action-row.css +258 -0
  204. package/dist/styles/components/collections/list-header/list-header.css +229 -0
  205. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  206. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  207. package/dist/styles/components/collections/list-item/list-item.css +255 -0
  208. package/dist/styles/components/data-display/value-table/value-table.css +105 -0
  209. package/dist/styles/components/feedback/badge/badge.css +118 -0
  210. package/dist/styles/components/feedback/chip/chip.css +138 -0
  211. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  212. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  213. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  214. package/dist/styles/components/feedback/state-banner/state-banner.css +248 -0
  215. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  216. package/dist/styles/components/forms/select/select.css +454 -0
  217. package/dist/styles/components/forms/token-search-field/token-search-field.css +381 -0
  218. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +575 -0
  219. package/dist/styles/components/layout/grid/grid.css +85 -0
  220. package/dist/styles/components/layout/pane/pane.css +263 -0
  221. package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
  222. package/dist/styles/components/layout/row/row.css +111 -0
  223. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  224. package/dist/styles/components/layout/split-view/split-view.css +146 -0
  225. package/dist/styles/components/layout/workbench/workbench.css +1067 -0
  226. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  227. package/dist/styles/components/navigation/app-tab/app-tab.css +376 -0
  228. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
  229. package/dist/styles/components/navigation/nav-stack/nav-stack.css +248 -0
  230. package/dist/styles/components/navigation/tab-bar/tab-bar.css +183 -0
  231. package/dist/styles/components/navigation/tab-scaffold/tab-scaffold.css +207 -0
  232. package/dist/styles/components/surfaces/content-item/content-item.css +120 -0
  233. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +29 -0
  234. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +56 -0
  235. package/dist/styles/components/typography/text/text.css +158 -0
  236. package/dist/styles/content-item.css +46 -1
  237. package/dist/styles/document.css +10 -0
  238. package/dist/styles/foundation.css +9 -6
  239. package/dist/styles/grid.css +50 -0
  240. package/dist/styles/lucide-icon.css +4 -0
  241. package/dist/styles/nav-stack.css +11 -0
  242. package/dist/styles/text.css +19 -0
  243. package/dist/styles/toolbar-control-group.css +51 -0
  244. package/dist/styles/toolbar-text.css +11 -0
  245. package/dist/styles/toolbar.css +32 -0
  246. package/dist/styles/webawesome.css +23 -6
  247. package/dist/sunken-panel.d.ts +1 -1
  248. package/dist/sunken-panel.js +1 -1
  249. package/dist/surface-scaffold.js +1 -1
  250. package/dist/tab-bar.js +1 -1
  251. package/dist/tab-scaffold.d.ts +1 -1
  252. package/dist/tab-scaffold.js +1 -1
  253. package/dist/tab-scaffold.js.map +1 -1
  254. package/dist/text.d.ts +16 -9
  255. package/dist/text.js +1 -1
  256. package/dist/token-search-field.d.ts +1 -1
  257. package/dist/token-search-field.js +1 -1
  258. package/dist/{token-search-field-CVGwDn2y.d.ts → token-search-model-DTcTXWMS.d.ts} +54 -54
  259. package/dist/token-search-model.d.ts +1 -1
  260. package/dist/token-search-model.js +1 -1
  261. package/dist/toolbar-control-group.d.ts +14 -2
  262. package/dist/toolbar-control-group.js +1 -1
  263. package/dist/toolbar-text.d.ts +10 -2
  264. package/dist/toolbar-text.js +1 -1
  265. package/dist/toolbar.d.ts +1 -1
  266. package/dist/toolbar.js +1 -1
  267. package/dist/value-table.js +1 -1
  268. package/dist/wire-catalog.js +2 -2
  269. package/dist/wire-catalog.js.map +1 -1
  270. package/dist/wire-content-items.js +1 -1
  271. package/dist/wire-content-items.js.map +1 -1
  272. package/dist/wire-nav-stack.js +59 -23
  273. package/dist/wire-nav-stack.js.map +1 -1
  274. package/dist/wire-resizable-regions.js +1 -1
  275. package/dist/wire-scroll-dividers.js +1 -1
  276. package/dist/wire-sidebar.js +1 -1
  277. package/dist/wire-sidebar.js.map +1 -1
  278. package/dist/wire-tab-bars.js +1 -1
  279. package/dist/wire-tab-scaffold.js +1 -1
  280. package/dist/wire-tab-scaffold.js.map +1 -1
  281. package/dist/wire-token-search-fields.d.ts +1 -1
  282. package/dist/wire-token-search-fields.js +1 -1
  283. package/dist/wire-toolbar-visibility.d.ts +13 -0
  284. package/dist/wire-toolbar-visibility.js +3 -0
  285. package/dist/wire-toolbar-visibility.js.map +1 -0
  286. package/dist/wire-workbench.js +1 -1
  287. package/dist/workbench.d.ts +3 -3
  288. package/dist/workbench.js +1 -1
  289. package/docs/accessibility.md +15 -0
  290. package/docs/collapsible-panel.md +5 -1
  291. package/docs/component-contract.md +56 -7
  292. package/docs/component-selection.md +73 -5
  293. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  294. package/docs/design/templates/empty-state/filtered.svg +1 -1
  295. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  296. package/docs/design/templates/empty-state/with-action.svg +1 -1
  297. package/docs/design/templates/empty-state-dark.svg +1 -1
  298. package/docs/design/templates/empty-state.svg +1 -1
  299. package/docs/design/templates/list/stack-dark.svg +1 -1
  300. package/docs/design/templates/list/stack.svg +1 -1
  301. package/docs/design/templates/list-dark.svg +1 -1
  302. package/docs/design/templates/list-header/action-dark.svg +1 -1
  303. package/docs/design/templates/list-header/action.svg +1 -1
  304. package/docs/design/templates/list-header/count-dark.svg +1 -1
  305. package/docs/design/templates/list-header/count.svg +1 -1
  306. package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
  307. package/docs/design/templates/list-header/inline-action.svg +1 -1
  308. package/docs/design/templates/list-header/size-l-dark.svg +1 -1
  309. package/docs/design/templates/list-header/size-l.svg +1 -1
  310. package/docs/design/templates/list-header/size-m-dark.svg +1 -1
  311. package/docs/design/templates/list-header/size-m.svg +1 -1
  312. package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
  313. package/docs/design/templates/list-header/size-xl.svg +1 -1
  314. package/docs/design/templates/list-header/size-xs-dark.svg +1 -1
  315. package/docs/design/templates/list-header/size-xs.svg +1 -1
  316. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  317. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  318. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  319. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  320. package/docs/design/templates/list-header-dark.svg +1 -1
  321. package/docs/design/templates/list-header.svg +1 -1
  322. package/docs/design/templates/list.svg +1 -1
  323. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  324. package/docs/design/templates/segmented-control/equal.svg +1 -1
  325. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  326. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  327. package/docs/design/templates/segmented-control-dark.svg +1 -1
  328. package/docs/design/templates/segmented-control.svg +1 -1
  329. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  330. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  331. package/docs/design/templates/tab-bar-dark.svg +1 -1
  332. package/docs/design/templates/tab-bar.svg +1 -1
  333. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  334. package/docs/design/templates/token-search-field/empty.svg +1 -1
  335. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
  336. package/docs/design/templates/token-search-field/tokens.svg +1 -1
  337. package/docs/design/templates/token-search-field-dark.svg +1 -1
  338. package/docs/design/templates/token-search-field.svg +1 -1
  339. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  340. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  341. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  342. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  343. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  344. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  345. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  346. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  347. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  348. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  349. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  350. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  351. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  352. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  353. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  354. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  355. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  356. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  357. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  358. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  359. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  360. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  361. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  362. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  363. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  364. package/docs/design/templates/toolbar-control-group.svg +1 -1
  365. package/docs/design/templates/toolbar-dark.svg +1 -1
  366. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  367. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  368. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  369. package/docs/design/templates/toolbar-text/default.svg +1 -1
  370. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  371. package/docs/design/templates/toolbar-text/large.svg +1 -1
  372. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  373. package/docs/design/templates/toolbar-text/small.svg +1 -1
  374. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  375. package/docs/design/templates/toolbar-text.svg +1 -1
  376. package/docs/design/templates/toolbar.svg +1 -1
  377. package/docs/design/templates/value-table/details-dark.svg +1 -1
  378. package/docs/design/templates/value-table/details.svg +1 -1
  379. package/docs/design/templates/value-table-dark.svg +1 -1
  380. package/docs/design/templates/value-table.svg +1 -1
  381. package/docs/design/templates.md +2 -0
  382. package/docs/document-baseline.md +4 -0
  383. package/docs/layout.md +23 -6
  384. package/docs/nav-stack.md +5 -1
  385. package/docs/sunken-panel.md +7 -7
  386. package/docs/ui-analyzer.md +12 -1
  387. package/docs/ui-doctor.md +12 -2
  388. package/docs/webawesome-theme.md +29 -59
  389. package/doctor/index.mjs +39 -30
  390. package/llms.txt +42 -1
  391. package/package.json +7 -2
  392. package/dist/chunk-3BYFWTP3.js.map +0 -1
  393. package/dist/chunk-4FEVHE7C.js.map +0 -1
  394. package/dist/chunk-4NG4Y2Q6.js.map +0 -1
  395. package/dist/chunk-4SQK27MR.js.map +0 -1
  396. package/dist/chunk-5I7QGQVT.js.map +0 -1
  397. package/dist/chunk-5TTZPGUY.js.map +0 -1
  398. package/dist/chunk-5UGLKFBF.js.map +0 -1
  399. package/dist/chunk-6DFDTWGG.js.map +0 -1
  400. package/dist/chunk-ALGYHYXP.js.map +0 -1
  401. package/dist/chunk-AYUHMAI6.js.map +0 -1
  402. package/dist/chunk-BFPBS5Y4.js.map +0 -1
  403. package/dist/chunk-DA3HS64I.js.map +0 -1
  404. package/dist/chunk-DG6G5EPF.js.map +0 -1
  405. package/dist/chunk-DPAUKNB6.js.map +0 -1
  406. package/dist/chunk-DUBUXJA3.js.map +0 -1
  407. package/dist/chunk-EHIMH4J7.js.map +0 -1
  408. package/dist/chunk-FKPKGP2H.js.map +0 -1
  409. package/dist/chunk-GRHJQWV2.js.map +0 -1
  410. package/dist/chunk-HKVJ5MW3.js.map +0 -1
  411. package/dist/chunk-HXTAPIHQ.js.map +0 -1
  412. package/dist/chunk-I3Q7KKYM.js.map +0 -1
  413. package/dist/chunk-JA4J7Y4C.js.map +0 -1
  414. package/dist/chunk-JGIV6ZDA.js.map +0 -1
  415. package/dist/chunk-K47P7QZC.js.map +0 -1
  416. package/dist/chunk-LHSUPNSE.js.map +0 -1
  417. package/dist/chunk-NCSWXG7G.js.map +0 -1
  418. package/dist/chunk-NN6GYOA2.js.map +0 -1
  419. package/dist/chunk-NPNSKX3K.js.map +0 -1
  420. package/dist/chunk-O5GM2JAM.js.map +0 -1
  421. package/dist/chunk-OXO2QJWV.js.map +0 -1
  422. package/dist/chunk-OYQIONQF.js.map +0 -1
  423. package/dist/chunk-PL26TKNK.js.map +0 -1
  424. package/dist/chunk-PSHUSWQH.js.map +0 -1
  425. package/dist/chunk-RFGW735Q.js.map +0 -1
  426. package/dist/chunk-RGS4WX2M.js.map +0 -1
  427. package/dist/chunk-SLWCCHNP.js.map +0 -1
  428. package/dist/chunk-SMZGAPCU.js.map +0 -1
  429. package/dist/chunk-SRSJO5QE.js.map +0 -1
  430. package/dist/chunk-SVLDRGPJ.js.map +0 -1
  431. package/dist/chunk-SX7FJXPJ.js.map +0 -1
  432. package/dist/chunk-TCXDZNCX.js.map +0 -1
  433. package/dist/chunk-TDN5EE3S.js.map +0 -1
  434. package/dist/chunk-TOICTHR2.js.map +0 -1
  435. package/dist/chunk-V4GAQ74C.js.map +0 -1
  436. package/dist/chunk-V4WLBOVJ.js.map +0 -1
  437. package/dist/chunk-VA5TN5PR.js.map +0 -1
  438. package/dist/chunk-WF75U3V4.js.map +0 -1
  439. package/dist/chunk-X5QSICJ3.js.map +0 -1
  440. package/dist/chunk-YDGNU2OD.js.map +0 -1
  441. package/dist/chunk-ZLKZFKLW.js.map +0 -1
  442. package/dist/{panel-toolbar-DDKh4uKd.d.ts → panel-toolbar-CL9tYOkh.d.ts} +1 -1
  443. package/dist/{types-BuHELdXR.d.ts → types-C9BubXfz.d.ts} +1 -1
@@ -0,0 +1,841 @@
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="true"][data-expanded-overflow="visible"] {
200
+ height: auto;
201
+ overflow: visible;
202
+ }
203
+ .kui-toolbar-control-group[data-content="search"][data-expanded="false"] {
204
+ width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
205
+ flex: 0 0 auto;
206
+ }
207
+
208
+ .kui-toolbar-control-group[data-content="search"]:has(
209
+ > .kui-token-search[data-expanded="false"][data-fill="true"]
210
+ ) {
211
+ width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
212
+ flex: 0 0 auto;
213
+ }
214
+
215
+ .kui-toolbar-control-group[data-sizing="grow"][data-expanded="true"] {
216
+ --_kui-toolbar-group-grow-search-width: 100%;
217
+ width: auto;
218
+ min-width: var(--kui-toolbar-group-grow-basis, 19rem);
219
+ flex: 1 1 var(--kui-toolbar-group-grow-basis, 19rem);
220
+ }
221
+ .kui-toolbar-control-group[data-sizing="fill"] {
222
+ width: 100%;
223
+ min-width: 0;
224
+ flex: 1 1 100%;
225
+ }
226
+
227
+ /* Auto margin consumes the free space before this group on its flex line;
228
+ when the expanded fill search takes a whole line, the margin resolves to 0. */
229
+ .kui-toolbar[data-responsive="stack"]
230
+ > :is(.kui-toolbar__center, .kui-toolbar__trailing)
231
+ > .kui-toolbar-control-group[data-placement="end"] {
232
+ margin-inline-start: auto;
233
+ }
234
+
235
+ /* A fill search crosses from the preceding control line to its own line.
236
+ Move its visual down one control band as it opens without changing layout. */
237
+ .kui-toolbar[data-responsive="stack"]
238
+ > :is(.kui-toolbar__center, .kui-toolbar__trailing)
239
+ > .kui-toolbar-control-group[data-content="search"][data-sizing="fill"][data-expanded="true"] {
240
+ animation: kui-toolbar-fill-search-enter 0.25s ease-out both;
241
+ }
242
+
243
+ @keyframes kui-toolbar-fill-search-enter {
244
+ from {
245
+ transform: translateY(
246
+ calc(
247
+ -1 * (var(--_kui-toolbar-band) + var(--kui-toolbar-gap, 0.5rem))
248
+ )
249
+ );
250
+ }
251
+ to {
252
+ transform: translateY(0);
253
+ }
254
+ }
255
+
256
+ @container kui-toolbar (max-width: 30rem) {
257
+ .kui-toolbar-control-group[data-sizing="grow"][data-expanded="true"] {
258
+ width: 100%;
259
+ min-width: 0;
260
+ flex: 1 1 100%;
261
+ }
262
+ }
263
+ .kui-toolbar-control-group[data-content="text"]
264
+ > :is(button, wa-button, .kui-toolbar-action-link),
265
+ .kui-toolbar-control-group[data-content="mixed"]
266
+ > :is(button, wa-button, .kui-toolbar-action-link) {
267
+ min-width: max-content;
268
+ }
269
+ .kui-toolbar-control-group[data-content="mixed"] > button {
270
+ display: flex;
271
+ gap: var(--kui-space-xs);
272
+ }
273
+ .kui-toolbar-control-group[data-content="mixed"]
274
+ wa-button:not(:where(.kui-popup-menu > *)) {
275
+ line-height: normal;
276
+ }
277
+ /* Toolbar controls never wrap. Web Awesome's label part is a plain block, so a
278
+ slotted icon (a block SVG) and its text would otherwise stack vertically —
279
+ lay them out on one row the way native mixed buttons already are. */
280
+ .kui-toolbar-control-group
281
+ wa-button:not(:where(.kui-popup-menu > *))::part(label) {
282
+ display: inline-flex;
283
+ align-items: center;
284
+ gap: var(--kui-space-xs);
285
+ white-space: nowrap;
286
+ }
287
+ .kui-toolbar-control-group[data-content="avatar"][data-scrim="true"] {
288
+ --kui-toolbar-control-background: color-mix(
289
+ in srgb,
290
+ var(--kui-color-neutral-fill-loud) 64%,
291
+ transparent
292
+ );
293
+ --kui-toolbar-control-color: var(--kui-color-neutral-on-loud);
294
+ }
295
+ .kui-toolbar-control-group[data-selected-tone="neutral"] {
296
+ --kui-toolbar-control-selected-color: var(--kui-color-neutral-on-normal);
297
+ --kui-toolbar-control-selected-background: var(
298
+ --kui-color-neutral-fill-normal
299
+ );
300
+ }
301
+ .kui-toolbar-control-group[data-selected-tone="pop"] {
302
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
303
+ }
304
+ .kui-toolbar-control-group[data-selected-chrome="filled"] {
305
+ --kui-toolbar-control-selected-shadow: none;
306
+ --kui-toolbar-control-selected-border: transparent;
307
+ --kui-toolbar-control-selected-background: var(--kui-color-brand-fill-normal);
308
+ --kui-toolbar-control-selected-color: var(--kui-color-brand-on-normal);
309
+ }
310
+ .kui-toolbar-control-group[data-selected-chrome="outline"] {
311
+ --kui-toolbar-control-selected-shadow: none;
312
+ --kui-toolbar-control-selected-background: transparent;
313
+ --kui-toolbar-control-selected-border: var(--kui-color-brand-border-normal);
314
+ }
315
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="filled"] {
316
+ --kui-toolbar-control-selected-background: var(--kui-color-pop-fill-normal);
317
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-normal);
318
+ }
319
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="outline"] {
320
+ --kui-toolbar-control-selected-border: var(--kui-color-pop-border-normal);
321
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
322
+ }
323
+
324
+ .kui-toolbar-control-group[data-appearance="borderless"] {
325
+ /* A borderless group has no base fill to lift from, so the default
326
+ surface-colored hover/selected background is invisible against the page.
327
+ Use a visible neutral tint so buttons still show hover/press feedback
328
+ (KF-WZDQS8). */
329
+ --kui-toolbar-control-hover-background: var(--kui-color-neutral-fill-normal);
330
+ --kui-toolbar-control-selected-background: var(
331
+ --kui-color-neutral-fill-normal
332
+ );
333
+ border-color: transparent;
334
+ background: transparent;
335
+ }
336
+
337
+ /* The group lays out its own native and raw Web Awesome children. A composed
338
+ PopupMenu (`wa-dropdown.kui-popup-menu`) or Select sizes itself in the
339
+ group's context from its own stylesheet (popup-menu.css, select.css); the
340
+ group names those children by class only to key its own state on them. */
341
+ .kui-toolbar-control-group > :is(button, wa-button, .kui-toolbar-action-link),
342
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu) {
343
+ flex: 0 0 auto;
344
+ }
345
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu) {
346
+ display: inline-flex;
347
+ }
348
+
349
+ .kui-toolbar-control-group > button {
350
+ appearance: none;
351
+ display: grid;
352
+ min-width: 2.5rem;
353
+ height: 2.5rem;
354
+ padding: 0 var(--kui-layout-item-padding, 0.5rem);
355
+ box-sizing: border-box;
356
+ border: 1px solid transparent;
357
+ border-radius: var(
358
+ --kui-toolbar-item-radius,
359
+ var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
360
+ );
361
+ color: inherit;
362
+ background: transparent;
363
+ cursor: pointer;
364
+ font: inherit;
365
+ place-items: center;
366
+ }
367
+
368
+ .kui-toolbar-control-group > button:disabled {
369
+ opacity: 0.5;
370
+ cursor: not-allowed;
371
+ }
372
+
373
+ .kui-toolbar-control-group > button:not(:disabled):hover {
374
+ border-color: var(--kui-toolbar-control-border);
375
+ background: var(--kui-toolbar-control-hover-background);
376
+ }
377
+
378
+ .kui-toolbar-control-group > .kui-toolbar-action-link {
379
+ position: relative;
380
+ display: inline-flex;
381
+ min-width: 2.5rem;
382
+ height: 2.5rem;
383
+ padding-inline: var(--kui-layout-item-padding, 0.5rem);
384
+ box-sizing: border-box;
385
+ border: 1px solid transparent;
386
+ border-radius: var(
387
+ --kui-toolbar-item-radius,
388
+ var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
389
+ );
390
+ color: inherit;
391
+ background: transparent;
392
+ align-items: center;
393
+ justify-content: center;
394
+ gap: var(--kui-space-2xs);
395
+ text-decoration: none;
396
+ white-space: nowrap;
397
+ }
398
+
399
+ .kui-toolbar-control-group > .kui-toolbar-action-link:hover {
400
+ border-color: var(--kui-toolbar-control-border);
401
+ background: var(--kui-toolbar-control-hover-background);
402
+ }
403
+
404
+ .kui-toolbar-action-link code {
405
+ position: absolute;
406
+ inset-block-start: 0;
407
+ inset-inline-start: 0;
408
+ width: 1px;
409
+ height: 1px;
410
+ padding: 0;
411
+ overflow: hidden;
412
+ border: 0;
413
+ clip-path: inset(50%);
414
+ white-space: nowrap;
415
+ }
416
+
417
+ /* An icon tile: a non-interactive icon placed directly in a group (a panel
418
+ heading's identity glyph) takes the same 40px slot and 16px visual as an
419
+ icon button, so it centers in the group and lines up with button icons,
420
+ without a hover surface or a focusable control that does nothing. */
421
+ .kui-toolbar-control-group > svg {
422
+ display: block;
423
+ width: 1rem;
424
+ height: 1rem;
425
+ padding: 0.75rem;
426
+ box-sizing: content-box;
427
+ flex: 0 0 auto;
428
+ }
429
+
430
+ .kui-toolbar-control-group > button svg,
431
+ .kui-toolbar-control-group wa-button:not(:where(.kui-popup-menu > *)) > svg,
432
+ .kui-toolbar-control-group > .kui-toolbar-action-link svg {
433
+ display: block;
434
+ width: 1rem;
435
+ height: 1rem;
436
+ }
437
+
438
+ /* Nested Web Awesome buttons take the group's control height, not the theme's
439
+ 44px standalone control height. The group's `wa-button` rules style only raw
440
+ buttons: a composed PopupMenu's trigger (`.kui-popup-menu > wa-button`) is
441
+ excluded inside a zero-specificity `:where()` and takes the same metrics
442
+ from popup-menu.css. */
443
+ .kui-toolbar-control-group wa-button:not(:where(.kui-popup-menu > *)) {
444
+ --wa-form-control-height: 2.5rem;
445
+ }
446
+ .kui-toolbar-control-group[data-size="compact"]
447
+ wa-button:not(:where(.kui-popup-menu > *)) {
448
+ --wa-form-control-height: 2rem;
449
+ }
450
+
451
+ .kui-toolbar-control-group > wa-button,
452
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu),
453
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu) > wa-button,
454
+ .kui-toolbar-control-group
455
+ > wa-dropdown:not(.kui-popup-menu)
456
+ > wa-button::part(base) {
457
+ min-width: 2.5rem;
458
+ height: 2.5rem;
459
+ }
460
+ .kui-toolbar-control-group[data-size="compact"] > button,
461
+ .kui-toolbar-control-group[data-size="compact"] > .kui-toolbar-action-link,
462
+ .kui-toolbar-control-group[data-size="compact"] > wa-button,
463
+ .kui-toolbar-control-group[data-size="compact"]
464
+ > wa-dropdown:not(.kui-popup-menu),
465
+ .kui-toolbar-control-group[data-size="compact"]
466
+ > wa-dropdown:not(.kui-popup-menu)
467
+ > wa-button,
468
+ .kui-toolbar-control-group[data-size="compact"]
469
+ > wa-dropdown:not(.kui-popup-menu)
470
+ > wa-button::part(base),
471
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
472
+ wa-dropdown:not(.kui-popup-menu)
473
+ wa-button,
474
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
475
+ wa-dropdown:not(.kui-popup-menu)
476
+ wa-button::part(base) {
477
+ min-width: 2rem;
478
+ height: 2rem;
479
+ min-height: 2rem;
480
+ }
481
+
482
+ /* A compact icon button is a 32px circle like its compact wa-button and
483
+ Select siblings; the default 8px inline padding around a 16px icon made its
484
+ selected highlight a 34x32 oval. */
485
+ .kui-toolbar-control-group[data-size="compact"][data-content="icon"] > button {
486
+ padding-inline: 0;
487
+ }
488
+
489
+ /* `standard` keeps each menu's own standard inset: a raw wa-dropdown takes the
490
+ 8px surface inset, while a PopupMenu keeps the Select listbox inset it
491
+ shares (popup-menu.css). The explicit compact and list-zero choices apply to
492
+ every nested menu; a PopupMenu applies them to itself (popup-menu.css). */
493
+ .kui-toolbar-control-group[data-menu-inset="standard"]
494
+ wa-dropdown:not(.kui-popup-menu)::part(menu) {
495
+ padding: var(--kui-wa-surface-inset, 0.5rem);
496
+ }
497
+ .kui-toolbar-control-group[data-menu-inset="compact"]
498
+ wa-dropdown:not(.kui-popup-menu)::part(menu) {
499
+ padding: 0.25rem;
500
+ }
501
+ .kui-toolbar-control-group[data-menu-inset="list-zero"]
502
+ wa-dropdown:not(.kui-popup-menu)::part(menu) {
503
+ padding: 0;
504
+ }
505
+
506
+ /* Compact mixed controls keep the default horizontal breathing room. Their
507
+ raised selection grows over the group's own border instead of becoming a
508
+ smaller inset lozenge, while negative margins keep the outer geometry and
509
+ neighboring trigger position stable. */
510
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"] {
511
+ --kui-layout-item-padding: 0.5rem;
512
+ }
513
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
514
+ > button[aria-pressed="true"] {
515
+ position: relative;
516
+ z-index: 1;
517
+ height: var(--kui-toolbar-group-size);
518
+ margin: -2px;
519
+ border-radius: var(--kui-toolbar-group-radius);
520
+ }
521
+
522
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
523
+ > wa-dropdown:not(.kui-popup-menu),
524
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
525
+ > wa-button {
526
+ margin: -2px;
527
+ }
528
+
529
+ /* A compact icon-only trigger may stay square, but a mixed-content dropdown
530
+ trigger must grow for its slotted label plus Web Awesome's caret. Otherwise
531
+ the fixed 32px base centers both outside its host, painting the label across
532
+ the separator and the caret beyond the group border. */
533
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
534
+ > wa-dropdown:not(.kui-popup-menu)
535
+ > wa-button,
536
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
537
+ > wa-dropdown:not(.kui-popup-menu)
538
+ > wa-button::part(base) {
539
+ min-width: max-content;
540
+ }
541
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
542
+ > wa-dropdown:not(.kui-popup-menu)
543
+ > wa-button::part(base) {
544
+ width: max-content;
545
+ }
546
+
547
+ .kui-toolbar-control-group[data-single="true"]
548
+ > wa-dropdown:not(.kui-popup-menu)
549
+ > wa-button::part(base) {
550
+ width: max-content;
551
+ }
552
+
553
+ .kui-toolbar-control-group wa-button:not(:where(.kui-popup-menu > *)) {
554
+ display: inline-flex;
555
+ line-height: 0;
556
+ align-items: center;
557
+ justify-content: center;
558
+ --wa-color-fill-quiet: transparent;
559
+ }
560
+
561
+ .kui-toolbar-control-group
562
+ wa-button:not(:where(.kui-popup-menu > *))::part(base) {
563
+ /* Match min-width to the 40px height so an icon-only button's highlight is at
564
+ least a circle, not a vertical oval — the host is 40px wide but the base
565
+ part was sizing to its ~32px content. Text/caret buttons grow past it. */
566
+ min-width: 2.5rem;
567
+ min-height: 2.5rem;
568
+ box-sizing: border-box;
569
+ border: 1px solid transparent;
570
+ border-radius: var(
571
+ --kui-toolbar-item-radius,
572
+ var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
573
+ );
574
+ }
575
+
576
+ .kui-toolbar-control-group
577
+ wa-button:not(:where(.kui-popup-menu > *)):hover::part(base) {
578
+ border-color: var(--kui-toolbar-control-border);
579
+ background-color: var(--kui-toolbar-control-hover-background);
580
+ }
581
+
582
+ .kui-toolbar-control-group[data-single="true"]:has(
583
+ > :is(
584
+ button:not(:disabled),
585
+ wa-button,
586
+ .kui-popup-menu,
587
+ wa-dropdown:not(.kui-popup-menu),
588
+ .kui-select,
589
+ .kui-toolbar-action-link
590
+ )
591
+ ):hover {
592
+ background-color: var(--kui-toolbar-control-hover-background);
593
+ }
594
+
595
+ .kui-toolbar-control-group[data-single="true"]
596
+ > :is(button, wa-button, .kui-toolbar-action-link):hover,
597
+ .kui-toolbar-control-group[data-single="true"]
598
+ wa-button:not(:where(.kui-popup-menu > *)):hover::part(base) {
599
+ border-color: transparent;
600
+ background: transparent;
601
+ }
602
+
603
+ /* A group holding exactly one control behaves like `single` even without the
604
+ flag: the whole group background changes on hover instead of highlighting an
605
+ inner layer inset from the border (KF-J9P1ZD — a heading toolbar's lone Close/
606
+ Done action). */
607
+ .kui-toolbar-control-group:not([data-single="true"]):has(
608
+ > :is(
609
+ button:not(:disabled),
610
+ wa-button,
611
+ .kui-select,
612
+ .kui-toolbar-action-link
613
+ ):only-child
614
+ ):hover {
615
+ background-color: var(--kui-toolbar-control-hover-background);
616
+ }
617
+
618
+ .kui-toolbar-control-group:not([data-single="true"]):has(
619
+ > :is(button, wa-button, .kui-toolbar-action-link):only-child
620
+ )
621
+ > :is(button, wa-button, .kui-toolbar-action-link):hover,
622
+ .kui-toolbar-control-group:not([data-single="true"]):has(
623
+ > :is(button, wa-button):only-child
624
+ )
625
+ > wa-button:hover::part(base) {
626
+ border-color: transparent;
627
+ background: transparent;
628
+ }
629
+
630
+ /* A toolbar Select beside other controls highlights its own pill on hover
631
+ (select.css); a lone Select instead lifts the whole group (above). */
632
+
633
+ /* A plain <button> child paints its own box for the selected state. */
634
+ .kui-toolbar-control-group[data-single="false"] > button[aria-pressed="true"] {
635
+ border-color: var(--kui-toolbar-control-selected-border);
636
+ color: var(--kui-toolbar-control-selected-color);
637
+ background: var(--kui-toolbar-control-selected-background);
638
+ box-shadow: var(--kui-toolbar-control-selected-shadow);
639
+ }
640
+
641
+ /* A wa-button's visual is ::part(base), not the outer 40px host box (which has no
642
+ pill radius). Paint the selected background/border/shadow on ::part(base) —
643
+ mirroring the hover rule — so the selected state matches the pill radius/size
644
+ and stays inside the group's border instead of overflowing it as an oversized
645
+ square (KF-5BDDQ9). The selected text color rides on the host and inherits in. */
646
+ .kui-toolbar-control-group[data-single="false"]
647
+ > wa-button[aria-pressed="true"] {
648
+ color: var(--kui-toolbar-control-selected-color);
649
+ }
650
+ .kui-toolbar-control-group[data-single="false"]
651
+ > wa-button[aria-pressed="true"]::part(base) {
652
+ border-color: var(--kui-toolbar-control-selected-border);
653
+ background: var(--kui-toolbar-control-selected-background);
654
+ box-shadow: var(--kui-toolbar-control-selected-shadow);
655
+ }
656
+
657
+ .kui-toolbar-control-group
658
+ > :is(button, wa-button, .kui-toolbar-action-link):focus-visible {
659
+ outline: var(--kui-focus-ring);
660
+ outline-offset: 1px;
661
+ }
662
+
663
+ /* With per-control rings, a composed Select paints its own ring (select.css). */
664
+
665
+ .kui-toolbar-control-group[data-focus-ring="outline"]:focus-within:not(
666
+ :where(
667
+ :has(
668
+ .kui-select[open],
669
+ .kui-popup-menu[open],
670
+ wa-dropdown:not(.kui-popup-menu)[open]
671
+ )
672
+ )
673
+ ) {
674
+ outline: var(--kui-focus-ring);
675
+ outline-offset: 1px;
676
+ }
677
+
678
+ .kui-toolbar-control-group[data-focus-ring="halo"]:focus-within:not(
679
+ :where(
680
+ :has(
681
+ .kui-select[open],
682
+ .kui-popup-menu[open],
683
+ wa-dropdown:not(.kui-popup-menu)[open]
684
+ )
685
+ )
686
+ ) {
687
+ border-color: var(--kui-color-text-link);
688
+ box-shadow: 0 0 0 3px
689
+ color-mix(in srgb, var(--kui-color-text-link) 22%, transparent);
690
+ }
691
+
692
+ /* A group-owned ring (outline or halo) is off while a Select listbox or a
693
+ PopupMenu inside the group is open: the open popup shows focus, as the
694
+ per-control Select and PopupMenu triggers already do, and the ring returns
695
+ when the popup closes with focus still in the group. The exclusion sits in
696
+ a forgiving :where(), so an engine without :has() keeps the ring.
697
+
698
+ Chromium and WebKit do not propagate :focus-within from a focused
699
+ light-DOM child through a host's popup shadow tree, so a focused light-DOM
700
+ descendant also owns the group ring. Kept as separate rules so an engine
701
+ without :has() keeps the :focus-within ring. */
702
+ .kui-toolbar-control-group[data-focus-ring="outline"]:has(:focus):not(
703
+ :where(
704
+ :has(
705
+ .kui-select[open],
706
+ .kui-popup-menu[open],
707
+ wa-dropdown:not(.kui-popup-menu)[open]
708
+ )
709
+ )
710
+ ) {
711
+ outline: var(--kui-focus-ring);
712
+ outline-offset: 1px;
713
+ }
714
+
715
+ .kui-toolbar-control-group[data-focus-ring="halo"]:has(:focus):not(
716
+ :where(
717
+ :has(
718
+ .kui-select[open],
719
+ .kui-popup-menu[open],
720
+ wa-dropdown:not(.kui-popup-menu)[open]
721
+ )
722
+ )
723
+ ) {
724
+ border-color: var(--kui-color-text-link);
725
+ box-shadow: 0 0 0 3px
726
+ color-mix(in srgb, var(--kui-color-text-link) 22%, transparent);
727
+ }
728
+
729
+ .kui-toolbar-control-group[data-button-appearance="push"][data-single="true"]:has(
730
+ > :is(button, wa-button)[aria-pressed="true"]
731
+ ) {
732
+ --kui-toolbar-control-color: var(--kui-toolbar-control-pressed-color);
733
+ border-color: var(--kui-toolbar-control-pressed-border);
734
+ color: var(--kui-toolbar-control-pressed-color);
735
+ background: var(--kui-toolbar-control-pressed-background);
736
+ }
737
+
738
+ .kui-toolbar-control-group[data-button-appearance="push"][data-single="true"]
739
+ > :is(button, wa-button)[aria-pressed="true"] {
740
+ color: var(--kui-toolbar-control-pressed-color);
741
+ }
742
+
743
+ @media (prefers-reduced-motion: reduce) {
744
+ .kui-toolbar-control-group[data-content="search"] {
745
+ transition-duration: 0s;
746
+ }
747
+
748
+ .kui-toolbar[data-responsive="stack"]
749
+ > :is(.kui-toolbar__center, .kui-toolbar__trailing)
750
+ > .kui-toolbar-control-group[data-content="search"][data-sizing="fill"][data-expanded="true"] {
751
+ animation: none;
752
+ }
753
+ }
754
+
755
+ /* Avatar controls paint the image as chrome rather than inserting a replaced
756
+ <img> into the control. `background-size: contain` is the background-image
757
+ equivalent of `object-fit: contain`: the whole avatar remains visible. A
758
+ lone control belongs to the outer group surface; in a group of choices the
759
+ image belongs only to the selected highlight. */
760
+ .kui-toolbar-control-group[data-content="avatar"] {
761
+ background-position: center;
762
+ background-repeat: no-repeat;
763
+ background-size: contain;
764
+ }
765
+
766
+ .kui-toolbar-control-group[data-content="avatar"]:is(
767
+ [data-single="true"],
768
+ :has(> :is(button, wa-button):only-child)
769
+ ) {
770
+ background-image: var(--kui-toolbar-avatar-image);
771
+ }
772
+
773
+ .kui-toolbar-control-group[data-content="avatar"]:is(
774
+ [data-single="true"],
775
+ :has(> :is(button, wa-button):only-child)
776
+ )
777
+ > :is(button, wa-button) {
778
+ color: transparent;
779
+ }
780
+
781
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
782
+ :has(> :is(button, wa-button):only-child)
783
+ )
784
+ > button[aria-pressed="true"],
785
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
786
+ :has(> :is(button, wa-button):only-child)
787
+ )
788
+ > wa-button[aria-pressed="true"]::part(base) {
789
+ color: transparent;
790
+ background-image: var(--kui-toolbar-avatar-image);
791
+ background-position: center;
792
+ background-repeat: no-repeat;
793
+ background-size: contain;
794
+ }
795
+
796
+ /* Explicit quiet palette only for a lone decorative icon tile. The structural
797
+ guard keeps interactive, mixed and borderless groups on their existing chrome. */
798
+
799
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="neutral"]:has(
800
+ > svg[aria-hidden="true"]
801
+ ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
802
+ background: var(--kui-color-neutral-fill-quiet);
803
+ border-color: var(--kui-color-neutral-border-quiet);
804
+ color: var(--kui-color-neutral-on-quiet);
805
+ }
806
+
807
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="brand"]:has(
808
+ > svg[aria-hidden="true"]
809
+ ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
810
+ background: var(--kui-color-brand-fill-quiet);
811
+ border-color: var(--kui-color-brand-border-quiet);
812
+ color: var(--kui-color-brand-on-quiet);
813
+ }
814
+
815
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="success"]:has(
816
+ > svg[aria-hidden="true"]
817
+ ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
818
+ background: var(--kui-color-success-fill-quiet);
819
+ border-color: var(--kui-color-success-border-quiet);
820
+ color: var(--kui-color-success-on-quiet);
821
+ }
822
+
823
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="warning"]:has(
824
+ > svg[aria-hidden="true"]
825
+ ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
826
+ background: var(--kui-color-warning-fill-quiet);
827
+ border-color: var(--kui-color-warning-border-quiet);
828
+ color: var(--kui-color-warning-on-quiet);
829
+ }
830
+
831
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="danger"]:has(
832
+ > svg[aria-hidden="true"]
833
+ ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
834
+ background: var(--kui-color-danger-fill-quiet);
835
+ border-color: var(--kui-color-danger-border-quiet);
836
+ color: var(--kui-color-danger-on-quiet);
837
+ }
838
+ .kui-toolbar-control-group[data-toolbar-width-hidden="true"],
839
+ .kui-toolbar-control-group__busy-status[data-toolbar-width-hidden="true"] {
840
+ display: none;
841
+ }