@kerfjs/ui 5.0.0-beta.4 → 5.0.0-beta.41

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 (498) hide show
  1. package/README.md +342 -108
  2. package/ai/application-ui-diagnostic-ids-v1.json +100 -0
  3. package/ai/application-ui-profile-sync.cjs +529 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +102 -0
  6. package/ai/application-ui-profile.defaults.json +41 -0
  7. package/ai/application-ui-profile.mjs +626 -0
  8. package/ai/application-ui-profile.schema.json +130 -0
  9. package/ai/catalog-authoring.json +25 -0
  10. package/ai/catalog-authoring.schema.json +61 -0
  11. package/ai/compile-time-contracts-v1.json +132 -0
  12. package/ai/compile-time-contracts-v1.schema.json +51 -0
  13. package/ai/component-catalog-extension-v2.d.ts +7 -0
  14. package/ai/component-catalog-extension-v2.schema.json +7 -0
  15. package/ai/component-catalog-extension.schema.json +79 -0
  16. package/ai/component-catalog-v2-overrides.json +496 -0
  17. package/ai/component-catalog-v2.d.ts +90 -0
  18. package/ai/component-catalog-v2.json +5678 -0
  19. package/ai/component-catalog-v2.schema.json +298 -0
  20. package/ai/component-catalog.json +2694 -417
  21. package/ai/component-catalog.schema.json +39 -0
  22. package/ai/public-api-signatures-v1.md +1591 -126
  23. package/ai/skill.md +140 -54
  24. package/ai/webawesome-jsx-signatures-v1.md +2 -1
  25. package/analyzer/cli.mjs +49 -0
  26. package/analyzer/index.d.mts +46 -0
  27. package/analyzer/index.mjs +1086 -0
  28. package/analyzer/report.schema.json +66 -0
  29. package/dist/app-tab.d.ts +15 -4
  30. package/dist/app-tab.js +3 -1
  31. package/dist/browser/app-tab.js +1 -0
  32. package/dist/browser/floating-toolbar.js +3 -0
  33. package/dist/browser/list-action-row.js +5 -0
  34. package/dist/browser/list-header.js +7 -0
  35. package/dist/browser/list-inset-control.js +3 -0
  36. package/dist/browser/list-inset-text.js +3 -0
  37. package/dist/browser/list-item.js +5 -0
  38. package/dist/browser/list.js +3 -0
  39. package/dist/browser/pane.js +3 -0
  40. package/dist/browser/row.js +3 -0
  41. package/dist/browser/segmented-control.js +1 -0
  42. package/dist/browser/select.js +1 -0
  43. package/dist/browser/skeleton.js +3 -0
  44. package/dist/browser/spacer.js +3 -0
  45. package/dist/browser/state-banner.js +1 -0
  46. package/dist/browser/sunken-panel.js +3 -0
  47. package/dist/browser/surface-scaffold.js +3 -0
  48. package/dist/browser/text.js +3 -0
  49. package/dist/browser/toolbar-text.js +1 -0
  50. package/dist/browser/value-table.js +1 -0
  51. package/dist/catalog-resources.d.ts +35 -0
  52. package/dist/catalog-resources.js +22 -0
  53. package/dist/catalog-resources.js.map +1 -0
  54. package/dist/catalog.d.ts +151 -0
  55. package/dist/catalog.js +396 -0
  56. package/dist/catalog.js.map +1 -0
  57. package/dist/chunk-2TYUFZUC.js +22 -0
  58. package/dist/chunk-2TYUFZUC.js.map +1 -0
  59. package/dist/chunk-6NDBE2OK.js +32 -0
  60. package/dist/chunk-6NDBE2OK.js.map +1 -0
  61. package/dist/chunk-6WTETUZ6.js +21 -0
  62. package/dist/chunk-6WTETUZ6.js.map +1 -0
  63. package/dist/chunk-AQFWBG23.js +83 -0
  64. package/dist/chunk-AQFWBG23.js.map +1 -0
  65. package/dist/chunk-B6JYRX3P.js +51 -0
  66. package/dist/chunk-B6JYRX3P.js.map +1 -0
  67. package/dist/chunk-C34NZOLJ.js +53 -0
  68. package/dist/chunk-C34NZOLJ.js.map +1 -0
  69. package/dist/chunk-CAB6NQ2T.js +102 -0
  70. package/dist/chunk-CAB6NQ2T.js.map +1 -0
  71. package/dist/chunk-CK6P5AUK.js +136 -0
  72. package/dist/chunk-CK6P5AUK.js.map +1 -0
  73. package/dist/chunk-DAO2VFTT.js +129 -0
  74. package/dist/chunk-DAO2VFTT.js.map +1 -0
  75. package/dist/chunk-DEYOGDE7.js +141 -0
  76. package/dist/chunk-DEYOGDE7.js.map +1 -0
  77. package/dist/chunk-DYBPI5O2.js +25 -0
  78. package/dist/chunk-DYBPI5O2.js.map +1 -0
  79. package/dist/{chunk-TRNBHPNW.js → chunk-E34TE2ZI.js} +12 -8
  80. package/dist/chunk-E34TE2ZI.js.map +1 -0
  81. package/dist/chunk-EYALJQQD.js +25 -0
  82. package/dist/chunk-EYALJQQD.js.map +1 -0
  83. package/dist/chunk-I45QO2IZ.js +88 -0
  84. package/dist/chunk-I45QO2IZ.js.map +1 -0
  85. package/dist/chunk-I4V3UDSA.js +79 -0
  86. package/dist/chunk-I4V3UDSA.js.map +1 -0
  87. package/dist/chunk-OGTJNHRG.js +42 -0
  88. package/dist/chunk-OGTJNHRG.js.map +1 -0
  89. package/dist/chunk-OL4TC3U2.js +156 -0
  90. package/dist/chunk-OL4TC3U2.js.map +1 -0
  91. package/dist/chunk-OMSRSL3B.js +120 -0
  92. package/dist/chunk-OMSRSL3B.js.map +1 -0
  93. package/dist/chunk-R3EBGEAW.js +46 -0
  94. package/dist/chunk-R3EBGEAW.js.map +1 -0
  95. package/dist/chunk-SOK5EUF7.js +25 -0
  96. package/dist/chunk-SOK5EUF7.js.map +1 -0
  97. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  98. package/dist/chunk-SRSJO5QE.js.map +1 -0
  99. package/dist/chunk-T7DOWS6T.js +61 -0
  100. package/dist/chunk-T7DOWS6T.js.map +1 -0
  101. package/dist/chunk-TIGSG6BX.js +218 -0
  102. package/dist/chunk-TIGSG6BX.js.map +1 -0
  103. package/dist/chunk-UDHHKZWO.js +41 -0
  104. package/dist/chunk-UDHHKZWO.js.map +1 -0
  105. package/dist/{chunk-MQIZAD4A.js → chunk-UKKSMZYT.js} +76 -22
  106. package/dist/chunk-UKKSMZYT.js.map +1 -0
  107. package/dist/chunk-V6GQKOX2.js +39 -0
  108. package/dist/chunk-V6GQKOX2.js.map +1 -0
  109. package/dist/chunk-V6HCTCVD.js +46 -0
  110. package/dist/chunk-V6HCTCVD.js.map +1 -0
  111. package/dist/chunk-VDUJZF5G.js +515 -0
  112. package/dist/chunk-VDUJZF5G.js.map +1 -0
  113. package/dist/chunk-VXFGMDA7.js +31 -0
  114. package/dist/chunk-VXFGMDA7.js.map +1 -0
  115. package/dist/chunk-WN52USHV.js +115 -0
  116. package/dist/chunk-WN52USHV.js.map +1 -0
  117. package/dist/chunk-WSXUPSID.js +43 -0
  118. package/dist/chunk-WSXUPSID.js.map +1 -0
  119. package/dist/chunk-X5GRDQ7V.js +50 -0
  120. package/dist/chunk-X5GRDQ7V.js.map +1 -0
  121. package/dist/{chunk-56RJXPHG.js → chunk-Y6LYKFXY.js} +1 -1
  122. package/dist/{chunk-56RJXPHG.js.map → chunk-Y6LYKFXY.js.map} +1 -1
  123. package/dist/chunk-ZASJJMGV.js +17 -0
  124. package/dist/chunk-ZASJJMGV.js.map +1 -0
  125. package/dist/chunk-ZPWZIVI6.js +47 -0
  126. package/dist/chunk-ZPWZIVI6.js.map +1 -0
  127. package/dist/collapsible-panel.d.ts +77 -0
  128. package/dist/collapsible-panel.js +84 -0
  129. package/dist/collapsible-panel.js.map +1 -0
  130. package/dist/css-values.d.ts +75 -0
  131. package/dist/css-values.js +3 -0
  132. package/dist/css-values.js.map +1 -0
  133. package/dist/device-class.d.ts +62 -0
  134. package/dist/device-class.js +103 -0
  135. package/dist/device-class.js.map +1 -0
  136. package/dist/disclosure-arrow.js +1 -1
  137. package/dist/divider-sides-BzB6rphT.d.ts +6 -0
  138. package/dist/empty-state.d.ts +3 -2
  139. package/dist/empty-state.js +1 -1
  140. package/dist/flex-alignment-CF8NLj7i.d.ts +4 -0
  141. package/dist/floating-toolbar.d.ts +29 -0
  142. package/dist/floating-toolbar.js +3 -0
  143. package/dist/floating-toolbar.js.map +1 -0
  144. package/dist/index.d.ts +28 -14
  145. package/dist/index.js +34 -23
  146. package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +19 -8
  147. package/dist/list-action-row.js +7 -0
  148. package/dist/list-action-row.js.map +1 -0
  149. package/dist/list-header.d.ts +80 -0
  150. package/dist/list-header.js +9 -0
  151. package/dist/list-header.js.map +1 -0
  152. package/dist/list-inset-control.d.ts +20 -0
  153. package/dist/list-inset-control.js +3 -0
  154. package/dist/list-inset-control.js.map +1 -0
  155. package/dist/list-inset-text.d.ts +29 -0
  156. package/dist/list-inset-text.js +3 -0
  157. package/dist/list-inset-text.js.map +1 -0
  158. package/dist/list-item.d.ts +45 -0
  159. package/dist/list-item.js +7 -0
  160. package/dist/list-item.js.map +1 -0
  161. package/dist/list.d.ts +30 -0
  162. package/dist/list.js +5 -0
  163. package/dist/list.js.map +1 -0
  164. package/dist/loading-spinner.js +1 -1
  165. package/dist/nav-stack.d.ts +41 -0
  166. package/dist/nav-stack.js +6 -0
  167. package/dist/nav-stack.js.map +1 -0
  168. package/dist/pane.d.ts +50 -0
  169. package/dist/pane.js +4 -0
  170. package/dist/pane.js.map +1 -0
  171. package/dist/resizable-region.d.ts +21 -3
  172. package/dist/resizable-region.js +1 -1
  173. package/dist/row.d.ts +28 -0
  174. package/dist/row.js +5 -0
  175. package/dist/row.js.map +1 -0
  176. package/dist/segmented-control.d.ts +11 -8
  177. package/dist/segmented-control.js +3 -1
  178. package/dist/select-register.d.ts +5 -1
  179. package/dist/select-register.js +129 -1
  180. package/dist/select-register.js.map +1 -1
  181. package/dist/select.d.ts +34 -8
  182. package/dist/select.js +3 -1
  183. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  184. package/dist/skeleton.d.ts +25 -0
  185. package/dist/skeleton.js +4 -0
  186. package/dist/skeleton.js.map +1 -0
  187. package/dist/spacer.d.ts +16 -0
  188. package/dist/spacer.js +4 -0
  189. package/dist/spacer.js.map +1 -0
  190. package/dist/split-view.d.ts +43 -0
  191. package/dist/split-view.js +82 -0
  192. package/dist/split-view.js.map +1 -0
  193. package/dist/state-banner.d.ts +11 -5
  194. package/dist/state-banner.js +3 -1
  195. package/dist/styles/app-tab.css +26 -0
  196. package/dist/styles/catalog.css +582 -0
  197. package/dist/styles/collapsible-panel.css +212 -0
  198. package/dist/styles/floating-toolbar.css +38 -0
  199. package/dist/styles/foundation.css +80 -0
  200. package/dist/styles/layout.css +2 -20
  201. package/dist/styles/list-action-row.css +224 -0
  202. package/dist/styles/list-header.css +224 -0
  203. package/dist/styles/list-inset-control.css +23 -0
  204. package/dist/styles/list-inset-text.css +30 -0
  205. package/dist/styles/list-item.css +171 -0
  206. package/dist/styles/list.css +118 -0
  207. package/dist/styles/nav-stack.css +141 -0
  208. package/dist/styles/pane.css +62 -0
  209. package/dist/styles/resizable-region.css +158 -0
  210. package/dist/styles/row.css +92 -0
  211. package/dist/styles/segmented-control.css +10 -7
  212. package/dist/styles/select.css +115 -2
  213. package/dist/styles/skeleton.css +31 -0
  214. package/dist/styles/spacer.css +11 -0
  215. package/dist/styles/split-view.css +35 -0
  216. package/dist/styles/state-banner.css +49 -10
  217. package/dist/styles/styles.css +10 -5
  218. package/dist/styles/sunken-panel.css +22 -0
  219. package/dist/styles/surface-scaffold.css +51 -0
  220. package/dist/styles/tab-bar.css +24 -0
  221. package/dist/styles/tab-scaffold.css +85 -0
  222. package/dist/styles/text.css +6 -0
  223. package/dist/styles/token-search-field.css +14 -2
  224. package/dist/styles/toolbar-control-group.css +235 -8
  225. package/dist/styles/toolbar-text.css +65 -2
  226. package/dist/styles/toolbar.css +47 -2
  227. package/dist/styles/webawesome.css +171 -0
  228. package/dist/styles/workbench.css +187 -0
  229. package/dist/sunken-panel.d.ts +20 -0
  230. package/dist/sunken-panel.js +3 -0
  231. package/dist/sunken-panel.js.map +1 -0
  232. package/dist/surface-scaffold.d.ts +26 -0
  233. package/dist/surface-scaffold.js +3 -0
  234. package/dist/surface-scaffold.js.map +1 -0
  235. package/dist/tab-bar.d.ts +24 -6
  236. package/dist/tab-bar.js +1 -1
  237. package/dist/tab-scaffold.d.ts +31 -0
  238. package/dist/tab-scaffold.js +51 -0
  239. package/dist/tab-scaffold.js.map +1 -0
  240. package/dist/text.d.ts +20 -0
  241. package/dist/text.js +3 -0
  242. package/dist/text.js.map +1 -0
  243. package/dist/token-search-field.d.ts +30 -13
  244. package/dist/token-search-field.js +1 -1
  245. package/dist/toolbar-control-group.d.ts +33 -7
  246. package/dist/toolbar-control-group.js +1 -1
  247. package/dist/toolbar-text.d.ts +31 -4
  248. package/dist/toolbar-text.js +3 -1
  249. package/dist/toolbar.d.ts +10 -7
  250. package/dist/toolbar.js +1 -1
  251. package/dist/value-table.d.ts +7 -3
  252. package/dist/value-table.js +3 -1
  253. package/dist/webawesome.d.ts +1 -0
  254. package/dist/wire-catalog.d.ts +57 -0
  255. package/dist/wire-catalog.js +302 -0
  256. package/dist/wire-catalog.js.map +1 -0
  257. package/dist/wire-nav-stack.d.ts +18 -0
  258. package/dist/wire-nav-stack.js +228 -0
  259. package/dist/wire-nav-stack.js.map +1 -0
  260. package/dist/wire-resizable-regions.d.ts +1 -1
  261. package/dist/wire-resizable-regions.js +1 -1
  262. package/dist/wire-sidebar.d.ts +48 -0
  263. package/dist/wire-sidebar.js +147 -0
  264. package/dist/wire-sidebar.js.map +1 -0
  265. package/dist/wire-tab-bars.d.ts +19 -2
  266. package/dist/wire-tab-bars.js +1 -1
  267. package/dist/wire-tab-scaffold.d.ts +11 -0
  268. package/dist/wire-tab-scaffold.js +21 -0
  269. package/dist/wire-tab-scaffold.js.map +1 -0
  270. package/dist/wire-token-search-fields.d.ts +104 -4
  271. package/dist/wire-token-search-fields.js +1 -1
  272. package/dist/workbench.d.ts +44 -0
  273. package/dist/workbench.js +106 -0
  274. package/dist/workbench.js.map +1 -0
  275. package/docs/accessibility.md +155 -20
  276. package/docs/app-layouts.md +61 -0
  277. package/docs/catalog.md +364 -0
  278. package/docs/collapsible-panel.md +142 -0
  279. package/docs/component-contract.md +258 -28
  280. package/docs/component-integration.md +63 -0
  281. package/docs/component-selection.md +219 -57
  282. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  283. package/docs/design/templates/empty-state/filtered.svg +1 -0
  284. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  285. package/docs/design/templates/empty-state/with-action.svg +1 -0
  286. package/docs/design/templates/empty-state-dark.svg +1 -0
  287. package/docs/design/templates/empty-state.svg +1 -0
  288. package/docs/design/templates/list/compact-dark.svg +1 -0
  289. package/docs/design/templates/list/compact.svg +1 -0
  290. package/docs/design/templates/list/stack-dark.svg +1 -0
  291. package/docs/design/templates/list/stack.svg +1 -0
  292. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  293. package/docs/design/templates/list-action-row/default.svg +1 -0
  294. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  295. package/docs/design/templates/list-action-row/selected.svg +1 -0
  296. package/docs/design/templates/list-action-row-dark.svg +1 -0
  297. package/docs/design/templates/list-action-row.svg +1 -0
  298. package/docs/design/templates/list-dark.svg +1 -0
  299. package/docs/design/templates/list-header/action-dark.svg +1 -0
  300. package/docs/design/templates/list-header/action.svg +1 -0
  301. package/docs/design/templates/list-header/count-dark.svg +1 -0
  302. package/docs/design/templates/list-header/count.svg +1 -0
  303. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  304. package/docs/design/templates/list-header/inline-action.svg +1 -0
  305. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  306. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  307. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  308. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  309. package/docs/design/templates/list-header-dark.svg +1 -0
  310. package/docs/design/templates/list-header.svg +1 -0
  311. package/docs/design/templates/list-item/default-dark.svg +1 -0
  312. package/docs/design/templates/list-item/default.svg +1 -0
  313. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  314. package/docs/design/templates/list-item/multiline.svg +1 -0
  315. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  316. package/docs/design/templates/list-item/selected.svg +1 -0
  317. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  318. package/docs/design/templates/list-item/trailing.svg +1 -0
  319. package/docs/design/templates/list-item-dark.svg +1 -0
  320. package/docs/design/templates/list-item.svg +1 -0
  321. package/docs/design/templates/list.svg +1 -0
  322. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  323. package/docs/design/templates/segmented-control/equal.svg +1 -0
  324. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  325. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  326. package/docs/design/templates/segmented-control-dark.svg +1 -0
  327. package/docs/design/templates/segmented-control.svg +1 -0
  328. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  329. package/docs/design/templates/skeleton/avatar.svg +1 -0
  330. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  331. package/docs/design/templates/skeleton/block.svg +1 -0
  332. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  333. package/docs/design/templates/skeleton/lines.svg +1 -0
  334. package/docs/design/templates/skeleton-dark.svg +1 -0
  335. package/docs/design/templates/skeleton.svg +1 -0
  336. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  337. package/docs/design/templates/state-banner/danger.svg +1 -0
  338. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  339. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  340. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  341. package/docs/design/templates/state-banner/info.svg +1 -0
  342. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  343. package/docs/design/templates/state-banner/success.svg +1 -0
  344. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  345. package/docs/design/templates/state-banner/warning.svg +1 -0
  346. package/docs/design/templates/state-banner-dark.svg +1 -0
  347. package/docs/design/templates/state-banner.svg +1 -0
  348. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  349. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  350. package/docs/design/templates/tab-bar-dark.svg +1 -0
  351. package/docs/design/templates/tab-bar.svg +1 -0
  352. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  353. package/docs/design/templates/token-search-field/empty.svg +1 -0
  354. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  355. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  356. package/docs/design/templates/token-search-field-dark.svg +1 -0
  357. package/docs/design/templates/token-search-field.svg +1 -0
  358. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  359. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  360. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  361. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  362. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  363. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  364. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  365. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  366. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  367. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  368. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  369. package/docs/design/templates/toolbar-control-group.svg +1 -0
  370. package/docs/design/templates/toolbar-dark.svg +1 -0
  371. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  372. package/docs/design/templates/toolbar-text/default.svg +1 -0
  373. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  374. package/docs/design/templates/toolbar-text/large.svg +1 -0
  375. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  376. package/docs/design/templates/toolbar-text/small.svg +1 -0
  377. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  378. package/docs/design/templates/toolbar-text.svg +1 -0
  379. package/docs/design/templates/toolbar.svg +1 -0
  380. package/docs/design/templates/value-table/details-dark.svg +1 -0
  381. package/docs/design/templates/value-table/details.svg +1 -0
  382. package/docs/design/templates/value-table-dark.svg +1 -0
  383. package/docs/design/templates/value-table.svg +1 -0
  384. package/docs/design/templates.md +128 -0
  385. package/docs/design-philosophy.md +33 -11
  386. package/docs/device-class.md +54 -0
  387. package/docs/examples/application-ui-profile.json +60 -0
  388. package/docs/examples/command-palette-adapter.tsx +68 -17
  389. package/docs/examples/component-catalog-extension-v2.json +80 -0
  390. package/docs/examples/component-catalog-extension.json +45 -0
  391. package/docs/layout.md +169 -38
  392. package/docs/nav-stack.md +77 -0
  393. package/docs/recipes.md +64 -16
  394. package/docs/split-view.md +55 -0
  395. package/docs/sunken-panel.md +53 -0
  396. package/docs/surface-scaffold.md +25 -0
  397. package/docs/tab-scaffold.md +52 -0
  398. package/docs/type-contracts.md +127 -0
  399. package/docs/ui-analyzer.md +118 -0
  400. package/docs/ui-doctor.md +91 -0
  401. package/docs/ui-evaluator.md +122 -0
  402. package/docs/ux-demo.md +29 -10
  403. package/docs/webawesome-theme.md +82 -8
  404. package/docs/workbench.md +123 -0
  405. package/doctor/cli.mjs +115 -0
  406. package/doctor/config.schema.json +68 -0
  407. package/doctor/eslint-diagnostics.d.mts +24 -0
  408. package/doctor/eslint-diagnostics.mjs +24 -0
  409. package/doctor/index.d.mts +116 -0
  410. package/doctor/index.mjs +1272 -0
  411. package/doctor/report.schema.json +118 -0
  412. package/evaluator/cli.mjs +89 -0
  413. package/evaluator/index.d.mts +90 -0
  414. package/evaluator/index.mjs +1138 -0
  415. package/evaluator/report.schema.json +152 -0
  416. package/llms.txt +260 -32
  417. package/package.json +205 -38
  418. package/traversal-exclusions.mjs +27 -0
  419. package/ux-demo/recipes/app-shell.tsx +223 -13
  420. package/ux-demo/recipes/collapsible-sidebar.tsx +230 -0
  421. package/ux-demo/recipes/compact-toolbar.tsx +116 -12
  422. package/ux-demo/recipes/composer-form.tsx +120 -19
  423. package/ux-demo/recipes/list-detail-dialog.tsx +205 -0
  424. package/ux-demo/recipes/list-workspace-states.tsx +176 -9
  425. package/ux-demo/recipes/loaders.ts +13 -4
  426. package/ux-demo/recipes/loading-inspector.tsx +191 -0
  427. package/ux-demo/recipes/mount-recipe.ts +31 -5
  428. package/ux-demo/recipes/navigation-sidebar.tsx +123 -11
  429. package/ux-demo/recipes/navigation-stack.tsx +121 -0
  430. package/ux-demo/recipes/recipes.css +125 -16
  431. package/ux-demo/recipes/types.ts +9 -1
  432. package/ux-demo/recipes/workspace-header.tsx +72 -3
  433. package/dist/browser/dialog-header.js +0 -5
  434. package/dist/browser/menu-action-row.js +0 -3
  435. package/dist/browser/menu-header.js +0 -5
  436. package/dist/browser/menu-item.js +0 -3
  437. package/dist/browser/page-header.js +0 -3
  438. package/dist/chunk-2PES33HS.js +0 -13
  439. package/dist/chunk-2PES33HS.js.map +0 -1
  440. package/dist/chunk-55DATV3A.js +0 -10
  441. package/dist/chunk-55DATV3A.js.map +0 -1
  442. package/dist/chunk-7BR3DO2A.js.map +0 -1
  443. package/dist/chunk-7LDCTU7D.js +0 -134
  444. package/dist/chunk-7LDCTU7D.js.map +0 -1
  445. package/dist/chunk-AQNKJRFH.js +0 -79
  446. package/dist/chunk-AQNKJRFH.js.map +0 -1
  447. package/dist/chunk-CTQKI2XL.js +0 -28
  448. package/dist/chunk-CTQKI2XL.js.map +0 -1
  449. package/dist/chunk-DAFFDO33.js +0 -14
  450. package/dist/chunk-DAFFDO33.js.map +0 -1
  451. package/dist/chunk-EGHL5S4P.js +0 -33
  452. package/dist/chunk-EGHL5S4P.js.map +0 -1
  453. package/dist/chunk-GY5WH7TO.js +0 -10
  454. package/dist/chunk-GY5WH7TO.js.map +0 -1
  455. package/dist/chunk-H5AGGVU5.js +0 -75
  456. package/dist/chunk-H5AGGVU5.js.map +0 -1
  457. package/dist/chunk-K3G72I6D.js +0 -24
  458. package/dist/chunk-K3G72I6D.js.map +0 -1
  459. package/dist/chunk-M5JRI6MN.js +0 -27
  460. package/dist/chunk-M5JRI6MN.js.map +0 -1
  461. package/dist/chunk-MBR3TYNL.js +0 -14
  462. package/dist/chunk-MBR3TYNL.js.map +0 -1
  463. package/dist/chunk-MFKMHK5W.js +0 -10
  464. package/dist/chunk-MFKMHK5W.js.map +0 -1
  465. package/dist/chunk-MQIZAD4A.js.map +0 -1
  466. package/dist/chunk-NPPD2A6O.js +0 -40
  467. package/dist/chunk-NPPD2A6O.js.map +0 -1
  468. package/dist/chunk-R6JHHBKQ.js +0 -19
  469. package/dist/chunk-R6JHHBKQ.js.map +0 -1
  470. package/dist/chunk-S3TPM2LP.js +0 -23
  471. package/dist/chunk-S3TPM2LP.js.map +0 -1
  472. package/dist/chunk-TRNBHPNW.js.map +0 -1
  473. package/dist/chunk-VHW5YNIB.js +0 -17
  474. package/dist/chunk-VHW5YNIB.js.map +0 -1
  475. package/dist/chunk-WVPYVDXY.js +0 -15
  476. package/dist/chunk-WVPYVDXY.js.map +0 -1
  477. package/dist/chunk-XZXRLY5Q.js +0 -33
  478. package/dist/chunk-XZXRLY5Q.js.map +0 -1
  479. package/dist/dialog-header.d.ts +0 -15
  480. package/dist/dialog-header.js +0 -5
  481. package/dist/dialog-header.js.map +0 -1
  482. package/dist/menu-action-row.js +0 -4
  483. package/dist/menu-action-row.js.map +0 -1
  484. package/dist/menu-header.d.ts +0 -41
  485. package/dist/menu-header.js +0 -6
  486. package/dist/menu-header.js.map +0 -1
  487. package/dist/menu-item.d.ts +0 -31
  488. package/dist/menu-item.js +0 -4
  489. package/dist/menu-item.js.map +0 -1
  490. package/dist/page-header.d.ts +0 -9
  491. package/dist/page-header.js +0 -3
  492. package/dist/page-header.js.map +0 -1
  493. package/dist/styles/dialog-header.css +0 -87
  494. package/dist/styles/menu-action-row.css +0 -160
  495. package/dist/styles/menu-header.css +0 -143
  496. package/dist/styles/menu-item.css +0 -123
  497. package/dist/styles/page-header.css +0 -33
  498. package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
