@kerfjs/ui 5.0.0-beta.6 → 5.0.0-beta.61

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 (714) hide show
  1. package/README.md +494 -138
  2. package/ai/application-ui-diagnostic-ids-v1.json +109 -0
  3. package/ai/application-ui-profile-sync.cjs +529 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +102 -0
  6. package/ai/application-ui-profile.defaults.json +96 -0
  7. package/ai/application-ui-profile.mjs +626 -0
  8. package/ai/application-ui-profile.schema.json +130 -0
  9. package/ai/catalog-authoring.json +36 -0
  10. package/ai/catalog-authoring.schema.json +109 -0
  11. package/ai/compile-time-contracts-v1.json +149 -0
  12. package/ai/compile-time-contracts-v1.schema.json +52 -0
  13. package/ai/component-catalog-extension.schema.json +79 -0
  14. package/ai/component-catalog.json +4041 -591
  15. package/ai/component-catalog.schema.json +78 -1
  16. package/ai/component-class-owners.cjs +83 -0
  17. package/ai/component-composition-extension.d.ts +7 -0
  18. package/ai/component-composition-extension.schema.json +7 -0
  19. package/ai/component-composition-rules.json +524 -0
  20. package/ai/component-composition.d.ts +125 -0
  21. package/ai/component-composition.json +7074 -0
  22. package/ai/component-composition.schema.json +375 -0
  23. package/ai/components/README.md +171 -0
  24. package/ai/components/application-tabs.md +65 -0
  25. package/ai/components/badge.md +72 -0
  26. package/ai/components/chip.md +72 -0
  27. package/ai/components/collapsible-panel.md +102 -0
  28. package/ai/components/content-item.md +90 -0
  29. package/ai/components/disclosure-arrow.md +77 -0
  30. package/ai/components/document-baseline.md +75 -0
  31. package/ai/components/empty-state.md +80 -0
  32. package/ai/components/feedback.md +71 -0
  33. package/ai/components/floating-toolbar.md +82 -0
  34. package/ai/components/foundation.md +65 -0
  35. package/ai/components/grid.md +96 -0
  36. package/ai/components/headers.md +63 -0
  37. package/ai/components/layout.md +75 -0
  38. package/ai/components/list-action-row.md +91 -0
  39. package/ai/components/list-header.md +89 -0
  40. package/ai/components/list-inset-control.md +74 -0
  41. package/ai/components/list-inset-text.md +72 -0
  42. package/ai/components/list-item.md +94 -0
  43. package/ai/components/list.md +103 -0
  44. package/ai/components/loading-spinner.md +72 -0
  45. package/ai/components/lucide-icon.md +66 -0
  46. package/ai/components/nav-stack.md +103 -0
  47. package/ai/components/pane.md +100 -0
  48. package/ai/components/popup-menu.md +171 -0
  49. package/ai/components/recipe-app-shell.md +57 -0
  50. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  51. package/ai/components/recipe-compact-toolbar.md +57 -0
  52. package/ai/components/recipe-composer-form.md +57 -0
  53. package/ai/components/recipe-list-detail-dialog.md +57 -0
  54. package/ai/components/recipe-list-workspace-states.md +57 -0
  55. package/ai/components/recipe-loading-inspector.md +57 -0
  56. package/ai/components/recipe-navigation-sidebar.md +57 -0
  57. package/ai/components/recipe-navigation-stack.md +57 -0
  58. package/ai/components/recipe-workspace-header.md +57 -0
  59. package/ai/components/resize.md +106 -0
  60. package/ai/components/row.md +96 -0
  61. package/ai/components/segmented-control.md +82 -0
  62. package/ai/components/select.md +112 -0
  63. package/ai/components/skeleton.md +84 -0
  64. package/ai/components/spacer.md +86 -0
  65. package/ai/components/split-view.md +102 -0
  66. package/ai/components/state-banner.md +94 -0
  67. package/ai/components/sunken-panel.md +79 -0
  68. package/ai/components/surface-scaffold.md +78 -0
  69. package/ai/components/tab-bar.md +112 -0
  70. package/ai/components/tab-scaffold.md +94 -0
  71. package/ai/components/tabs.md +95 -0
  72. package/ai/components/text.md +83 -0
  73. package/ai/components/token-search-field.md +103 -0
  74. package/ai/components/toolbar-control-group.md +102 -0
  75. package/ai/components/toolbar-text.md +78 -0
  76. package/ai/components/toolbar.md +97 -0
  77. package/ai/components/value-table.md +73 -0
  78. package/ai/components/wa-accordion-item.md +55 -0
  79. package/ai/components/wa-accordion.md +65 -0
  80. package/ai/components/wa-animated-image.md +55 -0
  81. package/ai/components/wa-animation.md +55 -0
  82. package/ai/components/wa-avatar.md +55 -0
  83. package/ai/components/wa-badge.md +55 -0
  84. package/ai/components/wa-breadcrumb-item.md +53 -0
  85. package/ai/components/wa-breadcrumb.md +55 -0
  86. package/ai/components/wa-button-group.md +59 -0
  87. package/ai/components/wa-button.md +55 -0
  88. package/ai/components/wa-callout.md +58 -0
  89. package/ai/components/wa-card.md +59 -0
  90. package/ai/components/wa-carousel-item.md +53 -0
  91. package/ai/components/wa-carousel.md +55 -0
  92. package/ai/components/wa-checkbox-group.md +55 -0
  93. package/ai/components/wa-checkbox.md +55 -0
  94. package/ai/components/wa-color-picker.md +55 -0
  95. package/ai/components/wa-comparison.md +55 -0
  96. package/ai/components/wa-copy-button.md +55 -0
  97. package/ai/components/wa-details.md +61 -0
  98. package/ai/components/wa-dialog.md +59 -0
  99. package/ai/components/wa-divider.md +53 -0
  100. package/ai/components/wa-drawer.md +55 -0
  101. package/ai/components/wa-dropdown-item.md +60 -0
  102. package/ai/components/wa-dropdown.md +60 -0
  103. package/ai/components/wa-format-bytes.md +53 -0
  104. package/ai/components/wa-format-date.md +53 -0
  105. package/ai/components/wa-format-number.md +53 -0
  106. package/ai/components/wa-icon.md +58 -0
  107. package/ai/components/wa-include.md +53 -0
  108. package/ai/components/wa-input.md +59 -0
  109. package/ai/components/wa-intersection-observer.md +53 -0
  110. package/ai/components/wa-known-date.md +53 -0
  111. package/ai/components/wa-markdown.md +53 -0
  112. package/ai/components/wa-mutation-observer.md +53 -0
  113. package/ai/components/wa-number-input.md +55 -0
  114. package/ai/components/wa-option.md +59 -0
  115. package/ai/components/wa-otp-input.md +53 -0
  116. package/ai/components/wa-page.md +53 -0
  117. package/ai/components/wa-pagination.md +55 -0
  118. package/ai/components/wa-popover.md +55 -0
  119. package/ai/components/wa-popup.md +53 -0
  120. package/ai/components/wa-progress-bar.md +53 -0
  121. package/ai/components/wa-progress-ring.md +53 -0
  122. package/ai/components/wa-qr-code.md +53 -0
  123. package/ai/components/wa-radio-group.md +59 -0
  124. package/ai/components/wa-radio.md +55 -0
  125. package/ai/components/wa-random-content.md +53 -0
  126. package/ai/components/wa-rating.md +55 -0
  127. package/ai/components/wa-relative-time.md +53 -0
  128. package/ai/components/wa-resize-observer.md +53 -0
  129. package/ai/components/wa-scroller.md +53 -0
  130. package/ai/components/wa-select.md +63 -0
  131. package/ai/components/wa-skeleton.md +53 -0
  132. package/ai/components/wa-slider.md +55 -0
  133. package/ai/components/wa-spinner.md +58 -0
  134. package/ai/components/wa-split-panel.md +58 -0
  135. package/ai/components/wa-switch.md +53 -0
  136. package/ai/components/wa-tab-group.md +69 -0
  137. package/ai/components/wa-tab-panel.md +60 -0
  138. package/ai/components/wa-tab.md +59 -0
  139. package/ai/components/wa-tag.md +59 -0
  140. package/ai/components/wa-textarea.md +53 -0
  141. package/ai/components/wa-time-input.md +55 -0
  142. package/ai/components/wa-toast-item.md +60 -0
  143. package/ai/components/wa-toast.md +60 -0
  144. package/ai/components/wa-tooltip.md +55 -0
  145. package/ai/components/wa-tree-item.md +55 -0
  146. package/ai/components/wa-tree.md +55 -0
  147. package/ai/components/wa-zoomable-frame.md +55 -0
  148. package/ai/components/workbench.md +114 -0
  149. package/ai/public-api-signatures-v1.md +2597 -190
  150. package/ai/skill.md +259 -65
  151. package/ai/webawesome-jsx-signatures-v1.md +9 -2
  152. package/analyzer/cli.mjs +49 -0
  153. package/analyzer/component-ownership.d.mts +56 -0
  154. package/analyzer/component-ownership.mjs +184 -0
  155. package/analyzer/index.d.mts +49 -0
  156. package/analyzer/index.mjs +1458 -0
  157. package/analyzer/loud-pairs.d.mts +49 -0
  158. package/analyzer/loud-pairs.mjs +357 -0
  159. package/analyzer/report.schema.json +66 -0
  160. package/analyzer/selectors.d.mts +21 -0
  161. package/analyzer/selectors.mjs +212 -0
  162. package/dist/app-tab.d.ts +41 -4
  163. package/dist/app-tab.js +3 -1
  164. package/dist/badge.d.ts +52 -0
  165. package/dist/badge.js +3 -0
  166. package/dist/badge.js.map +1 -0
  167. package/dist/browser/app-tab.js +1 -0
  168. package/dist/browser/badge.js +3 -0
  169. package/dist/browser/catalog.js +25 -0
  170. package/dist/browser/chip.js +3 -0
  171. package/dist/browser/collapsible-panel.js +7 -0
  172. package/dist/browser/content-item.js +3 -0
  173. package/dist/browser/floating-toolbar.js +3 -0
  174. package/dist/browser/grid.js +3 -0
  175. package/dist/browser/list-action-row.js +5 -0
  176. package/dist/browser/list-header.js +8 -0
  177. package/dist/browser/list-inset-control.js +3 -0
  178. package/dist/browser/list-inset-text.js +3 -0
  179. package/dist/browser/list-item.js +5 -0
  180. package/dist/browser/list.js +3 -0
  181. package/dist/browser/{panel-header.js → nav-stack.js} +4 -2
  182. package/dist/browser/pane.js +3 -0
  183. package/dist/browser/popup-menu.js +3 -0
  184. package/dist/browser/row.js +3 -0
  185. package/dist/browser/select.js +2 -0
  186. package/dist/browser/skeleton.js +3 -0
  187. package/dist/browser/spacer.js +3 -0
  188. package/dist/browser/split-view.js +10 -0
  189. package/dist/browser/state-banner.js +2 -0
  190. package/dist/browser/sunken-panel.js +3 -0
  191. package/dist/browser/surface-scaffold.js +3 -0
  192. package/dist/browser/tab-scaffold.js +4 -0
  193. package/dist/browser/text.js +3 -0
  194. package/dist/browser/toolbar-text.js +1 -0
  195. package/dist/browser/value-table.js +1 -0
  196. package/dist/browser/workbench.js +10 -0
  197. package/dist/catalog-resources.d.ts +46 -0
  198. package/dist/catalog-resources.js +22 -0
  199. package/dist/catalog-resources.js.map +1 -0
  200. package/dist/catalog.d.ts +90 -0
  201. package/dist/catalog.js +501 -0
  202. package/dist/catalog.js.map +1 -0
  203. package/dist/chip.d.ts +29 -0
  204. package/dist/chip.js +3 -0
  205. package/dist/chip.js.map +1 -0
  206. package/dist/chunk-2G2ZJQYK.js +152 -0
  207. package/dist/chunk-2G2ZJQYK.js.map +1 -0
  208. package/dist/chunk-3SXMEK3B.js +43 -0
  209. package/dist/chunk-3SXMEK3B.js.map +1 -0
  210. package/dist/{chunk-W2FK7ZNY.js → chunk-4R777DUZ.js} +10 -2
  211. package/dist/chunk-4R777DUZ.js.map +1 -0
  212. package/dist/chunk-4SQK27MR.js +202 -0
  213. package/dist/chunk-4SQK27MR.js.map +1 -0
  214. package/dist/chunk-5I7QGQVT.js +24 -0
  215. package/dist/chunk-5I7QGQVT.js.map +1 -0
  216. package/dist/chunk-5PESG2VP.js +115 -0
  217. package/dist/chunk-5PESG2VP.js.map +1 -0
  218. package/dist/chunk-5Q3N6EV7.js +156 -0
  219. package/dist/chunk-5Q3N6EV7.js.map +1 -0
  220. package/dist/chunk-6ZXOQEAN.js +27 -0
  221. package/dist/chunk-6ZXOQEAN.js.map +1 -0
  222. package/dist/chunk-7JUBXOIV.js +103 -0
  223. package/dist/chunk-7JUBXOIV.js.map +1 -0
  224. package/dist/chunk-A3CKOW2R.js +622 -0
  225. package/dist/chunk-A3CKOW2R.js.map +1 -0
  226. package/dist/chunk-AHEG27M7.js +66 -0
  227. package/dist/chunk-AHEG27M7.js.map +1 -0
  228. package/dist/chunk-AUKT3KMG.js +37 -0
  229. package/dist/chunk-AUKT3KMG.js.map +1 -0
  230. package/dist/chunk-AYUHMAI6.js +48 -0
  231. package/dist/chunk-AYUHMAI6.js.map +1 -0
  232. package/dist/chunk-BFPBS5Y4.js +250 -0
  233. package/dist/chunk-BFPBS5Y4.js.map +1 -0
  234. package/dist/{chunk-MQIZAD4A.js → chunk-C4OYOKWX.js} +138 -22
  235. package/dist/chunk-C4OYOKWX.js.map +1 -0
  236. package/dist/chunk-DG6G5EPF.js +35 -0
  237. package/dist/chunk-DG6G5EPF.js.map +1 -0
  238. package/dist/chunk-E36EVCKG.js +34 -0
  239. package/dist/chunk-E36EVCKG.js.map +1 -0
  240. package/dist/chunk-EAC4CDY7.js +57 -0
  241. package/dist/chunk-EAC4CDY7.js.map +1 -0
  242. package/dist/chunk-EZVNC4J6.js +104 -0
  243. package/dist/chunk-EZVNC4J6.js.map +1 -0
  244. package/dist/chunk-F4QMLOXJ.js +135 -0
  245. package/dist/chunk-F4QMLOXJ.js.map +1 -0
  246. package/dist/chunk-GLDWRCAM.js +49 -0
  247. package/dist/chunk-GLDWRCAM.js.map +1 -0
  248. package/dist/chunk-I3Q7KKYM.js +33 -0
  249. package/dist/chunk-I3Q7KKYM.js.map +1 -0
  250. package/dist/chunk-IA7TMD4Y.js +288 -0
  251. package/dist/chunk-IA7TMD4Y.js.map +1 -0
  252. package/dist/chunk-JCV4GXWB.js +249 -0
  253. package/dist/chunk-JCV4GXWB.js.map +1 -0
  254. package/dist/chunk-K47P7QZC.js +17 -0
  255. package/dist/chunk-K47P7QZC.js.map +1 -0
  256. package/dist/chunk-KLJKU6ZL.js +109 -0
  257. package/dist/chunk-KLJKU6ZL.js.map +1 -0
  258. package/dist/{chunk-56RJXPHG.js → chunk-KROD7KZK.js} +7 -4
  259. package/dist/chunk-KROD7KZK.js.map +1 -0
  260. package/dist/chunk-MA73TA6D.js +42 -0
  261. package/dist/chunk-MA73TA6D.js.map +1 -0
  262. package/dist/chunk-MERWRTBG.js +45 -0
  263. package/dist/chunk-MERWRTBG.js.map +1 -0
  264. package/dist/chunk-MEY33VWB.js +44 -0
  265. package/dist/chunk-MEY33VWB.js.map +1 -0
  266. package/dist/chunk-MP2GDBQZ.js +50 -0
  267. package/dist/chunk-MP2GDBQZ.js.map +1 -0
  268. package/dist/chunk-N3GKMPDW.js +51 -0
  269. package/dist/chunk-N3GKMPDW.js.map +1 -0
  270. package/dist/chunk-NAPE7WUS.js +75 -0
  271. package/dist/chunk-NAPE7WUS.js.map +1 -0
  272. package/dist/chunk-NN6GYOA2.js +47 -0
  273. package/dist/chunk-NN6GYOA2.js.map +1 -0
  274. package/dist/chunk-NNMLEDMD.js +399 -0
  275. package/dist/chunk-NNMLEDMD.js.map +1 -0
  276. package/dist/chunk-NYL63PSD.js +95 -0
  277. package/dist/chunk-NYL63PSD.js.map +1 -0
  278. package/dist/chunk-P7D3EMXM.js +52 -0
  279. package/dist/chunk-P7D3EMXM.js.map +1 -0
  280. package/dist/chunk-PSHUSWQH.js +18 -0
  281. package/dist/chunk-PSHUSWQH.js.map +1 -0
  282. package/dist/chunk-Q6YU3BT7.js +138 -0
  283. package/dist/chunk-Q6YU3BT7.js.map +1 -0
  284. package/dist/chunk-RRB26JRJ.js +247 -0
  285. package/dist/chunk-RRB26JRJ.js.map +1 -0
  286. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  287. package/dist/chunk-SRSJO5QE.js.map +1 -0
  288. package/dist/chunk-SWVW56CV.js +188 -0
  289. package/dist/chunk-SWVW56CV.js.map +1 -0
  290. package/dist/chunk-TEYARRAK.js +216 -0
  291. package/dist/chunk-TEYARRAK.js.map +1 -0
  292. package/dist/chunk-UCKKT6KO.js +71 -0
  293. package/dist/chunk-UCKKT6KO.js.map +1 -0
  294. package/dist/chunk-UIDKY4UB.js +14 -0
  295. package/dist/chunk-UIDKY4UB.js.map +1 -0
  296. package/dist/chunk-VCBTX62E.js +135 -0
  297. package/dist/chunk-VCBTX62E.js.map +1 -0
  298. package/dist/chunk-VZOFZPSO.js +71 -0
  299. package/dist/chunk-VZOFZPSO.js.map +1 -0
  300. package/dist/{chunk-TRNBHPNW.js → chunk-X5QSICJ3.js} +13 -7
  301. package/dist/chunk-X5QSICJ3.js.map +1 -0
  302. package/dist/chunk-Y74NWGQW.js +418 -0
  303. package/dist/chunk-Y74NWGQW.js.map +1 -0
  304. package/dist/chunk-ZLWQZUGF.js +27 -0
  305. package/dist/chunk-ZLWQZUGF.js.map +1 -0
  306. package/dist/collapsible-panel.d.ts +122 -0
  307. package/dist/collapsible-panel.js +115 -0
  308. package/dist/collapsible-panel.js.map +1 -0
  309. package/dist/content-item.d.ts +46 -0
  310. package/dist/content-item.js +4 -0
  311. package/dist/content-item.js.map +1 -0
  312. package/dist/css-values.d.ts +107 -0
  313. package/dist/css-values.js +3 -0
  314. package/dist/css-values.js.map +1 -0
  315. package/dist/device-class.js +33 -5
  316. package/dist/device-class.js.map +1 -1
  317. package/dist/disclosure-arrow.d.ts +6 -1
  318. package/dist/disclosure-arrow.js +1 -1
  319. package/dist/empty-state.d.ts +5 -2
  320. package/dist/empty-state.js +1 -1
  321. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  322. package/dist/floating-toolbar.d.ts +51 -0
  323. package/dist/floating-toolbar.js +3 -0
  324. package/dist/floating-toolbar.js.map +1 -0
  325. package/dist/grid.d.ts +42 -0
  326. package/dist/grid.js +5 -0
  327. package/dist/grid.js.map +1 -0
  328. package/dist/help-tags-register.d.ts +13 -0
  329. package/dist/help-tags-register.js +9 -0
  330. package/dist/help-tags-register.js.map +1 -0
  331. package/dist/index.d.ts +35 -14
  332. package/dist/index.js +43 -22
  333. package/dist/list-action-row.d.ts +64 -0
  334. package/dist/list-action-row.js +8 -0
  335. package/dist/list-action-row.js.map +1 -0
  336. package/dist/list-header.d.ts +99 -0
  337. package/dist/list-header.js +10 -0
  338. package/dist/list-header.js.map +1 -0
  339. package/dist/list-inset-control.d.ts +22 -0
  340. package/dist/list-inset-control.js +3 -0
  341. package/dist/list-inset-control.js.map +1 -0
  342. package/dist/list-inset-text.d.ts +30 -0
  343. package/dist/list-inset-text.js +4 -0
  344. package/dist/list-inset-text.js.map +1 -0
  345. package/dist/list-item.d.ts +62 -0
  346. package/dist/list-item.js +8 -0
  347. package/dist/list-item.js.map +1 -0
  348. package/dist/list.d.ts +59 -0
  349. package/dist/list.js +6 -0
  350. package/dist/list.js.map +1 -0
  351. package/dist/loading-spinner.d.ts +3 -1
  352. package/dist/loading-spinner.js +1 -1
  353. package/dist/lucide-icon.d.ts +3 -1
  354. package/dist/lucide-icon.js +1 -1
  355. package/dist/nav-stack.d.ts +60 -10
  356. package/dist/nav-stack.js +6 -1
  357. package/dist/pane.d.ts +102 -0
  358. package/dist/pane.js +4 -0
  359. package/dist/pane.js.map +1 -0
  360. package/dist/panel-toolbar-DqwtBxQL.d.ts +63 -0
  361. package/dist/popup-menu-register.d.ts +9 -0
  362. package/dist/popup-menu-register.js +31 -0
  363. package/dist/popup-menu-register.js.map +1 -0
  364. package/dist/popup-menu.d.ts +99 -0
  365. package/dist/popup-menu.js +3 -0
  366. package/dist/popup-menu.js.map +1 -0
  367. package/dist/resizable-region.d.ts +32 -3
  368. package/dist/resizable-region.js +1 -1
  369. package/dist/row.d.ts +48 -0
  370. package/dist/row.js +6 -0
  371. package/dist/row.js.map +1 -0
  372. package/dist/segmented-control.d.ts +13 -8
  373. package/dist/segmented-control.js +1 -1
  374. package/dist/select-register.d.ts +5 -1
  375. package/dist/select-register.js +243 -2
  376. package/dist/select-register.js.map +1 -1
  377. package/dist/select.d.ts +101 -8
  378. package/dist/select.js +4 -1
  379. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  380. package/dist/sides-BPSWde0A.d.ts +4 -0
  381. package/dist/skeleton.d.ts +31 -0
  382. package/dist/skeleton.js +4 -0
  383. package/dist/skeleton.js.map +1 -0
  384. package/dist/spacer.d.ts +18 -0
  385. package/dist/spacer.js +4 -0
  386. package/dist/spacer.js.map +1 -0
  387. package/dist/split-view.d.ts +39 -7
  388. package/dist/split-view.js +120 -10
  389. package/dist/split-view.js.map +1 -1
  390. package/dist/state-banner.d.ts +19 -5
  391. package/dist/state-banner.js +4 -1
  392. package/dist/styles/app-tab.css +104 -0
  393. package/dist/styles/badge.css +118 -0
  394. package/dist/styles/catalog/components/catalog-example-stack.css +9 -0
  395. package/dist/styles/catalog/components/catalog-example.css +164 -0
  396. package/dist/styles/catalog/components/catalog-stage.css +55 -0
  397. package/dist/styles/catalog/components/catalog.css +12 -0
  398. package/dist/styles/catalog.css +5 -0
  399. package/dist/styles/chip.css +118 -0
  400. package/dist/styles/collapsible-panel.css +575 -0
  401. package/dist/styles/content-item.css +30 -0
  402. package/dist/styles/document.css +23 -0
  403. package/dist/styles/floating-toolbar.css +119 -0
  404. package/dist/styles/foundation.css +178 -40
  405. package/dist/styles/grid.css +28 -0
  406. package/dist/styles/layout.css +3 -41
  407. package/dist/styles/list-action-row.css +257 -0
  408. package/dist/styles/list-header.css +228 -0
  409. package/dist/styles/list-inset-control.css +30 -0
  410. package/dist/styles/list-inset-text.css +29 -0
  411. package/dist/styles/list-item.css +245 -0
  412. package/dist/styles/list.css +133 -0
  413. package/dist/styles/nav-stack.css +158 -50
  414. package/dist/styles/pane.css +229 -0
  415. package/dist/styles/popup-menu.css +271 -0
  416. package/dist/styles/resizable-region.css +429 -4
  417. package/dist/styles/row.css +111 -0
  418. package/dist/styles/segmented-control.css +33 -9
  419. package/dist/styles/select.css +262 -9
  420. package/dist/styles/skeleton.css +92 -0
  421. package/dist/styles/spacer.css +11 -0
  422. package/dist/styles/split-view.css +108 -3
  423. package/dist/styles/state-banner.css +94 -19
  424. package/dist/styles/styles.css +14 -4
  425. package/dist/styles/sunken-panel.css +22 -0
  426. package/dist/styles/surface-scaffold.css +56 -0
  427. package/dist/styles/tab-bar.css +132 -9
  428. package/dist/styles/tab-scaffold.css +113 -3
  429. package/dist/styles/text.css +65 -0
  430. package/dist/styles/token-search-field.css +49 -43
  431. package/dist/styles/toolbar-control-group.css +465 -28
  432. package/dist/styles/toolbar-text.css +88 -4
  433. package/dist/styles/toolbar.css +322 -11
  434. package/dist/styles/value-table.css +34 -4
  435. package/dist/styles/webawesome.css +348 -10
  436. package/dist/styles/workbench.css +828 -7
  437. package/dist/sunken-panel.d.ts +22 -0
  438. package/dist/sunken-panel.js +3 -0
  439. package/dist/sunken-panel.js.map +1 -0
  440. package/dist/surface-scaffold.d.ts +30 -0
  441. package/dist/surface-scaffold.js +3 -0
  442. package/dist/surface-scaffold.js.map +1 -0
  443. package/dist/tab-bar.d.ts +31 -6
  444. package/dist/tab-bar.js +1 -1
  445. package/dist/tab-scaffold.d.ts +54 -7
  446. package/dist/tab-scaffold.js +82 -9
  447. package/dist/tab-scaffold.js.map +1 -1
  448. package/dist/text.d.ts +38 -0
  449. package/dist/text.js +3 -0
  450. package/dist/text.js.map +1 -0
  451. package/dist/token-search-field-DvgFLhLL.d.ts +130 -0
  452. package/dist/token-search-field.d.ts +3 -43
  453. package/dist/token-search-field.js +1 -1
  454. package/dist/token-search-model.d.ts +3 -0
  455. package/dist/token-search-model.js +3 -0
  456. package/dist/token-search-model.js.map +1 -0
  457. package/dist/toolbar-control-group.d.ts +65 -7
  458. package/dist/toolbar-control-group.js +1 -1
  459. package/dist/toolbar-text.d.ts +37 -4
  460. package/dist/toolbar-text.js +3 -1
  461. package/dist/toolbar.d.ts +56 -7
  462. package/dist/toolbar.js +1 -1
  463. package/dist/types-BuHELdXR.d.ts +117 -0
  464. package/dist/value-table.d.ts +13 -3
  465. package/dist/value-table.js +3 -1
  466. package/dist/webawesome.d.ts +8 -1
  467. package/dist/wire-catalog.d.ts +82 -0
  468. package/dist/wire-catalog.js +327 -0
  469. package/dist/wire-catalog.js.map +1 -0
  470. package/dist/wire-nav-stack.d.ts +4 -1
  471. package/dist/wire-nav-stack.js +147 -7
  472. package/dist/wire-nav-stack.js.map +1 -1
  473. package/dist/wire-resizable-regions.d.ts +2 -1
  474. package/dist/wire-resizable-regions.js +2 -1
  475. package/dist/wire-scroll-dividers.d.ts +69 -0
  476. package/dist/wire-scroll-dividers.js +3 -0
  477. package/dist/wire-scroll-dividers.js.map +1 -0
  478. package/dist/wire-sidebar.d.ts +63 -0
  479. package/dist/wire-sidebar.js +231 -0
  480. package/dist/wire-sidebar.js.map +1 -0
  481. package/dist/wire-tab-bars.d.ts +19 -2
  482. package/dist/wire-tab-bars.js +1 -1
  483. package/dist/wire-tab-scaffold.js +9 -4
  484. package/dist/wire-tab-scaffold.js.map +1 -1
  485. package/dist/wire-token-search-fields.d.ts +65 -3
  486. package/dist/wire-token-search-fields.js +1 -1
  487. package/dist/wire-workbench.d.ts +109 -0
  488. package/dist/wire-workbench.js +6 -0
  489. package/dist/wire-workbench.js.map +1 -0
  490. package/dist/workbench.d.ts +218 -7
  491. package/dist/workbench.js +13 -15
  492. package/dist/workbench.js.map +1 -1
  493. package/docs/accessibility.md +413 -23
  494. package/docs/app-layouts.md +106 -8
  495. package/docs/catalog.md +440 -0
  496. package/docs/collapsible-panel.md +363 -0
  497. package/docs/component-contract.md +560 -52
  498. package/docs/component-integration.md +75 -0
  499. package/docs/component-selection.md +421 -89
  500. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  501. package/docs/design/templates/empty-state/filtered.svg +1 -0
  502. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  503. package/docs/design/templates/empty-state/with-action.svg +1 -0
  504. package/docs/design/templates/empty-state-dark.svg +1 -0
  505. package/docs/design/templates/empty-state.svg +1 -0
  506. package/docs/design/templates/list/compact-dark.svg +1 -0
  507. package/docs/design/templates/list/compact.svg +1 -0
  508. package/docs/design/templates/list/stack-dark.svg +1 -0
  509. package/docs/design/templates/list/stack.svg +1 -0
  510. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  511. package/docs/design/templates/list-action-row/default.svg +1 -0
  512. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  513. package/docs/design/templates/list-action-row/selected.svg +1 -0
  514. package/docs/design/templates/list-action-row-dark.svg +1 -0
  515. package/docs/design/templates/list-action-row.svg +1 -0
  516. package/docs/design/templates/list-dark.svg +1 -0
  517. package/docs/design/templates/list-header/action-dark.svg +1 -0
  518. package/docs/design/templates/list-header/action.svg +1 -0
  519. package/docs/design/templates/list-header/count-dark.svg +1 -0
  520. package/docs/design/templates/list-header/count.svg +1 -0
  521. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  522. package/docs/design/templates/list-header/inline-action.svg +1 -0
  523. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  524. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  525. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  526. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  527. package/docs/design/templates/list-header-dark.svg +1 -0
  528. package/docs/design/templates/list-header.svg +1 -0
  529. package/docs/design/templates/list-item/default-dark.svg +1 -0
  530. package/docs/design/templates/list-item/default.svg +1 -0
  531. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  532. package/docs/design/templates/list-item/multiline.svg +1 -0
  533. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  534. package/docs/design/templates/list-item/selected.svg +1 -0
  535. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  536. package/docs/design/templates/list-item/trailing.svg +1 -0
  537. package/docs/design/templates/list-item-dark.svg +1 -0
  538. package/docs/design/templates/list-item.svg +1 -0
  539. package/docs/design/templates/list.svg +1 -0
  540. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  541. package/docs/design/templates/segmented-control/equal.svg +1 -0
  542. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  543. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  544. package/docs/design/templates/segmented-control-dark.svg +1 -0
  545. package/docs/design/templates/segmented-control.svg +1 -0
  546. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  547. package/docs/design/templates/skeleton/avatar.svg +1 -0
  548. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  549. package/docs/design/templates/skeleton/block.svg +1 -0
  550. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  551. package/docs/design/templates/skeleton/lines.svg +1 -0
  552. package/docs/design/templates/skeleton-dark.svg +1 -0
  553. package/docs/design/templates/skeleton.svg +1 -0
  554. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  555. package/docs/design/templates/state-banner/danger.svg +1 -0
  556. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  557. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  558. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  559. package/docs/design/templates/state-banner/info.svg +1 -0
  560. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  561. package/docs/design/templates/state-banner/success.svg +1 -0
  562. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  563. package/docs/design/templates/state-banner/warning.svg +1 -0
  564. package/docs/design/templates/state-banner-dark.svg +1 -0
  565. package/docs/design/templates/state-banner.svg +1 -0
  566. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  567. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  568. package/docs/design/templates/tab-bar-dark.svg +1 -0
  569. package/docs/design/templates/tab-bar.svg +1 -0
  570. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  571. package/docs/design/templates/token-search-field/empty.svg +1 -0
  572. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  573. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  574. package/docs/design/templates/token-search-field-dark.svg +1 -0
  575. package/docs/design/templates/token-search-field.svg +1 -0
  576. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  577. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  578. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  579. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  580. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  581. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  582. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  583. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  584. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  585. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  586. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  587. package/docs/design/templates/toolbar-control-group.svg +1 -0
  588. package/docs/design/templates/toolbar-dark.svg +1 -0
  589. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  590. package/docs/design/templates/toolbar-text/default.svg +1 -0
  591. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  592. package/docs/design/templates/toolbar-text/large.svg +1 -0
  593. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  594. package/docs/design/templates/toolbar-text/small.svg +1 -0
  595. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  596. package/docs/design/templates/toolbar-text.svg +1 -0
  597. package/docs/design/templates/toolbar.svg +1 -0
  598. package/docs/design/templates/value-table/details-dark.svg +1 -0
  599. package/docs/design/templates/value-table/details.svg +1 -0
  600. package/docs/design/templates/value-table-dark.svg +1 -0
  601. package/docs/design/templates/value-table.svg +1 -0
  602. package/docs/design/templates.md +138 -0
  603. package/docs/design-philosophy.md +48 -20
  604. package/docs/device-class.md +10 -9
  605. package/docs/document-baseline.md +38 -0
  606. package/docs/examples/application-ui-profile.json +60 -0
  607. package/docs/examples/command-palette-adapter.tsx +69 -17
  608. package/docs/examples/component-catalog-extension.json +45 -0
  609. package/docs/examples/component-composition-extension.json +80 -0
  610. package/docs/layout.md +409 -59
  611. package/docs/nav-stack.md +126 -14
  612. package/docs/recipes.md +137 -54
  613. package/docs/split-view.md +69 -6
  614. package/docs/sunken-panel.md +58 -0
  615. package/docs/surface-scaffold.md +25 -0
  616. package/docs/tab-scaffold.md +94 -10
  617. package/docs/type-contracts.md +134 -0
  618. package/docs/ui-analyzer.md +306 -0
  619. package/docs/ui-doctor.md +107 -0
  620. package/docs/ui-evaluator.md +139 -0
  621. package/docs/ux-demo.md +40 -16
  622. package/docs/webawesome-theme.md +175 -16
  623. package/docs/workbench.md +534 -12
  624. package/doctor/cli.mjs +115 -0
  625. package/doctor/config.schema.json +68 -0
  626. package/doctor/eslint-diagnostics.d.mts +24 -0
  627. package/doctor/eslint-diagnostics.mjs +24 -0
  628. package/doctor/index.d.mts +116 -0
  629. package/doctor/index.mjs +1277 -0
  630. package/doctor/report.schema.json +118 -0
  631. package/evaluator/cli.mjs +89 -0
  632. package/evaluator/index.d.mts +90 -0
  633. package/evaluator/index.mjs +1203 -0
  634. package/evaluator/report.schema.json +152 -0
  635. package/llms.txt +423 -42
  636. package/package.json +241 -37
  637. package/traversal-exclusions.mjs +27 -0
  638. package/ux-demo/recipes/app-shell.tsx +205 -17
  639. package/ux-demo/recipes/collapsible-sidebar.tsx +260 -0
  640. package/ux-demo/recipes/compact-toolbar.tsx +135 -14
  641. package/ux-demo/recipes/composer-form.tsx +133 -21
  642. package/ux-demo/recipes/list-detail-dialog.tsx +282 -0
  643. package/ux-demo/recipes/list-workspace-states.tsx +183 -11
  644. package/ux-demo/recipes/loaders.ts +15 -5
  645. package/ux-demo/recipes/loading-inspector.tsx +204 -0
  646. package/ux-demo/recipes/mount-recipe.ts +28 -10
  647. package/ux-demo/recipes/navigation-sidebar.tsx +139 -13
  648. package/ux-demo/recipes/navigation-stack.tsx +79 -24
  649. package/ux-demo/recipes/types.ts +23 -2
  650. package/ux-demo/recipes/workspace-header.tsx +86 -5
  651. package/dist/browser/menu-action-row.js +0 -3
  652. package/dist/browser/menu-header.js +0 -5
  653. package/dist/browser/menu-item.js +0 -3
  654. package/dist/chunk-24Z2XE6C.js +0 -10
  655. package/dist/chunk-24Z2XE6C.js.map +0 -1
  656. package/dist/chunk-2RJBFNB6.js +0 -172
  657. package/dist/chunk-2RJBFNB6.js.map +0 -1
  658. package/dist/chunk-55DATV3A.js +0 -10
  659. package/dist/chunk-55DATV3A.js.map +0 -1
  660. package/dist/chunk-56RJXPHG.js.map +0 -1
  661. package/dist/chunk-7BR3DO2A.js.map +0 -1
  662. package/dist/chunk-7LDCTU7D.js +0 -134
  663. package/dist/chunk-7LDCTU7D.js.map +0 -1
  664. package/dist/chunk-AQNKJRFH.js +0 -79
  665. package/dist/chunk-AQNKJRFH.js.map +0 -1
  666. package/dist/chunk-CTQKI2XL.js +0 -28
  667. package/dist/chunk-CTQKI2XL.js.map +0 -1
  668. package/dist/chunk-DAFFDO33.js +0 -14
  669. package/dist/chunk-DAFFDO33.js.map +0 -1
  670. package/dist/chunk-EGHL5S4P.js +0 -33
  671. package/dist/chunk-EGHL5S4P.js.map +0 -1
  672. package/dist/chunk-KZKSBUKC.js +0 -19
  673. package/dist/chunk-KZKSBUKC.js.map +0 -1
  674. package/dist/chunk-M5JRI6MN.js +0 -27
  675. package/dist/chunk-M5JRI6MN.js.map +0 -1
  676. package/dist/chunk-MBR3TYNL.js +0 -14
  677. package/dist/chunk-MBR3TYNL.js.map +0 -1
  678. package/dist/chunk-MFKMHK5W.js +0 -10
  679. package/dist/chunk-MFKMHK5W.js.map +0 -1
  680. package/dist/chunk-MQIZAD4A.js.map +0 -1
  681. package/dist/chunk-NPPD2A6O.js +0 -40
  682. package/dist/chunk-NPPD2A6O.js.map +0 -1
  683. package/dist/chunk-R6JHHBKQ.js +0 -19
  684. package/dist/chunk-R6JHHBKQ.js.map +0 -1
  685. package/dist/chunk-RBTVBGRD.js +0 -23
  686. package/dist/chunk-RBTVBGRD.js.map +0 -1
  687. package/dist/chunk-S3TPM2LP.js +0 -23
  688. package/dist/chunk-S3TPM2LP.js.map +0 -1
  689. package/dist/chunk-TRNBHPNW.js.map +0 -1
  690. package/dist/chunk-VHW5YNIB.js +0 -17
  691. package/dist/chunk-VHW5YNIB.js.map +0 -1
  692. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  693. package/dist/chunk-WVPYVDXY.js +0 -15
  694. package/dist/chunk-WVPYVDXY.js.map +0 -1
  695. package/dist/chunk-XZXRLY5Q.js +0 -33
  696. package/dist/chunk-XZXRLY5Q.js.map +0 -1
  697. package/dist/menu-action-row.d.ts +0 -50
  698. package/dist/menu-action-row.js +0 -4
  699. package/dist/menu-action-row.js.map +0 -1
  700. package/dist/menu-header.d.ts +0 -41
  701. package/dist/menu-header.js +0 -6
  702. package/dist/menu-header.js.map +0 -1
  703. package/dist/menu-item.d.ts +0 -31
  704. package/dist/menu-item.js +0 -4
  705. package/dist/menu-item.js.map +0 -1
  706. package/dist/panel-header.d.ts +0 -26
  707. package/dist/panel-header.js +0 -6
  708. package/dist/panel-header.js.map +0 -1
  709. package/dist/styles/menu-action-row.css +0 -160
  710. package/dist/styles/menu-header.css +0 -160
  711. package/dist/styles/menu-item.css +0 -123
  712. package/dist/styles/panel-header.css +0 -59
  713. package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
  714. package/ux-demo/recipes/recipes.css +0 -355
