@kerfjs/ui 5.0.0-beta.10 → 5.0.0-beta.101

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