@@ -4,19 +4,24 @@
4
4
  @import "./disclosure-arrow.css";
5
5
  @import "./toolbar.css";
6
6
  @import "./toolbar-control-group.css";
7
+ @import "./surface-scaffold.css";
7
8
  @import "./toolbar-text.css";
8
- @import "./menu-action-row.css";
9
- @import "./menu-item.css";
10
- @import "./menu-header.css";
9
+ @import "./text.css";
10
+ @import "./list.css";
11
+ @import "./row.css";
12
+ @import "./spacer.css";
13
+ @import "./list-action-row.css";
14
+ @import "./list-item.css";
15
+ @import "./list-header.css";
11
16
  @import "./resizable-region.css";
12
17
  @import "./app-tab.css";
18
+ @import "./catalog.css";
13
19
  @import "./tab-bar.css";
14
- @import "./page-header.css";
15
20
  @import "./loading-spinner.css";
21
+ @import "./skeleton.css";
16
22
  @import "./select.css";
17
23
  @import "./segmented-control.css";
18
24
  @import "./token-search-field.css";
19
25
  @import "./state-banner.css";
20
26
  @import "./empty-state.css";
21
- @import "./dialog-header.css";
22
27
  @import "./value-table.css";
@@ -0,0 +1,22 @@
1
+ .kui-sunken-panel {
2
+ display: flex;
3
+ min-width: 0;
4
+ min-height: 0;
5
+ padding: var(--kui-sunken-panel-padding, 0.5rem);
6
+ box-sizing: border-box;
7
+ border-radius: var(
8
+ --kui-sunken-panel-radius,
9
+ var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
10
+ );
11
+ color: var(--kui-sunken-panel-foreground, var(--kui-color-text));
12
+ background: var(
13
+ --kui-sunken-panel-background,
14
+ var(--kui-color-surface-lowered)
15
+ );
16
+ flex-direction: column;
17
+ gap: var(--kui-sunken-panel-gap, 0.5rem);
18
+ }
19
+
20
+ .kui-sunken-panel[data-shape="square"] {
21
+ border-radius: 0;
22
+ }
@@ -0,0 +1,51 @@
1
+ .kui-dialog-surface > wa-dialog {
2
+ --width: min(35rem, calc(100vw - 2rem));
3
+ }
4
+ .kui-dialog-surface[data-size="small"] > wa-dialog {
5
+ --width: min(25rem, calc(100vw - 2rem));
6
+ }
7
+ .kui-dialog-surface[data-size="large"] > wa-dialog {
8
+ --width: min(50rem, calc(100vw - 2rem));
9
+ }
10
+ .kui-dialog-surface[data-body-inset="none"] > wa-dialog::part(body),
11
+ .kui-dialog-surface[data-footer-inset="none"] > wa-dialog::part(footer) {
12
+ padding: 0;
13
+ }
14
+ .kui-dialog-surface[data-body-inset="compact"] > wa-dialog::part(body),
15
+ .kui-dialog-surface[data-footer-inset="compact"] > wa-dialog::part(footer) {
16
+ padding: var(--kui-wa-surface-inset, 0.5rem);
17
+ }
18
+ .kui-dialog-surface[data-body-inset="comfortable"] > wa-dialog::part(body),
19
+ .kui-dialog-surface[data-footer-inset="comfortable"] > wa-dialog::part(footer) {
20
+ padding: var(--kui-wa-container-inset, 1rem);
21
+ }
22
+ .kui-dialog-surface[data-presentation="side-sheet"] > wa-dialog::part(dialog) {
23
+ width: min(30rem, 100vw);
24
+ max-width: 100vw;
25
+ height: 100dvh;
26
+ max-height: 100dvh;
27
+ margin-inline-end: 0;
28
+ border-radius: var(--kui-radius-l) 0 0 var(--kui-radius-l);
29
+ }
30
+ .kui-dialog-surface[data-presentation="fullscreen"] > wa-dialog {
31
+ --width: 100vw;
32
+ }
33
+ .kui-dialog-surface[data-presentation="fullscreen"] > wa-dialog::part(dialog) {
34
+ width: 100vw;
35
+ max-width: 100vw;
36
+ height: 100dvh;
37
+ max-height: 100dvh;
38
+ border-radius: 0;
39
+ }
40
+ .kui-popup-surface {
41
+ display: inline-flex;
42
+ }
43
+ .kui-popup-surface[data-inset="standard"] > wa-dropdown::part(menu) {
44
+ padding: var(--kui-wa-surface-inset, 0.5rem);
45
+ }
46
+ .kui-popup-surface[data-inset="compact"] > wa-dropdown::part(menu) {
47
+ padding: 0.25rem;
48
+ }
49
+ .kui-popup-surface[data-inset="list-zero"] > wa-dropdown::part(menu) {
50
+ padding: 0;
51
+ }
@@ -31,6 +31,30 @@
31
31
  gap: 0;
