@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
@@ -58,68 +58,17 @@
58
58
  opacity: 0;
59
59
  }
60
60
 
61
+ /* The chrome hosts the stack's real top Toolbar. It hands that toolbar the
62
+ edges the stack still touches through the edge context (never the bottom,
63
+ which the viewport owns); the toolbar pads for the sides it claims with
64
+ `safeAreaEdges` while its box paints through them. */
61
65
  .kui-nav-stack__chrome {
62
- display: flex;
63
- min-width: 0;
64
- min-height: calc(2px + 2.625rem + var(--_kui-nav-stack-safe-block-start));
65
- padding-block-start: var(--_kui-nav-stack-safe-block-start);
66
- padding-inline: calc(
67
- var(--kui-space-xs) + var(--_kui-nav-stack-safe-inline-start)
68
- )
69
- calc(var(--kui-space-xs) + var(--_kui-nav-stack-safe-inline-end));
70
- align-items: center;
71
- gap: var(--kui-space-xs);
66
+ --kui-edge-inset-block-start: var(--_kui-nav-stack-safe-block-start);
67
+ --kui-edge-inset-inline-start: var(--_kui-nav-stack-safe-inline-start);
68
+ --kui-edge-inset-inline-end: var(--_kui-nav-stack-safe-inline-end);
72
69
  background: var(--kui-color-surface);
73
70
  }
74
71
 
75
- .kui-nav-stack__lead {
76
- display: flex;
77
- flex: 1;
78
- min-width: 0;
79
- align-items: center;
80
- gap: var(--kui-space-2xs);
81
- }
82
-
83
- .kui-nav-stack__back {
84
- display: grid;
85
- width: 2.5rem;
86
- height: 2.5rem;
87
- padding: 0;
88
- border: 1px solid transparent;
89
- border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
90
- color: inherit;
91
- background: transparent;
92
- cursor: pointer;
93
- place-items: center;
94
- }
95
-
96
- .kui-nav-stack__back:hover {
97
- border-color: var(--kui-color-border);
98
- background: var(--kui-color-neutral-fill-normal);
99
- }
100
-
101
- .kui-nav-stack__back:focus-visible {
102
- outline: var(--kui-focus-ring);
103
- outline-offset: 1px;
104
- }
105
-
106
- .kui-nav-stack__back-icon {
107
- display: block;
108
- }
109
-
110
- /* The title is ToolbarText (which owns its font, height, and ellipsis); it just
111
- needs to flex to fill the lead zone beside the back control. */
112
- .kui-nav-stack__title {
113
- flex: 1 1 auto;
114
- min-width: 0;
115
- }
116
-
117
- .kui-nav-stack__actions {
118
- display: flex;
119
- align-items: center;
120
- gap: var(--kui-space-2xs);
121
- }
122
-
123
72
  .kui-nav-stack__viewport {
124
73
  --kui-edge-inset-block-start: var(--_kui-nav-stack-safe-block-start);
125
74
  --kui-edge-inset-block-end: var(--_kui-nav-stack-safe-block-end);
@@ -174,18 +123,16 @@
174
123
  var(--kui-edge-inset-block-end);
175
124
  }
176
125
 
