@kerfjs/ui 5.0.0-beta.55 → 5.0.0-beta.57

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 (418) hide show
  1. package/README.md +74 -41
  2. package/ai/application-ui-diagnostic-ids-v1.json +9 -1
  3. package/ai/application-ui-profile-sync.cjs +1 -1
  4. package/ai/application-ui-profile.defaults.json +63 -8
  5. package/ai/application-ui-profile.mjs +1 -1
  6. package/ai/compile-time-contracts-v1.json +2 -2
  7. package/ai/component-catalog.json +407 -80
  8. package/ai/component-catalog.schema.json +2 -0
  9. package/ai/component-class-owners.cjs +83 -0
  10. package/ai/component-composition-extension.d.ts +7 -0
  11. package/ai/component-composition-extension.schema.json +7 -0
  12. package/ai/{component-catalog-v2-overrides.json → component-composition-rules.json} +2 -1
  13. package/ai/{component-catalog-v2.d.ts → component-composition.d.ts} +9 -5
  14. package/ai/{component-catalog-v2.json → component-composition.json} +302 -61
  15. package/ai/{component-catalog-v2.schema.json → component-composition.schema.json} +21 -5
  16. package/ai/components/README.md +170 -0
  17. package/ai/components/application-tabs.md +65 -0
  18. package/ai/components/badge.md +72 -0
  19. package/ai/components/collapsible-panel.md +102 -0
  20. package/ai/components/content-item.md +90 -0
  21. package/ai/components/disclosure-arrow.md +77 -0
  22. package/ai/components/document-baseline.md +75 -0
  23. package/ai/components/empty-state.md +80 -0
  24. package/ai/components/feedback.md +71 -0
  25. package/ai/components/floating-toolbar.md +80 -0
  26. package/ai/components/foundation.md +65 -0
  27. package/ai/components/grid.md +93 -0
  28. package/ai/components/headers.md +63 -0
  29. package/ai/components/layout.md +75 -0
  30. package/ai/components/list-action-row.md +91 -0
  31. package/ai/components/list-header.md +89 -0
  32. package/ai/components/list-inset-control.md +74 -0
  33. package/ai/components/list-inset-text.md +72 -0
  34. package/ai/components/list-item.md +88 -0
  35. package/ai/components/list.md +103 -0
  36. package/ai/components/loading-spinner.md +72 -0
  37. package/ai/components/lucide-icon.md +66 -0
  38. package/ai/components/nav-stack.md +103 -0
  39. package/ai/components/pane.md +100 -0
  40. package/ai/components/popup-menu.md +82 -0
  41. package/ai/components/recipe-app-shell.md +57 -0
  42. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  43. package/ai/components/recipe-compact-toolbar.md +57 -0
  44. package/ai/components/recipe-composer-form.md +57 -0
  45. package/ai/components/recipe-list-detail-dialog.md +57 -0
  46. package/ai/components/recipe-list-workspace-states.md +57 -0
  47. package/ai/components/recipe-loading-inspector.md +57 -0
  48. package/ai/components/recipe-navigation-sidebar.md +57 -0
  49. package/ai/components/recipe-navigation-stack.md +57 -0
  50. package/ai/components/recipe-workspace-header.md +57 -0
  51. package/ai/components/resize.md +101 -0
  52. package/ai/components/row.md +96 -0
  53. package/ai/components/segmented-control.md +82 -0
  54. package/ai/components/select.md +107 -0
  55. package/ai/components/skeleton.md +84 -0
  56. package/ai/components/spacer.md +86 -0
  57. package/ai/components/split-view.md +102 -0
  58. package/ai/components/state-banner.md +92 -0
  59. package/ai/components/sunken-panel.md +79 -0
  60. package/ai/components/surface-scaffold.md +78 -0
  61. package/ai/components/tab-bar.md +112 -0
  62. package/ai/components/tab-scaffold.md +94 -0
  63. package/ai/components/tabs.md +90 -0
  64. package/ai/components/text.md +82 -0
  65. package/ai/components/token-search-field.md +101 -0
  66. package/ai/components/toolbar-control-group.md +100 -0
  67. package/ai/components/toolbar-text.md +76 -0
  68. package/ai/components/toolbar.md +95 -0
  69. package/ai/components/value-table.md +72 -0
  70. package/ai/components/wa-accordion-item.md +55 -0
  71. package/ai/components/wa-accordion.md +65 -0
  72. package/ai/components/wa-animated-image.md +55 -0
  73. package/ai/components/wa-animation.md +55 -0
  74. package/ai/components/wa-avatar.md +55 -0
  75. package/ai/components/wa-badge.md +55 -0
  76. package/ai/components/wa-breadcrumb-item.md +53 -0
  77. package/ai/components/wa-breadcrumb.md +55 -0
  78. package/ai/components/wa-button-group.md +59 -0
  79. package/ai/components/wa-button.md +55 -0
  80. package/ai/components/wa-callout.md +58 -0
  81. package/ai/components/wa-card.md +59 -0
  82. package/ai/components/wa-carousel-item.md +53 -0
  83. package/ai/components/wa-carousel.md +55 -0
  84. package/ai/components/wa-checkbox-group.md +55 -0
  85. package/ai/components/wa-checkbox.md +55 -0
  86. package/ai/components/wa-color-picker.md +55 -0
  87. package/ai/components/wa-comparison.md +55 -0
  88. package/ai/components/wa-copy-button.md +55 -0
  89. package/ai/components/wa-details.md +61 -0
  90. package/ai/components/wa-dialog.md +59 -0
  91. package/ai/components/wa-divider.md +53 -0
  92. package/ai/components/wa-drawer.md +55 -0
  93. package/ai/components/wa-dropdown-item.md +60 -0
  94. package/ai/components/wa-dropdown.md +60 -0
  95. package/ai/components/wa-format-bytes.md +53 -0
  96. package/ai/components/wa-format-date.md +53 -0
  97. package/ai/components/wa-format-number.md +53 -0
  98. package/ai/components/wa-icon.md +58 -0
  99. package/ai/components/wa-include.md +53 -0
  100. package/ai/components/wa-input.md +59 -0
  101. package/ai/components/wa-intersection-observer.md +53 -0
  102. package/ai/components/wa-known-date.md +53 -0
  103. package/ai/components/wa-markdown.md +53 -0
  104. package/ai/components/wa-mutation-observer.md +53 -0
  105. package/ai/components/wa-number-input.md +55 -0
  106. package/ai/components/wa-option.md +59 -0
  107. package/ai/components/wa-otp-input.md +53 -0
  108. package/ai/components/wa-page.md +53 -0
  109. package/ai/components/wa-pagination.md +55 -0
  110. package/ai/components/wa-popover.md +55 -0
  111. package/ai/components/wa-popup.md +53 -0
  112. package/ai/components/wa-progress-bar.md +53 -0
  113. package/ai/components/wa-progress-ring.md +53 -0
  114. package/ai/components/wa-qr-code.md +53 -0
  115. package/ai/components/wa-radio-group.md +59 -0
  116. package/ai/components/wa-radio.md +55 -0
  117. package/ai/components/wa-random-content.md +53 -0
  118. package/ai/components/wa-rating.md +55 -0
  119. package/ai/components/wa-relative-time.md +53 -0
  120. package/ai/components/wa-resize-observer.md +53 -0
  121. package/ai/components/wa-scroller.md +53 -0
  122. package/ai/components/wa-select.md +63 -0
  123. package/ai/components/wa-skeleton.md +53 -0
  124. package/ai/components/wa-slider.md +55 -0
  125. package/ai/components/wa-spinner.md +58 -0
  126. package/ai/components/wa-split-panel.md +58 -0
  127. package/ai/components/wa-switch.md +53 -0
  128. package/ai/components/wa-tab-group.md +69 -0
  129. package/ai/components/wa-tab-panel.md +60 -0
  130. package/ai/components/wa-tab.md +59 -0
  131. package/ai/components/wa-tag.md +59 -0
  132. package/ai/components/wa-textarea.md +53 -0
  133. package/ai/components/wa-time-input.md +55 -0
  134. package/ai/components/wa-toast-item.md +60 -0
  135. package/ai/components/wa-toast.md +60 -0
  136. package/ai/components/wa-tooltip.md +55 -0
  137. package/ai/components/wa-tree-item.md +55 -0
  138. package/ai/components/wa-tree.md +55 -0
  139. package/ai/components/wa-zoomable-frame.md +55 -0
  140. package/ai/components/workbench.md +114 -0
  141. package/ai/public-api-signatures-v1.md +572 -101
  142. package/ai/skill.md +107 -52
  143. package/ai/webawesome-jsx-signatures-v1.md +8 -2
  144. package/analyzer/component-ownership.d.mts +56 -0
  145. package/analyzer/component-ownership.mjs +184 -0
  146. package/analyzer/index.d.mts +3 -0
  147. package/analyzer/index.mjs +274 -20
  148. package/analyzer/selectors.d.mts +21 -0
  149. package/analyzer/selectors.mjs +212 -0
  150. package/dist/app-tab.js +1 -1
  151. package/dist/badge.d.ts +35 -7
  152. package/dist/badge.js +1 -1
  153. package/dist/browser/catalog.js +25 -0
  154. package/dist/browser/collapsible-panel.js +7 -0
  155. package/dist/browser/content-item.js +3 -0
  156. package/dist/browser/nav-stack.js +8 -0
  157. package/dist/browser/select.js +1 -0
  158. package/dist/browser/split-view.js +10 -0
  159. package/dist/browser/tab-scaffold.js +4 -0
  160. package/dist/browser/workbench.js +10 -0
  161. package/dist/catalog-resources.d.ts +12 -1
  162. package/dist/catalog.d.ts +14 -3
  163. package/dist/catalog.js +53 -43
  164. package/dist/catalog.js.map +1 -1
  165. package/dist/{chunk-WZ2GLEY4.js → chunk-2G2ZJQYK.js} +2 -14
  166. package/dist/chunk-2G2ZJQYK.js.map +1 -0
  167. package/dist/{chunk-R754MHXX.js → chunk-553ASUK6.js} +8 -8
  168. package/dist/chunk-553ASUK6.js.map +1 -0
  169. package/dist/{chunk-D7GWXIAS.js → chunk-5I7QGQVT.js} +1 -1
  170. package/dist/chunk-5I7QGQVT.js.map +1 -0
  171. package/dist/{chunk-RNRUVPJ3.js → chunk-63ZWBGE3.js} +3 -2
  172. package/dist/chunk-63ZWBGE3.js.map +1 -0
  173. package/dist/{chunk-44IG7PFV.js → chunk-6CINWX2E.js} +3 -3
  174. package/dist/{chunk-44IG7PFV.js.map → chunk-6CINWX2E.js.map} +1 -1
  175. package/dist/{chunk-MTM43SJO.js → chunk-6YFHCLHG.js} +2 -2
  176. package/dist/chunk-6YFHCLHG.js.map +1 -0
  177. package/dist/{chunk-C2FAYFDE.js → chunk-AGXQQFKZ.js} +2 -2
  178. package/dist/{chunk-C2FAYFDE.js.map → chunk-AGXQQFKZ.js.map} +1 -1
  179. package/dist/{chunk-ATHXW6RP.js → chunk-AHEG27M7.js} +2 -2
  180. package/dist/{chunk-ATHXW6RP.js.map → chunk-AHEG27M7.js.map} +1 -1
  181. package/dist/chunk-BFPBS5Y4.js +250 -0
  182. package/dist/chunk-BFPBS5Y4.js.map +1 -0
  183. package/dist/{chunk-5OLVUEND.js → chunk-DG6G5EPF.js} +4 -6
  184. package/dist/chunk-DG6G5EPF.js.map +1 -0
  185. package/dist/{chunk-LZXQVUGN.js → chunk-EVYKTVBQ.js} +5 -14
  186. package/dist/chunk-EVYKTVBQ.js.map +1 -0
  187. package/dist/{chunk-7GUQYHKA.js → chunk-EZVNC4J6.js} +7 -1
  188. package/dist/chunk-EZVNC4J6.js.map +1 -0
  189. package/dist/{chunk-RNZAKSME.js → chunk-F4QMLOXJ.js} +5 -4
  190. package/dist/chunk-F4QMLOXJ.js.map +1 -0
  191. package/dist/{chunk-EAX2GSS4.js → chunk-G2RKFVRB.js} +54 -20
  192. package/dist/chunk-G2RKFVRB.js.map +1 -0
  193. package/dist/chunk-JCV4GXWB.js +249 -0
  194. package/dist/chunk-JCV4GXWB.js.map +1 -0
  195. package/dist/chunk-K47P7QZC.js +17 -0
  196. package/dist/chunk-K47P7QZC.js.map +1 -0
  197. package/dist/{chunk-HMQ2ZDGG.js → chunk-KROD7KZK.js} +3 -2
  198. package/dist/chunk-KROD7KZK.js.map +1 -0
  199. package/dist/{chunk-5NDQABWK.js → chunk-M7QV3IHH.js} +3 -1
  200. package/dist/chunk-M7QV3IHH.js.map +1 -0
  201. package/dist/chunk-MA73TA6D.js +42 -0
  202. package/dist/chunk-MA73TA6D.js.map +1 -0
  203. package/dist/{chunk-ZMBU522F.js → chunk-MEY33VWB.js} +2 -2
  204. package/dist/{chunk-ZMBU522F.js.map → chunk-MEY33VWB.js.map} +1 -1
  205. package/dist/chunk-MP2GDBQZ.js +50 -0
  206. package/dist/chunk-MP2GDBQZ.js.map +1 -0
  207. package/dist/{chunk-3NBL3OUQ.js → chunk-NAPE7WUS.js} +2 -2
  208. package/dist/chunk-NAPE7WUS.js.map +1 -0
  209. package/dist/{chunk-BSKEH3UC.js → chunk-NBYTIVHS.js} +2 -2
  210. package/dist/{chunk-BSKEH3UC.js.map → chunk-NBYTIVHS.js.map} +1 -1
  211. package/dist/{chunk-T22EM4ET.js → chunk-OUK6QRDR.js} +71 -31
  212. package/dist/chunk-OUK6QRDR.js.map +1 -0
  213. package/dist/chunk-PWXNJS2B.js +115 -0
  214. package/dist/chunk-PWXNJS2B.js.map +1 -0
  215. package/dist/{chunk-GUIHMIT2.js → chunk-QOWG4ZCL.js} +5 -4
  216. package/dist/chunk-QOWG4ZCL.js.map +1 -0
  217. package/dist/{chunk-5I22LMCV.js → chunk-VZOFZPSO.js} +2 -2
  218. package/dist/chunk-VZOFZPSO.js.map +1 -0
  219. package/dist/{chunk-4BIMLITI.js → chunk-WLG6SSNT.js} +5 -3
  220. package/dist/chunk-WLG6SSNT.js.map +1 -0
  221. package/dist/{chunk-NE5JAOQS.js → chunk-WOUF7YXM.js} +3 -3
  222. package/dist/{chunk-NE5JAOQS.js.map → chunk-WOUF7YXM.js.map} +1 -1
  223. package/dist/{chunk-N7FHFNT6.js → chunk-XCO6YCYM.js} +34 -5
  224. package/dist/chunk-XCO6YCYM.js.map +1 -0
  225. package/dist/{chunk-TZ5IHWB2.js → chunk-XDKAYSVD.js} +5 -3
  226. package/dist/chunk-XDKAYSVD.js.map +1 -0
  227. package/dist/collapsible-panel.d.ts +14 -3
  228. package/dist/collapsible-panel.js +13 -16
  229. package/dist/collapsible-panel.js.map +1 -1
  230. package/dist/content-item.d.ts +46 -0
  231. package/dist/content-item.js +4 -0
  232. package/dist/content-item.js.map +1 -0
  233. package/dist/css-values.d.ts +5 -11
  234. package/dist/css-values.js +1 -1
  235. package/dist/disclosure-arrow.d.ts +4 -1
  236. package/dist/disclosure-arrow.js +1 -1
  237. package/dist/floating-toolbar.d.ts +17 -6
  238. package/dist/floating-toolbar.js +1 -1
  239. package/dist/grid.js +1 -1
  240. package/dist/help-tags-register.d.ts +13 -0
  241. package/dist/help-tags-register.js +9 -0
  242. package/dist/help-tags-register.js.map +1 -0
  243. package/dist/index.d.ts +7 -5
  244. package/dist/index.js +29 -26
  245. package/dist/list-action-row.js +2 -1
  246. package/dist/list-header.d.ts +14 -1
  247. package/dist/list-header.js +1 -1
  248. package/dist/list-inset-control.d.ts +1 -1
  249. package/dist/list-inset-control.js +1 -1
  250. package/dist/list-inset-text.d.ts +3 -10
  251. package/dist/list-inset-text.js +1 -1
  252. package/dist/list-item.js +2 -1
  253. package/dist/list.d.ts +10 -3
  254. package/dist/list.js +1 -1
  255. package/dist/nav-stack.d.ts +50 -5
  256. package/dist/nav-stack.js +4 -1
  257. package/dist/pane.d.ts +37 -2
  258. package/dist/pane.js +1 -1
  259. package/dist/{panel-toolbar-BFQxFITu.d.ts → panel-toolbar-BN4x0rth.d.ts} +13 -1
  260. package/dist/popup-menu-register.js +3 -2
  261. package/dist/popup-menu-register.js.map +1 -1
  262. package/dist/popup-menu.js +1 -1
  263. package/dist/row.d.ts +1 -1
  264. package/dist/row.js +1 -1
  265. package/dist/select-register.js +70 -3
  266. package/dist/select-register.js.map +1 -1
  267. package/dist/select.d.ts +46 -8
  268. package/dist/select.js +2 -1
  269. package/dist/{divider-sides-BzB6rphT.d.ts → sides-BPSWde0A.d.ts} +1 -3
  270. package/dist/skeleton.js +1 -1
  271. package/dist/spacer.js +1 -1
  272. package/dist/split-view.d.ts +31 -3
  273. package/dist/split-view.js +34 -5
  274. package/dist/split-view.js.map +1 -1
  275. package/dist/state-banner.js +1 -1
  276. package/dist/styles/app-tab.css +31 -0
  277. package/dist/styles/badge.css +32 -11
  278. package/dist/styles/catalog/components/catalog-example.css +1 -1
  279. package/dist/styles/catalog/components/catalog-stage.css +1 -1
  280. package/dist/styles/collapsible-panel.css +199 -42
  281. package/dist/styles/content-item.css +30 -0
  282. package/dist/styles/floating-toolbar.css +26 -2
  283. package/dist/styles/foundation.css +28 -19
  284. package/dist/styles/layout.css +1 -21
  285. package/dist/styles/list-action-row.css +13 -1
  286. package/dist/styles/list-header.css +0 -12
  287. package/dist/styles/list-inset-text.css +1 -2
  288. package/dist/styles/list-item.css +14 -1
  289. package/dist/styles/list.css +5 -5
  290. package/dist/styles/nav-stack.css +63 -71
  291. package/dist/styles/pane.css +83 -1
  292. package/dist/styles/popup-menu.css +229 -0
  293. package/dist/styles/resizable-region.css +70 -15
  294. package/dist/styles/select.css +60 -19
  295. package/dist/styles/skeleton.css +30 -3
  296. package/dist/styles/split-view.css +31 -32
  297. package/dist/styles/state-banner.css +0 -19
  298. package/dist/styles/surface-scaffold.css +8 -3
  299. package/dist/styles/tab-bar.css +79 -28
  300. package/dist/styles/tab-scaffold.css +60 -14
  301. package/dist/styles/text.css +17 -1
  302. package/dist/styles/token-search-field.css +4 -4
  303. package/dist/styles/toolbar-control-group.css +143 -69
  304. package/dist/styles/toolbar-text.css +21 -0
  305. package/dist/styles/toolbar.css +22 -37
  306. package/dist/styles/value-table.css +19 -2
  307. package/dist/styles/webawesome.css +3 -1
  308. package/dist/styles/workbench.css +145 -42
  309. package/dist/tab-scaffold.d.ts +46 -2
  310. package/dist/tab-scaffold.js +52 -16
  311. package/dist/tab-scaffold.js.map +1 -1
  312. package/dist/token-search-field.d.ts +4 -2
  313. package/dist/token-search-field.js +1 -1
  314. package/dist/toolbar-text.d.ts +7 -1
  315. package/dist/toolbar-text.js +1 -1
  316. package/dist/toolbar.d.ts +20 -5
  317. package/dist/toolbar.js +1 -1
  318. package/dist/{types-D6vzj-VT.d.ts → types-BuHELdXR.d.ts} +39 -6
  319. package/dist/value-table.js +1 -1
  320. package/dist/webawesome.d.ts +7 -1
  321. package/dist/wire-catalog.d.ts +15 -2
  322. package/dist/wire-catalog.js +12 -2
  323. package/dist/wire-catalog.js.map +1 -1
  324. package/dist/wire-scroll-dividers.d.ts +69 -0
  325. package/dist/wire-scroll-dividers.js +3 -0
  326. package/dist/wire-scroll-dividers.js.map +1 -0
  327. package/dist/wire-token-search-fields.js +1 -1
  328. package/dist/workbench.d.ts +60 -22
  329. package/dist/workbench.js +1 -1
  330. package/docs/accessibility.md +116 -7
  331. package/docs/app-layouts.md +18 -8
  332. package/docs/catalog.md +26 -7
  333. package/docs/collapsible-panel.md +32 -9
  334. package/docs/component-contract.md +182 -30
  335. package/docs/component-selection.md +59 -46
  336. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  337. package/docs/design/templates/empty-state/with-action.svg +1 -1
  338. package/docs/design/templates/empty-state-dark.svg +1 -1
  339. package/docs/design/templates/empty-state.svg +1 -1
  340. package/docs/design/templates/list/compact-dark.svg +1 -1
  341. package/docs/design/templates/list/compact.svg +1 -1
  342. package/docs/design/templates/list/stack-dark.svg +1 -1
  343. package/docs/design/templates/list/stack.svg +1 -1
  344. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  345. package/docs/design/templates/list-action-row/default.svg +1 -1
  346. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  347. package/docs/design/templates/list-action-row/selected.svg +1 -1
  348. package/docs/design/templates/list-action-row-dark.svg +1 -1
  349. package/docs/design/templates/list-action-row.svg +1 -1
  350. package/docs/design/templates/list-dark.svg +1 -1
  351. package/docs/design/templates/list-item/default-dark.svg +1 -1
  352. package/docs/design/templates/list-item/default.svg +1 -1
  353. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  354. package/docs/design/templates/list-item/selected.svg +1 -1
  355. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  356. package/docs/design/templates/list-item/trailing.svg +1 -1
  357. package/docs/design/templates/list-item-dark.svg +1 -1
  358. package/docs/design/templates/list-item.svg +1 -1
  359. package/docs/design/templates/list.svg +1 -1
  360. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  361. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  362. package/docs/design/templates/tab-bar-dark.svg +1 -1
  363. package/docs/design/templates/tab-bar.svg +1 -1
  364. package/docs/design/templates/value-table/details-dark.svg +1 -1
  365. package/docs/design/templates/value-table/details.svg +1 -1
  366. package/docs/design/templates/value-table-dark.svg +1 -1
  367. package/docs/design/templates/value-table.svg +1 -1
  368. package/docs/design-philosophy.md +31 -4
  369. package/docs/examples/application-ui-profile.json +4 -4
  370. package/docs/examples/command-palette-adapter.tsx +3 -2
  371. package/docs/examples/{component-catalog-extension-v2.json → component-composition-extension.json} +3 -3
  372. package/docs/layout.md +148 -29
  373. package/docs/nav-stack.md +77 -3
  374. package/docs/recipes.md +4 -3
  375. package/docs/split-view.md +54 -5
  376. package/docs/tab-scaffold.md +73 -2
  377. package/docs/type-contracts.md +21 -20
  378. package/docs/ui-analyzer.md +99 -5
  379. package/docs/ui-doctor.md +10 -0
  380. package/docs/ux-demo.md +2 -2
  381. package/docs/webawesome-theme.md +1 -2
  382. package/docs/workbench.md +57 -11
  383. package/doctor/index.mjs +6 -1
  384. package/llms.txt +117 -24
  385. package/package.json +29 -6
  386. package/ux-demo/recipes/collapsible-sidebar.tsx +3 -3
  387. package/ux-demo/recipes/composer-form.tsx +0 -1
  388. package/ux-demo/recipes/list-detail-dialog.tsx +0 -2
  389. package/ux-demo/recipes/list-workspace-states.tsx +0 -1
  390. package/ux-demo/recipes/loading-inspector.tsx +0 -1
  391. package/ux-demo/recipes/navigation-sidebar.tsx +3 -2
  392. package/ux-demo/recipes/navigation-stack.tsx +3 -2
  393. package/ux-demo/recipes/workspace-header.tsx +0 -1
  394. package/ai/component-catalog-extension-v2.d.ts +0 -7
  395. package/ai/component-catalog-extension-v2.schema.json +0 -7
  396. package/dist/chunk-3NBL3OUQ.js.map +0 -1
  397. package/dist/chunk-4BIMLITI.js.map +0 -1
  398. package/dist/chunk-5I22LMCV.js.map +0 -1
  399. package/dist/chunk-5NDQABWK.js.map +0 -1
  400. package/dist/chunk-5OLVUEND.js.map +0 -1
  401. package/dist/chunk-7GUQYHKA.js.map +0 -1
  402. package/dist/chunk-D7GWXIAS.js.map +0 -1
  403. package/dist/chunk-DQA5FMOX.js +0 -85
  404. package/dist/chunk-DQA5FMOX.js.map +0 -1
  405. package/dist/chunk-EAX2GSS4.js.map +0 -1
  406. package/dist/chunk-GUIHMIT2.js.map +0 -1
  407. package/dist/chunk-HMQ2ZDGG.js.map +0 -1
  408. package/dist/chunk-LZXQVUGN.js.map +0 -1
  409. package/dist/chunk-MTM43SJO.js.map +0 -1
  410. package/dist/chunk-N7FHFNT6.js.map +0 -1
  411. package/dist/chunk-R754MHXX.js.map +0 -1
  412. package/dist/chunk-RNRUVPJ3.js.map +0 -1
  413. package/dist/chunk-RNZAKSME.js.map +0 -1
  414. package/dist/chunk-T22EM4ET.js.map +0 -1
  415. package/dist/chunk-TZ5IHWB2.js.map +0 -1
  416. package/dist/chunk-WZ2GLEY4.js.map +0 -1
  417. package/dist/chunk-XD7DWYXG.js +0 -34
  418. package/dist/chunk-XD7DWYXG.js.map +0 -1