32
32
  overscroll-behavior-inline: contain;
33
33
  }
34
+ .kui-tab-bar[data-presentation="segmented"],
35
+ .kui-tab-bar[data-presentation="inspector"] {
36
+ --kui-tab-bar-background: var(--kui-color-neutral-fill-quiet);
37
+ --kui-tab-bar-border: var(--kui-color-neutral-border-quiet);
38
+ }
39
+ .kui-tab-bar[data-presentation="inspector"] {
40
+ min-height: 2.125rem;
41
+ padding: 0;
42
+ }
43
+ .kui-tab-bar[data-presentation="inspector"] .kui-tab-bar__tabs {
44
+ height: 2.125rem;
45
+ border-radius: var(--kui-radius-s);
46
+ }
47
+ .kui-tab-bar[data-allocation="fill"] [data-component="app-tab"] {
48
+ min-width: 0;
49
+ flex: 1 1 0;
50
+ }
51
+ .kui-tab-bar[data-allocation="fill"] [data-component="app-tab"] > [role="tab"] {
52
+ width: 100%;
53
+ justify-content: center;
54
+ }
55
+ .kui-tab-bar[data-trailing-placement="adjacent"] .kui-tab-bar__tabs {
56
+ flex: 0 1 auto;
57
+ }
34
58
 
