@kerfjs/ui 5.0.0-beta.3 → 5.0.0-beta.31

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 (470) hide show
  1. package/README.md +320 -107
  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 +131 -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 +486 -0
  17. package/ai/component-catalog-v2.d.ts +90 -0
  18. package/ai/component-catalog-v2.json +5455 -0
  19. package/ai/component-catalog-v2.schema.json +298 -0
  20. package/ai/component-catalog.json +2437 -419
  21. package/ai/component-catalog.schema.json +39 -0
  22. package/ai/public-api-signatures-v1.md +1442 -124
  23. package/ai/skill.md +131 -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/{menu-header.js → list-header.js} +3 -2
  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/segmented-control.js +1 -0
  41. package/dist/browser/select.js +1 -0
  42. package/dist/browser/skeleton.js +3 -0
  43. package/dist/browser/state-banner.js +1 -0
  44. package/dist/browser/sunken-panel.js +3 -0
  45. package/dist/browser/surface-scaffold.js +3 -0
  46. package/dist/browser/toolbar-text.js +1 -0
  47. package/dist/browser/value-table.js +1 -0
  48. package/dist/catalog-resources.d.ts +35 -0
  49. package/dist/catalog-resources.js +22 -0
  50. package/dist/catalog-resources.js.map +1 -0
  51. package/dist/catalog.d.ts +151 -0
  52. package/dist/catalog.js +379 -0
  53. package/dist/catalog.js.map +1 -0
  54. package/dist/chunk-6NDBE2OK.js +32 -0
  55. package/dist/chunk-6NDBE2OK.js.map +1 -0
  56. package/dist/chunk-6WTETUZ6.js +21 -0
  57. package/dist/chunk-6WTETUZ6.js.map +1 -0
  58. package/dist/chunk-AQFWBG23.js +83 -0
  59. package/dist/chunk-AQFWBG23.js.map +1 -0
  60. package/dist/chunk-B6JYRX3P.js +51 -0
  61. package/dist/chunk-B6JYRX3P.js.map +1 -0
  62. package/dist/chunk-CAB6NQ2T.js +102 -0
  63. package/dist/chunk-CAB6NQ2T.js.map +1 -0
  64. package/dist/chunk-CK6P5AUK.js +136 -0
  65. package/dist/chunk-CK6P5AUK.js.map +1 -0
  66. package/dist/chunk-DAO2VFTT.js +129 -0
  67. package/dist/chunk-DAO2VFTT.js.map +1 -0
  68. package/dist/chunk-DYBPI5O2.js +25 -0
  69. package/dist/chunk-DYBPI5O2.js.map +1 -0
  70. package/dist/{chunk-TRNBHPNW.js → chunk-E34TE2ZI.js} +12 -8
  71. package/dist/chunk-E34TE2ZI.js.map +1 -0
  72. package/dist/chunk-I45QO2IZ.js +88 -0
  73. package/dist/chunk-I45QO2IZ.js.map +1 -0
  74. package/dist/chunk-I4V3UDSA.js +79 -0
  75. package/dist/chunk-I4V3UDSA.js.map +1 -0
  76. package/dist/chunk-KFUUFNTS.js +15 -0
  77. package/dist/chunk-KFUUFNTS.js.map +1 -0
  78. package/dist/chunk-MFR2IIFG.js +20 -0
  79. package/dist/chunk-MFR2IIFG.js.map +1 -0
  80. package/dist/chunk-OC275HHS.js +128 -0
  81. package/dist/chunk-OC275HHS.js.map +1 -0
  82. package/dist/chunk-OL4TC3U2.js +156 -0
  83. package/dist/chunk-OL4TC3U2.js.map +1 -0
  84. package/dist/chunk-OMSRSL3B.js +120 -0
  85. package/dist/chunk-OMSRSL3B.js.map +1 -0
  86. package/dist/chunk-RL6COPKF.js +44 -0
  87. package/dist/chunk-RL6COPKF.js.map +1 -0
  88. package/dist/chunk-SOK5EUF7.js +25 -0
  89. package/dist/chunk-SOK5EUF7.js.map +1 -0
  90. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  91. package/dist/chunk-SRSJO5QE.js.map +1 -0
  92. package/dist/chunk-T7DOWS6T.js +61 -0
  93. package/dist/chunk-T7DOWS6T.js.map +1 -0
  94. package/dist/chunk-TIGSG6BX.js +218 -0
  95. package/dist/chunk-TIGSG6BX.js.map +1 -0
  96. package/dist/chunk-UDHHKZWO.js +41 -0
  97. package/dist/chunk-UDHHKZWO.js.map +1 -0
  98. package/dist/{chunk-MQIZAD4A.js → chunk-UKKSMZYT.js} +76 -22
  99. package/dist/chunk-UKKSMZYT.js.map +1 -0
  100. package/dist/chunk-V6GQKOX2.js +39 -0
  101. package/dist/chunk-V6GQKOX2.js.map +1 -0
  102. package/dist/chunk-V6HCTCVD.js +46 -0
  103. package/dist/chunk-V6HCTCVD.js.map +1 -0
  104. package/dist/chunk-VDUJZF5G.js +515 -0
  105. package/dist/chunk-VDUJZF5G.js.map +1 -0
  106. package/dist/chunk-VXFGMDA7.js +31 -0
  107. package/dist/chunk-VXFGMDA7.js.map +1 -0
  108. package/dist/chunk-WN52USHV.js +115 -0
  109. package/dist/chunk-WN52USHV.js.map +1 -0
  110. package/dist/chunk-WSXUPSID.js +43 -0
  111. package/dist/chunk-WSXUPSID.js.map +1 -0
  112. package/dist/{chunk-56RJXPHG.js → chunk-Y6LYKFXY.js} +1 -1
  113. package/dist/{chunk-56RJXPHG.js.map → chunk-Y6LYKFXY.js.map} +1 -1
  114. package/dist/chunk-ZPWZIVI6.js +47 -0
  115. package/dist/chunk-ZPWZIVI6.js.map +1 -0
  116. package/dist/collapsible-panel.d.ts +77 -0
  117. package/dist/collapsible-panel.js +84 -0
  118. package/dist/collapsible-panel.js.map +1 -0
  119. package/dist/css-values.d.ts +75 -0
  120. package/dist/css-values.js +3 -0
  121. package/dist/css-values.js.map +1 -0
  122. package/dist/device-class.d.ts +62 -0
  123. package/dist/device-class.js +103 -0
  124. package/dist/device-class.js.map +1 -0
  125. package/dist/disclosure-arrow.js +1 -1
  126. package/dist/divider-sides-267FA7sY.d.ts +4 -0
  127. package/dist/empty-state.d.ts +3 -2
  128. package/dist/empty-state.js +1 -1
  129. package/dist/floating-toolbar.d.ts +29 -0
  130. package/dist/floating-toolbar.js +3 -0
  131. package/dist/floating-toolbar.js.map +1 -0
  132. package/dist/index.d.ts +23 -14
  133. package/dist/index.js +30 -23
  134. package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +19 -8
  135. package/dist/list-action-row.js +7 -0
  136. package/dist/list-action-row.js.map +1 -0
  137. package/dist/list-header.d.ts +77 -0
  138. package/dist/list-header.js +8 -0
  139. package/dist/list-header.js.map +1 -0
  140. package/dist/list-inset-control.d.ts +17 -0
  141. package/dist/list-inset-control.js +3 -0
  142. package/dist/list-inset-control.js.map +1 -0
  143. package/dist/list-inset-text.d.ts +26 -0
  144. package/dist/list-inset-text.js +3 -0
  145. package/dist/list-inset-text.js.map +1 -0
  146. package/dist/list-item.d.ts +45 -0
  147. package/dist/list-item.js +7 -0
  148. package/dist/list-item.js.map +1 -0
  149. package/dist/list.d.ts +21 -0
  150. package/dist/list.js +4 -0
  151. package/dist/list.js.map +1 -0
  152. package/dist/loading-spinner.js +1 -1
  153. package/dist/nav-stack.d.ts +41 -0
  154. package/dist/nav-stack.js +6 -0
  155. package/dist/nav-stack.js.map +1 -0
  156. package/dist/pane.d.ts +50 -0
  157. package/dist/pane.js +4 -0
  158. package/dist/pane.js.map +1 -0
  159. package/dist/resizable-region.d.ts +21 -3
  160. package/dist/resizable-region.js +1 -1
  161. package/dist/segmented-control.d.ts +11 -8
  162. package/dist/segmented-control.js +3 -1
  163. package/dist/select-register.d.ts +5 -1
  164. package/dist/select-register.js +3 -0
  165. package/dist/select-register.js.map +1 -1
  166. package/dist/select.d.ts +34 -8
  167. package/dist/select.js +3 -1
  168. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  169. package/dist/skeleton.d.ts +25 -0
  170. package/dist/skeleton.js +4 -0
  171. package/dist/skeleton.js.map +1 -0
  172. package/dist/split-view.d.ts +43 -0
  173. package/dist/split-view.js +82 -0
  174. package/dist/split-view.js.map +1 -0
  175. package/dist/state-banner.d.ts +11 -5
  176. package/dist/state-banner.js +3 -1
  177. package/dist/styles/app-tab.css +26 -0
  178. package/dist/styles/catalog.css +582 -0
  179. package/dist/styles/collapsible-panel.css +212 -0
  180. package/dist/styles/floating-toolbar.css +38 -0
  181. package/dist/styles/foundation.css +80 -0
  182. package/dist/styles/layout.css +2 -20
  183. package/dist/styles/list-action-row.css +224 -0
  184. package/dist/styles/list-header.css +198 -0
  185. package/dist/styles/list-inset-control.css +7 -0
  186. package/dist/styles/list-inset-text.css +14 -0
  187. package/dist/styles/list-item.css +171 -0
  188. package/dist/styles/list.css +43 -0
  189. package/dist/styles/nav-stack.css +141 -0
  190. package/dist/styles/pane.css +62 -0
  191. package/dist/styles/resizable-region.css +158 -0
  192. package/dist/styles/segmented-control.css +10 -7
  193. package/dist/styles/select.css +115 -2
  194. package/dist/styles/skeleton.css +31 -0
  195. package/dist/styles/split-view.css +35 -0
  196. package/dist/styles/state-banner.css +49 -10
  197. package/dist/styles/styles.css +7 -5
  198. package/dist/styles/sunken-panel.css +22 -0
  199. package/dist/styles/surface-scaffold.css +51 -0
  200. package/dist/styles/tab-bar.css +24 -0
  201. package/dist/styles/tab-scaffold.css +85 -0
  202. package/dist/styles/token-search-field.css +14 -2
  203. package/dist/styles/toolbar-control-group.css +224 -6
  204. package/dist/styles/toolbar-text.css +65 -2
  205. package/dist/styles/toolbar.css +47 -2
  206. package/dist/styles/webawesome.css +165 -0
  207. package/dist/styles/workbench.css +187 -0
  208. package/dist/sunken-panel.d.ts +20 -0
  209. package/dist/sunken-panel.js +3 -0
  210. package/dist/sunken-panel.js.map +1 -0
  211. package/dist/surface-scaffold.d.ts +26 -0
  212. package/dist/surface-scaffold.js +3 -0
  213. package/dist/surface-scaffold.js.map +1 -0
  214. package/dist/tab-bar.d.ts +24 -6
  215. package/dist/tab-bar.js +1 -1
  216. package/dist/tab-scaffold.d.ts +31 -0
  217. package/dist/tab-scaffold.js +51 -0
  218. package/dist/tab-scaffold.js.map +1 -0
  219. package/dist/token-search-field.d.ts +30 -13
  220. package/dist/token-search-field.js +1 -1
  221. package/dist/toolbar-control-group.d.ts +33 -7
  222. package/dist/toolbar-control-group.js +1 -1
  223. package/dist/toolbar-text.d.ts +31 -4
  224. package/dist/toolbar-text.js +3 -1
  225. package/dist/toolbar.d.ts +10 -7
  226. package/dist/toolbar.js +1 -1
  227. package/dist/value-table.d.ts +7 -3
  228. package/dist/value-table.js +3 -1
  229. package/dist/webawesome.d.ts +1 -0
  230. package/dist/wire-catalog.d.ts +57 -0
  231. package/dist/wire-catalog.js +302 -0
  232. package/dist/wire-catalog.js.map +1 -0
  233. package/dist/wire-nav-stack.d.ts +18 -0
  234. package/dist/wire-nav-stack.js +228 -0
  235. package/dist/wire-nav-stack.js.map +1 -0
  236. package/dist/wire-resizable-regions.d.ts +1 -1
  237. package/dist/wire-resizable-regions.js +1 -1
  238. package/dist/wire-sidebar.d.ts +48 -0
  239. package/dist/wire-sidebar.js +147 -0
  240. package/dist/wire-sidebar.js.map +1 -0
  241. package/dist/wire-tab-bars.d.ts +19 -2
  242. package/dist/wire-tab-bars.js +1 -1
  243. package/dist/wire-tab-scaffold.d.ts +11 -0
  244. package/dist/wire-tab-scaffold.js +21 -0
  245. package/dist/wire-tab-scaffold.js.map +1 -0
  246. package/dist/wire-token-search-fields.d.ts +104 -4
  247. package/dist/wire-token-search-fields.js +1 -1
  248. package/dist/workbench.d.ts +44 -0
  249. package/dist/workbench.js +106 -0
  250. package/dist/workbench.js.map +1 -0
  251. package/docs/accessibility.md +137 -20
  252. package/docs/app-layouts.md +61 -0
  253. package/docs/catalog.md +364 -0
  254. package/docs/collapsible-panel.md +142 -0
  255. package/docs/component-contract.md +253 -26
  256. package/docs/component-selection.md +213 -57
  257. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  258. package/docs/design/templates/empty-state/filtered.svg +1 -0
  259. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  260. package/docs/design/templates/empty-state/with-action.svg +1 -0
  261. package/docs/design/templates/empty-state-dark.svg +1 -0
  262. package/docs/design/templates/empty-state.svg +1 -0
  263. package/docs/design/templates/list/compact-dark.svg +1 -0
  264. package/docs/design/templates/list/compact.svg +1 -0
  265. package/docs/design/templates/list/stack-dark.svg +1 -0
  266. package/docs/design/templates/list/stack.svg +1 -0
  267. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  268. package/docs/design/templates/list-action-row/default.svg +1 -0
  269. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  270. package/docs/design/templates/list-action-row/selected.svg +1 -0
  271. package/docs/design/templates/list-action-row-dark.svg +1 -0
  272. package/docs/design/templates/list-action-row.svg +1 -0
  273. package/docs/design/templates/list-dark.svg +1 -0
  274. package/docs/design/templates/list-header/action-dark.svg +1 -0
  275. package/docs/design/templates/list-header/action.svg +1 -0
  276. package/docs/design/templates/list-header/count-dark.svg +1 -0
  277. package/docs/design/templates/list-header/count.svg +1 -0
  278. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  279. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  280. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  281. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  282. package/docs/design/templates/list-header-dark.svg +1 -0
  283. package/docs/design/templates/list-header.svg +1 -0
  284. package/docs/design/templates/list-item/default-dark.svg +1 -0
  285. package/docs/design/templates/list-item/default.svg +1 -0
  286. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  287. package/docs/design/templates/list-item/multiline.svg +1 -0
  288. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  289. package/docs/design/templates/list-item/selected.svg +1 -0
  290. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  291. package/docs/design/templates/list-item/trailing.svg +1 -0
  292. package/docs/design/templates/list-item-dark.svg +1 -0
  293. package/docs/design/templates/list-item.svg +1 -0
  294. package/docs/design/templates/list.svg +1 -0
  295. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  296. package/docs/design/templates/segmented-control/equal.svg +1 -0
  297. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  298. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  299. package/docs/design/templates/segmented-control-dark.svg +1 -0
  300. package/docs/design/templates/segmented-control.svg +1 -0
  301. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  302. package/docs/design/templates/skeleton/avatar.svg +1 -0
  303. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  304. package/docs/design/templates/skeleton/block.svg +1 -0
  305. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  306. package/docs/design/templates/skeleton/lines.svg +1 -0
  307. package/docs/design/templates/skeleton-dark.svg +1 -0
  308. package/docs/design/templates/skeleton.svg +1 -0
  309. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  310. package/docs/design/templates/state-banner/danger.svg +1 -0
  311. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  312. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  313. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  314. package/docs/design/templates/state-banner/info.svg +1 -0
  315. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  316. package/docs/design/templates/state-banner/success.svg +1 -0
  317. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  318. package/docs/design/templates/state-banner/warning.svg +1 -0
  319. package/docs/design/templates/state-banner-dark.svg +1 -0
  320. package/docs/design/templates/state-banner.svg +1 -0
  321. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  322. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  323. package/docs/design/templates/tab-bar-dark.svg +1 -0
  324. package/docs/design/templates/tab-bar.svg +1 -0
  325. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  326. package/docs/design/templates/token-search-field/empty.svg +1 -0
  327. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  328. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  329. package/docs/design/templates/token-search-field-dark.svg +1 -0
  330. package/docs/design/templates/token-search-field.svg +1 -0
  331. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  332. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  333. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  334. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  335. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  336. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  337. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  338. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  339. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  340. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  341. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  342. package/docs/design/templates/toolbar-control-group.svg +1 -0
  343. package/docs/design/templates/toolbar-dark.svg +1 -0
  344. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  345. package/docs/design/templates/toolbar-text/default.svg +1 -0
  346. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  347. package/docs/design/templates/toolbar-text/large.svg +1 -0
  348. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  349. package/docs/design/templates/toolbar-text/small.svg +1 -0
  350. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  351. package/docs/design/templates/toolbar-text.svg +1 -0
  352. package/docs/design/templates/toolbar.svg +1 -0
  353. package/docs/design/templates/value-table/details-dark.svg +1 -0
  354. package/docs/design/templates/value-table/details.svg +1 -0
  355. package/docs/design/templates/value-table-dark.svg +1 -0
  356. package/docs/design/templates/value-table.svg +1 -0
  357. package/docs/design/templates.md +128 -0
  358. package/docs/design-philosophy.md +33 -11
  359. package/docs/device-class.md +54 -0
  360. package/docs/examples/application-ui-profile.json +60 -0
  361. package/docs/examples/command-palette-adapter.tsx +67 -17
  362. package/docs/examples/component-catalog-extension-v2.json +80 -0
  363. package/docs/examples/component-catalog-extension.json +45 -0
  364. package/docs/layout.md +98 -37
  365. package/docs/nav-stack.md +77 -0
  366. package/docs/recipes.md +75 -19
  367. package/docs/split-view.md +55 -0
  368. package/docs/sunken-panel.md +53 -0
  369. package/docs/surface-scaffold.md +25 -0
  370. package/docs/tab-scaffold.md +52 -0
  371. package/docs/type-contracts.md +127 -0
  372. package/docs/ui-analyzer.md +118 -0
  373. package/docs/ui-doctor.md +91 -0
  374. package/docs/ui-evaluator.md +122 -0
  375. package/docs/ux-demo.md +24 -13
  376. package/docs/webawesome-theme.md +82 -8
  377. package/docs/workbench.md +123 -0
  378. package/doctor/cli.mjs +115 -0
  379. package/doctor/config.schema.json +68 -0
  380. package/doctor/eslint-diagnostics.d.mts +24 -0
  381. package/doctor/eslint-diagnostics.mjs +24 -0
  382. package/doctor/index.d.mts +116 -0
  383. package/doctor/index.mjs +1272 -0
  384. package/doctor/report.schema.json +118 -0
  385. package/evaluator/cli.mjs +89 -0
  386. package/evaluator/index.d.mts +90 -0
  387. package/evaluator/index.mjs +1138 -0
  388. package/evaluator/report.schema.json +152 -0
  389. package/llms.txt +253 -43
  390. package/package.json +180 -37
  391. package/traversal-exclusions.mjs +27 -0
  392. package/ux-demo/recipes/app-shell.tsx +222 -13
  393. package/ux-demo/recipes/collapsible-sidebar.tsx +229 -0
  394. package/ux-demo/recipes/compact-toolbar.tsx +115 -12
  395. package/ux-demo/recipes/composer-form.tsx +119 -18
  396. package/ux-demo/recipes/list-detail-dialog.tsx +197 -0
  397. package/ux-demo/recipes/list-workspace-states.tsx +175 -9
  398. package/ux-demo/recipes/loaders.ts +13 -4
  399. package/ux-demo/recipes/loading-inspector.tsx +186 -0
  400. package/ux-demo/recipes/mount-recipe.ts +31 -5
  401. package/ux-demo/recipes/navigation-sidebar.tsx +122 -11
  402. package/ux-demo/recipes/navigation-stack.tsx +118 -0
  403. package/ux-demo/recipes/recipes.css +143 -18
  404. package/ux-demo/recipes/types.ts +9 -1
  405. package/ux-demo/recipes/workspace-header.tsx +68 -3
  406. package/dist/browser/dialog-header.js +0 -5
  407. package/dist/browser/menu-action-row.js +0 -3
  408. package/dist/browser/menu-item.js +0 -3
  409. package/dist/browser/page-header.js +0 -3
  410. package/dist/chunk-2PES33HS.js +0 -13
  411. package/dist/chunk-2PES33HS.js.map +0 -1
  412. package/dist/chunk-55DATV3A.js +0 -10
  413. package/dist/chunk-55DATV3A.js.map +0 -1
  414. package/dist/chunk-7BR3DO2A.js.map +0 -1
  415. package/dist/chunk-7LDCTU7D.js +0 -134
  416. package/dist/chunk-7LDCTU7D.js.map +0 -1
  417. package/dist/chunk-AQNKJRFH.js +0 -79
  418. package/dist/chunk-AQNKJRFH.js.map +0 -1
  419. package/dist/chunk-CTQKI2XL.js +0 -28
  420. package/dist/chunk-CTQKI2XL.js.map +0 -1
  421. package/dist/chunk-DAFFDO33.js +0 -14
  422. package/dist/chunk-DAFFDO33.js.map +0 -1
  423. package/dist/chunk-EGHL5S4P.js +0 -33
  424. package/dist/chunk-EGHL5S4P.js.map +0 -1
  425. package/dist/chunk-GY5WH7TO.js +0 -10
  426. package/dist/chunk-GY5WH7TO.js.map +0 -1
  427. package/dist/chunk-H5AGGVU5.js +0 -75
  428. package/dist/chunk-H5AGGVU5.js.map +0 -1
  429. package/dist/chunk-K3G72I6D.js +0 -24
  430. package/dist/chunk-K3G72I6D.js.map +0 -1
  431. package/dist/chunk-M5JRI6MN.js +0 -27
  432. package/dist/chunk-M5JRI6MN.js.map +0 -1
  433. package/dist/chunk-MBR3TYNL.js +0 -14
  434. package/dist/chunk-MBR3TYNL.js.map +0 -1
  435. package/dist/chunk-MFKMHK5W.js +0 -10
  436. package/dist/chunk-MFKMHK5W.js.map +0 -1
  437. package/dist/chunk-MQIZAD4A.js.map +0 -1
  438. package/dist/chunk-NPPD2A6O.js +0 -40
  439. package/dist/chunk-NPPD2A6O.js.map +0 -1
  440. package/dist/chunk-R6JHHBKQ.js +0 -19
  441. package/dist/chunk-R6JHHBKQ.js.map +0 -1
  442. package/dist/chunk-S3TPM2LP.js +0 -23
  443. package/dist/chunk-S3TPM2LP.js.map +0 -1
  444. package/dist/chunk-TRNBHPNW.js.map +0 -1
  445. package/dist/chunk-VHW5YNIB.js +0 -17
  446. package/dist/chunk-VHW5YNIB.js.map +0 -1
  447. package/dist/chunk-WVPYVDXY.js +0 -15
  448. package/dist/chunk-WVPYVDXY.js.map +0 -1
  449. package/dist/chunk-XZXRLY5Q.js +0 -33
  450. package/dist/chunk-XZXRLY5Q.js.map +0 -1
  451. package/dist/dialog-header.d.ts +0 -15
  452. package/dist/dialog-header.js +0 -5
  453. package/dist/dialog-header.js.map +0 -1
  454. package/dist/menu-action-row.js +0 -4
  455. package/dist/menu-action-row.js.map +0 -1
  456. package/dist/menu-header.d.ts +0 -41
  457. package/dist/menu-header.js +0 -6
  458. package/dist/menu-header.js.map +0 -1
  459. package/dist/menu-item.d.ts +0 -31
  460. package/dist/menu-item.js +0 -4
  461. package/dist/menu-item.js.map +0 -1
  462. package/dist/page-header.d.ts +0 -9
  463. package/dist/page-header.js +0 -3
  464. package/dist/page-header.js.map +0 -1
  465. package/dist/styles/dialog-header.css +0 -87
  466. package/dist/styles/menu-action-row.css +0 -154
  467. package/dist/styles/menu-header.css +0 -143
  468. package/dist/styles/menu-item.css +0 -118
  469. package/dist/styles/page-header.css +0 -26
  470. package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