@@ -47,7 +47,7 @@
47
47
  var(--kui-collapsible-panel-width, 17.5rem) +
48
48
  var(--_kui-collapsible-panel-safe-inline-start)
49
49
  );
50
- border-inline-end: 1px solid var(--kui-color-border);
50
+ border-inline-end: 1px solid var(--kui-color-neutral-border-normal);
51
51
  }
52
52
 
53
53
  .kui-collapsible-panel--right {
@@ -55,7 +55,7 @@
55
55
  var(--kui-collapsible-panel-width, 17.5rem) +
56
56
  var(--_kui-collapsible-panel-safe-inline-end)
57
57
  );
58
- border-inline-start: 1px solid var(--kui-color-border);
58
+ border-inline-start: 1px solid var(--kui-color-neutral-border-normal);
59
59
  }
60
60
 
61
61
  .kui-collapsible-panel--bottom {
@@ -67,7 +67,7 @@
67
67
  width: 100%;
68
68
  height: var(--_kui-collapsible-panel-extent);
69
69
  min-height: 0;
70
- border-block-start: 1px solid var(--kui-color-border);
70
+ border-block-start: 1px solid var(--kui-color-neutral-border-normal);
71
71
  }
72
72
 
73
73
  /* The panel's content sees the edges it touches; its interior edge is clear. */