177
- .kui-nav-stack__view:not(
178
- :has(
179
- > :is(
180
- [data-component="pane"],
181
- [data-component="nav-stack"],
182
- [data-component="split-view"],
183
- [data-component="workbench"],
184
- [data-component="tab-scaffold"]
185
- ):only-child
186
- )
187
- )
188
- > * {
126
+ .kui-nav-stack__view
127
+ > :not(
128
+ :is(
129
+ [data-component="pane"],
130
+ [data-component="nav-stack"],
131
+ [data-component="split-view"],
132
+ [data-component="workbench"],
133
+ [data-component="tab-scaffold"]
134
+ ):only-child
135
+ ) {
189
136
  --kui-edge-inset-block-start: 0px;
190
137
  --kui-edge-inset-block-end: 0px;
191
138
  --kui-edge-inset-inline-start: 0px;
@@ -214,10 +161,45 @@
214
161
  padding-block-end: var(--_kui-nav-stack-safe-block-end);
215
162
  padding-inline: var(--_kui-nav-stack-safe-inline-start)
216
163
  var(--_kui-nav-stack-safe-inline-end);
217
- border-block-start: 1px solid var(--kui-color-border);
164
+ border-block-start: 1px solid
165
+ var(--_kui-nav-stack-bottom-divider, transparent);
218
166
  background: var(--kui-color-surface);
219
167
  }
220
168
 
169
+ /* The live chrome is the containing block of its scroll divider; a
170
+ cross-fading copy stays absolutely positioned. */
171
+ .kui-nav-stack__chrome:not(.kui-nav-stack__chrome-copy) {
172
+ position: relative;
173
+ }
174
+
175
+ /* Chrome dividers: with `chromeDividers="scroll"` (the default, no
176
+ attribute) the top chrome draws a line along its bottom edge while the
177
+ active view's content is scrolled beneath it, and the bottom toolbar
178
+ colors its 1px top border while more content lies below it — never when
179
+ the content fits. `wireScrollDividers` reports that state through
180
+ `data-scroll-divider`; `always` draws both lines without it, and `none`
181
+ neither, whatever it reports. The chrome's line is an overlaid 1px pseudo-element
182
+ (whatever the chrome holds never covers it) and the bottom's border is
183
+ always there, so showing either never moves the chrome, the toolbar, or
184
+ the content. A cross-fading chrome copy keeps the line its snapshot had. */
185
+ .kui-nav-stack:not([data-chrome-dividers])
186
+ > .kui-nav-stack__chrome[data-scroll-divider*="b"]::after,
187
+ .kui-nav-stack[data-chrome-dividers="always"] > .kui-nav-stack__chrome::after {
188
+ position: absolute;
189
+ block-size: 1px;
190
+ background: var(--kui-color-neutral-border-normal);
191
+ content: "";
192
+ inset-block-end: 0;
193
+ inset-inline: 0;
194
+ pointer-events: none;
195
+ }
196
+
197
+ .kui-nav-stack:not([data-chrome-dividers])
198
+ > .kui-nav-stack__bottom[data-scroll-divider*="t"],
199
+ .kui-nav-stack[data-chrome-dividers="always"] > .kui-nav-stack__bottom {
200
+ --_kui-nav-stack-bottom-divider: var(--kui-color-neutral-border-normal);
201
+ }
202
+
221
203
  @media (prefers-reduced-motion: reduce) {
222
204
  .kui-nav-stack__view,
223
205
  .kui-nav-stack__chrome,
@@ -226,3 +208,13 @@
226
208
  transition: none;
227
209
  }
228
210
  }
211
+
212
+ /* As the only child of a Workbench region (its main area or a panel's
213
+ content, which the Workbench marks with `data-workbench-main` /
214
+ `data-workbench-panel-content`), a NavStack fills the region, so a
215
+ composed toolbar's footer (or the app's own) sits at the region's bottom
216
+ edge rather than under short content. */
217
+ :is([data-workbench-main], [data-workbench-panel-content])
218
+ > [data-component="nav-stack"]:only-child {
219
+ height: 100%;
220
+ }
@@ -9,7 +9,8 @@
9
9
  min-height: 0;
10
10
  padding: 0;
11
11
  box-sizing: border-box;
12
- border: 0 solid var(--kui-pane-separator-color, var(--kui-color-border));
12
+ border: 0 solid
13
+ var(--kui-pane-separator-color, var(--kui-color-neutral-border-normal));
13
14
  border-block-start-width: var(--kui-pane-separator-block-start-width);
14
15
  border-block-end-width: var(--kui-pane-separator-block-end-width);
15
16
  border-inline-start-width: var(--kui-pane-separator-inline-start-width);
@@ -145,3 +146,84 @@
145
146
  flex-direction: column;
146
147
  grid-area: footer;
147
148
  }