@@ -1,28 +1,68 @@
1
1
  .kui-workbench {
2
+ position: relative;
3
+ /* The rail and drawer overlays and the restore controls stack within the
4
+ Workbench, never against the page around it. */
5
+ isolation: isolate;
2
6
  display: flex;
3
7
  min-width: 0;
4
8
  min-height: 0;
5
9
  height: 100%;
6
10
  overflow: hidden;
7
11
  background: var(--kui-color-surface);
12
+ /* Safe areas: every track paints through the unsafe area it reaches (a rail
13
+ or drawer grows by that inset), and each region's content compensates only
14
+ for the edges the region still touches. An expanded inline rail takes its
15
+ edge away from the center; collapsing it hands the edge back. See pane.css
16
+ for the `--kui-edge-inset-*` edge context. */
17
+ --_kui-workbench-safe-block-start: var(
18
+ --kui-edge-inset-block-start,
19
+ var(--kui-safe-area-block-start, env(safe-area-inset-top, 0px))
20
+ );
21
+ --_kui-workbench-safe-block-end: var(
22
+ --kui-edge-inset-block-end,
23
+ var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
24
+ );
25
+ --_kui-workbench-safe-inline-start: var(
26
+ --kui-edge-inset-inline-start,
27
+ var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
28
+ );
29
+ --_kui-workbench-safe-inline-end: var(
30
+ --kui-edge-inset-inline-end,
31
+ var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
32
+ );
8
33
  }