@@ -111,18 +111,16 @@
111
111
  var(--kui-edge-inset-inline-end);
112
112
  }
113
113
 
114
- .kui-collapsible-panel__content:not(
115
- :has(
116
- > :is(
117
- [data-component="pane"],
118
- [data-component="nav-stack"],
119
- [data-component="split-view"],
120
- [data-component="workbench"],
121
- [data-component="tab-scaffold"]
122
- ):only-child
123
- )
124
- )
125
- > * {
114
+ .kui-collapsible-panel__content
115
+ > :not(
116
+ :is(
117
+ [data-component="pane"],
118
+ [data-component="nav-stack"],
119
+ [data-component="split-view"],
120
+ [data-component="workbench"],
121
+ [data-component="tab-scaffold"]
122
+ ):only-child
123
+ ) {
126
124
  --kui-edge-inset-block-start: 0px;
127
125
  --kui-edge-inset-block-end: 0px;
128
126
  --kui-edge-inset-inline-start: 0px;
@@ -130,34 +128,132 @@
130
128
  }
131
129
 
132
130
  /* An expanded inline panel is the region at its edge, so its direct siblings
133
- no longer reach that edge. */
134
- .kui-collapsible-panel--left[data-presentation="inline"]:not(
135
- [data-collapsed="true"],
136
- [data-collapsible-overlay="true"] *,
137
- [data-collapsible-responsive="hidden"] *
131
+ no longer reach that edge. The container flags the edge it has handed to a
132
+ panel in a non-inheriting property, and a style query zeroes that edge on
133
+ the container's children only; the panel that owns the edge (the first
134
+ left, the last right or bottom) inherits the container's value back.
135
+ Selecting the siblings themselves (`:has(~ panel)`, `panel ~ *`) makes
136
+ every element a sibling-rule candidate, so in Chromium each insertion into
137
+ a long list restyles the list's other rows. The flag is set by a keyed
138
+ `:has(> panel)` on the container and read by a parent style lookup, so a
139
+ list without a panel in it pays nothing. */
140
+ @property --_kui-collapsible-panel-owns-inline-start {
141
+ syntax: "*";
142
+ inherits: false;
143
+ }
144
+
145
+ @property --_kui-collapsible-panel-owns-inline-end {
146
+ syntax: "*";
147
+ inherits: false;
148
+ }
149
+
150
+ @property --_kui-collapsible-panel-owns-block-end {
151
+ syntax: "*";
152
+ inherits: false;
153
+ }
154
+
155
+ :where(
156
+ :has(
157
+ > .kui-collapsible-panel--left[data-presentation="inline"]:not(
158
+ [data-collapsed="true"],
159
+ [data-collapsible-overlay="true"] *,
160
+ [data-collapsible-responsive="hidden"] *
161
+ )
138
162
  )
139
- ~ * {
140
- --kui-edge-inset-inline-start: 0px;
163
+ ) {
164
+ --_kui-collapsible-panel-owns-inline-start: true;
165
+ }
166
+
167
+ :where(
168
+ :has(
169
+ > .kui-collapsible-panel--right[data-presentation="inline"]:not(
170
+ [data-collapsed="true"],
171
+ [data-collapsible-overlay="true"] *,
172
+ [data-collapsible-responsive="hidden"] *
173
+ )
174
+ )
175
+ ) {
176
+ --_kui-collapsible-panel-owns-inline-end: true;
177
+ }
178
+
179
+ :where(
180
+ :has(
181
+ > .kui-collapsible-panel--bottom[data-presentation="inline"]:not(
182
+ [data-collapsed="true"],
183
+ [data-collapsible-overlay="true"] *,
184
+ [data-collapsible-responsive="hidden"] *
185
+ )
186
+ )
187
+ ) {
188
+ --_kui-collapsible-panel-owns-block-end: true;
189
+ }
190
+
191
+ @container style(--_kui-collapsible-panel-owns-inline-start: true) {
192
+ :where(*) {
193
+ --kui-edge-inset-inline-start: 0px;
194
+ }
195
+ }
196
+
197
+ @container style(--_kui-collapsible-panel-owns-inline-end: true) {
198
+ :where(*) {
199
+ --kui-edge-inset-inline-end: 0px;
200
+ }
141
201
  }
142
202
 
143
- :has(
144
- ~ .kui-collapsible-panel--right[data-presentation="inline"]:not(
203
+ @container style(--_kui-collapsible-panel-owns-block-end: true) {
204
+ :where(*) {
205
+ --kui-edge-inset-block-end: 0px;
206
+ }
207
+ }
208
+
209
+ :where(
210
+ .kui-collapsible-panel--left[data-presentation="inline"]:not(
145
211
  [data-collapsed="true"],
146
212
  [data-collapsible-overlay="true"] *,
147
- [data-collapsible-responsive="hidden"] *
213
+ [data-collapsible-responsive="hidden"] *,
214
+ .kui-collapsible-panel--left[data-presentation="inline"]:not(
215
+ [data-collapsed="true"],
216
+ [data-collapsible-overlay="true"] *,
217
+ [data-collapsible-responsive="hidden"] *
218
+ )
219
+ ~ *
148
220
  )
149
221
  ) {
150
- --kui-edge-inset-inline-end: 0px;
222
+ --kui-edge-inset-inline-start: inherit;
151
223
  }
152
224
 
153
- :has(
154
- ~ .kui-collapsible-panel--bottom[data-presentation="inline"]:not(
225
+ :where(
226
+ .kui-collapsible-panel--right[data-presentation="inline"]:not(
155
227
  [data-collapsed="true"],
156
228
  [data-collapsible-overlay="true"] *,
157
- [data-collapsible-responsive="hidden"] *
229
+ [data-collapsible-responsive="hidden"] *,
230
+ :has(
231
+ ~ .kui-collapsible-panel--right[data-presentation="inline"]:not(
232
+ [data-collapsed="true"],
233
+ [data-collapsible-overlay="true"] *,
234
+ [data-collapsible-responsive="hidden"] *
235
+ )
236
+ )
158
237
  )
159
238
  ) {
160
- --kui-edge-inset-block-end: 0px;
239
+ --kui-edge-inset-inline-end: inherit;
240
+ }
241
+
242
+ :where(
243
+ .kui-collapsible-panel--bottom[data-presentation="inline"]:not(
244
+ [data-collapsed="true"],
245
+ [data-collapsible-overlay="true"] *,
246
+ [data-collapsible-responsive="hidden"] *,
247
+ :has(
248
+ ~ .kui-collapsible-panel--bottom[data-presentation="inline"]:not(
249
+ [data-collapsed="true"],
250
+ [data-collapsible-overlay="true"] *,
251
+ [data-collapsible-responsive="hidden"] *
252
+ )
253
+ )
254
+ )
255
+ ) {
256
+ --kui-edge-inset-block-end: inherit;
161
257
  }
162
258
 
163
259
  .kui-collapsible-panel[data-collapsed="true"] {
@@ -292,10 +388,19 @@
292
388
  that container or of one of its direct children (the app's work-area
293
389
  column) — owns the container's bottom, so the corner floats above the
294
390
  drawer's top edge instead of over it. The drawer publishes that edge as an
295
- anchor; a drawer nested deeper, inside the work area's own content, belongs
296
- to another layout and is scoped out. Without anchor positioning the corner
297
- keeps the container's bottom edge. */
298
- .kui-collapsible-panel--bottom[data-presentation="inline"]:not(
391
+ anchor only there, beside a CollapsiblePanel or ResizableRegion restore
392
+ control (matched by their restore attributes); a drawer nested deeper,
393
+ inside the work area's own content, belongs to another layout and
394
+ publishes nothing. The selector ends on the drawer, not on a universal
395
+ `> * > * > *` scope below the container: a universal selector after a
396
+ :has() container restyles every child of every ancestor of a DOM change in
397
+ Chromium. Without anchor positioning the corner keeps the container's
398
+ bottom edge. */
399
+ :where(
400
+ :has(> [data-panel-restore], > [data-region-restore]),
401
+ :has(> [data-panel-restore], > [data-region-restore]) > *
402
+ )
403
+ > .kui-collapsible-panel--bottom[data-presentation="inline"]:not(
299
404
  [data-collapsed="true"],
300
405
  [data-collapsible-overlay="true"] *,
301
406
  [data-collapsible-responsive="hidden"] *
@@ -303,19 +408,20 @@
303
408
  anchor-name: --kui-restore-drawer;
304
409
  }
305
410
 
306
- :where(:has(> .kui-collapsible-panel__restore)) > * > * > * {
307
- anchor-scope: --kui-restore-drawer;
308
- }
309
-
310
411
  .kui-collapsible-panel__restore {
311
412
  --_kui-collapsible-panel-restore-inset: var(
312
413
  --kui-collapsible-panel-restore-inset,
313
414
  1rem
314
415
  );
315
- /* The corner owns the inset, so a FloatingToolbar composed here floats
316
- from this point instead of adding its own inset on top. */
317
- --kui-floating-toolbar-inset: 0px;
318
416
  position: absolute;
417
+ /* Hidden while an open side overlay covers the content (see below). */
418
+ visibility: var(
419
+ --_kui-workbench-covered,
420
+ var(
421
+ --_kui-collapsible-panel-covered,
422
+ var(--_kui-resizable-region-covered, inherit)
423
+ )
424
+ );
319
425
  z-index: var(
320
426
  --kui-collapsible-panel-restore-z,
321
427
  calc(var(--kui-collapsible-panel-overlay-z, 40) - 2)
@@ -361,6 +467,57 @@
361
467
  );
362
468
  }
363
469
 
470
+ /* An open side overlay — the wireSidebar compact overlay or a static
471
+ `presentation="overlay"` panel — covers the content beside it, so that
472
+ content's floating controls (a FloatingToolbar, another panel's restore
473
+ corner) are hidden, not merely stacked beneath it: they never paint over
474
+ the overlay whatever stacking context an app puts them in, and hidden they
475
+ leave the tab order and the accessibility tree. They come back as the
476
+ overlay closes. The CollapsiblePanel's own covered context,
477
+ `--_kui-collapsible-panel-covered`, is read by FloatingToolbar and the
478
+ layouts' restore corners; the overlay panels themselves are exempt, so
479
+ their own floating controls stay. */
480
+ [data-collapsible-overlay="true"]:has(
481
+ .kui-collapsible-panel:is(
482
+ .kui-collapsible-panel--left,
483
+ .kui-collapsible-panel--right
484
+ ):not([data-collapsed="true"])
485
+ ) {
486
+ --_kui-collapsible-panel-covered: hidden;
487
+ }
488
+
489
+ [data-collapsible-overlay="true"] .kui-collapsible-panel {
490
+ --_kui-collapsible-panel-covered: initial;
491
+ }
492
+
493
+ /* A static overlay panel sets the flag on its container and clears it again
494
+ on the overlay panels in it, so it reaches the overlay's siblings only —
495
+ never through a universal selector below the :has() container
496
+ (`:has(…) > :not(…)`), which in Chromium restyles every child of every
497
+ ancestor of a DOM change. */
498
+ :where(
499
+ :has(
500
+ > .kui-collapsible-panel:is(
501
+ .kui-collapsible-panel--left,
502
+ .kui-collapsible-panel--right
503
+ )[data-presentation="overlay"]:not([data-collapsed="true"])
504
+ )
505
+ ) {
506
+ --_kui-collapsible-panel-covered: hidden;
507
+ }
508
+
509
+ :where(
510
+ :has(
511
+ > .kui-collapsible-panel:is(
512
+ .kui-collapsible-panel--left,
513
+ .kui-collapsible-panel--right
514
+ )[data-presentation="overlay"]:not([data-collapsed="true"])
515
+ )
516
+ )
517
+ > .kui-collapsible-panel[data-presentation="overlay"] {
518
+ --_kui-collapsible-panel-covered: initial;
519
+ }
520
+
364
521
  /* A button does not stretch between its insets the way a div does, so the
365
522
  backdrop sizes itself to its containing block explicitly. It sits one below
366
523
  the overlay z-index, so an app that moves the overlay moves the backdrop
@@ -396,7 +553,7 @@
396
553
  }
397
554
 
398
555
  .kui-collapsible-panel__toggle:hover {
399
- border-color: var(--kui-color-border);
556
+ border-color: var(--kui-color-neutral-border-normal);
400
557
  background: var(--kui-color-neutral-fill-normal);
401
558
  }
402
559
 
@@ -0,0 +1,30 @@
1
+ /* One self-contained content-item: 8px inline margin, a real 1px border
2
+ (transparent unless framed), 8px padding, and a rounded or pill radius.
3
+ Rendered by ContentItem; the classes stay public for other elements. */
4
+
5
+ .kui-content-item {
6
+ min-width: 0;
7
+ margin-inline: var(--kui-layout-inline-margin, 0.5rem);
8
+ padding: var(--kui-layout-item-padding, 0.5rem);
9
+ box-sizing: border-box;
10
+ border: var(--kui-layout-item-border-width, 1px) solid
11
+ var(--kui-content-item-border, transparent);
12
+ border-radius: var(
13
+ --kui-content-item-radius,
14
+ var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
15
+ );
16
+ background: var(--kui-content-item-background, transparent);
17
+ }
18
+
19
+ .kui-content-item--pill {
20
+ --kui-content-item-radius: var(
21
+ --kui-layout-pill-radius,
22
+ calc(1px + 1.3125rem)
23
+ );
24
+ }
25
+
26
+ /* A visible frame for a content item that marks a real distinction: the
27
+ standard neutral border, same geometry (the border is always reserved). */
28
+ .kui-content-item--framed {
29
+ --kui-content-item-border: var(--kui-color-neutral-border-normal);
30
+ }
@@ -1,8 +1,7 @@
1
1
  .kui-floating-toolbar {
2
2
  /* Inset from the container edges: a top toolbar sits 8px in, so this floats an
3
3
  extra 8px past that (--kui-space-m = 16px). Override the token to reposition,
4
- on the toolbar or on an ancestor composition boundary: a Workbench restore
5
- corner sets it to 0 because the corner already owns the inset. */
4
+ on the toolbar or on an ancestor composition boundary. */
6
5
  --_kui-floating-toolbar-inset: var(
7
6
  --kui-floating-toolbar-inset,
8
7
  var(--kui-space-m, 1rem)
@@ -13,12 +12,37 @@
13
12
  dark so the controls read as one distinct floating layer over any theme. */
14
13
  position: absolute;
15
14
  z-index: 4;
15
+ /* A layout whose open side overlay covers this toolbar's region (a
16
+ Workbench rail, a CollapsiblePanel, a ResizableRegion) provides its own
17
+ covered context to that region, and the toolbar hides — out of the tab
18
+ order and the accessibility tree — rather than risk painting over the
19
+ overlay. Any enclosing layout's covered context hides it. */
20
+ visibility: var(
21
+ --_kui-workbench-covered,
22
+ var(
23
+ --_kui-collapsible-panel-covered,
24
+ var(--_kui-resizable-region-covered, inherit)
25
+ )
26
+ );
16
27
  display: flex;
17
28
  color-scheme: dark;
18
29
  align-items: center;
19
30
  gap: var(--kui-space-xs, 0.5rem);
20
31
  }
21
32
 
33
+ /* In a layout's restore corner the corner already owns the inset, so the
34
+ toolbar floats from the corner itself. Zero specificity: the toolbar's own
35
+ `inset` (or an app rule on the toolbar) still wins, while a token inherited
36
+ from outside the corner does not. */
37
+ :where(
38
+ .kui-workbench__restore,
39
+ .kui-collapsible-panel__restore,
40
+ .kui-resizable-region__restore
41
+ )
42
+ :where(.kui-floating-toolbar) {
43
+ --kui-floating-toolbar-inset: 0px;
44
+ }
45
+
22
46
  .kui-floating-toolbar[data-position^="bottom"] {
23
47
  inset-block-end: var(--_kui-floating-toolbar-inset);
24
48
  }
@@ -79,6 +79,33 @@
79
79
  --kui-radius-circle: var(--wa-border-radius-circle, 50%);
80
80
  --kui-radius-pill: var(--wa-border-radius-pill, 999px);
81
81
  --kui-disclosure-icon-scale: 0.5;
82
+ /* Private popup-choice contract. A Select's listbox and a PopupMenu's menu
83
+ both read these, so a value list and a command menu draw one surface
84
+ inset, one row geometry (Web Awesome's option metrics plus Kerf's label
85
+ rhythm), one reserved check column, one current-row fill, one group-title
86
+ style, and one disclosure-caret motion. The em values resolve against the
87
+ row that reads them. */
88
+ --_kui-popup-inset: 0.25rem;
89
+ --_kui-popup-row-gap: 0.125rem;
90
+ --_kui-popup-row-padding-block: 0.5em;
91
+ --_kui-popup-row-padding-inline-start: 0.25em;
92
+ --_kui-popup-row-padding-inline-end: 1em;
93
+ --_kui-popup-row-check-width: calc(
94
+ 2 * var(--wa-font-size-smaller, round(calc(1em / 1.125), 1px))
95
+ );
96
+ --_kui-popup-row-icon-size: 1rem;
97
+ --_kui-popup-row-icon-gap: 0.5rem;
98
+ --_kui-popup-row-label-padding-block: 0.35rem;
99
+ --_kui-popup-row-label-line-height: 1.25;
100
+ --_kui-popup-row-current-background: var(--kui-color-brand-fill-normal);
101
+ /* Current row text sits on the brand fill; the darker on-fill accent clears
102
+ WCAG AA there (brand-on-quiet is 4.26:1 over that fill). */
103
+ --_kui-popup-row-current-color: var(--kui-color-brand-on-fill);
104
+ --_kui-popup-group-title-padding: 0.2rem 0.75rem 0.3rem;
105
+ --_kui-popup-group-title-font-weight: 750;
106
+ --_kui-popup-caret-open-rotation: -180deg;
107
+ --_kui-popup-caret-transition: rotate var(--wa-transition-slow, 0.3s)
108
+ var(--wa-transition-easing, ease);
82
109
  /* macOS Tahoe light semantics used by Hot Sheet 2, with a compatible dark extension. */
83
110
  /* Every --kui-color-* token (and the focus-ring color) that reads a --wa-*
84
111
  token falls back to the value src/webawesome.css assigns to that token,
@@ -419,22 +446,6 @@
419
446
  fill; #ffa0a2 matches the other tones' pale dark on-fill values. */
420
447
  --kui-color-danger-on-fill: light-dark(#c20b20, #ffa0a2);
421
448
 
422
- /* Compatibility aliases retained for existing @kerfjs/ui consumers. */
423
- --kui-color-border: var(
424
- --wa-color-surface-border,
425
- var(--kui-color-neutral-border-normal)
426
- );
427
- --kui-color-border-quiet: var(--kui-color-neutral-border-quiet);
428
- --kui-color-accent: var(--kui-color-brand-fill-normal);
429
- --kui-color-accent-text: var(--kui-color-brand-on-quiet);
430
- --kui-color-pop: var(--kui-color-pop-fill-quiet);
431
- --kui-color-pop-text: var(--kui-color-pop-on-fill);
432
- --kui-color-success: var(--kui-color-success-fill-quiet);
433
- --kui-color-success-text: var(--kui-color-success-on-quiet);
434
- --kui-color-warning: var(--kui-color-warning-fill-quiet);
435
- --kui-color-warning-text: var(--kui-color-warning-on-quiet);
436
- --kui-color-danger: var(--kui-color-danger-fill-quiet);
437
- --kui-color-danger-text: var(--kui-color-danger-on-quiet);
438
449
  --kui-focus-ring: var(
439
450
  --wa-focus-ring,
440
451
  3px solid var(--wa-color-focus, light-dark(#007aff, #64d2ff))
@@ -468,9 +479,7 @@
468
479
  --kui-color-pop-on-normal: currentColor;
469
480
  --kui-color-pop-on-loud: HighlightText;
470
481
  --kui-color-pop-on-fill: currentColor;
471
- --kui-color-pop: Canvas;
472
- --kui-color-pop-text: currentColor;
473
- --kui-color-border: currentColor;
482
+ --kui-color-neutral-border-normal: currentColor;
474
483
  --kui-focus-ring: 3px solid currentColor;
475
484
  }
476
485
  }
@@ -1,4 +1,5 @@
1
1
  @import "./pane.css";
2
+ @import "./content-item.css";
2
3
 
3
4
  /* Shared application content geometry for Pane children and standalone stacks. */
4
5
 
@@ -10,27 +11,6 @@
10
11
  gap: var(--kui-layout-content-gap, 1.5rem);
11
12
  }
12
13
 
13
- .kui-content-item {
14
- min-width: 0;
15
- margin-inline: var(--kui-layout-inline-margin, 0.5rem);
16
- padding: var(--kui-layout-item-padding, 0.5rem);
17
- box-sizing: border-box;
18
- border: var(--kui-layout-item-border-width, 1px) solid
19
- var(--kui-content-item-border, transparent);
20
- border-radius: var(
21
- --kui-content-item-radius,
22
- var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
23
- );
24
- background: var(--kui-content-item-background, transparent);
25
- }
26
-
27
- .kui-content-item--pill {
28
- --kui-content-item-radius: var(
29
- --kui-layout-pill-radius,
30
- calc(1px + 1.3125rem)
31
- );
32
- }
33
-
34
14
  .kui-control-cluster {
35
15
  display: flex;
36
16
  min-width: 0;
@@ -140,7 +140,6 @@
140
140
  2.75rem - (2 * var(--kui-layout-item-padding, 0.5rem))
141
141
  );
142
142
  overflow: hidden;
143
- text-overflow: ellipsis;
144
143
  white-space: nowrap;
145
144
  align-items: center;
146
145
  }
@@ -151,6 +150,14 @@
151
150
  min-width: 0;
152
151
  }
153
152
 
153
+ /* The label is a grid container, and `text-overflow` never reaches a grid
154
+ item's text, so each text line of the stack ellipsizes itself. */
155
+ .kui-list-action-row__primary-label,
156
+ .kui-list-action-row__description {
157
+ overflow: hidden;
158
+ text-overflow: ellipsis;
159
+ }
160
+
154
161
  .kui-list-action-row__description,
155
162
  .kui-list-action-row__status {
156
163
  color: var(--kui-color-neutral-on-quiet);
@@ -181,6 +188,11 @@
181
188
  white-space: normal;
182
189
  }
183
190
 
191
+ .kui-list-action-row[data-multiline="true"]
192
+ :is(.kui-list-action-row__primary-label, .kui-list-action-row__description) {
193
+ overflow: visible;
194
+ }
195
+
184
196
  .kui-list-action-row[data-multiline="true"] .kui-list-action-row__icon {
185
197
  inset-block-start: calc(
186
198
  var(--kui-layout-item-padding, 0.5rem) + (1lh / 2)
@@ -88,18 +88,6 @@
88
88
  text-align: start;
89
89
  }
90
90
 
91
- .kui-list-header__label {
92
- min-width: 0;
93
- margin: 0;
94
- overflow: hidden;
95
- font-size: var(--kui-font-xs);
96
- font-weight: 650;
97
- letter-spacing: 0.04em;
98
- text-overflow: ellipsis;
99
- text-transform: uppercase;
100
- white-space: nowrap;
101
- }
102
-
103
91
  .kui-list-header__action,
104
92
  .kui-list-header__action-layer {
105
93
  display: grid;
@@ -1,5 +1,4 @@
1
- .kui-list-inset-text,
2
- .kui-list-inset-text--horizontal {
1
+ .kui-list-inset-text {
3
2
  margin: 0;
4
3
  border: 0 solid transparent;
5
4
  padding: 0;
@@ -128,13 +128,17 @@
128
128
  display: grid;
129
129
  min-width: 0;
130
130
  overflow: hidden;
131
- text-overflow: ellipsis;
132
131
  white-space: nowrap;
133
132
  }
134
133
 
134
+ /* The label is a grid container, and `text-overflow` never reaches a grid
135
+ item's text, so each line of the stack clips and ellipsizes itself: a long
136
+ label ends in "…" before the trailing slot instead of being cut mid-glyph. */
135
137
  .kui-list-item__primary-label,
136
138
  .kui-list-item__description {
137
139
  min-width: 0;
140
+ overflow: hidden;
141
+ text-overflow: ellipsis;
138
142
  }
139
143
 
140
144
  .kui-list-item__description {
@@ -160,6 +164,15 @@
160
164
  white-space: normal;
161
165
  }
162
166
 
167
+ /* A multiline row shows its whole label, so a single word wider than the
168
+ column (a long component or file name) breaks onto the next line rather
169
+ than running under the trailing slot. */
170
+ .kui-list-item[data-multiline="true"]
171
+ :is(.kui-list-item__primary-label, .kui-list-item__description) {
172
+ overflow: visible;
173
+ overflow-wrap: anywhere;
174
+ }
175
+
163
176
  .kui-list-item[data-multiline="true"] .kui-list-item__icon {
164
177
  align-self: start;
165
178
  margin-block-start: calc((1lh - 1.125rem) / 2);
@@ -1,5 +1,5 @@
1
1
  .kui-list {
2
- --kui-list-divider-color: var(--kui-color-border);
2
+ --kui-list-divider-color: var(--kui-color-neutral-border-normal);
3
3
  --kui-list-gap: var(--kui-layout-item-gap, 0.5rem);
4
4
  /* Private per-instance values are reset on every List so a nested List that
5
5
  omits `gap` or `flex` never inherits its ancestor's; the component's inline
@@ -110,19 +110,19 @@
110
110
  overscroll-behavior-y: contain;
111
111
  }
112
112
 
113
- .kui-list[divider-sides*="t"] {
113
+ .kui-list:is([divider-sides*="t"], [data-scroll-divider*="t"]) {
114
114
  --_kui-list-divider-top: var(--kui-list-divider-color);
115
115
  }
116
116
 
117
- .kui-list[divider-sides*="r"] {
117
+ .kui-list:is([divider-sides*="r"], [data-scroll-divider*="r"]) {
118
118
  --_kui-list-divider-right: var(--kui-list-divider-color);
119
119
  }
120
120
 
121
- .kui-list[divider-sides*="b"] {
121
+ .kui-list:is([divider-sides*="b"], [data-scroll-divider*="b"]) {
122
122
  --_kui-list-divider-bottom: var(--kui-list-divider-color);
123
123
  }
124
124
 
125
- .kui-list[divider-sides*="l"] {
125
+ .kui-list:is([divider-sides*="l"], [data-scroll-divider*="l"]) {
126
126
  --_kui-list-divider-left: var(--kui-list-divider-color);
127
127
  }
128
128