@kerfjs/ui 4.5.0-beta.1 → 5.0.0-beta.100

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 (980) hide show
  1. package/README.md +461 -116
  2. package/ai/application-ui-diagnostic-ids-v1.json +23 -1
  3. package/ai/application-ui-profile-sync.cjs +21 -2
  4. package/ai/application-ui-profile.d.ts +4 -0
  5. package/ai/application-ui-profile.defaults.json +63 -8
  6. package/ai/application-ui-profile.mjs +28 -1
  7. package/ai/application-ui-profile.schema.json +10 -0
  8. package/ai/catalog-authoring.json +13 -4
  9. package/ai/catalog-authoring.schema.json +52 -8
  10. package/ai/compile-time-contracts-v1.json +63 -16
  11. package/ai/compile-time-contracts-v1.schema.json +4 -1
  12. package/ai/component-catalog-extension.schema.json +25 -0
  13. package/ai/component-catalog.json +5585 -1175
  14. package/ai/component-catalog.schema.json +78 -1
  15. package/ai/component-class-owners.cjs +83 -0
  16. package/ai/component-composition-extension.d.ts +7 -0
  17. package/ai/component-composition-extension.schema.json +7 -0
  18. package/ai/{component-catalog-v2-overrides.json → component-composition-rules.json} +281 -49
  19. package/ai/component-composition.d.ts +132 -0
  20. package/ai/component-composition.json +8729 -0
  21. package/ai/component-composition.schema.json +412 -0
  22. package/ai/components/README.md +185 -0
  23. package/ai/components/anchored-surface.md +99 -0
  24. package/ai/components/application-tabs.md +65 -0
  25. package/ai/components/badge.md +76 -0
  26. package/ai/components/chip.md +76 -0
  27. package/ai/components/choice-chips.md +87 -0
  28. package/ai/components/collapsible-panel.md +103 -0
  29. package/ai/components/column-track.md +78 -0
  30. package/ai/components/combobox.md +88 -0
  31. package/ai/components/composer.md +83 -0
  32. package/ai/components/content-item.md +98 -0
  33. package/ai/components/content-swap.md +78 -0
  34. package/ai/components/corner-status.md +88 -0
  35. package/ai/components/disclosure-arrow.md +77 -0
  36. package/ai/components/document-baseline.md +77 -0
  37. package/ai/components/edge-activity-indicator.md +81 -0
  38. package/ai/components/empty-state.md +80 -0
  39. package/ai/components/feedback.md +71 -0
  40. package/ai/components/file-picker.md +88 -0
  41. package/ai/components/floating-toolbar.md +82 -0
  42. package/ai/components/foundation.md +65 -0
  43. package/ai/components/framed-list.md +80 -0
  44. package/ai/components/grid.md +101 -0
  45. package/ai/components/headers.md +63 -0
  46. package/ai/components/icon-button.md +82 -0
  47. package/ai/components/icon-toggle-button.md +80 -0
  48. package/ai/components/layout.md +75 -0
  49. package/ai/components/list-action-row.md +108 -0
  50. package/ai/components/list-header.md +91 -0
  51. package/ai/components/list-inset-control.md +74 -0
  52. package/ai/components/list-inset-text.md +72 -0
  53. package/ai/components/list-item.md +108 -0
  54. package/ai/components/list.md +125 -0
  55. package/ai/components/loading-spinner.md +73 -0
  56. package/ai/components/lucide-icon.md +97 -0
  57. package/ai/components/nav-stack.md +115 -0
  58. package/ai/components/pane.md +115 -0
  59. package/ai/components/popup-menu.md +171 -0
  60. package/ai/components/recipe-app-shell.md +57 -0
  61. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  62. package/ai/components/recipe-compact-toolbar.md +57 -0
  63. package/ai/components/recipe-composer-form.md +57 -0
  64. package/ai/components/recipe-list-detail-dialog.md +57 -0
  65. package/ai/components/recipe-list-workspace-states.md +57 -0
  66. package/ai/components/recipe-loading-inspector.md +57 -0
  67. package/ai/components/recipe-navigation-sidebar.md +57 -0
  68. package/ai/components/recipe-navigation-stack.md +57 -0
  69. package/ai/components/recipe-workspace-header.md +57 -0
  70. package/ai/components/resize.md +106 -0
  71. package/ai/components/row.md +96 -0
  72. package/ai/components/segmented-control.md +82 -0
  73. package/ai/components/select.md +116 -0
  74. package/ai/components/skeleton.md +84 -0
  75. package/ai/components/spacer.md +86 -0
  76. package/ai/components/split-button.md +80 -0
  77. package/ai/components/split-view.md +105 -0
  78. package/ai/components/state-banner.md +96 -0
  79. package/ai/components/summary-row.md +85 -0
  80. package/ai/components/sunken-panel.md +79 -0
  81. package/ai/components/surface-scaffold.md +105 -0
  82. package/ai/components/tab-bar.md +114 -0
  83. package/ai/components/tab-navigator.md +100 -0
  84. package/ai/components/tabs.md +95 -0
  85. package/ai/components/text.md +90 -0
  86. package/ai/components/token-search-field.md +107 -0
  87. package/ai/components/toolbar-control-group.md +125 -0
  88. package/ai/components/toolbar-text.md +100 -0
  89. package/ai/components/toolbar.md +103 -0
  90. package/ai/components/value-table.md +80 -0
  91. package/ai/components/wa-accordion-item.md +55 -0
  92. package/ai/components/wa-accordion.md +65 -0
  93. package/ai/components/wa-animated-image.md +55 -0
  94. package/ai/components/wa-animation.md +55 -0
  95. package/ai/components/wa-avatar.md +55 -0
  96. package/ai/components/wa-badge.md +55 -0
  97. package/ai/components/wa-breadcrumb-item.md +53 -0
  98. package/ai/components/wa-breadcrumb.md +55 -0
  99. package/ai/components/wa-button-group.md +60 -0
  100. package/ai/components/wa-button.md +59 -0
  101. package/ai/components/wa-callout.md +58 -0
  102. package/ai/components/wa-card.md +59 -0
  103. package/ai/components/wa-carousel-item.md +53 -0
  104. package/ai/components/wa-carousel.md +55 -0
  105. package/ai/components/wa-checkbox-group.md +55 -0
  106. package/ai/components/wa-checkbox.md +55 -0
  107. package/ai/components/wa-color-picker.md +55 -0
  108. package/ai/components/wa-comparison.md +55 -0
  109. package/ai/components/wa-copy-button.md +55 -0
  110. package/ai/components/wa-details.md +61 -0
  111. package/ai/components/wa-dialog.md +59 -0
  112. package/ai/components/wa-divider.md +53 -0
  113. package/ai/components/wa-drawer.md +55 -0
  114. package/ai/components/wa-dropdown-item.md +60 -0
  115. package/ai/components/wa-dropdown.md +60 -0
  116. package/ai/components/wa-format-bytes.md +53 -0
  117. package/ai/components/wa-format-date.md +53 -0
  118. package/ai/components/wa-format-number.md +53 -0
  119. package/ai/components/wa-icon.md +58 -0
  120. package/ai/components/wa-include.md +53 -0
  121. package/ai/components/wa-input.md +59 -0
  122. package/ai/components/wa-intersection-observer.md +53 -0
  123. package/ai/components/wa-known-date.md +53 -0
  124. package/ai/components/wa-markdown.md +53 -0
  125. package/ai/components/wa-mutation-observer.md +53 -0
  126. package/ai/components/wa-number-input.md +55 -0
  127. package/ai/components/wa-option.md +59 -0
  128. package/ai/components/wa-otp-input.md +53 -0
  129. package/ai/components/wa-page.md +53 -0
  130. package/ai/components/wa-pagination.md +55 -0
  131. package/ai/components/wa-popover.md +55 -0
  132. package/ai/components/wa-popup.md +53 -0
  133. package/ai/components/wa-progress-bar.md +53 -0
  134. package/ai/components/wa-progress-ring.md +53 -0
  135. package/ai/components/wa-qr-code.md +53 -0
  136. package/ai/components/wa-radio-group.md +59 -0
  137. package/ai/components/wa-radio.md +55 -0
  138. package/ai/components/wa-random-content.md +53 -0
  139. package/ai/components/wa-rating.md +55 -0
  140. package/ai/components/wa-relative-time.md +53 -0
  141. package/ai/components/wa-resize-observer.md +53 -0
  142. package/ai/components/wa-scroller.md +53 -0
  143. package/ai/components/wa-select.md +63 -0
  144. package/ai/components/wa-skeleton.md +53 -0
  145. package/ai/components/wa-slider.md +55 -0
  146. package/ai/components/wa-spinner.md +58 -0
  147. package/ai/components/wa-split-panel.md +58 -0
  148. package/ai/components/wa-switch.md +53 -0
  149. package/ai/components/wa-tab-group.md +69 -0
  150. package/ai/components/wa-tab-panel.md +60 -0
  151. package/ai/components/wa-tab.md +59 -0
  152. package/ai/components/wa-tag.md +59 -0
  153. package/ai/components/wa-textarea.md +53 -0
  154. package/ai/components/wa-time-input.md +55 -0
  155. package/ai/components/wa-toast-item.md +60 -0
  156. package/ai/components/wa-toast.md +60 -0
  157. package/ai/components/wa-tooltip.md +55 -0
  158. package/ai/components/wa-tree-item.md +55 -0
  159. package/ai/components/wa-tree.md +55 -0
  160. package/ai/components/wa-zoomable-frame.md +55 -0
  161. package/ai/components/workbench.md +120 -0
  162. package/ai/public-api-signatures-v1.md +3851 -441
  163. package/ai/skill.md +402 -70
  164. package/ai/webawesome-jsx-signatures-v1.md +9 -2
  165. package/analyzer/cli.mjs +5 -2
  166. package/analyzer/component-ownership.d.mts +72 -0
  167. package/analyzer/component-ownership.mjs +429 -0
  168. package/analyzer/index.d.mts +8 -0
  169. package/analyzer/index.mjs +1687 -49
  170. package/analyzer/loud-pairs.d.mts +49 -0
  171. package/analyzer/loud-pairs.mjs +357 -0
  172. package/analyzer/selectors.d.mts +21 -0
  173. package/analyzer/selectors.mjs +212 -0
  174. package/catalog-projection-cli.mjs +96 -0
  175. package/catalog-projection.d.mts +55 -0
  176. package/catalog-projection.mjs +62 -0
  177. package/dist/anchored-surface.d.ts +69 -0
  178. package/dist/anchored-surface.js +3 -0
  179. package/dist/anchored-surface.js.map +1 -0
  180. package/dist/app-tab.d.ts +39 -4
  181. package/dist/app-tab.js +2 -1
  182. package/dist/badge.d.ts +83 -0
  183. package/dist/badge.js +4 -0
  184. package/dist/badge.js.map +1 -0
  185. package/dist/browser/anchored-surface.js +3 -0
  186. package/dist/browser/badge.js +3 -0
  187. package/dist/browser/catalog.js +28 -0
  188. package/dist/browser/chip.js +3 -0
  189. package/dist/browser/choice-chips.js +3 -0
  190. package/dist/browser/collapsible-panel.js +9 -0
  191. package/dist/browser/column-track.js +3 -0
  192. package/dist/browser/combobox.js +3 -0
  193. package/dist/browser/composer.js +4 -0
  194. package/dist/browser/content-item.js +3 -0
  195. package/dist/browser/content-swap.js +3 -0
  196. package/dist/browser/corner-status.js +3 -0
  197. package/dist/browser/edge-activity-indicator.js +3 -0
  198. package/dist/browser/file-picker.js +3 -0
  199. package/dist/browser/framed-list.js +3 -0
  200. package/dist/browser/grid.js +3 -0
  201. package/dist/browser/icon-button.js +4 -0
  202. package/dist/browser/icon-toggle-button.js +4 -0
  203. package/dist/browser/list-action-row.js +2 -0
  204. package/dist/browser/list-header.js +3 -1
  205. package/dist/browser/list-item.js +1 -0
  206. package/dist/browser/nav-stack.js +11 -0
  207. package/dist/browser/popup-menu.js +3 -0
  208. package/dist/browser/row.js +3 -0
  209. package/dist/browser/segmented-control.js +0 -1
  210. package/dist/browser/select.js +2 -1
  211. package/dist/browser/spacer.js +3 -0
  212. package/dist/browser/split-button.js +5 -0
  213. package/dist/browser/split-view.js +13 -0
  214. package/dist/browser/state-banner.js +1 -0
  215. package/dist/browser/summary-row.js +3 -0
  216. package/dist/browser/surface-scaffold.js +3 -0
  217. package/dist/browser/tab-navigator.js +4 -0
  218. package/dist/browser/text.js +3 -0
  219. package/dist/browser/toolbar-control-group.js +1 -0
  220. package/dist/browser/workbench.js +14 -0
  221. package/dist/catalog-resources.d.ts +17 -1
  222. package/dist/catalog-resources.js +5 -5
  223. package/dist/catalog-resources.js.map +1 -1
  224. package/dist/catalog.d.ts +123 -121
  225. package/dist/catalog.js +598 -269
  226. package/dist/catalog.js.map +1 -1
  227. package/dist/chip.d.ts +69 -0
  228. package/dist/chip.js +3 -0
  229. package/dist/chip.js.map +1 -0
  230. package/dist/choice-chips.d.ts +82 -0
  231. package/dist/choice-chips.js +3 -0
  232. package/dist/choice-chips.js.map +1 -0
  233. package/dist/chunk-2GOCOLQL.js +270 -0
  234. package/dist/chunk-2GOCOLQL.js.map +1 -0
  235. package/dist/chunk-2MSPNRWJ.js +82 -0
  236. package/dist/chunk-2MSPNRWJ.js.map +1 -0
  237. package/dist/chunk-34U4ANDJ.js +119 -0
  238. package/dist/chunk-34U4ANDJ.js.map +1 -0
  239. package/dist/chunk-3GLYIIFR.js +230 -0
  240. package/dist/chunk-3GLYIIFR.js.map +1 -0
  241. package/dist/{chunk-Y6LYKFXY.js → chunk-3VXDSIBJ.js} +7 -4
  242. package/dist/chunk-3VXDSIBJ.js.map +1 -0
  243. package/dist/chunk-3WYREXW4.js +120 -0
  244. package/dist/chunk-3WYREXW4.js.map +1 -0
  245. package/dist/chunk-4UB5Z3ZZ.js +68 -0
  246. package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
  247. package/dist/chunk-6C6DLP3W.js +31 -0
  248. package/dist/chunk-6C6DLP3W.js.map +1 -0
  249. package/dist/chunk-7IUEBNCO.js +108 -0
  250. package/dist/chunk-7IUEBNCO.js.map +1 -0
  251. package/dist/{chunk-QO55FN2Y.js → chunk-AN5IWMTM.js} +7 -3
  252. package/dist/chunk-AN5IWMTM.js.map +1 -0
  253. package/dist/chunk-AV7CPAPT.js +82 -0
  254. package/dist/chunk-AV7CPAPT.js.map +1 -0
  255. package/dist/{chunk-PX3YSS5C.js → chunk-B53PS2LE.js} +5 -3
  256. package/dist/chunk-B53PS2LE.js.map +1 -0
  257. package/dist/chunk-CA7LNX3J.js +44 -0
  258. package/dist/chunk-CA7LNX3J.js.map +1 -0
  259. package/dist/chunk-CEJ5FK6G.js +288 -0
  260. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  261. package/dist/chunk-CMETHPKR.js +175 -0
  262. package/dist/chunk-CMETHPKR.js.map +1 -0
  263. package/dist/chunk-CMLPFIC5.js +46 -0
  264. package/dist/chunk-CMLPFIC5.js.map +1 -0
  265. package/dist/{chunk-RKVQEH4J.js → chunk-CVD5IZGB.js} +10 -5
  266. package/dist/chunk-CVD5IZGB.js.map +1 -0
  267. package/dist/chunk-CXZXHZTR.js +514 -0
  268. package/dist/chunk-CXZXHZTR.js.map +1 -0
  269. package/dist/chunk-D5RGM3XA.js +38 -0
  270. package/dist/chunk-D5RGM3XA.js.map +1 -0
  271. package/dist/{chunk-KWWR5VMS.js → chunk-DZJ4GBSP.js} +19 -5
  272. package/dist/chunk-DZJ4GBSP.js.map +1 -0
  273. package/dist/chunk-EIET4QLK.js +51 -0
  274. package/dist/chunk-EIET4QLK.js.map +1 -0
  275. package/dist/chunk-ELCMSQNJ.js +49 -0
  276. package/dist/chunk-ELCMSQNJ.js.map +1 -0
  277. package/dist/chunk-EOO6PYGF.js +162 -0
  278. package/dist/chunk-EOO6PYGF.js.map +1 -0
  279. package/dist/chunk-ETCWQLJV.js +85 -0
  280. package/dist/chunk-ETCWQLJV.js.map +1 -0
  281. package/dist/chunk-FDZNYD4C.js +138 -0
  282. package/dist/chunk-FDZNYD4C.js.map +1 -0
  283. package/dist/chunk-FR76ZJQC.js +90 -0
  284. package/dist/chunk-FR76ZJQC.js.map +1 -0
  285. package/dist/chunk-G3J7JDP6.js +29 -0
  286. package/dist/chunk-G3J7JDP6.js.map +1 -0
  287. package/dist/chunk-GS2QD3N7.js +14 -0
  288. package/dist/chunk-GS2QD3N7.js.map +1 -0
  289. package/dist/chunk-HGV7J4T6.js +86 -0
  290. package/dist/chunk-HGV7J4T6.js.map +1 -0
  291. package/dist/chunk-HLDRH23D.js +84 -0
  292. package/dist/chunk-HLDRH23D.js.map +1 -0
  293. package/dist/chunk-HQZYKJ56.js +302 -0
  294. package/dist/chunk-HQZYKJ56.js.map +1 -0
  295. package/dist/chunk-HZPHCSCS.js +95 -0
  296. package/dist/chunk-HZPHCSCS.js.map +1 -0
  297. package/dist/chunk-IKS72C6P.js +53 -0
  298. package/dist/chunk-IKS72C6P.js.map +1 -0
  299. package/dist/chunk-IM3GKYOG.js +202 -0
  300. package/dist/chunk-IM3GKYOG.js.map +1 -0
  301. package/dist/{chunk-JRKSK2HX.js → chunk-INI4WDWC.js} +53 -7
  302. package/dist/chunk-INI4WDWC.js.map +1 -0
  303. package/dist/chunk-IQSRHXZR.js +164 -0
  304. package/dist/chunk-IQSRHXZR.js.map +1 -0
  305. package/dist/{chunk-M7JBER5U.js → chunk-JOR5LGYE.js} +18 -4
  306. package/dist/chunk-JOR5LGYE.js.map +1 -0
  307. package/dist/chunk-K4AT3V3J.js +545 -0
  308. package/dist/chunk-K4AT3V3J.js.map +1 -0
  309. package/dist/chunk-KCS6NJ3O.js +82 -0
  310. package/dist/chunk-KCS6NJ3O.js.map +1 -0
  311. package/dist/{chunk-SRSJO5QE.js → chunk-KH4KEMSP.js} +34 -3
  312. package/dist/chunk-KH4KEMSP.js.map +1 -0
  313. package/dist/chunk-LL45C7BB.js +122 -0
  314. package/dist/chunk-LL45C7BB.js.map +1 -0
  315. package/dist/chunk-LOSRXZAH.js +100 -0
  316. package/dist/chunk-LOSRXZAH.js.map +1 -0
  317. package/dist/{chunk-7KEUJIIC.js → chunk-MF6ZUUJZ.js} +93 -11
  318. package/dist/chunk-MF6ZUUJZ.js.map +1 -0
  319. package/dist/chunk-MHMWQ7RB.js +19 -0
  320. package/dist/chunk-MHMWQ7RB.js.map +1 -0
  321. package/dist/chunk-MJ5RU6XT.js +173 -0
  322. package/dist/chunk-MJ5RU6XT.js.map +1 -0
  323. package/dist/chunk-MXNIVEVL.js +48 -0
  324. package/dist/chunk-MXNIVEVL.js.map +1 -0
  325. package/dist/{chunk-IJBSZ4NX.js → chunk-NS2TBYM4.js} +8 -5
  326. package/dist/chunk-NS2TBYM4.js.map +1 -0
  327. package/dist/chunk-PIVY32AE.js +140 -0
  328. package/dist/chunk-PIVY32AE.js.map +1 -0
  329. package/dist/chunk-PYBBYSZ3.js +526 -0
  330. package/dist/chunk-PYBBYSZ3.js.map +1 -0
  331. package/dist/chunk-QDSZTQXL.js +28 -0
  332. package/dist/chunk-QDSZTQXL.js.map +1 -0
  333. package/dist/chunk-QH5KOFNS.js +39 -0
  334. package/dist/chunk-QH5KOFNS.js.map +1 -0
  335. package/dist/chunk-QIG4IGUP.js +139 -0
  336. package/dist/chunk-QIG4IGUP.js.map +1 -0
  337. package/dist/chunk-QLA25V2K.js +493 -0
  338. package/dist/chunk-QLA25V2K.js.map +1 -0
  339. package/dist/chunk-QROYYGWU.js +52 -0
  340. package/dist/chunk-QROYYGWU.js.map +1 -0
  341. package/dist/chunk-QYMJHS4K.js +36 -0
  342. package/dist/chunk-QYMJHS4K.js.map +1 -0
  343. package/dist/chunk-RHD7RKGI.js +176 -0
  344. package/dist/chunk-RHD7RKGI.js.map +1 -0
  345. package/dist/chunk-S2XULQEK.js +52 -0
  346. package/dist/chunk-S2XULQEK.js.map +1 -0
  347. package/dist/{chunk-LPOMRC4C.js → chunk-S3ECMF23.js} +11 -3
  348. package/dist/chunk-S3ECMF23.js.map +1 -0
  349. package/dist/chunk-S4Y3YTAI.js +35 -0
  350. package/dist/chunk-S4Y3YTAI.js.map +1 -0
  351. package/dist/chunk-S4ZGTDSG.js +18 -0
  352. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  353. package/dist/{chunk-PSKN344N.js → chunk-T4WJ5VGP.js} +63 -12
  354. package/dist/chunk-T4WJ5VGP.js.map +1 -0
  355. package/dist/chunk-TDMHA7C3.js +251 -0
  356. package/dist/chunk-TDMHA7C3.js.map +1 -0
  357. package/dist/{chunk-Y45PPBDV.js → chunk-TGLUDQP2.js} +47 -14
  358. package/dist/chunk-TGLUDQP2.js.map +1 -0
  359. package/dist/chunk-TLMMFQWM.js +222 -0
  360. package/dist/chunk-TLMMFQWM.js.map +1 -0
  361. package/dist/chunk-U6QYTMDB.js +85 -0
  362. package/dist/chunk-U6QYTMDB.js.map +1 -0
  363. package/dist/chunk-UMKV7YVQ.js +20 -0
  364. package/dist/chunk-UMKV7YVQ.js.map +1 -0
  365. package/dist/chunk-VFYO3UGZ.js +45 -0
  366. package/dist/chunk-VFYO3UGZ.js.map +1 -0
  367. package/dist/chunk-W4IK7AWD.js +73 -0
  368. package/dist/chunk-W4IK7AWD.js.map +1 -0
  369. package/dist/chunk-WVS6CUCT.js +48 -0
  370. package/dist/chunk-WVS6CUCT.js.map +1 -0
  371. package/dist/chunk-Y6KT7ZTR.js +109 -0
  372. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  373. package/dist/chunk-YMUIQRWK.js +44 -0
  374. package/dist/chunk-YMUIQRWK.js.map +1 -0
  375. package/dist/chunk-YOA5W5ZH.js +807 -0
  376. package/dist/chunk-YOA5W5ZH.js.map +1 -0
  377. package/dist/chunk-YQ2AC4E2.js +59 -0
  378. package/dist/chunk-YQ2AC4E2.js.map +1 -0
  379. package/dist/chunk-ZKKO4MHC.js +25 -0
  380. package/dist/chunk-ZKKO4MHC.js.map +1 -0
  381. package/dist/chunk-ZNROKDSZ.js +54 -0
  382. package/dist/chunk-ZNROKDSZ.js.map +1 -0
  383. package/dist/collapsible-panel.d.ts +96 -17
  384. package/dist/collapsible-panel.js +104 -27
  385. package/dist/collapsible-panel.js.map +1 -1
  386. package/dist/column-track.d.ts +41 -0
  387. package/dist/column-track.js +4 -0
  388. package/dist/column-track.js.map +1 -0
  389. package/dist/combobox.d.ts +40 -0
  390. package/dist/combobox.js +3 -0
  391. package/dist/combobox.js.map +1 -0
  392. package/dist/composer.d.ts +62 -0
  393. package/dist/composer.js +5 -0
  394. package/dist/composer.js.map +1 -0
  395. package/dist/content-item.d.ts +116 -0
  396. package/dist/content-item.js +4 -0
  397. package/dist/content-item.js.map +1 -0
  398. package/dist/content-swap.d.ts +34 -0
  399. package/dist/content-swap.js +3 -0
  400. package/dist/content-swap.js.map +1 -0
  401. package/dist/corner-status.d.ts +36 -0
  402. package/dist/corner-status.js +3 -0
  403. package/dist/corner-status.js.map +1 -0
  404. package/dist/css-values.d.ts +127 -0
  405. package/dist/css-values.js +3 -0
  406. package/dist/css-values.js.map +1 -0
  407. package/dist/device-class.js +1 -1
  408. package/dist/device-class.js.map +1 -1
  409. package/dist/disclosure-arrow.d.ts +6 -1
  410. package/dist/disclosure-arrow.js +2 -1
  411. package/dist/edge-activity-indicator.d.ts +28 -0
  412. package/dist/edge-activity-indicator.js +3 -0
  413. package/dist/edge-activity-indicator.js.map +1 -0
  414. package/dist/empty-state.d.ts +5 -2
  415. package/dist/empty-state.js +2 -1
  416. package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
  417. package/dist/file-picker.d.ts +47 -0
  418. package/dist/file-picker.js +3 -0
  419. package/dist/file-picker.js.map +1 -0
  420. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  421. package/dist/floating-toolbar.d.ts +29 -6
  422. package/dist/floating-toolbar.js +1 -1
  423. package/dist/framed-list.d.ts +47 -0
  424. package/dist/framed-list.js +4 -0
  425. package/dist/framed-list.js.map +1 -0
  426. package/dist/grid.d.ts +58 -0
  427. package/dist/grid.js +6 -0
  428. package/dist/grid.js.map +1 -0
  429. package/dist/help-tags-register.d.ts +13 -0
  430. package/dist/help-tags-register.js +9 -0
  431. package/dist/help-tags-register.js.map +1 -0
  432. package/dist/icon-button.d.ts +46 -0
  433. package/dist/icon-button.js +6 -0
  434. package/dist/icon-button.js.map +1 -0
  435. package/dist/icon-toggle-button.d.ts +42 -0
  436. package/dist/icon-toggle-button.js +6 -0
  437. package/dist/icon-toggle-button.js.map +1 -0
  438. package/dist/index.d.ts +59 -20
  439. package/dist/index.js +66 -29
  440. package/dist/list-action-row.d.ts +69 -12
  441. package/dist/list-action-row.js +5 -1
  442. package/dist/list-header.d.ts +36 -2
  443. package/dist/list-header.js +4 -1
  444. package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
  445. package/dist/list-inset-control.d.ts +10 -4
  446. package/dist/list-inset-control.js +1 -1
  447. package/dist/list-inset-text.d.ts +17 -12
  448. package/dist/list-inset-text.js +2 -1
  449. package/dist/list-item.d.ts +49 -5
  450. package/dist/list-item.js +4 -1
  451. package/dist/list.d.ts +121 -12
  452. package/dist/list.js +5 -1
  453. package/dist/loading-spinner.d.ts +12 -2
  454. package/dist/loading-spinner.js +2 -1
  455. package/dist/lucide-icon.d.ts +15 -3
  456. package/dist/lucide-icon.js +2 -1
  457. package/dist/nav-stack-VXTumzKa.d.ts +158 -0
  458. package/dist/nav-stack.d.ts +15 -38
  459. package/dist/nav-stack.js +13 -1
  460. package/dist/pane.d.ts +111 -7
  461. package/dist/pane.js +2 -1
  462. package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
  463. package/dist/popup-menu-register.d.ts +10 -0
  464. package/dist/popup-menu-register.js +336 -0
  465. package/dist/popup-menu-register.js.map +1 -0
  466. package/dist/popup-menu.d.ts +125 -0
  467. package/dist/popup-menu.js +3 -0
  468. package/dist/popup-menu.js.map +1 -0
  469. package/dist/resizable-region.d.ts +32 -3
  470. package/dist/resizable-region.js +1 -1
  471. package/dist/row.d.ts +53 -0
  472. package/dist/row.js +7 -0
  473. package/dist/row.js.map +1 -0
  474. package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
  475. package/dist/segmented-control.d.ts +7 -4
  476. package/dist/segmented-control.js +1 -2
  477. package/dist/select-register.js +255 -3
  478. package/dist/select-register.js.map +1 -1
  479. package/dist/select.d.ts +95 -6
  480. package/dist/select.js +4 -1
  481. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  482. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  483. package/dist/sides-BPSWde0A.d.ts +4 -0
  484. package/dist/skeleton.d.ts +14 -7
  485. package/dist/skeleton.js +2 -1
  486. package/dist/spacer.d.ts +18 -0
  487. package/dist/spacer.js +4 -0
  488. package/dist/spacer.js.map +1 -0
  489. package/dist/split-button.d.ts +57 -0
  490. package/dist/split-button.js +7 -0
  491. package/dist/split-button.js.map +1 -0
  492. package/dist/split-view.d.ts +63 -6
  493. package/dist/split-view.js +88 -9
  494. package/dist/split-view.js.map +1 -1
  495. package/dist/state-banner.d.ts +37 -6
  496. package/dist/state-banner.js +4 -1
  497. package/dist/styles/anchored-surface.css +41 -0
  498. package/dist/styles/app-tab.css +232 -0
  499. package/dist/styles/badge.css +145 -0
  500. package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
  501. package/dist/styles/catalog/components/catalog-example.css +204 -0
  502. package/dist/styles/catalog/components/catalog-stage.css +61 -0
  503. package/dist/styles/catalog/components/catalog.css +26 -0
  504. package/dist/styles/catalog.css +5 -575
  505. package/dist/styles/chip.css +208 -0
  506. package/dist/styles/choice-chips.css +154 -0
  507. package/dist/styles/collapsible-panel.css +450 -16
  508. package/dist/styles/column-track.css +57 -0
  509. package/dist/styles/combobox.css +113 -0
  510. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  511. package/dist/styles/components/actions/icon-button/icon-button.css +22 -0
  512. package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +83 -0
  513. package/dist/styles/components/actions/popup-menu/popup-menu.css +370 -0
  514. package/dist/styles/components/actions/split-button/split-button.css +95 -0
  515. package/dist/styles/components/actions/toolbar/toolbar.css +443 -0
  516. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1069 -0
  517. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +269 -0
  518. package/dist/styles/components/collections/framed-list/framed-list.css +47 -0
  519. package/dist/styles/components/collections/list/list.css +250 -0
  520. package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
  521. package/dist/styles/components/collections/list-header/list-header.css +229 -0
  522. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  523. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  524. package/dist/styles/components/collections/list-item/list-item.css +461 -0
  525. package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
  526. package/dist/styles/components/data-display/value-table/value-table.css +183 -0
  527. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +41 -0
  528. package/dist/styles/components/feedback/badge/badge.css +145 -0
  529. package/dist/styles/components/feedback/chip/chip.css +208 -0
  530. package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
  531. package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
  532. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  533. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  534. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  535. package/dist/styles/components/feedback/state-banner/state-banner.css +297 -0
  536. package/dist/styles/components/forms/choice-chips/choice-chips.css +154 -0
  537. package/dist/styles/components/forms/combobox/combobox.css +113 -0
  538. package/dist/styles/components/forms/composer/composer.css +100 -0
  539. package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
  540. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  541. package/dist/styles/components/forms/select/select.css +455 -0
  542. package/dist/styles/components/forms/token-search-field/token-search-field.css +432 -0
  543. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
  544. package/dist/styles/components/layout/column-track/column-track.css +57 -0
  545. package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
  546. package/dist/styles/components/layout/grid/grid.css +88 -0
  547. package/dist/styles/components/layout/pane/pane.css +382 -0
  548. package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
  549. package/dist/styles/components/layout/row/row.css +114 -0
  550. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  551. package/dist/styles/components/layout/split-view/split-view.css +146 -0
  552. package/dist/styles/components/layout/workbench/workbench.css +1086 -0
  553. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  554. package/dist/styles/components/navigation/app-tab/app-tab.css +384 -0
  555. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
  556. package/dist/styles/components/navigation/nav-stack/nav-stack.css +342 -0
  557. package/dist/styles/components/navigation/tab-bar/tab-bar.css +197 -0
  558. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +325 -0
  559. package/dist/styles/components/surfaces/content-item/content-item.css +138 -0
  560. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +31 -0
  561. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +425 -0
  562. package/dist/styles/components/typography/text/text.css +220 -0
  563. package/dist/styles/composer.css +100 -0
  564. package/dist/styles/content-item.css +138 -0
  565. package/dist/styles/content-swap.css +154 -0
  566. package/dist/styles/corner-status.css +60 -0
  567. package/dist/styles/document.css +98 -0
  568. package/dist/styles/edge-activity-indicator.css +127 -0
  569. package/dist/styles/file-picker.css +81 -0
  570. package/dist/styles/floating-toolbar.css +87 -6
  571. package/dist/styles/foundation.css +254 -53
  572. package/dist/styles/framed-list.css +47 -0
  573. package/dist/styles/grid.css +88 -0
  574. package/dist/styles/icon-button.css +22 -0
  575. package/dist/styles/icon-toggle-button.css +83 -0
  576. package/dist/styles/layout.css +1 -21
  577. package/dist/styles/list-action-row.css +323 -17
  578. package/dist/styles/list-header.css +128 -59
  579. package/dist/styles/list-inset-control.css +25 -2
  580. package/dist/styles/list-inset-text.css +27 -12
  581. package/dist/styles/list-item.css +371 -33
  582. package/dist/styles/list.css +214 -7
  583. package/dist/styles/loading-spinner.css +4 -0
  584. package/dist/styles/lucide-icon.css +9 -0
  585. package/dist/styles/nav-stack.css +280 -49
  586. package/dist/styles/pane.css +322 -2
  587. package/dist/styles/popup-menu.css +370 -0
  588. package/dist/styles/resizable-region.css +438 -4
  589. package/dist/styles/row.css +114 -0
  590. package/dist/styles/segmented-control.css +34 -3
  591. package/dist/styles/select.css +338 -23
  592. package/dist/styles/skeleton.css +64 -3
  593. package/dist/styles/spacer.css +11 -0
  594. package/dist/styles/split-button.css +95 -0
  595. package/dist/styles/split-view.css +114 -3
  596. package/dist/styles/state-banner.css +141 -42
  597. package/dist/styles/styles.css +22 -1
  598. package/dist/styles/summary-row.css +161 -0
  599. package/dist/styles/sunken-panel.css +13 -4
  600. package/dist/styles/surface-scaffold.css +425 -0
  601. package/dist/styles/tab-bar.css +161 -9
  602. package/dist/styles/tab-navigator.css +325 -0
  603. package/dist/styles/text.css +220 -0
  604. package/dist/styles/token-search-field.css +202 -59
  605. package/dist/styles/toolbar-control-group.css +886 -42
  606. package/dist/styles/toolbar-text.css +184 -7
  607. package/dist/styles/toolbar.css +363 -17
  608. package/dist/styles/value-table.css +115 -7
  609. package/dist/styles/webawesome.css +282 -20
  610. package/dist/styles/workbench.css +999 -7
  611. package/dist/summary-row.d.ts +56 -0
  612. package/dist/summary-row.js +4 -0
  613. package/dist/summary-row.js.map +1 -0
  614. package/dist/sunken-panel.d.ts +23 -4
  615. package/dist/sunken-panel.js +2 -1
  616. package/dist/surface-scaffold-register.d.ts +9 -0
  617. package/dist/surface-scaffold-register.js +151 -0
  618. package/dist/surface-scaffold-register.js.map +1 -0
  619. package/dist/surface-scaffold.d.ts +170 -0
  620. package/dist/surface-scaffold.js +4 -0
  621. package/dist/surface-scaffold.js.map +1 -0
  622. package/dist/tab-bar.d.ts +31 -6
  623. package/dist/tab-bar.js +1 -1
  624. package/dist/tab-navigator.d.ts +114 -0
  625. package/dist/tab-navigator.js +102 -0
  626. package/dist/tab-navigator.js.map +1 -0
  627. package/dist/text.d.ts +98 -0
  628. package/dist/text.js +3 -0
  629. package/dist/text.js.map +1 -0
  630. package/dist/token-search-field.d.ts +3 -59
  631. package/dist/token-search-field.js +2 -1
  632. package/dist/token-search-model-aYR0YAei.d.ts +184 -0
  633. package/dist/token-search-model.d.ts +3 -0
  634. package/dist/token-search-model.js +3 -0
  635. package/dist/token-search-model.js.map +1 -0
  636. package/dist/toolbar-control-group.d.ts +87 -4
  637. package/dist/toolbar-control-group.js +3 -1
  638. package/dist/toolbar-text.d.ts +46 -12
  639. package/dist/toolbar-text.js +2 -1
  640. package/dist/toolbar.d.ts +71 -9
  641. package/dist/toolbar.js +1 -1
  642. package/dist/types-CVgIwSdq.d.ts +189 -0
  643. package/dist/value-table.d.ts +30 -4
  644. package/dist/value-table.js +2 -1
  645. package/dist/webawesome.d.ts +8 -1
  646. package/dist/wire-catalog.d.ts +88 -13
  647. package/dist/wire-catalog.js +240 -206
  648. package/dist/wire-catalog.js.map +1 -1
  649. package/dist/wire-comboboxes.d.ts +26 -0
  650. package/dist/wire-comboboxes.js +3 -0
  651. package/dist/wire-comboboxes.js.map +1 -0
  652. package/dist/wire-composers.d.ts +16 -0
  653. package/dist/wire-composers.js +3 -0
  654. package/dist/wire-composers.js.map +1 -0
  655. package/dist/wire-content-items.d.ts +11 -0
  656. package/dist/wire-content-items.js +139 -0
  657. package/dist/wire-content-items.js.map +1 -0
  658. package/dist/wire-corner-status.d.ts +11 -0
  659. package/dist/wire-corner-status.js +3 -0
  660. package/dist/wire-corner-status.js.map +1 -0
  661. package/dist/wire-file-pickers.d.ts +26 -0
  662. package/dist/wire-file-pickers.js +3 -0
  663. package/dist/wire-file-pickers.js.map +1 -0
  664. package/dist/wire-list-focus-scroll.d.ts +16 -0
  665. package/dist/wire-list-focus-scroll.js +3 -0
  666. package/dist/wire-list-focus-scroll.js.map +1 -0
  667. package/dist/wire-list-reorder.d.ts +41 -0
  668. package/dist/wire-list-reorder.js +3 -0
  669. package/dist/wire-list-reorder.js.map +1 -0
  670. package/dist/wire-nav-stack.d.ts +4 -1
  671. package/dist/wire-nav-stack.js +312 -16
  672. package/dist/wire-nav-stack.js.map +1 -1
  673. package/dist/wire-resizable-regions.d.ts +2 -1
  674. package/dist/wire-resizable-regions.js +2 -1
  675. package/dist/wire-scroll-dividers.d.ts +87 -0
  676. package/dist/wire-scroll-dividers.js +3 -0
  677. package/dist/wire-scroll-dividers.js.map +1 -0
  678. package/dist/wire-sidebar.d.ts +24 -4
  679. package/dist/wire-sidebar.js +122 -19
  680. package/dist/wire-sidebar.js.map +1 -1
  681. package/dist/wire-tab-bars.d.ts +1 -0
  682. package/dist/wire-tab-bars.js +1 -1
  683. package/dist/wire-tab-navigator.d.ts +13 -0
  684. package/dist/wire-tab-navigator.js +153 -0
  685. package/dist/wire-tab-navigator.js.map +1 -0
  686. package/dist/wire-token-search-fields.d.ts +5 -1
  687. package/dist/wire-token-search-fields.js +2 -1
  688. package/dist/wire-toolbar-visibility.d.ts +13 -0
  689. package/dist/wire-toolbar-visibility.js +3 -0
  690. package/dist/wire-toolbar-visibility.js.map +1 -0
  691. package/dist/wire-workbench.d.ts +116 -0
  692. package/dist/wire-workbench.js +6 -0
  693. package/dist/wire-workbench.js.map +1 -0
  694. package/dist/workbench.d.ts +253 -10
  695. package/dist/workbench.js +20 -62
  696. package/dist/workbench.js.map +1 -1
  697. package/docs/accessibility.md +617 -32
  698. package/docs/anchored-surface.md +101 -0
  699. package/docs/app-layouts.md +159 -10
  700. package/docs/apple-hig.md +2 -0
  701. package/docs/catalog.md +403 -110
  702. package/docs/collapsible-panel.md +272 -16
  703. package/docs/component-contract.md +700 -79
  704. package/docs/component-integration.md +75 -0
  705. package/docs/component-selection.md +908 -79
  706. package/docs/composer.md +143 -0
  707. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  708. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  709. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  710. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  711. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
  712. package/docs/design/templates/choice-chips/multiple.svg +1 -0
  713. package/docs/design/templates/choice-chips-dark.svg +1 -0
  714. package/docs/design/templates/choice-chips.svg +1 -0
  715. package/docs/design/templates/composer/chat-dark.svg +1 -0
  716. package/docs/design/templates/composer/chat.svg +1 -0
  717. package/docs/design/templates/composer/prompt-dark.svg +1 -0
  718. package/docs/design/templates/composer/prompt.svg +1 -0
  719. package/docs/design/templates/composer-dark.svg +1 -0
  720. package/docs/design/templates/composer.svg +1 -0
  721. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  722. package/docs/design/templates/empty-state/filtered.svg +1 -1
  723. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  724. package/docs/design/templates/empty-state/with-action.svg +1 -1
  725. package/docs/design/templates/empty-state-dark.svg +1 -1
  726. package/docs/design/templates/empty-state.svg +1 -1
  727. package/docs/design/templates/list/compact-dark.svg +1 -1
  728. package/docs/design/templates/list/compact.svg +1 -1
  729. package/docs/design/templates/list/stack-dark.svg +1 -1
  730. package/docs/design/templates/list/stack.svg +1 -1
  731. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  732. package/docs/design/templates/list-action-row/default.svg +1 -1
  733. package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
  734. package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
  735. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  736. package/docs/design/templates/list-action-row/selected.svg +1 -1
  737. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  738. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  739. package/docs/design/templates/list-action-row-dark.svg +1 -1
  740. package/docs/design/templates/list-action-row.svg +1 -1
  741. package/docs/design/templates/list-dark.svg +1 -1
  742. package/docs/design/templates/list-header/action-dark.svg +1 -1
  743. package/docs/design/templates/list-header/action.svg +1 -1
  744. package/docs/design/templates/list-header/count-dark.svg +1 -1
  745. package/docs/design/templates/list-header/count.svg +1 -1
  746. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  747. package/docs/design/templates/list-header/inline-action.svg +1 -0
  748. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  749. package/docs/design/templates/list-header/size-l.svg +1 -0
  750. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  751. package/docs/design/templates/list-header/size-m.svg +1 -0
  752. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  753. package/docs/design/templates/list-header/size-xl.svg +1 -0
  754. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  755. package/docs/design/templates/list-header/size-xs.svg +1 -0
  756. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  757. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  758. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  759. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  760. package/docs/design/templates/list-header-dark.svg +1 -1
  761. package/docs/design/templates/list-header.svg +1 -1
  762. package/docs/design/templates/list-item/default-dark.svg +1 -1
  763. package/docs/design/templates/list-item/default.svg +1 -1
  764. package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
  765. package/docs/design/templates/list-item/icon-tile.svg +1 -0
  766. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  767. package/docs/design/templates/list-item/multiline.svg +1 -1
  768. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  769. package/docs/design/templates/list-item/selected.svg +1 -1
  770. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  771. package/docs/design/templates/list-item/trailing.svg +1 -1
  772. package/docs/design/templates/list-item-dark.svg +1 -1
  773. package/docs/design/templates/list-item.svg +1 -1
  774. package/docs/design/templates/list.svg +1 -1
  775. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  776. package/docs/design/templates/segmented-control/equal.svg +1 -1
  777. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  778. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  779. package/docs/design/templates/segmented-control-dark.svg +1 -1
  780. package/docs/design/templates/segmented-control.svg +1 -1
  781. package/docs/design/templates/skeleton-dark.svg +1 -1
  782. package/docs/design/templates/skeleton.svg +1 -1
  783. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  784. package/docs/design/templates/state-banner/danger.svg +1 -1
  785. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
  786. package/docs/design/templates/state-banner/info-badge.svg +1 -1
  787. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  788. package/docs/design/templates/state-banner/info.svg +1 -1
  789. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  790. package/docs/design/templates/state-banner/strip.svg +1 -0
  791. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  792. package/docs/design/templates/state-banner/success.svg +1 -1
  793. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  794. package/docs/design/templates/state-banner/warning.svg +1 -1
  795. package/docs/design/templates/state-banner-dark.svg +1 -1
  796. package/docs/design/templates/state-banner.svg +1 -1
  797. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  798. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  799. package/docs/design/templates/tab-bar-dark.svg +1 -1
  800. package/docs/design/templates/tab-bar.svg +1 -1
  801. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  802. package/docs/design/templates/token-search-field/empty.svg +1 -1
  803. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
  804. package/docs/design/templates/token-search-field/tokens.svg +1 -1
  805. package/docs/design/templates/token-search-field-dark.svg +1 -1
  806. package/docs/design/templates/token-search-field.svg +1 -1
  807. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  808. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  809. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  810. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  811. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  812. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  813. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  814. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  815. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  816. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  817. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  818. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  819. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  820. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  821. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  822. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  823. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  824. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  825. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  826. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  827. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  828. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  829. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  830. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  831. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  832. package/docs/design/templates/toolbar-control-group.svg +1 -1
  833. package/docs/design/templates/toolbar-dark.svg +1 -1
  834. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  835. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  836. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  837. package/docs/design/templates/toolbar-text/default.svg +1 -1
  838. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  839. package/docs/design/templates/toolbar-text/large.svg +1 -1
  840. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  841. package/docs/design/templates/toolbar-text/small.svg +1 -1
  842. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  843. package/docs/design/templates/toolbar-text.svg +1 -1
  844. package/docs/design/templates/toolbar.svg +1 -1
  845. package/docs/design/templates/value-table/details-dark.svg +1 -1
  846. package/docs/design/templates/value-table/details.svg +1 -1
  847. package/docs/design/templates/value-table-dark.svg +1 -1
  848. package/docs/design/templates/value-table.svg +1 -1
  849. package/docs/design/templates.md +19 -9
  850. package/docs/design-philosophy.md +58 -11
  851. package/docs/device-class.md +2 -1
  852. package/docs/document-baseline.md +93 -0
  853. package/docs/examples/application-ui-profile.json +8 -8
  854. package/docs/examples/command-palette-adapter.tsx +9 -7
  855. package/docs/examples/component-catalog-extension.json +8 -1
  856. package/docs/examples/{component-catalog-extension-v2.json → component-composition-extension.json} +8 -9
  857. package/docs/layout.md +764 -40
  858. package/docs/nav-stack.md +275 -11
  859. package/docs/recipes.md +125 -69
  860. package/docs/split-view.md +94 -5
  861. package/docs/sunken-panel.md +54 -1
  862. package/docs/surface-scaffold.md +270 -0
  863. package/docs/tab-navigator.md +255 -0
  864. package/docs/type-contracts.md +57 -22
  865. package/docs/ui-analyzer.md +334 -14
  866. package/docs/ui-doctor.md +207 -10
  867. package/docs/ui-evaluator.md +17 -0
  868. package/docs/ux-demo.md +47 -16
  869. package/docs/webawesome-theme.md +148 -14
  870. package/docs/workbench.md +600 -11
  871. package/docs/writing.md +152 -0
  872. package/doctor/cli.mjs +5 -0
  873. package/doctor/component-style-checks.mjs +457 -0
  874. package/doctor/config.schema.json +26 -0
  875. package/doctor/copy-capitalization-checks.mjs +591 -0
  876. package/doctor/eslint-diagnostics.d.mts +16 -0
  877. package/doctor/eslint-diagnostics.mjs +17 -0
  878. package/doctor/index.d.mts +6 -0
  879. package/doctor/index.mjs +214 -47
  880. package/evaluator/index.mjs +73 -8
  881. package/llms.txt +702 -56
  882. package/package.json +256 -25
  883. package/scripts/component-catalog-extension-validation.mjs +28 -0
  884. package/traversal-exclusions.mjs +60 -1
  885. package/ux-demo/recipes/app-shell.tsx +181 -189
  886. package/ux-demo/recipes/collapsible-sidebar.tsx +177 -139
  887. package/ux-demo/recipes/compact-toolbar.tsx +120 -101
  888. package/ux-demo/recipes/composer-form.tsx +86 -62
  889. package/ux-demo/recipes/list-detail-dialog.tsx +219 -114
  890. package/ux-demo/recipes/list-workspace-states.tsx +95 -80
  891. package/ux-demo/recipes/loaders.ts +5 -2
  892. package/ux-demo/recipes/loading-inspector.tsx +157 -117
  893. package/ux-demo/recipes/mount-recipe.ts +0 -5
  894. package/ux-demo/recipes/navigation-sidebar.tsx +98 -83
  895. package/ux-demo/recipes/navigation-stack.tsx +42 -29
  896. package/ux-demo/recipes/types.ts +14 -1
  897. package/ux-demo/recipes/workspace-header.tsx +77 -51
  898. package/vite-ux-review.d.mts +83 -0
  899. package/vite-ux-review.mjs +120 -0
  900. package/ai/component-catalog-extension-v2.d.ts +0 -7
  901. package/ai/component-catalog-extension-v2.schema.json +0 -7
  902. package/ai/component-catalog-v2.d.ts +0 -67
  903. package/ai/component-catalog-v2.json +0 -4675
  904. package/ai/component-catalog-v2.schema.json +0 -246
  905. package/dist/browser/panel-header.js +0 -7
  906. package/dist/chunk-5VTB2BKP.js +0 -35
  907. package/dist/chunk-5VTB2BKP.js.map +0 -1
  908. package/dist/chunk-6WTETUZ6.js +0 -21
  909. package/dist/chunk-6WTETUZ6.js.map +0 -1
  910. package/dist/chunk-7KEUJIIC.js.map +0 -1
  911. package/dist/chunk-7XRDUG4Y.js +0 -58
  912. package/dist/chunk-7XRDUG4Y.js.map +0 -1
  913. package/dist/chunk-B3A3IVO5.js +0 -83
  914. package/dist/chunk-B3A3IVO5.js.map +0 -1
  915. package/dist/chunk-DPDBVKNA.js +0 -113
  916. package/dist/chunk-DPDBVKNA.js.map +0 -1
  917. package/dist/chunk-FEAMR7S4.js +0 -68
  918. package/dist/chunk-FEAMR7S4.js.map +0 -1
  919. package/dist/chunk-FEY65TBV.js +0 -15
  920. package/dist/chunk-FEY65TBV.js.map +0 -1
  921. package/dist/chunk-IJBSZ4NX.js.map +0 -1
  922. package/dist/chunk-J5BFYY7Q.js +0 -35
  923. package/dist/chunk-J5BFYY7Q.js.map +0 -1
  924. package/dist/chunk-JRKSK2HX.js.map +0 -1
  925. package/dist/chunk-KWWR5VMS.js.map +0 -1
  926. package/dist/chunk-LPOMRC4C.js.map +0 -1
  927. package/dist/chunk-M7JBER5U.js.map +0 -1
  928. package/dist/chunk-NENBUYX5.js +0 -79
  929. package/dist/chunk-NENBUYX5.js.map +0 -1
  930. package/dist/chunk-NWSEP5RT.js +0 -117
  931. package/dist/chunk-NWSEP5RT.js.map +0 -1
  932. package/dist/chunk-OJWWHFH3.js +0 -426
  933. package/dist/chunk-OJWWHFH3.js.map +0 -1
  934. package/dist/chunk-PSKN344N.js.map +0 -1
  935. package/dist/chunk-PX3YSS5C.js.map +0 -1
  936. package/dist/chunk-QO55FN2Y.js.map +0 -1
  937. package/dist/chunk-R7ZWUN64.js +0 -38
  938. package/dist/chunk-R7ZWUN64.js.map +0 -1
  939. package/dist/chunk-RKVQEH4J.js.map +0 -1
  940. package/dist/chunk-SRSJO5QE.js.map +0 -1
  941. package/dist/chunk-SYDMYBPG.js +0 -31
  942. package/dist/chunk-SYDMYBPG.js.map +0 -1
  943. package/dist/chunk-TB6DY7H5.js +0 -25
  944. package/dist/chunk-TB6DY7H5.js.map +0 -1
  945. package/dist/chunk-UFZKLBCF.js +0 -108
  946. package/dist/chunk-UFZKLBCF.js.map +0 -1
  947. package/dist/chunk-UKKSMZYT.js +0 -281
  948. package/dist/chunk-UKKSMZYT.js.map +0 -1
  949. package/dist/chunk-W2FK7ZNY.js +0 -26
  950. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  951. package/dist/chunk-W5L2JSBY.js +0 -40
  952. package/dist/chunk-W5L2JSBY.js.map +0 -1
  953. package/dist/chunk-Y45PPBDV.js.map +0 -1
  954. package/dist/chunk-Y6LYKFXY.js.map +0 -1
  955. package/dist/divider-sides-267FA7sY.d.ts +0 -4
  956. package/dist/panel-header.d.ts +0 -42
  957. package/dist/panel-header.js +0 -7
  958. package/dist/panel-header.js.map +0 -1
  959. package/dist/styles/panel-header.css +0 -64
  960. package/dist/styles/tab-scaffold.css +0 -84
  961. package/dist/tab-scaffold.d.ts +0 -30
  962. package/dist/tab-scaffold.js +0 -51
  963. package/dist/tab-scaffold.js.map +0 -1
  964. package/dist/wire-tab-scaffold.d.ts +0 -11
  965. package/dist/wire-tab-scaffold.js +0 -21
  966. package/dist/wire-tab-scaffold.js.map +0 -1
  967. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  968. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  969. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  970. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  971. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  972. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  973. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  974. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  975. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  976. package/docs/design/templates/panel-header/title-only.svg +0 -1
  977. package/docs/design/templates/panel-header-dark.svg +0 -1
  978. package/docs/design/templates/panel-header.svg +0 -1
  979. package/docs/tab-scaffold.md +0 -50
  980. package/ux-demo/recipes/recipes.css +0 -448