9
34
 
10
35
  /* Side rails. Collapsing snaps the flex track to zero (one reflow) while the
11
36
  fixed-width content slides out via transform (composited, clipped) — never a
12
37
  per-frame width animation. See docs/18 / the KF-7QKJRK catalog sidebar. */
13
38
  .kui-workbench__rail {
14
- flex: 0 0 var(--kui-workbench-rail-width, 17.5rem);
39
+ --kui-edge-inset-block-start: var(--_kui-workbench-safe-block-start);
40
+ --kui-edge-inset-block-end: var(--_kui-workbench-safe-block-end);
41
+ --_kui-workbench-rail-extent: calc(
42
+ var(--kui-workbench-rail-width, 17.5rem) +
43
+ var(--_kui-workbench-rail-safe-inset)
44
+ );
45
+ /* The size is the whole track, separator border included, in or out of
46
+ flow and whatever box model the app defaults to. */
47
+ box-sizing: border-box;
48
+ flex: 0 0 var(--_kui-workbench-rail-extent);
15
49
  min-width: 0;
16
50
  overflow: hidden;
17
51
  background: var(--kui-color-surface);
18
52
  }
19
53
 
20
54
  .kui-workbench__rail--left {
21
- border-inline-end: 1px solid var(--kui-color-border);
55
+ --_kui-workbench-rail-safe-inset: var(--_kui-workbench-safe-inline-start);
56
+ --kui-edge-inset-inline-start: var(--_kui-workbench-safe-inline-start);
57
+ --kui-edge-inset-inline-end: 0px;
58
+ border-inline-end: 1px solid var(--kui-color-neutral-border-normal);
22
59
  }