35
59
  .kui-tab-bar__tabs::-webkit-scrollbar {
36
60
  display: none;
@@ -0,0 +1,85 @@
1
+ .kui-tab-scaffold {
2
+ display: flex;
3
+ min-width: 0;
4
+ min-height: 0;
5
+ height: 100%;
6
+ overflow: hidden;
7
+ flex-direction: column;
8
+ background: var(--kui-color-surface);
9
+ }
10
+
11
+ .kui-tab-scaffold__scenes {
12
+ position: relative;
13
+ flex: 1;
14
+ min-height: 0;
15
+ overflow: hidden;
16
+ }
17
+
18
+ /* Every tab stays mounted (its NavStack keeps its stack and scroll); only the
19
+ active scene is shown. */
20
+ .kui-tab-scaffold__scene {
21
+ position: absolute;
22
+ overflow: auto;
23
+ inset: 0;
24
+ }
25
+
26
+ .kui-tab-scaffold__scene[data-active="false"] {
27
+ visibility: hidden;
28
+ }
29
+
30
+ .kui-tab-scaffold__bar {
31
+ display: flex;
32
+ flex: 0 0 auto;
33
+ padding-block-start: var(--kui-space-2xs);
34
+ /* Respect the home-indicator safe area on iOS-class devices. */
35
+ padding-block-end: calc(
36
+ var(--kui-space-2xs) + env(safe-area-inset-bottom, 0px)
37
+ );
38
+ border-block-start: 1px solid var(--kui-color-border);
39
+ background: var(--kui-color-surface);
40
+ }
41
+
42
+ .kui-tab-scaffold__tab {
43
+ display: flex;
44
+ flex: 1 1 0;
45
+ min-width: 0;
46
+ min-height: 2.75rem;
47
+ padding: var(--kui-space-2xs) var(--kui-space-xs);
48
+ border: 0;
49
+ color: var(--kui-color-text-quiet);
50
+ background: transparent;
51
+ cursor: pointer;
52
+ font: inherit;
53
+ flex-direction: column;
54
+ align-items: center;
55
+ justify-content: center;
56
+ gap: 0.125rem;
57
+ }
58
+
59
+ .kui-tab-scaffold__tab[aria-selected="true"] {
60
+ color: var(--kui-color-accent-text);
61
+ }
62
+
63
+ .kui-tab-scaffold__tab:focus-visible {
64
+ outline: var(--kui-focus-ring);
65
+ outline-offset: -2px;
66
+ }
67
+
68
+ .kui-tab-scaffold__tab-icon {
69
+ display: grid;
70
+ place-items: center;
71
+ }
72
+
73
+ .kui-tab-scaffold__tab-icon svg {
74
+ width: 1.375rem;
75
+ height: 1.375rem;
76
+ }
77
+
78
+ .kui-tab-scaffold__tab-label {
79
+ flex: none;
80
+ max-width: 100%;
81
+ overflow: hidden;
82
+ font-size: var(--kui-font-2xs);
83
+ text-overflow: ellipsis;
84
+ white-space: nowrap;
85
+ }
@@ -0,0 +1,6 @@
1
+ .kui-text {
2
+ padding: var(--kui-layout-item-padding, 0.5rem);
3
+ box-sizing: border-box;
4
+ border: 1px solid transparent;
5
+ margin: 0;
6
+ }
@@ -159,7 +159,12 @@
159
159
  width: min(var(--kui-token-search-expanded-width, 30rem), 100%);
160
160
  max-width: 100%;
161
161
  overflow: hidden;
162
- flex: 0 1 var(--kui-token-search-expanded-width, 30rem);
162
+ /* Size the inline axis through `width` only. A `flex-basis` of the expanded
163
+ width would drive the MAIN axis, which is the field's HEIGHT inside a flex
164
+ column — stretching the field tall (KF-EPEM88). `flex: 0 1 auto` keeps the
165
+ no-grow / may-shrink behavior a toolbar row wants without leaking the width
166
+ into the cross axis. */
167
+ flex: 0 1 auto;
163
168
  transition:
164
169
  width 0.25s ease,
165
170
  background-color 0.2s ease,
@@ -214,7 +219,10 @@
214
219
  height: auto;
215
220
  min-width: 0;
216
221
  overflow: hidden;
217
- flex: 0 1 var(--kui-token-search-expanded-width, 30rem);
222
+ /* Same reason as the field above (KF-EPEM88): drive the inline size through
223
+ `width`, not `flex-basis`, so a group placed in a flex column is not
224
+ stretched to the expanded width in its cross axis. */
225
+ flex: 0 1 auto;
218
226
  transition:
219
227
  width 0.25s ease,
220
228
  background-color 0.2s ease,
@@ -234,6 +242,10 @@
234
242
  min-height: 2.5rem;
235
243
  padding: 0.25rem 0.375rem;
236
244
  border: 0;
245
+ /* This field is the group's inset visual layer. Inherit the same concentric
246
+ radius contract as buttons instead of retaining TokenSearchField's own pill
247
+ radius when the group switches to `shape="rounded"`. */
248
+ border-radius: var(--kui-control-highlight-radius);
237
249
  background: transparent;
238
250
  box-shadow: none;
239
251
  }