@@ -10,16 +10,36 @@
10
10
  --kui-toolbar-control-pressed-background: var(--kui-color-neutral-fill-loud);
11
11
  --kui-toolbar-control-pressed-border: var(--kui-color-neutral-border-loud);
12
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);
13
35
  display: inline-flex;
36
+ position: relative;
14
37
  height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
15
38
  min-width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
16
39
  padding: 1px;
17
40
  box-sizing: border-box;
18
41
  border: 1px solid var(--kui-toolbar-control-border);
19
- border-radius: var(
20
- --kui-toolbar-group-radius,
21
- var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
22
- );
42
+ border-radius: var(--kui-toolbar-group-radius);
23
43
  color: var(--kui-toolbar-control-color);
24
44
  background: var(--kui-toolbar-control-background);
25
45
  align-items: center;
@@ -27,18 +47,88 @@
27
47
  gap: 0;
28
48
  }
29
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
+ align-self: flex-start;
84
+ margin-block-start: max(
85
+ 0px,
86
+ calc(
87
+ (
88
+ var(--_kui-toolbar-band) -
89
+ var(--kui-toolbar-group-size, calc(2px + 2.625rem))
90
+ ) /
91
+ 2
92
+ )
93
+ );
94
+ }
95
+
96
+ .kui-toolbar-control-group[data-visibility="compact-only"] {
97
+ display: none;
98
+ }
99
+
100
+ @container kui-toolbar (max-width: 44rem) {
101
+ .kui-toolbar-control-group[data-visibility="compact-only"] {
102
+ display: inline-flex;
103
+ }
104
+ }
105
+
106
+ @container kui-toolbar (max-width: 14rem) {
107
+ .kui-toolbar-control-group[data-visibility="hide-collapsed-tiny"][data-expanded="false"] {
108
+ display: none;
109
+ }
110
+ }
111
+
112
+ /* An expanded trailing control owns the compact row when sibling groups opt
113
+ into yielding. Scoping to the trailing zone keeps independent center and
114
+ leading controls visible, and the siblings return when it closes. */
115
+ @container kui-toolbar (max-width: 30rem) {
116
+ .kui-toolbar__trailing:has(> .kui-toolbar-control-group[data-expanded="true"])
117
+ > .kui-toolbar-control-group[data-visibility="yield-to-expanded-sibling"]:not(
118
+ [data-expanded="true"]
119
+ ) {
120
+ display: none;
121
+ }
122
+ }
123
+
30
124
  /* `shape="rounded"` swaps the default pill radius for the design system's softer
31
- rounded-rectangle radius on both the group and its items (custom properties
32
- inherit to the item rules that read them). */
125
+ rounded rectangle. The shared highlight contract derives every inner hover or
126
+ selected surface from this outer radius and the group's full inset. */
33
127
  .kui-toolbar-control-group[data-shape="rounded"] {
34
128
  --kui-toolbar-group-radius: var(
35
129
  --kui-layout-rounded-radius,
36
130
  calc(1px + 0.6875rem)
37
131
  );
38
- --kui-toolbar-item-radius: var(
39
- --kui-layout-rounded-radius,
40
- calc(1px + 0.6875rem)
41
- );
42
132
  }