23
60
 
24
61
  .kui-workbench__rail--right {
25
- border-inline-start: 1px solid var(--kui-color-border);
62
+ --_kui-workbench-rail-safe-inset: var(--_kui-workbench-safe-inline-end);
63
+ --kui-edge-inset-inline-start: 0px;
64
+ --kui-edge-inset-inline-end: var(--_kui-workbench-safe-inline-end);
65
+ border-inline-start: 1px solid var(--kui-color-neutral-border-normal);
26
66
  }
27
67
 
28
68
  .kui-workbench__rail[data-collapsed="true"] {
@@ -30,7 +70,19 @@
30
70
  border-inline: 0;
31
71
  }
32
72
 
73
+ .kui-workbench__rail[data-separator="hidden"],
74
+ .kui-workbench__drawer[data-separator="hidden"] {
75
+ border-color: transparent;
76
+ }
77
+
78
+ /* The center is the overlay drawer's containing block, so a drawer that
79
+ leaves the flow still covers exactly the work-area column it docks under. */
33
80
  .kui-workbench__center {
81
+ position: relative;
82
+ --kui-edge-inset-block-start: var(--_kui-workbench-safe-block-start);
83
+ --kui-edge-inset-block-end: var(--_kui-workbench-safe-block-end);
84
+ --kui-edge-inset-inline-start: var(--_kui-workbench-safe-inline-start);
85
+ --kui-edge-inset-inline-end: var(--_kui-workbench-safe-inline-end);
34
86
  display: flex;
35
87
  flex: 1;
36
88
  min-width: 0;
@@ -39,18 +91,127 @@
39
91
  flex-direction: column;
40
92
  }