@@ -10,16 +10,24 @@
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);
13
24
  display: inline-flex;
14
25
  height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
15
26
  min-width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
16
27
  padding: 1px;
17
28
  box-sizing: border-box;
18
29
  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
- );
30
+ border-radius: var(--kui-toolbar-group-radius);
23
31
  color: var(--kui-toolbar-control-color);
24
32
  background: var(--kui-toolbar-control-background);
25
33
  align-items: center;
@@ -27,6 +35,16 @@
27
35
  gap: 0;
28
36
  }
29
37
 
38
+ /* `shape="rounded"` swaps the default pill radius for the design system's softer
39
+ rounded rectangle. The shared highlight contract derives every inner hover or
40
+ selected surface from this outer radius and the group's full inset. */
41
+ .kui-toolbar-control-group[data-shape="rounded"] {
42
+ --kui-toolbar-group-radius: var(
43
+ --kui-layout-rounded-radius,
44
+ calc(1px + 0.6875rem)
45
+ );
46
+ }
47
+
30
48
  .kui-toolbar-control-group[data-tone="dark"] {
31
49
  --kui-toolbar-control-background: color-mix(
32
50
  in srgb,
@@ -41,8 +59,66 @@
41
59
  transparent
42
60
  );
43
61
  }
62
+ .kui-toolbar-control-group[data-size="compact"] {
63
+ --kui-toolbar-group-size: 2.125rem;
64
+ }
65
+ .kui-toolbar-control-group[data-density="tight"] {
66
+ --kui-layout-item-padding: 0.3125rem;
67
+ }
68
+ .kui-toolbar-control-group[data-content="text"] > :is(button, wa-button),
69
+ .kui-toolbar-control-group[data-content="mixed"] > :is(button, wa-button) {
70
+ min-width: max-content;
71
+ }
72
+ .kui-toolbar-control-group[data-content="mixed"] > button {
73
+ display: flex;
74
+ gap: var(--kui-space-xs);
75
+ }
76
+ .kui-toolbar-control-group[data-content="avatar"][data-scrim="true"] {
77
+ --kui-toolbar-control-background: color-mix(
78
+ in srgb,
79
+ var(--kui-color-neutral-fill-loud) 64%,
80
+ transparent
81
+ );
82
+ --kui-toolbar-control-color: var(--kui-color-neutral-on-loud);
83
+ }
84
+ .kui-toolbar-control-group[data-selected-tone="neutral"] {
85
+ --kui-toolbar-control-selected-color: var(--kui-color-neutral-on-normal);
86
+ --kui-toolbar-control-selected-background: var(
87
+ --kui-color-neutral-fill-normal
88
+ );
89
+ }
90
+ .kui-toolbar-control-group[data-selected-tone="pop"] {
91
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
92
+ }
93
+ .kui-toolbar-control-group[data-selected-chrome="filled"] {
94
+ --kui-toolbar-control-selected-shadow: none;
95
+ --kui-toolbar-control-selected-border: transparent;
96
+ --kui-toolbar-control-selected-background: var(--kui-color-brand-fill-normal);
97
+ --kui-toolbar-control-selected-color: var(--kui-color-brand-on-normal);
98
+ }
99
+ .kui-toolbar-control-group[data-selected-chrome="outline"] {
100
+ --kui-toolbar-control-selected-shadow: none;
101
+ --kui-toolbar-control-selected-background: transparent;
102
+ --kui-toolbar-control-selected-border: var(--kui-color-brand-border-normal);
103
+ }
104
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="filled"] {
105
+ --kui-toolbar-control-selected-background: var(--kui-color-pop-fill-normal);
106
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-normal);
107
+ }
108
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="outline"] {
109
+ --kui-toolbar-control-selected-border: var(--kui-color-pop-border-normal);
110
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
111
+ }
44
112
 