@@ -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
+ }
@@ -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,73 @@
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="mixed"] {
77
+ gap: 0.5rem;
78
+ }
79
+ .kui-toolbar-control-group[data-content="mixed"] > wa-dropdown {
80
+ padding-inline-start: 0.375rem;
81
+ border-inline-start: 1px solid var(--kui-toolbar-control-border);
82
+ }
83
+ .kui-toolbar-control-group[data-content="avatar"][data-scrim="true"] {
84
+ --kui-toolbar-control-background: color-mix(
85
+ in srgb,
86
+ var(--kui-color-neutral-fill-loud) 64%,
87
+ transparent
88
+ );
89
+ --kui-toolbar-control-color: var(--kui-color-neutral-on-loud);
90
+ }
91
+ .kui-toolbar-control-group[data-selected-tone="neutral"] {
92
+ --kui-toolbar-control-selected-color: var(--kui-color-neutral-on-normal);
93
+ --kui-toolbar-control-selected-background: var(
94
+ --kui-color-neutral-fill-normal
95
+ );
96
+ }
97
+ .kui-toolbar-control-group[data-selected-tone="pop"] {
98
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
99
+ }
100
+ .kui-toolbar-control-group[data-selected-chrome="filled"] {
101
+ --kui-toolbar-control-selected-shadow: none;
102
+ --kui-toolbar-control-selected-border: transparent;
103
+ --kui-toolbar-control-selected-background: var(--kui-color-brand-fill-normal);
104
+ --kui-toolbar-control-selected-color: var(--kui-color-brand-on-normal);
105
+ }
106
+ .kui-toolbar-control-group[data-selected-chrome="outline"] {
107
+ --kui-toolbar-control-selected-shadow: none;
108
+ --kui-toolbar-control-selected-background: transparent;
109
+ --kui-toolbar-control-selected-border: var(--kui-color-brand-border-normal);
110
+ }
111
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="filled"] {
112
+ --kui-toolbar-control-selected-background: var(--kui-color-pop-fill-normal);
113
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-normal);
114
+ }
115
+ .kui-toolbar-control-group[data-selected-tone="pop"][data-selected-chrome="outline"] {
116
+ --kui-toolbar-control-selected-border: var(--kui-color-pop-border-normal);
117
+ --kui-toolbar-control-selected-color: var(--kui-color-pop-on-quiet);
118
+ }
44
119
 