149
+
150
+ /* Chrome dividers: one line under the header and one over the footer, where
151
+ the pinned chrome meets the scrolling content, whatever the chrome holds.
152
+ `chromeDividers="scroll"` (the default, no attribute) draws each only while
153
+ `wireScrollDividers` reports content scrolled away beneath it through
154
+ `data-scroll-divider` on the slot; `always` draws both; `none` neither. The
155
+ line is an inset shadow inside the slot, so showing or hiding it never
156
+ moves the chrome or the content. */
157
+ .kui-pane > :is(.kui-pane__header, .kui-pane__toolbar, .kui-pane__footer) {
158
+ --_kui-pane-chrome-divider: transparent;
159
+ }
160
+
161
+ .kui-pane > :is(.kui-pane__header, .kui-pane__toolbar) {
162
+ box-shadow: inset 0 -1px var(--_kui-pane-chrome-divider);
163
+ }
164
+
165
+ .kui-pane > .kui-pane__footer {
166
+ box-shadow: inset 0 1px var(--_kui-pane-chrome-divider);
167
+ }
168
+
169
+ .kui-pane:not([data-chrome-dividers])
170
+ > :is(.kui-pane__header, .kui-pane__toolbar)[data-scroll-divider*="b"],
171
+ .kui-pane:not([data-chrome-dividers])
172
+ > .kui-pane__footer[data-scroll-divider*="t"],
173
+ .kui-pane[data-chrome-dividers="always"]
174
+ > :is(.kui-pane__header, .kui-pane__toolbar, .kui-pane__footer) {
175
+ --_kui-pane-chrome-divider: var(
176
+ --kui-pane-separator-color,
177
+ var(--kui-color-neutral-border-normal)
178
+ );
179
+ }
180
+
181
+ /* `chromePlacement="auto"`: the header and footer stay pinned while the pane
182
+ is tall enough; below 480px of height (30rem, so it scales with the text
183
+ size) the whole pane scrolls as one column instead, so tall chrome can never
184
+ squeeze the content to nothing. The pane is its own size container and lays
185
+ its slots out as a column: while tall, the content fills the space between
186
+ the chrome and scrolls itself, and the pane never scrolls; while short, the
187
+ content takes its natural height and the pane scrolls. */
188
+ .kui-pane[data-chrome-placement="auto"] {
189
+ container: kui-pane / size;
190
+ display: flex;
191
+ overflow-y: auto;
192
+ flex-direction: column;
193
+ overscroll-behavior: contain;
194
+ }
195
+
196
+ .kui-pane[data-chrome-placement="auto"]
197
+ > :is(.kui-pane__header, .kui-pane__footer) {
198
+ flex: none;
199
+ }
200
+
201
+ .kui-pane[data-chrome-placement="auto"] > .kui-pane__content {
202
+ flex: 1 1 0;
203
+ }
204
+
205
+ @container kui-pane (max-height: 30rem) {
206
+ .kui-pane[data-chrome-placement="auto"] > .kui-pane__content {
207
+ flex: none;
208
+ overflow: visible;
209
+ }
210
+ }
211
+
212
+ /* As the only child of a Workbench region (its main area or a panel's
213
+ content, which the Workbench marks with `data-workbench-main` /
214
+ `data-workbench-panel-content`), a Pane fills the region, so a
215
+ composed toolbar's footer (or the app's own) sits at the region's bottom
216
+ edge rather than under short content. */
217
+ :is([data-workbench-main], [data-workbench-panel-content])
218
+ > [data-component="pane"]:only-child {
219
+ height: 100%;
220
+ }
221
+
222
+ /* As the only child of a NavStack view or a TabScaffold scene, a Pane fills
223
+ it too, so its content owns the scroll and its header and footer stay
224
+ pinned; the view or scene then never scrolls (it hands the Pane its
225
+ safe-area edge context, which the Pane's slots apply). */
226
+ :is(.kui-nav-stack__view, .kui-tab-scaffold__scene)
227
+ > [data-component="pane"]:only-child {
228
+ height: 100%;
229
+ }
@@ -10,3 +10,232 @@
10
10
  white-space: nowrap;
11
11
  clip-path: inset(50%);
12
12
  }