43
133
 
44
134
  .kui-toolbar-control-group[data-tone="dark"] {
@@ -49,11 +139,239 @@
49
139
  );
50
140
  --kui-toolbar-control-border: var(--kui-toolbar-control-dark-border, #353536);
51
141
  --kui-toolbar-control-color: var(--kui-color-neutral-on-loud);
142
+ /* A 14% surface wash over the loud fill: visible hover feedback that keeps
143
+ the on-loud icon above 3:1 over a light page (about 3.4:1; a 28% wash
144
+ measured 2.7:1) and well above it in dark (about 5.8:1). */
52
145
  --kui-toolbar-control-hover-background: color-mix(
53
146
  in srgb,
54
- var(--kui-color-surface) 28%,
147
+ var(--kui-color-surface) 14%,
148
+ transparent
149
+ );
150
+ }
151
+ .kui-toolbar-control-group[data-size="compact"] {
152
+ --kui-toolbar-group-size: 2.125rem;
153
+ --_kui-toolbar-control-group-slot-height: 2rem;
154
+ --_kui-toolbar-control-group-slot-overlap: 1px;
155
+ --_kui-toolbar-control-group-slot-radius: max(
156
+ 0px,
157
+ calc(var(--kui-toolbar-group-radius) - 1px)
158
+ );
159
+ gap: 4px; /* Compensating for -2px margins */
160
+ }
161
+ .kui-toolbar-control-group[data-density="tight"] {
162
+ --kui-layout-item-padding: 0.3125rem;
163
+ }
164
+ .kui-toolbar-control-group[data-overflow="scroll"] {
165
+ max-width: 100%;
166
+ overflow-x: auto;
167
+ }
168
+ .kui-toolbar-control-group[data-overflow="wrap"] {
169
+ max-width: 100%;
170
+ height: auto;
171
+ flex-wrap: wrap;
172
+ }
173
+ :is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing)
174
+ > .kui-toolbar-control-group[data-overflow="wrap"] {
175
+ margin-block-start: 0;
176
+ align-self: center;
177
+ }
178
+ .kui-toolbar-control-group[data-content="search"] {
179
+ /* The group owns the open/close width motion, and a collapsible search
180
+ inside follows it on every frame (no second, lagging width transition,
181
+ which left an empty band). For the length of the opening it also asks the
182
+ search to keep its query on one line, so the group's clip reveals the
183
+ query instead of re-wrapping it every frame (KF-CXQB30). */
184
+ --_kui-toolbar-group-search-width-duration: 0s;
185
+ --_kui-toolbar-group-search-reveal-duration: 0.25s;
186
+ width: min(var(--kui-token-search-expanded-width, 30rem), 100%);
187
+ max-width: 100%;
188
+ height: auto;
189
+ min-width: 0;
190
+ overflow: hidden;
191
+ flex: 0 1 auto;
192
+ transition:
193
+ width 0.25s ease,
194
+ background-color 0.2s ease,
195
+ border-color 0.2s ease;
196
+ }
197
+
198
+ .kui-toolbar-control-group[data-content="search"]:has(
199
+ > .kui-token-search[data-expanded="true"][data-fill="true"]
200
+ ) {
201
+ width: 100%;
202
+ flex: 1 1 auto;
203
+ }
204
+
205
+ .kui-toolbar-control-group[data-content="search"]:has(
206
+ .kui-token-search__suggestions
207
+ ) {
208
+ overflow: visible;
209
+ }
210
+ .kui-toolbar-control-group[data-content="search"][data-expanded="true"][data-expanded-overflow="visible"] {
211
+ height: auto;
212
+ overflow: visible;
213
+ }
214
+ .kui-toolbar-control-group[data-content="search"][data-expanded="false"] {
215
+ width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
216
+ flex: 0 0 auto;
217
+ }
218
+
219
+ .kui-toolbar-control-group[data-content="search"]:has(
220
+ > .kui-token-search[data-expanded="false"][data-fill="true"]
221
+ ) {
222
+ width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
223
+ flex: 0 0 auto;
224
+ }
225
+
226
+ .kui-toolbar-control-group[data-sizing="grow"][data-expanded="true"] {
227
+ --_kui-toolbar-group-grow-search-width: 100%;
228
+ /* The grown group's content-box width at its basis (basis minus the 1px
229
+ border and 1px padding on each side). A collapsible search lays its editor
230
+ out at least this wide while the group's flex size animates open, so the
231
+ clipped query is revealed rather than re-wrapped every frame (KF-50K0JM). */
232
+ --_kui-toolbar-group-grow-search-min-width: calc(
233
+ var(--kui-toolbar-group-grow-basis, 19rem) - 4px
234
+ );
235
+ width: auto;
236
+ min-width: var(--kui-toolbar-group-grow-basis, 19rem);
237
+ flex: 1 1 var(--kui-toolbar-group-grow-basis, 19rem);
238
+ }
239
+
240
+ /* A grow search animates its flex size, not `width`: an expanded grow group's
241
+ `width: auto` cannot interpolate, so it used to snap open while the search
242
+ inside animated, leaving an empty band (KF-50K0JM). The collapsed state names
243
+ a definite basis and minimum so all three flex lengths interpolate. */
244
+ .kui-toolbar-control-group[data-content="search"][data-sizing="grow"] {
245
+ /* The group's flex size owns this motion; its basis-wide minimum (above)
246
+ already keeps the query on one line. */
247
+ --_kui-toolbar-group-search-reveal-duration: 0s;
248
+ transition-property:
249
+ width, flex-basis, flex-grow, min-width, background-color, border-color;
250
+ transition-duration: 0.25s, 0.25s, 0.25s, 0.25s, 0.2s, 0.2s;
251
+ transition-timing-function: ease;
252
+ }
253
+ .kui-toolbar-control-group[data-content="search"][data-sizing="grow"][data-expanded="false"] {
254
+ min-width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
255
+ flex: 0 0 var(--kui-toolbar-group-size, calc(2px + 2.625rem));
256
+ }
257
+ .kui-toolbar-control-group[data-sizing="fill"] {
258
+ width: 100%;
259
+ min-width: 0;
260
+ flex: 1 1 100%;
261
+ }
262
+
263
+ /* Auto margin consumes the free space before this group on its flex line;
264
+ when the expanded fill search takes a whole line, the margin resolves to 0. */
265
+ .kui-toolbar[data-responsive="stack"]
266
+ > :is(.kui-toolbar__center, .kui-toolbar__trailing)
267
+ > .kui-toolbar-control-group[data-placement="end"] {
268
+ margin-inline-start: auto;
269
+ }
270
+
271
+ /* A fill search crosses from the preceding control line to its own line.
272
+ Move its visual down one control band as it opens without changing layout. */
273
+ .kui-toolbar[data-responsive="stack"]
274
+ > :is(.kui-toolbar__center, .kui-toolbar__trailing)
275
+ > .kui-toolbar-control-group[data-content="search"][data-sizing="fill"][data-expanded="true"] {
276
+ animation: kui-toolbar-fill-search-enter 0.25s ease-out both;
277
+ }
278
+
279
+ @keyframes kui-toolbar-fill-search-enter {
280
+ from {
281
+ transform: translateY(
282
+ calc(
283
+ -1 * (var(--_kui-toolbar-band) + var(--kui-toolbar-gap, 0.5rem))
284
+ )
285
+ );
286
+ }
287
+ to {
288
+ transform: translateY(0);
289
+ }
290
+ }
291
+
292
+ @container kui-toolbar (max-width: 30rem) {
293
+ .kui-toolbar-control-group[data-sizing="grow"][data-expanded="true"] {
294
+ --_kui-toolbar-group-grow-search-min-width: 0px;
295
+ width: 100%;
296
+ min-width: 0;
297
+ flex: 1 1 100%;
298
+ }
299
+
300
+ /* Here the grown search takes its own line. Animating its basis would push
301
+ the trailing siblings and then jump the group to the next line mid-way, so
302
+ it opens and closes in one frame with the search filling it. */
303
+ .kui-toolbar-control-group[data-content="search"][data-sizing="grow"] {
304
+ transition-property: background-color, border-color;
305
+ transition-duration: 0.2s;
306
+ }
307
+ }
308
+ .kui-toolbar-control-group[data-content="text"]
309
+ > :is(
310
+ button,
311
+ wa-button:not(:where(.kui-icon-button)),
312
+ .kui-toolbar-action-link
313
+ ),
314
+ .kui-toolbar-control-group[data-content="mixed"]
315
+ > :is(
316
+ button,
317
+ wa-button:not(:where(.kui-icon-button)),
318
+ .kui-toolbar-action-link
319
+ ) {
320
+ min-width: max-content;
321
+ }
322
+ .kui-toolbar-control-group[data-content="mixed"] > button {
323
+ display: flex;
324
+ gap: var(--kui-space-xs);
325
+ }
326
+ .kui-toolbar-control-group[data-content="mixed"]
327
+ wa-button:not(:where(.kui-popup-menu > *, .kui-icon-button)) {
328
+ line-height: normal;
329
+ }
330
+ /* Toolbar controls never wrap. Web Awesome's label part is a plain block, so a
331
+ slotted icon (a block SVG) and its text would otherwise stack vertically —
332
+ lay them out on one row the way native mixed buttons already are. */
333
+ .kui-toolbar-control-group
334
+ wa-button:not(:where(.kui-popup-menu > *, .kui-icon-button))::part(label) {
335
+ display: inline-flex;
336
+ align-items: center;
337
+ gap: var(--kui-space-xs);
338
+ white-space: nowrap;
339
+ }
340
+ .kui-toolbar-control-group[data-content="avatar"][data-scrim="true"] {
341
+ --kui-toolbar-control-background: color-mix(
342
+ in srgb,
343
+ var(--kui-color-neutral-fill-loud) 64%,
55
344
  transparent
56
345
  );
346
+ --kui-toolbar-control-color: var(--kui-color-neutral-on-loud);
347
+ }
348
+ .kui-toolbar-control-group[data-selected-tone="neutral"] {
349
+ --kui-toolbar-control-selected-color: var(--kui-color-neutral-on-normal);
350
+ --kui-toolbar-control-selected-background: var(
351
+ --kui-color-neutral-fill-normal
352
+ );
353
+ }
354
+ .kui-toolbar-control-group[data-selected-tone="pop"] {
355
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
356
+ }
357
+ .kui-toolbar-control-group[data-selected-chrome="filled"] {
358
+ --kui-toolbar-control-selected-shadow: none;
359
+ --kui-toolbar-control-selected-border: transparent;
360
+ --kui-toolbar-control-selected-background: var(--kui-color-brand-fill-normal);
361
+ --kui-toolbar-control-selected-color: var(--kui-color-brand-on-normal);
362
+ }
363
+ .kui-toolbar-control-group[data-selected-chrome="outline"] {
364
+ --kui-toolbar-control-selected-shadow: none;
365
+ --kui-toolbar-control-selected-background: transparent;
366
+ --kui-toolbar-control-selected-border: var(--kui-color-brand-border-normal);
367
+ }
368
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="filled"] {
369
+ --kui-toolbar-control-selected-background: var(--kui-color-pop-fill-normal);
370
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-normal);
371
+ }
372
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="outline"] {
373
+ --kui-toolbar-control-selected-border: var(--kui-color-pop-border-normal);
374
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
57
375
  }