45
120
  .kui-toolbar-control-group[data-appearance="borderless"] {
121
+ /* A borderless group has no base fill to lift from, so the default
122
+ surface-colored hover/selected background is invisible against the page.
123
+ Use a visible neutral tint so buttons still show hover/press feedback
124
+ (KF-WZDQS8). */
125
+ --kui-toolbar-control-hover-background: var(--kui-color-neutral-fill-normal);
126
+ --kui-toolbar-control-selected-background: var(
127
+ --kui-color-neutral-fill-normal
128
+ );
46
129
  border-color: transparent;
47
130
  background: transparent;
48
131
  }
@@ -50,6 +133,9 @@
50
133
  .kui-toolbar-control-group > :is(button, wa-button, wa-dropdown) {
51
134
  flex: 0 0 auto;
52
135
  }
136
+ .kui-toolbar-control-group > wa-dropdown {
137
+ display: inline-flex;
138
+ }
53
139
 
54
140
  .kui-toolbar-control-group > button {
55
141
  appearance: none;
@@ -89,6 +175,45 @@
89
175
  min-width: 2.5rem;
90
176
  height: 2.5rem;
91
177
  }
178
+ .kui-toolbar-control-group[data-size="compact"] > button,
179
+ .kui-toolbar-control-group[data-size="compact"] > wa-button,
180
+ .kui-toolbar-control-group[data-size="compact"] > wa-dropdown,
181
+ .kui-toolbar-control-group[data-size="compact"] > wa-dropdown > wa-button,
182
+ .kui-toolbar-control-group[data-size="compact"]
183
+ > wa-dropdown
184
+ > wa-button::part(base),
185
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
186
+ wa-dropdown
187
+ wa-button,
188
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
189
+ wa-dropdown
190
+ wa-button::part(base) {
191
+ min-width: 2rem;
192
+ height: 2rem;
193
+ min-height: 2rem;
194
+ }
195
+
196
+ /* A compact icon-only trigger may stay square, but a mixed-content dropdown
197
+ trigger must grow for its slotted label plus Web Awesome's caret. Otherwise
198
+ the fixed 32px base centers both outside its host, painting the label across
199
+ the separator and the caret beyond the group border. */
200
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
201
+ > wa-dropdown
202
+ > wa-button,
203
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
204
+ > wa-dropdown
205
+ > wa-button::part(base) {
206
+ min-width: max-content;
207
+ }
208
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
209
+ > wa-dropdown
210
+ > wa-button {
211
+ /* WebKit does not contribute a custom element's shadow-part caret to the
212
+ host's intrinsic inline size. Give the standard short text trigger an
213
+ engine-stable floor; max-content still wins for longer light-DOM labels,
214
+ and consumers can raise the public variable for localized copy. */
215
+ width: var(--kui-toolbar-dropdown-trigger-width, 4.125rem);
216
+ }
92
217
 