41
93
 
94
+ .kui-workbench:has(
95
+ > .kui-workbench__rail--left[data-presentation="inline"]:not(
96
+ [data-collapsed="true"]
97
+ )
98
+ )
99
+ > .kui-workbench__center {
100
+ --kui-edge-inset-inline-start: 0px;
101
+ }
102
+
103
+ .kui-workbench:has(
104
+ > .kui-workbench__rail--right[data-presentation="inline"]:not(
105
+ [data-collapsed="true"]
106
+ )
107
+ )
108
+ > .kui-workbench__center {
109
+ --kui-edge-inset-inline-end: 0px;
110
+ }
111
+
42
112
  .kui-workbench__main {
43
113
  flex: 1;
44
114
  min-height: 0;
45
115
  overflow: auto;
46
116
  }
47
117
 
118
+ .kui-workbench__main:has(
119
+ ~ .kui-workbench__drawer[data-presentation="inline"]:not(
120
+ [data-collapsed="true"]
121
+ )
122
+ ) {
123
+ --kui-edge-inset-block-end: 0px;
124
+ }
125
+
126
+ /* The main area and each panel's content are the consumers: they pad for the
127
+ edges their region still touches, the main area inside its scroller so
128
+ content scrolls under an unsafe edge but can always be scrolled clear. A
129
+ region whose only child is a Pane or layout lets that child own the insets. */
130
+ .kui-workbench__main:not(
131
+ :has(
132
+ > :is(
133
+ [data-component="pane"],
134
+ [data-component="nav-stack"],
135
+ [data-component="split-view"],
136
+ [data-component="workbench"],
137
+ [data-component="tab-scaffold"]
138
+ ):only-child
139
+ )
140
+ ),
141
+ .kui-workbench__panel-content:not(
142
+ :has(
143
+ > :is(
144
+ [data-component="pane"],
145
+ [data-component="nav-stack"],
146
+ [data-component="split-view"],
147
+ [data-component="workbench"],
148
+ [data-component="tab-scaffold"]
149
+ ):only-child
150
+ )
151
+ ) {
152
+ padding-block: var(--kui-edge-inset-block-start)
153
+ var(--kui-edge-inset-block-end);
154
+ padding-inline: var(--kui-edge-inset-inline-start)
155
+ var(--kui-edge-inset-inline-end);
156
+ scroll-padding-block: var(--kui-edge-inset-block-start)
157
+ var(--kui-edge-inset-block-end);
158
+ }
159
+
160
+ /* Every other child sees a cleared context. The exemption is tested on the
161
+ child itself, never as `region:not(:has(…)) > *`: a `:has()` before a
162
+ universal child makes each child of the region re-check the region's
163
+ `:has()` on every DOM change (~46ms per restyle for 1000 rows in Chromium).
164
+ SplitView, NavStack, TabScaffold, and CollapsiblePanel content use the same
165
+ shape. */
166
+ .kui-workbench__main
167
+ > :not(
168
+ :is(
169
+ [data-component="pane"],
170
+ [data-component="nav-stack"],
171
+ [data-component="split-view"],
172
+ [data-component="workbench"],
173
+ [data-component="tab-scaffold"]
174
+ ):only-child
175
+ ),
176
+ .kui-workbench__panel-content
177
+ > :not(
178
+ :is(
179
+ [data-component="pane"],
180
+ [data-component="nav-stack"],
181
+ [data-component="split-view"],
182
+ [data-component="workbench"],
183
+ [data-component="tab-scaffold"]
184
+ ):only-child
185
+ ) {
186
+ --kui-edge-inset-block-start: 0px;
187
+ --kui-edge-inset-block-end: 0px;
188
+ --kui-edge-inset-inline-start: 0px;
189
+ --kui-edge-inset-inline-end: 0px;
190
+ }
191
+
192
+ /* A region whose only child is a Pane or layout lets it fill the region, so a
193
+ composed toolbar's footer (or the app's own) sits at the region's bottom
194
+ edge rather than under short content. Each of those components fills the
195
+ region from its own stylesheet (pane.css, nav-stack.css, split-view.css,
196
+ tab-scaffold.css); a nested Workbench fills it here. */
197
+ :is(.kui-workbench__main, .kui-workbench__panel-content)
198
+ > [data-component="workbench"]:only-child {
199
+ height: 100%;
200
+ }
201
+
48
202
  /* Bottom drawer — the vertical analogue of a rail. */