45
113
  .kui-toolbar-control-group[data-appearance="borderless"] {
114
+ /* A borderless group has no base fill to lift from, so the default
115
+ surface-colored hover/selected background is invisible against the page.
116
+ Use a visible neutral tint so buttons still show hover/press feedback
117
+ (KF-WZDQS8). */
118
+ --kui-toolbar-control-hover-background: var(--kui-color-neutral-fill-normal);
119
+ --kui-toolbar-control-selected-background: var(
120
+ --kui-color-neutral-fill-normal
121
+ );
46
122
  border-color: transparent;
47
123
  background: transparent;
48
124
  }
@@ -50,6 +126,9 @@
50
126
  .kui-toolbar-control-group > :is(button, wa-button, wa-dropdown) {
51
127
  flex: 0 0 auto;
52
128
  }
129
+ .kui-toolbar-control-group > wa-dropdown {
130
+ display: inline-flex;
131
+ }
53
132
 
54
133
  .kui-toolbar-control-group > button {
55
134
  appearance: none;
@@ -89,6 +168,61 @@
89
168
  min-width: 2.5rem;
90
169
  height: 2.5rem;
91
170
  }
171
+ .kui-toolbar-control-group[data-size="compact"] > button,
172
+ .kui-toolbar-control-group[data-size="compact"] > wa-button,
173
+ .kui-toolbar-control-group[data-size="compact"] > wa-dropdown,
174
+ .kui-toolbar-control-group[data-size="compact"] > wa-dropdown > wa-button,
175
+ .kui-toolbar-control-group[data-size="compact"]
176
+ > wa-dropdown
177
+ > wa-button::part(base),
178
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
179
+ wa-dropdown
180
+ wa-button,
181
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
182
+ wa-dropdown
183
+ wa-button::part(base) {
184
+ min-width: 2rem;
185
+ height: 2rem;
186
+ min-height: 2rem;
187
+ }
188
+
189
+ /* Compact mixed controls keep the default horizontal breathing room. Their
190
+ raised selection grows over the group's own border instead of becoming a
191
+ smaller inset lozenge, while negative margins keep the outer geometry and
192
+ neighboring trigger position stable. */
193
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"] {
194
+ --kui-layout-item-padding: 0.5rem;
195
+ }
196
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
197
+ > button[aria-pressed="true"] {
198
+ position: relative;
199
+ z-index: 1;
200
+ height: var(--kui-toolbar-group-size);
201
+ margin: -2px;
202
+ border-radius: var(--kui-toolbar-group-radius);
203
+ }
204
+
205
+ /* A compact icon-only trigger may stay square, but a mixed-content dropdown
206
+ trigger must grow for its slotted label plus Web Awesome's caret. Otherwise
207
+ the fixed 32px base centers both outside its host, painting the label across
208
+ the separator and the caret beyond the group border. */
209
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
210
+ > wa-dropdown
211
+ > wa-button,
212
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
213
+ > wa-dropdown
214
+ > wa-button::part(base) {
215
+ min-width: max-content;
216
+ }
217
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
218
+ > wa-dropdown
219
+ > wa-button {
220
+ /* WebKit does not contribute a custom element's shadow-part caret to the
221
+ host's intrinsic inline size. Give the standard short text trigger an
222
+ engine-stable floor; max-content still wins for longer light-DOM labels,
223
+ and consumers can raise the public variable for localized copy. */
224
+ width: var(--kui-toolbar-dropdown-trigger-width, 4.125rem);
225
+ }
92
226
 