58
376
 
59
377
  .kui-toolbar-control-group[data-appearance="borderless"] {
@@ -69,9 +387,71 @@
69
387
  background: transparent;
70
388
  }
71
389
 
72
- .kui-toolbar-control-group > :is(button, wa-button, wa-dropdown) {
390
+ /* In overlay NavStack chrome (`chromePresentation="overlay"`), an overlay
391
+ NavStack bottom toolbar (`bottomToolbarPresentation="overlay"`), cross-fading
392
+ copies included, an overlay Pane header (`headerPresentation="overlay"`), or
393
+ a DialogSurface floating header's actions (`headerPresentation="floating"`),
394
+ the group sits on the translucent chrome material with arbitrary content
395
+ scrolling beneath it. Its quiet control color over its own translucent fill
396
+ falls below AA there over the worst-case backdrop (about 3.0:1 in light
397
+ over black, 3.5:1 in dark over white), so an untoned group's controls take
398
+ the normal text color (well above 4.5:1 in both), as an untoned
399
+ ToolbarText's title does. A dark-toned group (or an avatar scrim) keeps its
400
+ own loud colors. */
401
+ .kui-pane[data-header-presentation="overlay"]
402
+ > .kui-pane__header
403
+ .kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]),
404
+ .kui-dialog-surface[data-header-presentation="floating"]
405
+ > wa-dialog
406
+ > .kui-toolbar-control-group[slot="header-actions"]:not(
407
+ [data-tone="dark"],
408
+ [data-scrim="true"]
409
+ ),
410
+ .kui-dialog-surface[data-header-presentation="floating"]
411
+ > wa-dialog
412
+ > [slot="header-actions"]
413
+ .kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]),
414
+ .kui-nav-stack[data-chrome-presentation="overlay"]
415
+ > .kui-nav-stack__chrome
416
+ .kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]),
417
+ .kui-nav-stack[data-bottom-toolbar-presentation="overlay"]
418
+ > .kui-nav-stack__bottom
419
+ .kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]) {
420
+ --kui-toolbar-control-color: var(--kui-color-text);
421
+ }
422
+
423
+ /* `selectedChrome="none"`: a pressed control paints like its unpressed
424
+ neighbors, for an icon-state toggle whose glyph already shows the state.
425
+ One button opts out alone with `data-selected-chrome="none"`. After the
426
+ tone and appearance rules above, so it wins over their selected fills. */
427
+ .kui-toolbar-control-group[data-selected-chrome="none"],
428
+ .kui-toolbar-control-group
429
+ > :is(
430
+ button,
431
+ wa-button:not(:where(.kui-icon-button))
432
+ )[data-selected-chrome="none"] {
433
+ --kui-toolbar-control-selected-shadow: none;
434
+ --kui-toolbar-control-selected-border: transparent;
435
+ --kui-toolbar-control-selected-background: transparent;
436
+ --kui-toolbar-control-selected-color: var(--kui-toolbar-control-color);
437
+ }
438
+
439
+ /* The group lays out its own native and raw Web Awesome children. A composed
440
+ PopupMenu (`wa-dropdown.kui-popup-menu`) or Select sizes itself in the
441
+ group's context from its own stylesheet (popup-menu.css, select.css); the
442
+ group names those children by class only to key its own state on them. */
443
+ .kui-toolbar-control-group
444
+ > :is(
445
+ button,
446
+ wa-button:not(:where(.kui-icon-button)),
447
+ .kui-toolbar-action-link
448
+ ),
449
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu) {
73
450
  flex: 0 0 auto;
74
451
  }