49
203
  .kui-workbench__drawer {
50
- flex: 0 0 var(--kui-workbench-drawer-height, 13.75rem);
204
+ --kui-edge-inset-block-start: 0px;
205
+ --_kui-workbench-drawer-extent: calc(
206
+ var(--kui-workbench-drawer-height, 13.75rem) +
207
+ var(--_kui-workbench-safe-block-end)
208
+ );
209
+ box-sizing: border-box;
210
+ position: relative;
211
+ flex: 0 0 var(--_kui-workbench-drawer-extent);
51
212
  min-height: 0;
52
213
  overflow: hidden;
53
- border-block-start: 1px solid var(--kui-color-border);
214
+ border-block-start: 1px solid var(--kui-color-neutral-border-normal);
54
215
  background: var(--kui-color-surface);
55
216
  }
56
217
 
@@ -59,20 +220,47 @@
59
220
  border-block-start: 0;
60
221
  }
61
222
 
223
+ .kui-workbench__rail[data-content-overflow="auto"],
224
+ .kui-workbench__drawer[data-content-overflow="auto"] {
225
+ overflow: auto;
226
+ }
227
+
228
+ .kui-workbench__rail[data-content-overflow="visible"],
229
+ .kui-workbench__drawer[data-content-overflow="visible"] {
230
+ z-index: var(--kui-workbench-popup-z, 5);
231
+ overflow: visible;
232
+ }
233
+
62
234
  /* The fixed-size sliding content. The rail/drawer keeps a definite size on its
63
235
  content so the transform reads as a slide, not a squeeze. */
64
236
  .kui-workbench__rail .kui-workbench__panel-content {
65
- width: var(--kui-workbench-rail-width, 17.5rem);
237
+ width: var(--_kui-workbench-rail-extent);
66
238
  height: 100%;
67
239
  transition: transform 200ms ease;
68
240
  }
69
241
 
70
242
  .kui-workbench__drawer .kui-workbench__panel-content {
243
+ position: absolute;
244
+ inset-inline: 0;
245
+ inset-block-end: 0;
71
246
  width: 100%;
72
- height: var(--kui-workbench-drawer-height, 13.75rem);
247
+ height: var(--_kui-workbench-drawer-extent);
73
248
  transition: transform 200ms ease;
74
249
  }
75
250
 
251
+ .kui-workbench__rail[data-collapse-motion="none"] .kui-workbench__panel-content,
252
+ .kui-workbench__drawer[data-collapse-motion="none"]
253
+ .kui-workbench__panel-content {
254
+ transition: none;
255
+ }
256
+
257
+ .kui-workbench__rail[data-collapse-motion="fade-slide"][data-collapsed="true"]
258
+ .kui-workbench__panel-content,
259
+ .kui-workbench__drawer[data-collapse-motion="fade-slide"][data-collapsed="true"]
260
+ .kui-workbench__panel-content {
261
+ opacity: 0;
262
+ }
263
+
76
264
  .kui-workbench__rail--left[data-collapsed="true"]
77
265
  .kui-workbench__panel-content {
78
266
  transform: translateX(-100%);
@@ -87,8 +275,641 @@
87
275
  transform: translateY(100%);
88
276
  }
89
277
 