93
227
  .kui-toolbar-control-group[data-single="true"] > wa-dropdown,
94
228
  .kui-toolbar-control-group[data-single="true"] > wa-dropdown > wa-button,
@@ -107,6 +241,10 @@
107
241
  }
108
242
 
109
243
  .kui-toolbar-control-group wa-button::part(base) {
244
+ /* Match min-width to the 40px height so an icon-only button's highlight is at
245
+ least a circle, not a vertical oval — the host is 40px wide but the base
246
+ part was sizing to its ~32px content. Text/caret buttons grow past it. */
247
+ min-width: 2.5rem;
110
248
  min-height: 2.5rem;
111
249
  box-sizing: border-box;
112
250
  border: 1px solid transparent;
@@ -118,13 +256,13 @@
118
256
 
119
257
  .kui-toolbar-control-group wa-button:hover::part(base) {
120
258
  border-color: var(--kui-toolbar-control-border);
121
- background: var(--kui-toolbar-control-hover-background);
259
+ background-color: var(--kui-toolbar-control-hover-background);
122
260
  }
123
261
 
124
262
  .kui-toolbar-control-group[data-single="true"]:has(
125
263
  > :is(button, wa-button, wa-dropdown)
126
264
  ):hover {
127
- background: var(--kui-toolbar-control-hover-background);
265
+ background-color: var(--kui-toolbar-control-hover-background);
128
266
  }
129
267
 
130
268
  .kui-toolbar-control-group[data-single="true"] > :is(button, wa-button):hover,
@@ -133,19 +271,67 @@
133
271
  background: transparent;
134
272
  }
135
273
 