93
218
  .kui-toolbar-control-group[data-single="true"] > wa-dropdown,
94
219
  .kui-toolbar-control-group[data-single="true"] > wa-dropdown > wa-button,
@@ -107,6 +232,10 @@
107
232
  }
108
233
 
109
234
  .kui-toolbar-control-group wa-button::part(base) {
235
+ /* Match min-width to the 40px height so an icon-only button's highlight is at
236
+ least a circle, not a vertical oval — the host is 40px wide but the base
237
+ part was sizing to its ~32px content. Text/caret buttons grow past it. */
238
+ min-width: 2.5rem;
110
239
  min-height: 2.5rem;
111
240
  box-sizing: border-box;
112
241
  border: 1px solid transparent;
@@ -133,19 +262,67 @@
133
262
  background: transparent;
134
263
  }
135
264
 
136
- .kui-toolbar-control-group[data-single="false"]
137
- > :is(button, wa-button)[aria-pressed="true"] {
265
+ /* A group holding exactly one control behaves like `single` even without the
266
+ flag: the whole group background changes on hover instead of highlighting an
267
+ inner layer inset from the border (KF-J9P1ZD — a heading toolbar's lone Close/
268
+ Done action). */
269
+ .kui-toolbar-control-group:not([data-single="true"]):has(
270
+ > :is(button, wa-button):only-child
271
+ ):hover {
272
+ background: var(--kui-toolbar-control-hover-background);
273
+ }
274
+
275
+ .kui-toolbar-control-group:not([data-single="true"]):has(
276
+ > :is(button, wa-button):only-child
277
+ )
278
+ > :is(button, wa-button):hover,
279
+ .kui-toolbar-control-group:not([data-single="true"]):has(
280
+ > :is(button, wa-button):only-child
281
+ )
282
+ wa-button:hover::part(base) {
283
+ border-color: transparent;
284
+ background: transparent;
285
+ }
286
+
287
+ /* A plain <button> child paints its own box for the selected state. */
288
+ .kui-toolbar-control-group[data-single="false"] > button[aria-pressed="true"] {
138
289
  border-color: var(--kui-toolbar-control-selected-border);
139
290
  color: var(--kui-toolbar-control-selected-color);
140
291
  background: var(--kui-toolbar-control-selected-background);
141
292
  box-shadow: var(--kui-toolbar-control-selected-shadow);
142
293
  }
143
294
 
295
+ /* A wa-button's visual is ::part(base), not the outer 40px host box (which has no
296
+ pill radius). Paint the selected background/border/shadow on ::part(base) —
297
+ mirroring the hover rule — so the selected state matches the pill radius/size
298
+ and stays inside the group's border instead of overflowing it as an oversized
299
+ square (KF-5BDDQ9). The selected text color rides on the host and inherits in. */
300
+ .kui-toolbar-control-group[data-single="false"]
301
+ > wa-button[aria-pressed="true"] {
302
+ color: var(--kui-toolbar-control-selected-color);
303
+ }
304
+ .kui-toolbar-control-group[data-single="false"]
305
+ > wa-button[aria-pressed="true"]::part(base) {
306
+ border-color: var(--kui-toolbar-control-selected-border);
307
+ background: var(--kui-toolbar-control-selected-background);
308
+ box-shadow: var(--kui-toolbar-control-selected-shadow);
309
+ }
310
+
144
311
  .kui-toolbar-control-group > :is(button, wa-button):focus-visible {
145
312
  outline: var(--kui-focus-ring);
146
313
  outline-offset: 1px;
147
314
  }
148
315
 
316
+ /* A composed Select can delegate focus paint to the group so the visible ring
317
+ follows the group's selected pill/rounded geometry instead of Web Awesome's
318
+ form-control radius. */
319
+ .kui-toolbar-control-group:has(
320
+ > .kui-select[data-focus-ring-owner="group"]:is(:focus-within, [open])
321
+ ) {
322
+ outline: var(--kui-focus-ring);
323
+ outline-offset: 1px;
324
+ }
325
+
149
326
  .kui-toolbar-control-group[data-button-appearance="push"][data-single="true"]:has(
150
327
  > :is(button, wa-button)[aria-pressed="true"]
151
328
  ) {
@@ -159,3 +336,44 @@
159
336
  > :is(button, wa-button)[aria-pressed="true"] {
160
337
  color: var(--kui-toolbar-control-pressed-color);
161
338
  }
339
+
340
+ /* Avatar controls paint the image as chrome rather than inserting a replaced
341
+ <img> into the control. `background-size: contain` is the background-image
342
+ equivalent of `object-fit: contain`: the whole avatar remains visible. A
343
+ lone control belongs to the outer group surface; in a group of choices the
344
+ image belongs only to the selected highlight. */
345
+ .kui-toolbar-control-group[data-content="avatar"] {
346
+ background-position: center;
347
+ background-repeat: no-repeat;
348
+ background-size: contain;
349
+ }
350
+
351
+ .kui-toolbar-control-group[data-content="avatar"]:is(
352
+ [data-single="true"],
353
+ :has(> :is(button, wa-button):only-child)
354
+ ) {
355
+ background-image: var(--kui-toolbar-avatar-image);
356
+ }
357
+
358
+ .kui-toolbar-control-group[data-content="avatar"]:is(
359
+ [data-single="true"],
360
+ :has(> :is(button, wa-button):only-child)
361
+ )
362
+ > :is(button, wa-button) {
363
+ color: transparent;
364
+ }
365
+
366
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
367
+ :has(> :is(button, wa-button):only-child)
368
+ )
369
+ > button[aria-pressed="true"],
370
+ .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
371
+ :has(> :is(button, wa-button):only-child)
372
+ )
373
+ > wa-button[aria-pressed="true"]::part(base) {
374
+ color: transparent;
375
+ background-image: var(--kui-toolbar-avatar-image);
376
+ background-position: center;
377
+ background-repeat: no-repeat;
378
+ background-size: contain;
379
+ }
@@ -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
+ }
@@ -20,8 +20,44 @@
20
20
  grid-template-columns: minmax(0, 1fr) auto;