278
+ /* Opt-in resizable panels. The size lives in the resize wiring's track
279
+ property, which the wiring updates live during a drag, so the rail width or
280
+ drawer height follows it; collapsing leaves it alone, so the panel expands
281
+ back to the size it had. These rules precede the presentation rules below,
282
+ which must keep winning for overlay and hidden panels. */
283
+ .kui-workbench__rail[data-resizable="true"] {
284
+ --kui-workbench-rail-width: var(--kui-resizable-region-size);
285
+ position: relative;
286
+ }
287
+
288
+ .kui-workbench__drawer[data-resizable="true"] {
289
+ --kui-workbench-drawer-height: var(--kui-resizable-region-size);
290
+ }
291
+
292
+ /* The work area keeps a minimum width beside the rails (the Workbench's
293
+ `mainMinSize`) and a minimum height above the drawer (`mainMinHeight`),
294
+ never larger than the Workbench itself. Inline panels, fixed or resizable,
295
+ give way instead: when the container narrows the rails shrink in proportion
296
+ to their sizes, when it gets shorter the drawer shrinks, and their content
297
+ follows the shown size. The wiring stops a resize where the work area would
298
+ drop below the minimum. */
299
+ .kui-workbench[data-main-min-size] > .kui-workbench__center {
300
+ min-width: min(var(--_kui-workbench-main-min-width), 100%);
301
+ }
302
+
303
+ .kui-workbench[data-main-min-height]
304
+ > .kui-workbench__center
305
+ > .kui-workbench__main {
306
+ min-height: min(var(--_kui-workbench-main-min-height), 100%);
307
+ }
308
+
309
+ .kui-workbench__rail[data-presentation="inline"]:not([data-collapsed="true"]),
310
+ .kui-workbench__drawer[data-presentation="inline"]:not(
311
+ [data-collapsed="true"]
312
+ ) {
313
+ flex-shrink: 1;
314
+ }
315
+
316
+ /* Low specificity, so a responsive overlay (below) restores the fixed size. */
317
+ .kui-workbench__rail:where(
318
+ [data-presentation="inline"]:not([data-collapsed="true"])
319
+ )
320
+ > .kui-workbench__panel-content {
321
+ width: 100%;
322
+ }
323
+
324
+ .kui-workbench__drawer:where(
325
+ [data-presentation="inline"]:not([data-collapsed="true"])
326
+ )
327
+ > .kui-workbench__panel-content {
328
+ height: 100%;
329
+ }
330
+
331
+ /* The panel clips its sliding content, so a scrolling panel scrolls its
332
+ content box instead of itself: the separator handle is a child of the panel
333
+ and must not scroll away with the content. */
334
+ .kui-workbench__rail[data-resizable="true"][data-content-overflow="auto"],
335
+ .kui-workbench__drawer[data-resizable="true"][data-content-overflow="auto"] {
336
+ overflow: hidden;
337
+ }
338
+
339
+ .kui-workbench__rail[data-resizable="true"][data-content-overflow="auto"]
340
+ > .kui-workbench__panel-content,
341
+ .kui-workbench__drawer[data-resizable="true"][data-content-overflow="auto"]
342
+ > .kui-workbench__panel-content {
343
+ overflow: auto;
344
+ }
345
+
346
+ /* The separator handle: the 20px hit target and dormant grip a
347
+ ResizableRegion handle has. The panel's own border stays the visible
348
+ separator line. By default the target sits wholly inside the panel, at its
349
+ inner edge, because the panel clips its sliding content. */
350
+ .kui-workbench__handle {
351
+ position: absolute;
352
+ z-index: 3;
353
+ display: grid;
354
+ color: var(--kui-color-neutral-on-quiet);
355
+ place-items: center;
356
+ touch-action: none;
357
+ }
358
+
359
+ .kui-workbench__rail > .kui-workbench__handle {
360
+ inset-block: 0;
361
+ width: 20px;
362
+ cursor: col-resize;
363
+ }
364
+
365
+ .kui-workbench__rail--left > .kui-workbench__handle {
366
+ inset-inline-end: 0;
367
+ }
368
+
369
+ .kui-workbench__rail--right > .kui-workbench__handle {
370
+ inset-inline-start: 0;
371
+ }
372
+
373
+ .kui-workbench__drawer > .kui-workbench__handle {
374
+ inset-inline: 0;
375
+ inset-block-start: 0;
376
+ height: 20px;
377
+ cursor: row-resize;
378
+ }
379
+
380
+ .kui-workbench__rail[data-collapsed="true"] > .kui-workbench__handle,
381
+ .kui-workbench__drawer[data-collapsed="true"] > .kui-workbench__handle,
382
+ .kui-workbench__rail:not([data-presentation="inline"]) > .kui-workbench__handle,
383
+ .kui-workbench__drawer:not([data-presentation="inline"])
384
+ > .kui-workbench__handle {
385
+ display: none;
386
+ }
387
+
388
+ /* An expanded panel lets exactly the handle's outer half through its clip, so
389
+ the hit target straddles the separator like a ResizableRegion handle does
390
+ and the grip is drawn centered on the separator line. Collapsing drops the
391
+ extension again before the content slides out. Engines that can extend a
392
+ clip past the panel's edge do it with `overflow-clip-margin`; the rest
393
+ (WebKit) clip with a `clip-path` that reaches past the panel's edges. That
394
+ also makes the panel a stacking context, so the panel stacks at the
395
+ handle's own level to keep the handle's outer half above the work area
396
+ beside it. The clip and the stacking level sit at low specificity, so a
397
+ responsive overlay presentation (below) replaces both. */
398
+ @supports not (overflow-clip-margin: 10px) {
399
+ .kui-workbench__rail[data-resizable="true"][data-presentation="inline"]:not(
400
+ [data-collapsed="true"],
401
+ [data-content-overflow="visible"]
402
+ ),
403
+ .kui-workbench__drawer[data-resizable="true"][data-presentation="inline"]:not(
404
+ [data-collapsed="true"],
405
+ [data-content-overflow="visible"]
406
+ ) {
407
+ overflow: visible;
408
+ }
409
+
410
+ .kui-workbench__rail:where(
411
+ [data-resizable="true"][data-presentation="inline"]:not(
412
+ [data-collapsed="true"],
413
+ [data-content-overflow="visible"]
414
+ )
415
+ ) {
416
+ z-index: 3;
417
+ clip-path: inset(0 -10px);
418
+ }
419
+
420
+ .kui-workbench__drawer:where(
421
+ [data-resizable="true"][data-presentation="inline"]:not(
422
+ [data-collapsed="true"],
423
+ [data-content-overflow="visible"]
424
+ )
425
+ ) {
426
+ z-index: 3;
427
+ clip-path: inset(-10px 0 0);
428
+ }
429
+
430
+ .kui-workbench__rail--left[data-resizable="true"][data-presentation="inline"]
431
+ > .kui-workbench__handle {
432
+ inset-inline-end: -10px;
433
+ }
434
+
435
+ .kui-workbench__rail--right[data-resizable="true"][data-presentation="inline"]
436
+ > .kui-workbench__handle {
437
+ inset-inline-start: -10px;
438
+ }
439
+
440
+ .kui-workbench__drawer[data-resizable="true"][data-presentation="inline"]
441
+ > .kui-workbench__handle {
442
+ inset-block-start: -10px;
443
+ }
444
+ }
445
+
446
+ @supports (overflow-clip-margin: 10px) {
447
+ .kui-workbench__rail[data-resizable="true"]:not(
448
+ [data-collapsed="true"],
449
+ [data-content-overflow="visible"]
450
+ ),
451
+ .kui-workbench__drawer[data-resizable="true"]:not(
452
+ [data-collapsed="true"],
453
+ [data-content-overflow="visible"]
454
+ ) {
455
+ overflow: clip;
456
+ overflow-clip-margin: 10px;
457
+ }
458
+
459
+ .kui-workbench__rail--left[data-resizable="true"] > .kui-workbench__handle {
460
+ inset-inline-end: -10px;
461
+ }
462
+
463
+ .kui-workbench__rail--right[data-resizable="true"] > .kui-workbench__handle {
464
+ inset-inline-start: -10px;
465
+ }
466
+
467
+ .kui-workbench__drawer[data-resizable="true"] > .kui-workbench__handle {
468
+ inset-block-start: -10px;
469
+ }
470
+ }
471
+
472
+ .kui-workbench__handle:hover,
473
+ .kui-workbench__handle:focus-visible {
474
+ color: var(--kui-color-text-link);
475
+ }
476
+
477
+ /* The ring stays wholly inside the handle's box, as a ResizableRegion
478
+ handle's does. */
479
+ .kui-workbench__handle:focus-visible {
480
+ border-radius: var(--kui-radius-s);
481
+ outline: var(--kui-focus-ring);
482
+ outline-offset: -3px;
483
+ }
484
+
485
+ .kui-workbench__handle-icon {
486
+ position: relative;
487
+ display: grid;
488
+ width: 0.9rem;
489
+ height: 0.9rem;
490
+ opacity: 0;
491
+ pointer-events: none;
492
+ place-items: center;
493
+ }
494
+
495
+ .kui-workbench__handle-icon > svg {
496
+ width: 100%;
497
+ height: 100%;
498
+ }
499
+
500
+ .kui-workbench__handle:hover .kui-workbench__handle-icon,
501
+ .kui-workbench__handle:focus-visible .kui-workbench__handle-icon {
502
+ opacity: 1;
503
+ }
504
+
505
+ /* Overlay stacking order: both rails stack above the bottom drawer, one below
506
+ the overlay z-index, as inline rails span the Workbench's full height beside
507
+ the drawer's column; the right rail stacks above the left (document order).
508
+ Restore controls stack below every overlay (see .kui-workbench__restore). */
509
+ .kui-workbench__rail[data-presentation="overlay"],
510
+ .kui-workbench__drawer[data-presentation="overlay"] {
511
+ position: absolute;
512
+ z-index: var(--kui-workbench-overlay-z, 41);
513
+ box-shadow: var(--kui-shadow-l);
514
+ }
515
+
516
+ /* An out-of-flow rail sizes to its content plus its border, so it takes its
517
+ extent explicitly, as its in-flow flex basis does, border included. Each
518
+ overlay maximum caps only the panel's own axis: a rail spans the
519
+ Workbench's full height and a drawer its full width. */
520
+ .kui-workbench__rail[data-presentation="overlay"] {
521
+ width: var(--_kui-workbench-rail-extent);
522
+ max-width: var(--kui-workbench-overlay-max-width, 85vw);
523
+ inset-block: 0;
524
+ }
525
+
526
+ .kui-workbench__rail--left[data-presentation="overlay"] {
527
+ inset-inline-start: 0;
528
+ }
529
+
530
+ .kui-workbench__rail--right[data-presentation="overlay"] {
531
+ inset-inline-end: 0;
532
+ }
533
+
534
+ /* The drawer's content is absolutely positioned against its bottom edge, so
535
+ an out-of-flow drawer has no content height of its own: it takes its extent
536
+ explicitly, as the in-flow track does through its flex basis. */
537
+ .kui-workbench__drawer[data-presentation="overlay"] {
538
+ z-index: calc(var(--kui-workbench-overlay-z, 41) - 1);
539
+ height: var(--_kui-workbench-drawer-extent);
540
+ max-height: var(--kui-workbench-overlay-max-height, 85vh);
541
+ inset-inline: 0;
542
+ inset-block-end: 0;
543
+ }
544
+
545
+ /* A collapsed overlay keeps its box for the slide-out, so it drops its surface
546
+ and shadow; the sliding content carries the surface instead. */
547
+ .kui-workbench__rail[data-presentation="overlay"][data-collapsed="true"],
548
+ .kui-workbench__drawer[data-presentation="overlay"][data-collapsed="true"] {
549
+ background: transparent;
550
+ box-shadow: none;
551
+ pointer-events: none;
552
+ }
553
+
554
+ /* Overlay content fills the rail inside its separator border, so it is
555
+ clamped with the rail and carries the surface through the slide-out. */
556
+ .kui-workbench__rail[data-presentation="overlay"]
557
+ > .kui-workbench__panel-content {
558
+ width: 100%;
559
+ background: var(--kui-color-surface);
560
+ }
561
+
562
+ /* The overlay content fills the drawer box below its separator border, so it
563
+ is clamped with the box and carries the surface through the slide-out. */
564
+ .kui-workbench__drawer[data-presentation="overlay"]
565
+ > .kui-workbench__panel-content {
566
+ height: 100%;
567
+ background: var(--kui-color-surface);
568
+ }
569
+
570
+ .kui-workbench__rail[data-presentation="hidden"],
571
+ .kui-workbench__drawer[data-presentation="hidden"] {
572
+ display: none;
573
+ }
574
+
575
+ /* Responsive overlay panels. A rail or the drawer with `responsiveOverlayAt`
576
+ presents as an overlay — out of flow, over the work area, without a
577
+ separator — below the Workbench's own container breakpoint (`narrow`: 704px
578
+ or less, `compact`: 448px or less, as `ResizableRegion`'s
579
+ `responsiveFillAt`), and inline above it. The Workbench becomes a named
580
+ inline-size container only when a panel opts in. The work area keeps its
581
+ safe-area inset under an overlay panel. */
582
+ .kui-workbench:has(
583
+ > .kui-workbench__rail[data-responsive-overlay-at],
584
+ > .kui-workbench__center > .kui-workbench__drawer[data-responsive-overlay-at]
585
+ ) {
586
+ container: kui-workbench / inline-size;
587
+ }
588
+
589
+ @container kui-workbench (max-width: 44rem) {
590
+ .kui-workbench__rail[data-responsive-overlay-at="narrow"] {
591
+ position: absolute;
592
+ z-index: var(--kui-workbench-overlay-z, 41);
593
+ width: var(--_kui-workbench-rail-extent);
594
+ max-width: var(--kui-workbench-overlay-max-width, 85vw);
595
+ inset-block: 0;
596
+ box-shadow: var(--kui-shadow-l);
597
+ clip-path: none;
598
+ }
599
+
600
+ .kui-workbench__rail--left[data-responsive-overlay-at="narrow"] {
601
+ inset-inline-start: 0;
602
+ }
603
+
604
+ .kui-workbench__rail--right[data-responsive-overlay-at="narrow"] {
605
+ inset-inline-end: 0;
606
+ }
607
+
608
+ .kui-workbench__rail[data-responsive-overlay-at="narrow"][data-collapsed="true"] {
609
+ background: transparent;
610
+ box-shadow: none;
611
+ pointer-events: none;
612
+ }
613
+
614
+ .kui-workbench__rail[data-responsive-overlay-at="narrow"]
615
+ > .kui-workbench__panel-content {
616
+ width: 100%;
617
+ background: var(--kui-color-surface);
618
+ }
619
+
620
+ .kui-workbench__rail[data-responsive-overlay-at="narrow"]
621
+ > .kui-workbench__handle {
622
+ display: none;
623
+ }
624
+
625
+ .kui-workbench:has(
626
+ > .kui-workbench__rail--left[data-responsive-overlay-at="narrow"][data-presentation="inline"]
627
+ )
628
+ > .kui-workbench__center {
629
+ --kui-edge-inset-inline-start: var(--_kui-workbench-safe-inline-start);
630
+ }
631
+
632
+ .kui-workbench:has(
633
+ > .kui-workbench__rail--right[data-responsive-overlay-at="narrow"][data-presentation="inline"]
634
+ )
635
+ > .kui-workbench__center {
636
+ --kui-edge-inset-inline-end: var(--_kui-workbench-safe-inline-end);
637
+ }
638
+
639
+ .kui-workbench__drawer[data-responsive-overlay-at="narrow"] {
640
+ position: absolute;
641
+ anchor-name: none;
642
+ z-index: calc(var(--kui-workbench-overlay-z, 41) - 1);
643
+ height: var(--_kui-workbench-drawer-extent);
644
+ max-height: var(--kui-workbench-overlay-max-height, 85vh);
645
+ inset-inline: 0;
646
+ inset-block-end: 0;
647
+ box-shadow: var(--kui-shadow-l);
648
+ clip-path: none;
649
+ }
650
+
651
+ .kui-workbench__drawer[data-responsive-overlay-at="narrow"][data-collapsed="true"] {
652
+ background: transparent;
653
+ box-shadow: none;
654
+ pointer-events: none;
655
+ }
656
+
657
+ .kui-workbench__drawer[data-responsive-overlay-at="narrow"]
658
+ > .kui-workbench__panel-content {
659
+ height: 100%;
660
+ background: var(--kui-color-surface);
661
+ }
662
+
663
+ .kui-workbench__drawer[data-responsive-overlay-at="narrow"]
664
+ > .kui-workbench__handle {
665
+ display: none;
666
+ }
667
+
668
+ .kui-workbench__main:has(
669
+ ~ .kui-workbench__drawer[data-responsive-overlay-at="narrow"][data-presentation="inline"]
670
+ ) {
671
+ --kui-edge-inset-block-end: var(--_kui-workbench-safe-block-end);
672
+ }
673
+ }
674
+
675
+ @container kui-workbench (max-width: 28rem) {
676
+ .kui-workbench__rail[data-responsive-overlay-at="compact"] {
677
+ position: absolute;
678
+ z-index: var(--kui-workbench-overlay-z, 41);
679
+ width: var(--_kui-workbench-rail-extent);
680
+ max-width: var(--kui-workbench-overlay-max-width, 85vw);
681
+ inset-block: 0;
682
+ box-shadow: var(--kui-shadow-l);
683
+ clip-path: none;
684
+ }
685
+
686
+ .kui-workbench__rail--left[data-responsive-overlay-at="compact"] {
687
+ inset-inline-start: 0;
688
+ }
689
+
690
+ .kui-workbench__rail--right[data-responsive-overlay-at="compact"] {
691
+ inset-inline-end: 0;
692
+ }
693
+
694
+ .kui-workbench__rail[data-responsive-overlay-at="compact"][data-collapsed="true"] {
695
+ background: transparent;
696
+ box-shadow: none;
697
+ pointer-events: none;
698
+ }
699
+
700
+ .kui-workbench__rail[data-responsive-overlay-at="compact"]
701
+ > .kui-workbench__panel-content {
702
+ width: 100%;
703
+ background: var(--kui-color-surface);
704
+ }
705
+
706
+ .kui-workbench__rail[data-responsive-overlay-at="compact"]
707
+ > .kui-workbench__handle {
708
+ display: none;
709
+ }
710
+
711
+ .kui-workbench:has(
712
+ > .kui-workbench__rail--left[data-responsive-overlay-at="compact"][data-presentation="inline"]
713
+ )
714
+ > .kui-workbench__center {
715
+ --kui-edge-inset-inline-start: var(--_kui-workbench-safe-inline-start);
716
+ }
717
+
718
+ .kui-workbench:has(
719
+ > .kui-workbench__rail--right[data-responsive-overlay-at="compact"][data-presentation="inline"]
720
+ )
721
+ > .kui-workbench__center {
722
+ --kui-edge-inset-inline-end: var(--_kui-workbench-safe-inline-end);
723
+ }
724
+
725
+ .kui-workbench__drawer[data-responsive-overlay-at="compact"] {
726
+ position: absolute;
727
+ anchor-name: none;
728
+ z-index: calc(var(--kui-workbench-overlay-z, 41) - 1);
729
+ height: var(--_kui-workbench-drawer-extent);
730
+ max-height: var(--kui-workbench-overlay-max-height, 85vh);
731
+ inset-inline: 0;
732
+ inset-block-end: 0;
733
+ box-shadow: var(--kui-shadow-l);
734
+ clip-path: none;
735
+ }
736
+
737
+ .kui-workbench__drawer[data-responsive-overlay-at="compact"][data-collapsed="true"] {
738
+ background: transparent;
739
+ box-shadow: none;
740
+ pointer-events: none;
741
+ }
742
+
743
+ .kui-workbench__drawer[data-responsive-overlay-at="compact"]
744
+ > .kui-workbench__panel-content {
745
+ height: 100%;
746
+ background: var(--kui-color-surface);
747
+ }
748
+
749
+ .kui-workbench__drawer[data-responsive-overlay-at="compact"]
750
+ > .kui-workbench__handle {
751
+ display: none;
752
+ }
753
+
754
+ .kui-workbench__main:has(
755
+ ~ .kui-workbench__drawer[data-responsive-overlay-at="compact"][data-presentation="inline"]
756
+ ) {
757
+ --kui-edge-inset-block-end: var(--_kui-workbench-safe-block-end);
758
+ }
759
+ }
760
+
761
+ /* A collapsed panel's restore control floats in a corner of the Workbench
762
+ itself, never of the viewport, so an embedded Workbench cannot float it over
763
+ page chrome outside it. It is inset from the corner plus the unsafe area of
764
+ each edge that corner reaches. The drawer's control sits in the work-area
765
+ column it restores (the center is its containing block), inset from the
766
+ edges that column still reaches, so it never lands on an expanded rail.
767
+ It belongs to the layer beneath the overlays, two below the overlay
768
+ z-index: an open overlay covers it as it covers the rest of the work area,
769
+ so no other panel's control floats over the overlay's content. A collapsed
770
+ overlay drops its pointer events, so the control stays usable beneath it. */
771
+ .kui-workbench__restore {
772
+ --_kui-workbench-restore-inset: var(
773
+ --kui-workbench-restore-inset,
774
+ 1rem
775
+ );
776
+ position: absolute;
777
+ /* Hidden while an open rail overlay covers the work area (see below). */
778
+ visibility: var(
779
+ --_kui-workbench-covered,
780
+ var(
781
+ --_kui-collapsible-panel-covered,
782
+ var(--_kui-resizable-region-covered, inherit)
783
+ )
784
+ );
785
+ z-index: var(
786
+ --kui-workbench-restore-z,
787
+ calc(var(--kui-workbench-overlay-z, 41) - 2)
788
+ );
789
+ inset-block-end: calc(
790
+ var(--_kui-workbench-restore-inset) + var(--_kui-workbench-safe-block-end)
791
+ );
792
+ }
793
+
794
+ .kui-workbench__restore[data-position="bottom-start"] {
795
+ inset-inline-start: calc(
796
+ var(--_kui-workbench-restore-inset) +
797
+ var(--_kui-workbench-safe-inline-start)
798
+ );
799
+ }
800
+
801
+ .kui-workbench__restore[data-position="bottom-end"] {
802
+ inset-inline-end: calc(
803
+ var(--_kui-workbench-restore-inset) + var(--_kui-workbench-safe-inline-end)
804
+ );
805
+ }
806
+
807
+ /* An expanded inline bottom drawer owns the bottom of the work-area column,
808
+ which reaches the Workbench's bottom corners once a rail collapses, so a
809
+ collapsed rail's control floats the restore inset above the drawer's top
810
+ edge instead of over it — the standalone CollapsiblePanel rule, scoped to
811
+ this Workbench so a nested Workbench or an enclosing layout never sees its
812
+ drawer. The drawer publishes that edge only while it is expanded and in
813
+ flow: an overlay drawer, static or responsive (see the container queries
814
+ above), covers the control as every open overlay does. Without anchor
815
+ positioning the control keeps the Workbench corner. */
816
+ .kui-workbench {
817
+ anchor-scope: --kui-restore-drawer;
818
+ }
819
+
820
+ .kui-workbench__drawer:where(
821
+ [data-presentation="inline"]:not([data-collapsed="true"])
822
+ ) {
823
+ anchor-name: --kui-restore-drawer;
824
+ }
825
+
826
+ .kui-workbench > .kui-workbench__restore {
827
+ position-visibility: always;
828
+ inset-block-end: calc(
829
+ var(--_kui-workbench-restore-inset) +
830
+ anchor(--kui-restore-drawer top, var(--_kui-workbench-safe-block-end))
831
+ );
832
+ }
833
+
834
+ .kui-workbench__center > .kui-workbench__restore {
835
+ inset-block-end: calc(
836
+ var(--_kui-workbench-restore-inset) + var(--kui-edge-inset-block-end)
837
+ );
838
+ }
839
+
840
+ .kui-workbench__center > .kui-workbench__restore[data-position="bottom-start"] {
841
+ inset-inline-start: calc(
842
+ var(--_kui-workbench-restore-inset) + var(--kui-edge-inset-inline-start)
843
+ );
844
+ }
845
+
846
+ .kui-workbench__center > .kui-workbench__restore[data-position="bottom-end"] {
847
+ inset-inline-end: calc(
848
+ var(--_kui-workbench-restore-inset) + var(--kui-edge-inset-inline-end)
849
+ );
850
+ }
851
+
852
+ /* An open rail overlay — static or a responsive one whose breakpoint applies —
853
+ covers the work area, so the work area's floating controls (a
854
+ FloatingToolbar in main, the drawer's restore corner, the other rail's
855
+ restore corner) are hidden, not merely stacked beneath it: they never paint
856
+ over the overlay whatever stacking context an app puts them in, and hidden
857
+ they leave the tab order and the accessibility tree. They come back as the
858
+ overlay closes. The Workbench's own covered context,
859
+ `--_kui-workbench-covered`, is set on the rail's siblings only (never on
860
+ the open rail), so the overlay's own floating controls stay; FloatingToolbar
861
+ and the layouts' restore corners read it. A direct child
862
+ resolves the Workbench's own container query, never a nested one's. */
863
+ .kui-workbench:has(
864
+ > .kui-workbench__rail[data-presentation="overlay"]:not(
865
+ [data-collapsed="true"]
866
+ )
867
+ )
868
+ > :is(.kui-workbench__center, .kui-workbench__restore) {
869
+ --_kui-workbench-covered: hidden;
870
+ }
871
+
872
+ @container kui-workbench (max-width: 44rem) {
873
+ .kui-workbench:has(
874
+ > .kui-workbench__rail[data-responsive-overlay-at="narrow"][data-presentation="inline"]:not(
875
+ [data-collapsed="true"]
876
+ )
877
+ )
878
+ > :is(.kui-workbench__center, .kui-workbench__restore) {
879
+ --_kui-workbench-covered: hidden;
880
+ }
881
+ }
882
+
883
+ @container kui-workbench (max-width: 28rem) {
884
+ .kui-workbench:has(
885
+ > .kui-workbench__rail[data-responsive-overlay-at="compact"][data-presentation="inline"]:not(
886
+ [data-collapsed="true"]
887
+ )
888
+ )
889
+ > :is(.kui-workbench__center, .kui-workbench__restore) {
890
+ --_kui-workbench-covered: hidden;
891
+ }
892
+ }
893
+
90
894
  @media (prefers-reduced-motion: reduce) {
91
895
  .kui-workbench__panel-content {
92
896
  transition: none;
93
897
  }
94
898
  }
899
+
900
+ /* On a compact (phone-sized) Workbench an overlay rail fills the Workbench
901
+ less a dismiss margin on the side away from its edge, so a press beside it
902
+ closes it (the wiring's outside press); `compactOverlay: "full"` fills the
903
+ Workbench. The rail's resize and configured size stop applying there. */
904
+ @container kui-workbench (max-width: 28rem) {
905
+ .kui-workbench__rail[data-responsive-overlay-at] {
906
+ width: calc(
907
+ 100% - var(--kui-workbench-overlay-dismiss-margin, 2.75rem)
908
+ );
909
+ max-width: none;
910
+ }
911
+
912
+ .kui-workbench__rail[data-responsive-overlay-at][data-compact-overlay="full"] {
913
+ width: 100%;
914
+ }
915
+ }