13
+
14
+ /* A PopupMenu draws exactly the Select's popup: the same caret motion, surface
15
+ inset, row geometry, reserved check column, current-row fill, and group
16
+ titles, all read from the private popup-choice contract in foundation.css
17
+ (select.css reads the same values). */
18
+
19
+ /* The trigger caret turns to face the open menu, like the Select's. */
20
+ .kui-popup-menu > wa-button::part(caret) {
21
+ rotate: 0deg;
22
+ transition: var(--_kui-popup-caret-transition);
23
+ }
24
+ .kui-popup-menu[open] > wa-button::part(caret) {
25
+ rotate: var(--_kui-popup-caret-open-rotation);
26
+ }
27
+
28
+ /* The Select's popup fades in place; Web Awesome's dropdown also scales from
29
+ 90%. Holding the scale leaves the shared fade. */
30
+ .kui-popup-menu::part(menu) {
31
+ padding: var(--_kui-popup-inset);
32
+ gap: var(--_kui-popup-row-gap);
33
+ scale: none !important;
34
+ }
35
+
36
+ .kui-popup-menu > wa-dropdown-item {
37
+ /* Leading inset plus the Select's check column, so item icons and labels
38
+ start where a Select option's do. */
39
+ padding: var(--_kui-popup-row-padding-block)
40
+ var(--_kui-popup-row-padding-inline-end) var(--_kui-popup-row-padding-block)
41
+ calc(
42
+ var(--_kui-popup-row-padding-inline-start) +
43
+ var(--_kui-popup-row-check-width)
44
+ );
45
+ }
46
+ .kui-popup-menu > wa-dropdown-item::part(label) {
47
+ padding-block: var(--_kui-popup-row-label-padding-block);
48
+ line-height: var(--_kui-popup-row-label-line-height);
49
+ }
50
+ /* A keyboard-focused item is the menu's current row: the Select's brand fill,
51
+ with no second focus ring inside the open popup. */
52
+ .kui-popup-menu > wa-dropdown-item:focus-visible {
53
+ outline: none;
54
+ color: var(--_kui-popup-row-current-color);
55
+ background-color: var(--_kui-popup-row-current-background);
56
+ }
57
+ .kui-popup-menu > wa-divider {
58
+ --spacing: 0.5em;
59
+ }
60
+
61
+ /* Center the icon on the label's line, like the Select's start slot. */
62
+ .kui-popup-menu > wa-dropdown-item::part(icon) {
63
+ display: flex;
64
+ align-self: center;
65
+ }
66
+ .kui-popup-menu__icon {
67
+ display: inline-flex;
68
+ width: var(--_kui-popup-row-icon-size);
69
+ height: var(--_kui-popup-row-icon-size);
70
+ flex: none;
71
+ /* Web Awesome spaces a slotted item icon 0.75em from its label (an
72
+ !important shadow rule). Sizing that em makes the gap the Select's. */
73
+ font-size: calc(var(--_kui-popup-row-icon-gap) / 0.75);
74
+ }
75
+ .kui-popup-menu__icon svg {
76
+ display: block;
77
+ width: 100%;
78
+ height: 100%;
79
+ }
80
+
81
+ /* A group title matches the Select's group title. It is a styled element
82
+ rather than a slotted heading, whose Web Awesome metrics are !important. */
83
+ .kui-popup-menu__heading {
84
+ padding: var(--_kui-popup-group-title-padding);
85
+ color: var(--kui-color-neutral-on-quiet);
86
+ font-size: var(--kui-font-2xs);
87
+ font-weight: var(--_kui-popup-group-title-font-weight);
88
+ letter-spacing: 0.04em;
89
+ text-transform: uppercase;
90
+ }
91
+
92
+ /* In a ToolbarControlGroup a PopupMenu sizes itself in the group's context:
93
+ the group lays out its own native and raw Web Awesome children and names a
94
+ PopupMenu only to key its own state on it. The trigger takes the group's
95
+ control height (40px, or 32px in a compact group). A mixed-content trigger
96
+ in a nested-dropdown group grows for its label plus the caret; a fixed 32px
97
+ base would center both outside its host, painting the label across the
98
+ separator and the caret beyond the group border. */
99
+ /* The trigger button takes the group's control metrics, as the group's own
100
+ raw wa-button children do (toolbar-control-group.css excludes this
101
+ trigger). The PopupMenu ancestor sits in `:where()` so each rule keeps the
102
+ specificity of the group's matching raw-child rule and resolves against the
103
+ group's attribute-keyed variants exactly as they do. */
104
+ .kui-toolbar-control-group :where(wa-dropdown.kui-popup-menu) > wa-button {
105
+ --wa-form-control-height: 2.5rem;
106
+ display: inline-flex;
107
+ line-height: 0;
108
+ align-items: center;
109
+ justify-content: center;
110
+ --wa-color-fill-quiet: transparent;
111
+ }
112
+ .kui-toolbar-control-group[data-size="compact"]
113
+ :where(wa-dropdown.kui-popup-menu)
114
+ > wa-button {
115
+ --wa-form-control-height: 2rem;
116
+ }
117
+ .kui-toolbar-control-group[data-content="mixed"]
118
+ :where(wa-dropdown.kui-popup-menu)
119
+ > wa-button {
120
+ line-height: normal;
121
+ }
122
+ .kui-toolbar-control-group
123
+ :where(wa-dropdown.kui-popup-menu)
124
+ > wa-button
125
+ > svg {
126
+ display: block;
127
+ width: 1rem;
128
+ height: 1rem;
129
+ }
130
+ /* Toolbar controls never wrap: a slotted icon and its label share one row. */
131
+ .kui-toolbar-control-group
132
+ :where(wa-dropdown.kui-popup-menu)
133
+ > wa-button::part(label) {
134
+ display: inline-flex;
135
+ align-items: center;
136
+ gap: var(--kui-space-xs);
137
+ white-space: nowrap;
138
+ }
139
+ /* At least a circle around an icon-only trigger, with the group's item radius;
140
+ hover lifts the trigger like a group button, except in a `single` group,
141
+ whose whole surface shows the hover (toolbar-control-group.css). */
142
+ .kui-toolbar-control-group
143
+ :where(wa-dropdown.kui-popup-menu)
144
+ > wa-button::part(base) {
145
+ min-width: 2.5rem;
146
+ min-height: 2.5rem;
147
+ box-sizing: border-box;
148
+ border: 1px solid transparent;
149
+ border-radius: var(
150
+ --kui-toolbar-item-radius,
151
+ var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
152
+ );
153
+ }
154
+ .kui-toolbar-control-group
155
+ :where(wa-dropdown.kui-popup-menu)
156
+ > wa-button:hover::part(base) {
157
+ border-color: var(--kui-toolbar-control-border);
158
+ background-color: var(--kui-toolbar-control-hover-background);
159
+ }
160
+ .kui-toolbar-control-group[data-single="true"]
161
+ :where(wa-dropdown.kui-popup-menu)
162
+ > wa-button:hover::part(base) {
163
+ border-color: transparent;
164
+ background: transparent;
165
+ }
166
+ .kui-toolbar-control-group > wa-dropdown.kui-popup-menu {
167
+ display: inline-flex;
168
+ flex: 0 0 auto;
169
+ }
170
+ .kui-toolbar-control-group > wa-dropdown.kui-popup-menu,
171
+ .kui-toolbar-control-group > wa-dropdown.kui-popup-menu > wa-button,
172
+ .kui-toolbar-control-group
173
+ > wa-dropdown.kui-popup-menu
174
+ > wa-button::part(base) {
175
+ min-width: 2.5rem;
176
+ height: 2.5rem;
177
+ }
178
+ .kui-toolbar-control-group[data-size="compact"] > wa-dropdown.kui-popup-menu,
179
+ .kui-toolbar-control-group[data-size="compact"]
180
+ > wa-dropdown.kui-popup-menu
181
+ > wa-button,
182
+ .kui-toolbar-control-group[data-size="compact"]
183
+ > wa-dropdown.kui-popup-menu
184
+ > wa-button::part(base),
185
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
186
+ wa-dropdown.kui-popup-menu
187
+ wa-button,
188
+ .kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
189
+ wa-dropdown.kui-popup-menu
190
+ wa-button::part(base) {
191
+ min-width: 2rem;
192
+ height: 2rem;
193
+ min-height: 2rem;
194
+ }
195
+ .kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
196
+ > wa-dropdown.kui-popup-menu {
197
+ margin: -2px;
198
+ }
199
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
200
+ > wa-dropdown.kui-popup-menu
201
+ > wa-button,
202
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
203
+ > wa-dropdown.kui-popup-menu
204
+ > wa-button::part(base) {
205
+ min-width: max-content;
206
+ }
207
+ .kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
208
+ > wa-dropdown.kui-popup-menu
209
+ > wa-button::part(base) {
210
+ width: max-content;
211
+ }
212
+ .kui-toolbar-control-group[data-single="true"]
213
+ > wa-dropdown.kui-popup-menu
214
+ > wa-button::part(base) {
215
+ width: max-content;
216
+ }
217
+
218
+ /* The menu insets a composing parent asks for. A PopupMenu applies them to
219
+ itself; its default is the Select listbox inset above, which a
220
+ ToolbarControlGroup's `standard` inset keeps. A PopupSurface's inset follows
221
+ the group's, so a surface wins when both apply. */
222
+ .kui-toolbar-control-group[data-menu-inset="compact"]
223
+ wa-dropdown.kui-popup-menu::part(menu) {
224
+ padding: 0.25rem;
225
+ }
226
+ .kui-toolbar-control-group[data-menu-inset="list-zero"]
227
+ wa-dropdown.kui-popup-menu::part(menu) {
228
+ padding: 0;
229
+ }
230
+ .kui-popup-surface[data-inset="standard"]
231
+ > wa-dropdown.kui-popup-menu::part(menu) {
232
+ padding: var(--kui-wa-surface-inset, 0.5rem);
233
+ }
234
+ .kui-popup-surface[data-inset="compact"]
235
+ > wa-dropdown.kui-popup-menu::part(menu) {
236
+ padding: 0.25rem;
237
+ }
238
+ .kui-popup-surface[data-inset="list-zero"]
239
+ > wa-dropdown.kui-popup-menu::part(menu) {
240
+ padding: 0;
241
+ }
@@ -1,17 +1,27 @@
1
1
  .kui-resizable-region {
2
- --kui-resizable-region-separator-color: var(--kui-color-border);
2
+ --kui-resizable-region-separator-color: var(
3
+ --kui-color-neutral-border-normal
4
+ );
3
5
  --kui-resizable-region-handle-color: var(--kui-color-neutral-on-quiet);
4
6
  --kui-resizable-region-handle-active-color: var(--kui-color-text-link);
5
7
  /* Extra track a horizontal region adds when it reaches an unsafe screen edge,
6
8
  so its surface paints through the unsafe area while its committed size
7
- stays the content width. A composing layout sets it on the region (a
8
- SplitView list does); it never inherits into a nested region. */
9
+ stays the content width. The region sets it itself from the context of a
10
+ layout that places it at an edge (a SplitView list); it never inherits
11
+ into a nested region. */
9
12
  --kui-resizable-region-edge-extent: 0px;
10
13
  position: relative;
11
14
  display: flex;
12
15
  min-width: 0;
13
16
  min-height: 0;
14
17
  }