21
21
  }
22
22
 
23
- .kui-toolbar[data-divider="true"] {
24
- box-shadow: inset 0 -1px var(--kui-color-border);
23
+ .kui-toolbar {
24
+ --_kui-toolbar-divider-top: transparent;
25
+ --_kui-toolbar-divider-right: transparent;
26
+ --_kui-toolbar-divider-bottom: transparent;
27
+ --_kui-toolbar-divider-left: transparent;
28
+ box-shadow:
29
+ inset 0 1px var(--_kui-toolbar-divider-top),
30
+ inset -1px 0 var(--_kui-toolbar-divider-right),
31
+ inset 0 -1px var(--_kui-toolbar-divider-bottom),
32
+ inset 1px 0 var(--_kui-toolbar-divider-left);
33
+ }
34
+
35
+ .kui-toolbar[divider-sides*="t"] {
36
+ --_kui-toolbar-divider-top: var(
37
+ --kui-toolbar-divider-color,
38
+ var(--kui-color-border)
39
+ );
40
+ }
41
+
42
+ .kui-toolbar[divider-sides*="r"] {
43
+ --_kui-toolbar-divider-right: var(
44
+ --kui-toolbar-divider-color,
45
+ var(--kui-color-border)
46
+ );
47
+ }
48
+
49
+ .kui-toolbar[divider-sides*="b"] {
50
+ --_kui-toolbar-divider-bottom: var(
51
+ --kui-toolbar-divider-color,
52
+ var(--kui-color-border)
53
+ );
54
+ }
55
+
56
+ .kui-toolbar[divider-sides*="l"] {
57
+ --_kui-toolbar-divider-left: var(
58
+ --kui-toolbar-divider-color,
59
+ var(--kui-color-border)
60
+ );
25
61
  }
26
62
 
27
63
  .kui-toolbar__leading,
@@ -33,16 +69,25 @@
33
69
  gap: var(--kui-toolbar-gap, 0.5rem);
34
70
  }
35
71
 
72
+ /* Pin each zone to its column so a display:none (empty) leading or center zone
73
+ doesn't let the trailing zone auto-place into the first column — which left an
74
+ extra gap + empty track to the trailing zone's right (KF-5BEF2M). The trailing
75
+ zone anchors to the last column via -2/-1, so it stays flush right for both
76
+ the 3- and 2-column layouts, and still stacks under the leading zone when a
77
+ consumer collapses the toolbar to a single column. */
36
78
  .kui-toolbar__leading {
79
+ grid-column: 1;
37
80
  overflow: hidden;
38
81
  }
39
82
 
40
83
  .kui-toolbar__center {
41
84
  justify-content: center;
85
+ grid-column: 2;
42
86
  }
43
87
 
44
88
  .kui-toolbar__trailing {
45
89
  justify-content: flex-end;
90
+ grid-column: -2 / -1;
46
91
  }
47
92
 
48
93
  .kui-toolbar[data-has-center="false"] .kui-toolbar__center,