136
- .kui-toolbar-control-group[data-single="false"]
137
- > :is(button, wa-button)[aria-pressed="true"] {
274
+ /* A group holding exactly one control behaves like `single` even without the
275
+ flag: the whole group background changes on hover instead of highlighting an
276
+ inner layer inset from the border (KF-J9P1ZD — a heading toolbar's lone Close/
277
+ Done action). */
278
+ .kui-toolbar-control-group:not([data-single="true"]):has(
279
+ > :is(button, wa-button):only-child
280
+ ):hover {
281
+ background-color: var(--kui-toolbar-control-hover-background);
282
+ }
283
+
284
+ .kui-toolbar-control-group:not([data-single="true"]):has(
285
+ > :is(button, wa-button):only-child
286
+ )
287
+ > :is(button, wa-button):hover,
288
+ .kui-toolbar-control-group:not([data-single="true"]):has(
289
+ > :is(button, wa-button):only-child
290
+ )
291
+ wa-button:hover::part(base) {
292
+ border-color: transparent;
293
+ background: transparent;
294
+ }
295
+
296
+ /* A plain <button> child paints its own box for the selected state. */
297
+ .kui-toolbar-control-group[data-single="false"] > button[aria-pressed="true"] {
138
298
  border-color: var(--kui-toolbar-control-selected-border);
139
299
  color: var(--kui-toolbar-control-selected-color);
140
300
  background: var(--kui-toolbar-control-selected-background);
141
301
  box-shadow: var(--kui-toolbar-control-selected-shadow);
142
302
  }
143
303
 
304
+ /* A wa-button's visual is ::part(base), not the outer 40px host box (which has no
305
+ pill radius). Paint the selected background/border/shadow on ::part(base) —
306
+ mirroring the hover rule — so the selected state matches the pill radius/size
307
+ and stays inside the group's border instead of overflowing it as an oversized
308
+ square (KF-5BDDQ9). The selected text color rides on the host and inherits in. */
309
+ .kui-toolbar-control-group[data-single="false"]
310
+ > wa-button[aria-pressed="true"] {
311
+ color: var(--kui-toolbar-control-selected-color);
312
+ }
313
+ .kui-toolbar-control-group[data-single="false"]
314
+ > wa-button[aria-pressed="true"]::part(base) {
315
+ border-color: var(--kui-toolbar-control-selected-border);
316
+ background: var(--kui-toolbar-control-selected-background);
317
+ box-shadow: var(--kui-toolbar-control-selected-shadow);
318
+ }
319
+
144
320
  .kui-toolbar-control-group > :is(button, wa-button):focus-visible {
145
321
  outline: var(--kui-focus-ring);
146
322
  outline-offset: 1px;
147
323
  }
148
324
 
325
+ /* A composed Select can delegate focus paint to the group so the visible ring
326
+ follows the group's selected pill/rounded geometry instead of Web Awesome's
327
+ form-control radius. */
328
+ .kui-toolbar-control-group:has(
329
+ > .kui-select[data-focus-ring-owner="group"]:is(:focus-within, [open])
330
+ ) {
331
+ outline: var(--kui-focus-ring);
332
+ outline-offset: 1px;
333
+ }
334
+
149
335
  .kui-toolbar-control-group[data-button-appearance="push"][data-single="true"]:has(
150
336
  > :is(button, wa-button)[aria-pressed="true"]
151
337
  ) {
@@ -159,3 +345,44 @@
159
345
  > :is(button, wa-button)[aria-pressed="true"] {
160
346
  color: var(--kui-toolbar-control-pressed-color);
161
347
  }
348
+
349
+ /* Avatar controls paint the image as chrome rather than inserting a replaced
350
+ <img> into the control. `background-size: contain` is the background-image
351
+ equivalent of `object-fit: contain`: the whole avatar remains visible. A
352
+ lone control belongs to the outer group surface; in a group of choices the
353
+ image belongs only to the selected highlight. */
354
+ .kui-toolbar-control-group[data-content="avatar"] {
355
+ background-position: center;
356
+ background-repeat: no-repeat;
357
+ background-size: contain;
358
+ }
359
+
360
+ .kui-toolbar-control-group[data-content="avatar"]:is(
361
+ [data-single="true"],
362
+ :has(> :is(button, wa-button):only-child)
363
+ ) {
364
+ background-image: var(--kui-toolbar-avatar-image);
365
+ }
366
+
367
+ .kui-toolbar-control-group[data-content="avatar"]:is(
368
+ [data-single="true"],
369
+ :has(> :is(button, wa-button):only-child)
370
+ )
371
+ > :is(button, wa-button) {
372
+ color: transparent;
373
+ }
374
+
375
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
376
+ :has(> :is(button, wa-button):only-child)
377
+ )
378
+ > button[aria-pressed="true"],
379
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
380
+ :has(> :is(button, wa-button):only-child)
381
+ )
382
+ > wa-button[aria-pressed="true"]::part(base) {
383
+ color: transparent;
384
+ background-image: var(--kui-toolbar-avatar-image);
385
+ background-position: center;
386
+ background-repeat: no-repeat;
387
+ background-size: contain;
388
+ }
@@ -9,11 +9,30 @@
9
9
  color: var(--kui-color-neutral-on-quiet);
10
10
  font-weight: 650;
11
11
  line-height: 1;
12
- text-overflow: ellipsis;
13
- white-space: nowrap;
14
12
  align-items: center;
15
13
  }
16
14
 
15
+ /* The text lives in a block child, not directly in the flex box, so
16
+ `text-overflow: ellipsis` actually applies (it is a no-op on a flex item). */
17
+ .kui-toolbar-text__text {
18
+ min-width: 0;
19
+ max-width: 100%;
20
+ overflow: hidden;
21
+ white-space: nowrap;
22
+ text-overflow: ellipsis;
23
+ }
24
+
25
+ .kui-toolbar-text[data-size="xlarge"] {
26
+ /* Matches page/panel titles: the same responsive clamp so a heading toolbar
27
+ title reads at the page-title scale without a bespoke override. Height grows
28
+ to the larger text (the fixed 40px would clip its ascenders). */
29
+ height: auto;
30
+ min-height: 2.75rem;
31
+ color: var(--kui-color-text);
32
+ font-size: clamp(var(--kui-font-l), 2.3vw, var(--kui-font-2xl));
33
+ letter-spacing: -0.025em;
34
+ }
35
+
17
36
  .kui-toolbar-text[data-size="large"] {
18
37
  font-size: var(--kui-font-m);
19
38
  letter-spacing: -0.015em;
@@ -27,3 +46,47 @@
27
46
  font-family: var(--kui-font-mono);
28
47
  font-size: var(--kui-font-xs);
29
48
  }
49
+
50
+ /* Single line, no ellipsis: hard-clip the overflow instead of showing …. */
51
+ .kui-toolbar-text[data-ellipsis="false"] .kui-toolbar-text__text {
52
+ text-overflow: clip;
53
+ }
54
+
55
+ /* Wrap onto multiple lines. The box grows to fit and switches from the centered
56
+ single-line row to a top-aligned block with readable leading; a min-height keeps
57
+ a one-line label at the toolbar row height. */
58
+ .kui-toolbar-text[data-wrap="true"] {
59
+ align-items: flex-start;
60
+ height: auto;
61
+ min-height: 2.5rem;
62
+ }
63
+
64
+ .kui-toolbar-text[data-size="xlarge"][data-wrap="true"] {
65
+ min-height: 2.75rem;
66
+ }
67
+
68
+ .kui-toolbar-text[data-wrap="true"] .kui-toolbar-text__text {
69
+ white-space: normal;
70
+ line-height: 1.25;
71
+ }
72
+
73
+ /* Wrap capped to N lines with an ellipsis at the cut. `-webkit-line-clamp` needs
74
+ the box display and emits the … itself; the unprefixed `line-clamp` follows for
75
+ engines that ship it. */
76
+ .kui-toolbar-text[data-wrap="true"][data-max-lines] .kui-toolbar-text__text {
77
+ display: -webkit-box;
78
+ -webkit-box-orient: vertical;
79
+ -webkit-line-clamp: var(--kui-toolbar-text-max-lines);
80
+ line-clamp: var(--kui-toolbar-text-max-lines);
81
+ overflow: hidden;
82
+ }
83
+
84
+ /* Wrap capped to N lines without an ellipsis: clip at a max-height instead of
85
+ line-clamp (which always ellipsizes). */
86
+ .kui-toolbar-text[data-wrap="true"][data-max-lines][data-ellipsis="false"]
87
+ .kui-toolbar-text__text {
88
+ display: block;
89
+ -webkit-line-clamp: none;
90
+ line-clamp: none;
91
+ max-height: calc(var(--kui-toolbar-text-max-lines) * 1.25em);
92
+ }