18
+ /* As a split SplitView's list, the region's track grows by the unsafe
19
+ inline-start inset the SplitView provides, while its committed size stays
20
+ the content width. A collapsed region stays shut. */
21
+ .kui-split-view[data-split-mode="split"]
22
+ > .kui-resizable-region:not([data-collapsed="true"]) {
23
+ --kui-resizable-region-edge-extent: var(--_kui-split-view-safe-inline-start);
24
+ }
15
25
  .kui-resizable-region[data-axis="horizontal"] {
16
26
  width: calc(
17
27
  var(--kui-resizable-region-size) + var(--kui-resizable-region-edge-extent)
@@ -211,6 +221,37 @@
211
221
  .kui-resizable-region[data-presentation="hidden"] {
212
222
  display: none;
213
223
  }
224
+ /* An open side overlay (a horizontal region) covers the work area beside it,
225
+ so that area's floating controls (a FloatingToolbar, a restore corner) are
226
+ hidden, not merely stacked beneath it: they never paint over the overlay
227
+ whatever stacking context an app puts them in, and hidden they leave the
228
+ tab order and the accessibility tree. They come back as the overlay
229
+ closes. The ResizableRegion's own covered context,
230
+ `--_kui-resizable-region-covered`, is read by FloatingToolbar and the
231
+ layouts' restore corners. It is set on the overlay's container and cleared again on the
232
+ overlay regions in it, so it reaches the overlay's siblings only. It is
233
+ never set by a universal selector below the :has() container (`:has(…) >
234
+ :not(…)`): Chromium then restyles every child of every ancestor of a DOM
235
+ change, which made each change in a long list about 30× slower. */
236
+ :where(
237
+ :has(
238
+ > .kui-resizable-region[data-presentation="overlay"][data-axis="horizontal"]:not(
239
+ [data-collapsed="true"]
240
+ )
241
+ )
242
+ ) {
243
+ --_kui-resizable-region-covered: hidden;
244
+ }
245
+ :where(
246
+ :has(
247
+ > .kui-resizable-region[data-presentation="overlay"][data-axis="horizontal"]:not(
248
+ [data-collapsed="true"]
249
+ )
250
+ )
251
+ )
252
+ > .kui-resizable-region[data-presentation="overlay"] {
253
+ --_kui-resizable-region-covered: initial;
254
+ }
214
255
 
215
256
  @container (max-width: 44rem) {
216
257
  .kui-resizable-region[data-responsive-fill-at="narrow"] {
@@ -256,27 +297,38 @@
256
297
  beside the collapsed one — a direct child of that container or of one of
257
298
  its direct children (the app's work-area column) — owns the container's
258
299
  bottom, so the corner floats above the drawer's top edge instead of over
259
- it. CollapsiblePanel drawers publish the same anchor. A drawer nested
260
- deeper, inside the work area's own content, belongs to another layout and
261
- is scoped out. Without anchor positioning the corner keeps the container's
262
- bottom edge. */
263
- .kui-resizable-region[data-axis="vertical"][data-edge="start"][data-presentation="inline"]:not(
300
+ it. The region publishes that edge as an anchor only there, beside a
301
+ CollapsiblePanel or ResizableRegion restore control (matched by their
302
+ restore attributes); CollapsiblePanel drawers publish the same anchor. A
303
+ drawer nested deeper, inside the work area's own content, belongs to
304
+ another layout and publishes nothing. The selector ends on the region, not
305
+ on a universal `> * > * > *` scope below the container: a universal
306
+ selector after a :has() container restyles every child of every ancestor
307
+ of a DOM change in Chromium. Without anchor positioning the corner keeps
308
+ the container's bottom edge. */
309
+ :where(
310
+ :has(> [data-panel-restore], > [data-region-restore]),
311
+ :has(> [data-panel-restore], > [data-region-restore]) > *
312
+ )
313
+ > .kui-resizable-region[data-axis="vertical"][data-edge="start"][data-presentation="inline"]:not(
264
314
  [data-collapsed="true"]
265
315
  ) {
266
316
  anchor-name: --kui-restore-drawer;
267
317
  }
268
- :where(:has(> .kui-resizable-region__restore)) > * > * > * {
269
- anchor-scope: --kui-restore-drawer;
270
- }
271
318
  .kui-resizable-region__restore {
272
319
  --_kui-resizable-region-restore-inset: var(
273
320
  --kui-resizable-region-restore-inset,
274
321
  1rem
275
322
  );
276
- /* The corner owns the inset, so a FloatingToolbar composed here floats
277
- from this point instead of adding its own inset on top. */
278
- --kui-floating-toolbar-inset: 0px;
279
323
  position: absolute;
324
+ /* Hidden while an open side overlay covers the content (see above). */
325
+ visibility: var(
326
+ --_kui-workbench-covered,
327
+ var(
328
+ --_kui-collapsible-panel-covered,
329
+ var(--_kui-resizable-region-covered, inherit)
330
+ )
331
+ );
280
332
  z-index: var(
281
333
  --kui-resizable-region-restore-z,
282
334
  calc(var(--kui-resizable-region-overlay-z, 41) - 2)
@@ -379,7 +431,10 @@
379
431
  and the separator has less room past it than the handle's overhang, which
380
432
  puts it at the parent's edge. The handle then sits wholly inside the region
381
433
  and keeps its separator line on the region's edge, so a clipping ancestor
382
- never cuts off half of the hit target or its focus ring. */
434
+ never cuts off half of the hit target or its focus ring. The grip stays
435
+ centered in the handle there: the separator is the clipping edge, so a grip
436
+ centered on it would be cut in half. Everywhere else the grip is drawn on
437
+ the separator line. */
383
438
  .kui-resizable-region[data-handle-inset][data-axis="horizontal"][data-edge="end"]
384
439
  > .kui-resizable-region__handle {
385
440
  right: 0;