452
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu) {
453
+ display: inline-flex;
454
+ }
75
455
 
76
456
  .kui-toolbar-control-group > button {
77
457
  appearance: none;
@@ -92,35 +472,202 @@
92
472
  place-items: center;
93
473
  }
94
474
 
95
- .kui-toolbar-control-group > button:hover {
475
+ /* A native button that is disabled, or kept focusable with aria-disabled,
476
+ dims and drops hover chrome. */
477
+ .kui-toolbar-control-group > button:is(:disabled, [aria-disabled="true"]) {
478
+ opacity: 0.5;
479
+ cursor: not-allowed;
480
+ }
481
+
482
+ .kui-toolbar-control-group
483
+ > button:not(:disabled, [aria-disabled="true"]):hover {
96
484
  border-color: var(--kui-toolbar-control-border);
97
485
  background: var(--kui-toolbar-control-hover-background);
98
486
  }
99
487
 
488
+ .kui-toolbar-control-group > .kui-toolbar-action-link {
489
+ position: relative;
490
+ display: inline-flex;
491
+ min-width: 2.5rem;
492
+ height: 2.5rem;
493
+ padding-inline: var(--kui-layout-item-padding, 0.5rem);
494
+ box-sizing: border-box;
495
+ border: 1px solid transparent;
496
+ border-radius: var(
497
+ --kui-toolbar-item-radius,
498
+ var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
499
+ );
500
+ color: inherit;
501
+ background: transparent;
502
+ align-items: center;
503
+ justify-content: center;
504
+ gap: var(--kui-space-2xs);
505
+ text-decoration: none;
506
+ white-space: nowrap;
507
+ }
508
+
509
+ .kui-toolbar-control-group > .kui-toolbar-action-link:hover {
510
+ border-color: var(--kui-toolbar-control-border);
511
+ background: var(--kui-toolbar-control-hover-background);
512
+ }
513
+
514
+ .kui-toolbar-action-link code {
515
+ position: absolute;
516
+ inset-block-start: 0;
517
+ inset-inline-start: 0;
518
+ width: 1px;
519
+ height: 1px;
520
+ padding: 0;
521
+ overflow: hidden;
522
+ border: 0;
523
+ clip-path: inset(50%);
524
+ white-space: nowrap;
525
+ }
526
+
527
+ /* An icon tile: a non-interactive icon placed directly in a group (a panel
528
+ heading's identity glyph) takes the same 40px slot and 16px visual as an
529
+ icon button, so it centers in the group and lines up with button icons,
530
+ without a hover surface or a focusable control that does nothing. */
531
+ .kui-toolbar-control-group > svg {
532
+ display: block;
533
+ width: 1rem;
534
+ height: 1rem;
535
+ padding: 0.75rem;
536
+ box-sizing: content-box;
537
+ flex: 0 0 auto;
538
+ }
539
+
100
540
  .kui-toolbar-control-group > button svg,
101
- .kui-toolbar-control-group wa-button > svg {
541
+ .kui-toolbar-control-group
542
+ wa-button:not(:where(.kui-popup-menu > *, .kui-icon-button))
543
+ > svg,
544
+ .kui-toolbar-control-group > .kui-toolbar-action-link svg {
102
545
  display: block;
103
546
  width: 1rem;
104
547
  height: 1rem;
105
548
  }
106
549
 
107
- .kui-toolbar-control-group > wa-button,
108
- .kui-toolbar-control-group > wa-dropdown,
109
- .kui-toolbar-control-group > wa-dropdown > wa-button,
110
- .kui-toolbar-control-group > wa-dropdown > wa-button::part(base) {
550
+ /* Nested Web Awesome buttons take the group's control height, not the theme's
551
+ 44px standalone control height. The group's `wa-button` rules style only raw
552
+ buttons: a composed PopupMenu's trigger (`.kui-popup-menu > wa-button`) is
553
+ excluded inside a zero-specificity `:where()` and takes the same metrics
554
+ from popup-menu.css. */
555
+ .kui-toolbar-control-group
556
+ wa-button:not(:where(.kui-popup-menu > *, .kui-icon-button)) {
557
+ --wa-form-control-height: 2.5rem;
558
+ }
559
+ .kui-toolbar-control-group[data-size="compact"]
560
+ wa-button:not(:where(.kui-popup-menu > *, .kui-icon-button)) {
561
+ --wa-form-control-height: 2rem;
562
+ }
563
+
564
+ .kui-toolbar-control-group > wa-button:not(:where(.kui-icon-button)),
565
+ .kui-toolbar-control-group > wa-dropdown:not(.kui-popup-menu),
566
+ .kui-toolbar-control-group
567
+ > wa-dropdown:not(.kui-popup-menu)
568
+ > wa-button:not(:where(.kui-icon-button)),
569
+ .kui-toolbar-control-group
570
+ > wa-dropdown:not(.kui-popup-menu)
571
+ > wa-button:not(:where(.kui-icon-button))::part(base) {
111
572
  min-width: 2.5rem;
112
573
  height: 2.5rem;
113
574
  }
575
+ .kui-toolbar-control-group[data-size="compact"] > button,
576
+ .kui-toolbar-control-group[data-size="compact"] > .kui-toolbar-action-link,
577
+ .kui-toolbar-control-group[data-size="compact"]
578
+ > wa-button:not(:where(.kui-icon-button)),
579
+ .kui-toolbar-control-group[data-size="compact"]
580
+ > wa-dropdown:not(.kui-popup-menu),
581
+ .kui-toolbar-control-group[data-size="compact"]
582
+ > wa-dropdown:not(.kui-popup-menu)
583
+ > wa-button:not(:where(.kui-icon-button)),
584
+ .kui-toolbar-control-group[data-size="compact"]
585
+ > wa-dropdown:not(.kui-popup-menu)
586
+ > wa-button:not(:where(.kui-icon-button))::part(base),
587
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
588
+ wa-dropdown:not(.kui-popup-menu)
589
+ wa-button:not(:where(.kui-icon-button)),
590
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
591
+ wa-dropdown:not(.kui-popup-menu)
592
+ wa-button:not(:where(.kui-icon-button))::part(base) {
593
+ min-width: 2rem;
594
+ height: 2rem;
595
+ min-height: 2rem;
596
+ }
597
+
598
+ /* A compact icon button is a 32px circle like its compact wa-button and
599
+ Select siblings; the default 8px inline padding around a 16px icon made its
600
+ selected highlight a 34x32 oval. */
601
+ .kui-toolbar-control-group[data-size="compact"][data-content="icon"] > button {
602
+ padding-inline: 0;
603
+ }
604
+
605
+ /* `standard` keeps each menu's own standard inset: a raw wa-dropdown takes the
606
+ 8px surface inset, while a PopupMenu keeps the Select listbox inset it
607
+ shares (popup-menu.css). The explicit compact and list-zero choices apply to
608
+ every nested menu; a PopupMenu applies them to itself (popup-menu.css). */
609
+ .kui-toolbar-control-group[data-menu-inset="standard"]
610
+ wa-dropdown:not(.kui-popup-menu)::part(menu) {
611
+ padding: var(--kui-wa-surface-inset, 0.5rem);
612
+ }
613
+ .kui-toolbar-control-group[data-menu-inset="compact"]
614
+ wa-dropdown:not(.kui-popup-menu)::part(menu) {
615
+ padding: 0.25rem;
616
+ }
617
+ .kui-toolbar-control-group[data-menu-inset="list-zero"]
618
+ wa-dropdown:not(.kui-popup-menu)::part(menu) {
619
+ padding: 0;
620
+ }
621
+
622
+ /* Compact mixed controls keep the default horizontal breathing room. Their
623
+ raised selection grows over the group's own border instead of becoming a
624
+ smaller inset lozenge, while negative margins keep the outer geometry and
625
+ neighboring trigger position stable. */
626
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"] {
627
+ --kui-layout-item-padding: 0.5rem;
628
+ }
629
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
630
+ > button[aria-pressed="true"] {
631
+ position: relative;
632
+ z-index: 1;
633
+ height: var(--kui-toolbar-group-size);
634
+ margin: -2px;
635
+ border-radius: var(--kui-toolbar-group-radius);
636
+ }
637
+
638
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
639
+ > wa-dropdown:not(.kui-popup-menu),
640
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
641
+ > wa-button:not(:where(.kui-icon-button)) {
642
+ margin: -2px;
643
+ }
644
+
645
+ /* A compact icon-only trigger may stay square, but a mixed-content dropdown
646
+ trigger must grow for its slotted label plus Web Awesome's caret. Otherwise
647
+ the fixed 32px base centers both outside its host, painting the label across
648
+ the separator and the caret beyond the group border. */
649
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
650
+ > wa-dropdown:not(.kui-popup-menu)
651
+ > wa-button:not(:where(.kui-icon-button)),
652
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
653
+ > wa-dropdown:not(.kui-popup-menu)
654
+ > wa-button:not(:where(.kui-icon-button))::part(base) {
655
+ min-width: max-content;
656
+ }
657
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
658
+ > wa-dropdown:not(.kui-popup-menu)
659
+ > wa-button:not(:where(.kui-icon-button))::part(base) {
660
+ width: max-content;
661
+ }
114
662
 
115
- .kui-toolbar-control-group[data-single="true"] > wa-dropdown,
116
- .kui-toolbar-control-group[data-single="true"] > wa-dropdown > wa-button,
117
663
  .kui-toolbar-control-group[data-single="true"]
118
- > wa-dropdown
119
- > wa-button::part(base) {
120
- width: 3rem;
664
+ > wa-dropdown:not(.kui-popup-menu)
665
+ > wa-button:not(:where(.kui-icon-button))::part(base) {
666
+ width: max-content;
121
667
  }
122
668
 
123
- .kui-toolbar-control-group wa-button {
669
+ .kui-toolbar-control-group
670
+ wa-button:not(:where(.kui-popup-menu > *, .kui-icon-button)) {
124
671
  display: inline-flex;
125
672
  line-height: 0;
126
673
  align-items: center;
@@ -128,7 +675,8 @@
128
675
  --wa-color-fill-quiet: transparent;
129
676
  }
130
677
 
131
- .kui-toolbar-control-group wa-button::part(base) {
678
+ .kui-toolbar-control-group
679
+ wa-button:not(:where(.kui-popup-menu > *, .kui-icon-button))::part(base) {
132
680
  /* Match min-width to the 40px height so an icon-only button's highlight is at
133
681
  least a circle, not a vertical oval — the host is 40px wide but the base
134
682
  part was sizing to its ~32px content. Text/caret buttons grow past it. */
@@ -142,45 +690,125 @@
142
690
  );
143
691
  }
144
692
 
145
- .kui-toolbar-control-group wa-button:hover::part(base) {
693
+ .kui-toolbar-control-group
694
+ wa-button:not(
695
+ :where(.kui-popup-menu > *, .kui-icon-button),
696
+ [disabled]
697
+ ):hover::part(base) {
146
698
  border-color: var(--kui-toolbar-control-border);
147
- background: var(--kui-toolbar-control-hover-background);
699
+ background-color: var(--kui-toolbar-control-hover-background);
148
700
  }
149
701
 
150
702
  .kui-toolbar-control-group[data-single="true"]:has(
151
- > :is(button, wa-button, wa-dropdown)
703
+ > :is(
704
+ button:not(:disabled, [aria-disabled="true"]),
705
+ wa-button:not([disabled]),
706
+ .kui-popup-menu,
707
+ wa-dropdown:not(.kui-popup-menu),
708
+ .kui-select,
709
+ .kui-toolbar-action-link
710
+ )
152
711
  ):hover {
153
- background: var(--kui-toolbar-control-hover-background);
712
+ background-color: var(--kui-toolbar-control-hover-background);
154
713
  }
155
714
 
156
- .kui-toolbar-control-group[data-single="true"] > :is(button, wa-button):hover,
157
- .kui-toolbar-control-group[data-single="true"] wa-button:hover::part(base) {
715
+ .kui-toolbar-control-group[data-single="true"]
716
+ > :is(
717
+ button,
718
+ wa-button:not(:where(.kui-icon-button)),
719
+ .kui-toolbar-action-link
720
+ ):hover,
721
+ .kui-toolbar-control-group[data-single="true"]
722
+ wa-button:not(
723
+ :where(.kui-popup-menu > *, .kui-icon-button),
724
+ [disabled]
725
+ ):hover::part(base) {
158
726
  border-color: transparent;
159
727
  background: transparent;
160
728
  }
161
729
 
162
730
  /* A group holding exactly one control behaves like `single` even without the
163
731
  flag: the whole group background changes on hover instead of highlighting an
164
- inner layer inset from the border (KF-J9P1ZD — a PanelHeader's lone Close/
732
+ inner layer inset from the border (KF-J9P1ZD — a heading toolbar's lone Close/
165
733
  Done action). */
166
734
  .kui-toolbar-control-group:not([data-single="true"]):has(
167
- > :is(button, wa-button):only-child
735
+ > :is(
736
+ button:not(:disabled, [aria-disabled="true"]),
737
+ wa-button:not([disabled]),
738
+ .kui-select,
739
+ .kui-toolbar-action-link
740
+ ):nth-child(1 of :where(:not([data-toolbar-visibility-state]))):where(
741
+ :nth-last-child(1 of :not([data-toolbar-visibility-state]))
742
+ )
168
743
  ):hover {
169
- background: var(--kui-toolbar-control-hover-background);
744
+ background-color: var(--kui-toolbar-control-hover-background);
170
745
  }
171
746
 
172
747
  .kui-toolbar-control-group:not([data-single="true"]):has(
173
- > :is(button, wa-button):only-child
748
+ > :is(
749
+ button,
750
+ wa-button:not(:where(.kui-icon-button)),
751
+ .kui-toolbar-action-link
752
+ ):nth-child(1 of :where(:not([data-toolbar-visibility-state]))):where(
753
+ :nth-last-child(1 of :not([data-toolbar-visibility-state]))
754
+ )
174
755
  )
175
- > :is(button, wa-button):hover,
756
+ > :is(
757
+ button,
758
+ wa-button:not(:where(.kui-icon-button)),
759
+ .kui-toolbar-action-link
760
+ ):hover,
176
761
  .kui-toolbar-control-group:not([data-single="true"]):has(
177
- > :is(button, wa-button):only-child
762
+ > :is(button, wa-button:not(:where(.kui-icon-button))):nth-child(
763
+ 1 of :where(:not([data-toolbar-visibility-state]))
764
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
178
765
  )
179
- wa-button:hover::part(base) {
766
+ > wa-button:not(:where(.kui-icon-button)):hover::part(base) {
180
767
  border-color: transparent;
181
768
  background: transparent;
182
769
  }
183
770
 
771
+ /* A lone control's hover replaces the whole group's fill (above). A dark
772
+ group's hover tint is a translucent surface wash meant to lie OVER its loud
773
+ fill, as it does on one control of a dark group; replacing the fill with it
774
+ left a near-white circle behind the dark tone's white icon on a light page
775
+ (about 1.3:1). So a dark lone group keeps its fill and paints the tint over
776
+ it as an image layer. Avatar groups paint their image as the background and
777
+ keep the plain rule. */
778
+ .kui-toolbar-control-group[data-tone="dark"][data-single="true"]:not(
779
+ [data-content="avatar"]
780
+ ):has(
781
+ > :is(
782
+ button:not(:disabled, [aria-disabled="true"]),
783
+ wa-button:not([disabled]),
784
+ .kui-popup-menu,
785
+ wa-dropdown:not(.kui-popup-menu),
786
+ .kui-select,
787
+ .kui-toolbar-action-link
788
+ )
789
+ ):hover,
790
+ .kui-toolbar-control-group[data-tone="dark"]:not(
791
+ [data-single="true"],
792
+ [data-content="avatar"]
793
+ ):has(
794
+ > :is(
795
+ button:not(:disabled, [aria-disabled="true"]),
796
+ wa-button:not([disabled]),
797
+ .kui-select,
798
+ .kui-toolbar-action-link
799
+ ):nth-child(1 of :where(:not([data-toolbar-visibility-state]))):where(
800
+ :nth-last-child(1 of :not([data-toolbar-visibility-state]))
801
+ )
802
+ ):hover {
803
+ background-color: var(--kui-toolbar-control-background);
804
+ background-image: linear-gradient(
805
+ var(--kui-toolbar-control-hover-background) 0 0
806
+ );
807
+ }
808
+
809
+ /* A toolbar Select beside other controls highlights its own pill on hover
810
+ (select.css); a lone Select instead lifts the whole group (above). */
811
+
184
812
  /* A plain <button> child paints its own box for the selected state. */
185
813
  .kui-toolbar-control-group[data-single="false"] > button[aria-pressed="true"] {
186
814
  border-color: var(--kui-toolbar-control-selected-border);
@@ -195,21 +823,92 @@
195
823
  and stays inside the group's border instead of overflowing it as an oversized
196
824
  square (KF-5BDDQ9). The selected text color rides on the host and inherits in. */
197
825
  .kui-toolbar-control-group[data-single="false"]
198
- > wa-button[aria-pressed="true"] {
826
+ > wa-button:not(:where(.kui-icon-button))[aria-pressed="true"] {
199
827
  color: var(--kui-toolbar-control-selected-color);
200
828
  }
201
829
  .kui-toolbar-control-group[data-single="false"]
202
- > wa-button[aria-pressed="true"]::part(base) {
830
+ > wa-button:not(:where(.kui-icon-button))[aria-pressed="true"]::part(base) {
203
831
  border-color: var(--kui-toolbar-control-selected-border);
204
832
  background: var(--kui-toolbar-control-selected-background);
205
833
  box-shadow: var(--kui-toolbar-control-selected-shadow);
206
834
  }
207
835
 
208
- .kui-toolbar-control-group > :is(button, wa-button):focus-visible {
836
+ .kui-toolbar-control-group
837
+ > :is(
838
+ button,
839
+ wa-button:not(:where(.kui-icon-button)),
840
+ .kui-toolbar-action-link
841
+ ):focus-visible {
209
842
  outline: var(--kui-focus-ring);
210
843
  outline-offset: 1px;
211
844
  }
212
845
 
846
+ /* With per-control rings, a composed Select paints its own ring (select.css). */
847
+
848
+ .kui-toolbar-control-group[data-focus-ring="outline"]:focus-within:not(
849
+ :where(
850
+ :has(
851
+ .kui-select[open],
852
+ .kui-popup-menu[open],
853
+ wa-dropdown:not(.kui-popup-menu)[open]
854
+ )
855
+ )
856
+ ) {
857
+ outline: var(--kui-focus-ring);
858
+ outline-offset: 1px;
859
+ }
860
+
861
+ .kui-toolbar-control-group[data-focus-ring="halo"]:focus-within:not(
862
+ :where(
863
+ :has(
864
+ .kui-select[open],
865
+ .kui-popup-menu[open],
866
+ wa-dropdown:not(.kui-popup-menu)[open]
867
+ )
868
+ )
869
+ ) {
870
+ border-color: var(--kui-color-text-link);
871
+ box-shadow: 0 0 0 3px
872
+ color-mix(in srgb, var(--kui-color-text-link) 22%, transparent);
873
+ }
874
+
875
+ /* A group-owned ring (outline or halo) is off while a Select listbox or a
876
+ PopupMenu inside the group is open: the open popup shows focus, as the
877
+ per-control Select and PopupMenu triggers already do, and the ring returns
878
+ when the popup closes with focus still in the group. The exclusion sits in
879
+ a forgiving :where(), so an engine without :has() keeps the ring.
880
+
881
+ Chromium and WebKit do not propagate :focus-within from a focused
882
+ light-DOM child through a host's popup shadow tree, so a focused light-DOM
883
+ descendant also owns the group ring. Kept as separate rules so an engine
884
+ without :has() keeps the :focus-within ring. */
885
+ .kui-toolbar-control-group[data-focus-ring="outline"]:has(:focus):not(
886
+ :where(
887
+ :has(
888
+ .kui-select[open],
889
+ .kui-popup-menu[open],
890
+ wa-dropdown:not(.kui-popup-menu)[open]
891
+ )
892
+ )
893
+ ) {
894
+ outline: var(--kui-focus-ring);
895
+ outline-offset: 1px;
896
+ }
897
+
898
+ .kui-toolbar-control-group[data-focus-ring="halo"]:has(:focus):not(
899
+ :where(
900
+ :has(
901
+ .kui-select[open],
902
+ .kui-popup-menu[open],
903
+ wa-dropdown:not(.kui-popup-menu)[open]
904
+ )
905
+ )
906
+ ) {
907
+ border-color: var(--kui-color-text-link);
908
+ box-shadow: 0 0 0 3px
909
+ color-mix(in srgb, var(--kui-color-text-link) 22%, transparent);
910
+ }
911
+
213
912
  .kui-toolbar-control-group[data-button-appearance="push"][data-single="true"]:has(
214
913
  > :is(button, wa-button)[aria-pressed="true"]
215
914
  ) {
@@ -220,6 +919,151 @@
220
919
  }
221
920
 
222
921
  .kui-toolbar-control-group[data-button-appearance="push"][data-single="true"]
223
- > :is(button, wa-button)[aria-pressed="true"] {
922
+ > :is(button, wa-button:not(:where(.kui-icon-button)))[aria-pressed="true"] {
224
923
  color: var(--kui-toolbar-control-pressed-color);
225
924
  }
925
+
926
+ @media (prefers-reduced-motion: reduce) {
927
+ .kui-toolbar-control-group[data-content="search"],
928
+ .kui-toolbar-control-group[data-content="search"][data-sizing="grow"] {
929
+ --_kui-toolbar-group-search-reveal-duration: 0s;
930
+ transition-duration: 0s;
931
+ }
932
+
933
+ .kui-toolbar[data-responsive="stack"]
934
+ > :is(.kui-toolbar__center, .kui-toolbar__trailing)
935
+ > .kui-toolbar-control-group[data-content="search"][data-sizing="fill"][data-expanded="true"] {
936
+ animation: none;
937
+ }
938
+ }
939
+
940
+ /* Avatar controls paint the image as chrome rather than inserting a replaced
941
+ <img> into the control. `background-size: contain` is the background-image
942
+ equivalent of `object-fit: contain`: the whole avatar remains visible. A
943
+ lone control belongs to the outer group surface; in a group of choices the
944
+ image belongs only to the selected highlight. */
945
+ .kui-toolbar-control-group[data-content="avatar"] {
946
+ background-origin: border-box;
947
+ background-position: center;
948
+ background-repeat: no-repeat;
949
+ background-size: contain;
950
+ }
951
+
952
+ .kui-toolbar-control-group[data-content="avatar"]:is(
953
+ [data-single="true"],
954
+ :has(
955
+ > :is(button, wa-button):nth-child(
956
+ 1 of :where(:not([data-toolbar-visibility-state]))
957
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
958
+ )
959
+ ) {
960
+ background-image: var(--kui-toolbar-avatar-image);
961
+ }
962
+
963
+ .kui-toolbar-control-group[data-content="avatar"]:is(
964
+ [data-single="true"],
965
+ :has(
966
+ > :is(button, wa-button:not(:where(.kui-icon-button))):nth-child(
967
+ 1 of :where(:not([data-toolbar-visibility-state]))
968
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
969
+ )
970
+ )
971
+ > :is(button, wa-button:not(:where(.kui-icon-button))) {
972
+ color: transparent;
973
+ }
974
+
975
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
976
+ :has(
977
+ > :is(button, wa-button:not(:where(.kui-icon-button))):nth-child(
978
+ 1 of :where(:not([data-toolbar-visibility-state]))
979
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
980
+ )
981
+ )
982
+ > button[aria-pressed="true"],
983
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
984
+ :has(
985
+ > :is(button, wa-button:not(:where(.kui-icon-button))):nth-child(
986
+ 1 of :where(:not([data-toolbar-visibility-state]))
987
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
988
+ )
989
+ )
990
+ > wa-button:not(:where(.kui-icon-button))[aria-pressed="true"]::part(base) {
991
+ color: transparent;
992
+ background-image: var(--kui-toolbar-avatar-image);
993
+ background-origin: border-box;
994
+ background-position: center;
995
+ background-repeat: no-repeat;
996
+ background-size: contain;
997
+ }
998
+
999
+ /* Explicit quiet palette only for a lone decorative icon tile. The structural
1000
+ guard keeps interactive, mixed and borderless groups on their existing chrome. */
1001
+
1002
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="neutral"]:has(
1003
+ > svg[aria-hidden="true"]
1004
+ ):not(
1005
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
1006
+ :has(> svg ~ svg)
1007
+ ) {
1008
+ background: var(--kui-color-neutral-fill-quiet);
1009
+ border-color: var(--kui-color-neutral-border-quiet);
1010
+ color: var(--kui-color-neutral-on-quiet);
1011
+ }
1012
+
1013
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="brand"]:has(
1014
+ > svg[aria-hidden="true"]
1015
+ ):not(
1016
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
1017
+ :has(> svg ~ svg)
1018
+ ) {
1019
+ background: var(--kui-color-brand-fill-quiet);
1020
+ border-color: var(--kui-color-brand-border-quiet);
1021
+ color: var(--kui-color-brand-on-quiet);
1022
+ }
1023
+
1024
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="success"]:has(
1025
+ > svg[aria-hidden="true"]
1026
+ ):not(
1027
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
1028
+ :has(> svg ~ svg)
1029
+ ) {
1030
+ background: var(--kui-color-success-fill-quiet);
1031
+ border-color: var(--kui-color-success-border-quiet);
1032
+ color: var(--kui-color-success-on-quiet);
1033
+ }
1034
+
1035
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="warning"]:has(
1036
+ > svg[aria-hidden="true"]
1037
+ ):not(
1038
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
1039
+ :has(> svg ~ svg)
1040
+ ) {
1041
+ background: var(--kui-color-warning-fill-quiet);
1042
+ border-color: var(--kui-color-warning-border-quiet);
1043
+ color: var(--kui-color-warning-on-quiet);
1044
+ }
1045
+
1046
+ .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="danger"]:has(
1047
+ > svg[aria-hidden="true"]
1048
+ ):not(
1049
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
1050
+ :has(> svg ~ svg)
1051
+ ) {
1052
+ background: var(--kui-color-danger-fill-quiet);
1053
+ border-color: var(--kui-color-danger-border-quiet);
1054
+ color: var(--kui-color-danger-on-quiet);
1055
+ }
1056
+ .kui-toolbar-control-group[data-toolbar-width-hidden="true"],
1057
+ .kui-toolbar-control-group__busy-status[data-toolbar-width-hidden="true"],
1058
+ .kui-toolbar-control-group:has(
1059
+ > [data-toolbar-visibility-state][data-toolbar-width-hidden="true"]
1060
+ ),
1061
+ .kui-toolbar-control-group__busy-status:has(
1062
+ > [data-toolbar-visibility-state][data-toolbar-width-hidden="true"]
1063
+ ) {
1064
+ display: none;
1065
+ }
1066
+ .kui-toolbar-control-group > [data-toolbar-visibility-state],
1067
+ .kui-toolbar-control-group__busy-status > [data-toolbar-visibility-state] {
1068
+ display: none;
1069
+ }