@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
@@ -23,6 +23,11 @@
23
23
  text-overflow: ellipsis;
24
24
  white-space: nowrap;
25
25
  }
26
+ /* A multiple Select summarizes its choices in the display text (installed by
27
+ select/register) instead of drawing a removable tag per choice. */
28
+ .kui-select[multiple]::part(tags) {
29
+ display: none;
30
+ }
26
31
  .kui-select[data-size="compact"]::part(combobox) {
27
32
  min-height: 2rem;
28
33
  }
@@ -44,10 +49,10 @@
44
49
  caret wa-button): symmetric 8px inline padding, 12px from the icon to the
45
50
  caret's 20px box, the caret glyph size, and the control height, so the icon
46
51
  sits left of center to balance the caret. Inside a ToolbarControlGroup the
47
- trigger takes the group's control-slot height, overlap, and radius
48
- (`--_kui-toolbar-slot-*`) so it is inset evenly on every side, the group
49
- sizes to the trigger (wider than tall), and the group-owned focus ring
50
- stays concentric with it. */
52
+ trigger takes the control-slot height, overlap, and radius the group
53
+ provides (`--_kui-toolbar-control-group-slot-*`) so it is inset evenly on
54
+ every side, the group sizes to the trigger (wider than tall), and the
55
+ group-owned focus ring stays concentric with it. */
51
56
  .kui-select[data-selected-presentation="icon-only"] {
52
57
  --_kui-select-height: 2.75rem;
53
58
  width: max-content;
@@ -56,7 +61,10 @@
56
61
  --_kui-select-height: 2rem;
57
62
  }
58
63
  .kui-select[data-selected-presentation="icon-only"]::part(combobox) {
59
- min-height: var(--_kui-toolbar-slot-height, var(--_kui-select-height));
64
+ min-height: var(
65
+ --_kui-toolbar-control-group-slot-height,
66
+ var(--_kui-select-height)
67
+ );
60
68
  padding-inline: 0.5rem;
61
69
  border-radius: var(
62
70
  --kui-toolbar-item-radius,
@@ -67,14 +75,32 @@
67
75
  sibling controls it keeps the group's gap, end insets, and item radius, as
68
76
  they do. */
69
77
  .kui-select[data-selected-presentation="icon-only"]:only-child {
70
- margin-inline: calc(var(--_kui-toolbar-slot-overlap, 0px) * -1);
78
+ margin-inline: calc(var(--_kui-toolbar-control-group-slot-overlap, 0px) * -1);
71
79
  }
72
80
  .kui-select[data-selected-presentation="icon-only"]:only-child::part(combobox) {
73
81
  border-radius: var(
74
- --_kui-toolbar-slot-radius,
82
+ --_kui-toolbar-control-group-slot-radius,
75
83
  var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
76
84
  );
77
85
  }
86
+ /* In a ToolbarControlGroup, a Select beside other controls highlights its own
87
+ pill on hover, like its button and dropdown siblings; a lone Select instead
88
+ lifts the whole group (toolbar-control-group.css). */
89
+ .kui-toolbar-control-group:not([data-single="true"])
90
+ > .kui-select:not(:only-child):hover::part(combobox) {
91
+ border-color: var(--kui-toolbar-control-border);
92
+ background: var(--kui-toolbar-control-hover-background);
93
+ }
94
+ /* With the group's per-control rings, a composed Select paints its own ring
95
+ even when it was told the group owns it: nothing else would show focus. It
96
+ matches the sibling controls' ring and offset. While its listbox is open the
97
+ popup shows focus instead, so the trigger ring stays off, as a PopupMenu
98
+ trigger's does. */
99
+ .kui-toolbar-control-group[data-focus-ring="control"]
100
+ > .kui-select:not([open]):focus-within::part(combobox) {
101
+ outline: var(--kui-focus-ring);
102
+ outline-offset: 1px;
103
+ }
78
104
  /* The popup-menu wa-button draws the same chevron glyph at 0.875em inside a
79
105
  20px box; match its box, spacing, and glyph size rather than the smaller
80
106
  form-field disclosure scale. */
@@ -102,7 +128,21 @@
102
128
  .kui-select::part(expand-icon) {
103
129
  transform: scale(var(--kui-disclosure-icon-scale, 0.5));
104
130
  }
131
+ .kui-select::part(expand-icon) {
132
+ transition: var(--_kui-popup-caret-transition);
133
+ }
134
+ .kui-select[open]::part(expand-icon) {
135
+ rotate: var(--_kui-popup-caret-open-rotation);
136
+ }
137
+ /* The open listbox already shows where focus is (its current option), so the
138
+ trigger drops its focus ring while the popup is visible, as a PopupMenu
139
+ trigger does; the ring returns when the popup closes with focus still on
140
+ the control. */
141
+ .kui-select[open]::part(combobox) {
142
+ outline-color: transparent;
143
+ }
105
144
  .kui-select::part(listbox) {
145
+ padding: var(--_kui-popup-inset);
106
146
  width: max-content;
107
147
  min-width: 100%;
108
148
  max-width: min(20rem, calc(100vw - 1.25rem));
@@ -114,28 +154,29 @@
114
154
  align-items: center;
115
155
  }
116
156
  .kui-select wa-option {
117
- --wa-form-control-activated-color: var(--kui-color-brand-fill-normal);
118
- /* Current option text sits on the activated brand fill; use the darker on-fill
119
- accent so it clears WCAG AA (brand-on-quiet is 4.26:1 over that fill). */
120
- --current-text-color: var(--kui-color-brand-on-fill);
157
+ --wa-form-control-activated-color: var(--_kui-popup-row-current-background);
158
+ --current-text-color: var(--_kui-popup-row-current-color);
159
+ padding: var(--_kui-popup-row-padding-block)
160
+ var(--_kui-popup-row-padding-inline-end) var(--_kui-popup-row-padding-block)
161
+ var(--_kui-popup-row-padding-inline-start);
121
162
  }
122
163
  .kui-select wa-option::part(start) {
123
164
  align-self: center;
124
- margin-inline-end: 0.5rem;
165
+ margin-inline-end: var(--_kui-popup-row-icon-gap);
125
166
  margin-top: 0;
126
167
  }
127
168
  .kui-select wa-option::part(label) {
128
169
  min-width: 0;
129
- padding-block: 0.35rem;
130
- line-height: 1.25;
170
+ padding-block: var(--_kui-popup-row-label-padding-block);
171
+ line-height: var(--_kui-popup-row-label-line-height);
131
172
  overflow-wrap: normal;
132
173
  word-break: normal;
133
174
  white-space: normal;
134
175
  }
135
176
  .kui-select__icon {
136
177
  display: inline-flex;
137
- width: 1rem;
138
- height: 1rem;
178
+ width: var(--_kui-popup-row-icon-size);
179
+ height: var(--_kui-popup-row-icon-size);
139
180
  flex: none;
140
181
  }
141
182
  .kui-select > .kui-select__icon[slot="start"] {
@@ -173,10 +214,10 @@
173
214
  border-block-start: 1px solid var(--kui-color-neutral-border-quiet);
174
215
  }
175
216
  .kui-select__group-title {
176
- padding: 0.2rem 0.75rem 0.3rem;
217
+ padding: var(--_kui-popup-group-title-padding);
177
218
  color: var(--kui-color-neutral-on-quiet);
178
219
  font-size: var(--kui-font-2xs);
179
- font-weight: 750;
220
+ font-weight: var(--_kui-popup-group-title-font-weight);
180
221
  letter-spacing: 0.04em;
181
222
  text-transform: uppercase;
182
223
  }
@@ -208,7 +249,7 @@
208
249
  justify-content: space-between;
209
250
  gap: 0.5rem;
210
251
  padding-inline: var(--kui-layout-item-padding, 0.5rem);
211
- border: 1px solid var(--kui-color-border);
252
+ border: 1px solid var(--kui-color-neutral-border-normal);
212
253
  border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
213
254
  background: var(--kui-color-surface);
214
255
  }
@@ -7,9 +7,10 @@
7
7
  height: 1em;
8
8
  border-radius: var(--kui-skeleton-radius);
9
9
  /* Deliberately unanimated: a flat, subtle fill that reads as "not yet loaded"
10
- without drawing the eye or implying progress. A host with its own solid
11
- fill (a solid Badge) supplies `--_kui-skeleton-fill` derived from its
12
- foreground, since a text-color tint vanishes on a saturated fill. */
10
+ without drawing the eye or implying progress. On a host with its own
11
+ solid fill (a solid Badge) the skeleton derives `--_kui-skeleton-fill`
12
+ from the host's foreground, since a text-color tint vanishes on a
13
+ saturated fill. */
13
14
  background: var(
14
15
  --_kui-skeleton-fill,
15
16
  color-mix(in srgb, var(--kui-color-text) 12%, transparent)
@@ -17,6 +18,19 @@
17
18
  vertical-align: middle;
18
19
  }
19
20
 
21
+ /* A placeholder's skeleton inside a solid badge: the generic text-color tint is
22
+ nearly invisible on the saturated fill, so derive it from the on-solid
23
+ foreground the badge provides, which contrasts with the fill in every tone
24
+ and color scheme. Quiet and outline badges sit on a pale fill and keep the
25
+ generic tint. */
26
+ .kui-badge[data-appearance="solid"] .kui-skeleton {
27
+ --_kui-skeleton-fill: color-mix(
28
+ in srgb,
29
+ var(--_kui-badge-on-solid) 45%,
30
+ transparent
31
+ );
32
+ }
33
+
20
34
  .kui-skeleton[data-block="true"] {
21
35
  display: block;
22
36
  }
@@ -63,3 +77,16 @@
63
77
  background: GrayText;
64
78
  }
65
79
  }
80
+
81
+ /* A placeholder StateBanner's badge holds this skeleton instead of text. With
82
+ no text, the skeleton's baseline would be synthesized from its bottom edge,
83
+ sitting the badge higher than the live one by a font-dependent amount. A
84
+ zero-width character gives it a text baseline in the badge's own font and
85
+ line height, exactly where the live badge's text baseline falls on every
86
+ platform. */
87
+ .kui-state-banner[data-placeholder="true"]
88
+ .kui-state-banner__copy
89
+ > .kui-badge
90
+ > .kui-skeleton::before {
91
+ content: "\200b";
92
+ }
@@ -37,7 +37,7 @@
37
37
  var(--kui-split-view-list-width, 20rem) +
38
38
  var(--_kui-split-view-safe-inline-start)
39
39
  );
40
- border-inline-end: 1px solid var(--kui-color-border);
40
+ border-inline-end: 1px solid var(--kui-color-neutral-border-normal);
41
41
  }
42
42
 
43
43
  .kui-split-view__list[data-resizable="true"] {
@@ -51,13 +51,6 @@
51
51
  min-height: 0;
52
52
  }
53
53
 
54
- /* A resizable list keeps its committed size as content width; its region's
55
- track grows by the unsafe inset it reaches. A collapsed region stays shut. */
56
- .kui-split-view[data-split-mode="split"]
57
- > [data-component="resizable-region"]:not([data-collapsed="true"]) {
58
- --kui-resizable-region-edge-extent: var(--_kui-split-view-safe-inline-start);
59
- }
60
-
61
54
  .kui-split-view__list,
62
55
  .kui-split-view__detail {
63
56
  --kui-edge-inset-block-start: var(--_kui-split-view-safe-block-start);
@@ -104,30 +97,26 @@
104
97
  var(--kui-edge-inset-inline-end);
105
98
  }
106
99
 
107
- .kui-split-view__list:not(
108
- :has(
109
- > :is(
110
- [data-component="pane"],
111
- [data-component="nav-stack"],
112
- [data-component="split-view"],
113
- [data-component="workbench"],
114
- [data-component="tab-scaffold"]
115
- ):only-child
116
- )
117
- )
118
- > *,
119
- .kui-split-view__detail:not(
120
- :has(
121
- > :is(
122
- [data-component="pane"],
123
- [data-component="nav-stack"],
124
- [data-component="split-view"],
125
- [data-component="workbench"],
126
- [data-component="tab-scaffold"]
127
- ):only-child
128
- )
129
- )
130
- > * {
100
+ .kui-split-view__list
101
+ > :not(
102
+ :is(
103
+ [data-component="pane"],
104
+ [data-component="nav-stack"],
105
+ [data-component="split-view"],
106
+ [data-component="workbench"],
107
+ [data-component="tab-scaffold"]
108
+ ):only-child
109
+ ),
110
+ .kui-split-view__detail
111
+ > :not(
112
+ :is(
113
+ [data-component="pane"],
114
+ [data-component="nav-stack"],
115
+ [data-component="split-view"],
116
+ [data-component="workbench"],
117
+ [data-component="tab-scaffold"]
118
+ ):only-child
119
+ ) {
131
120
  --kui-edge-inset-block-start: 0px;
132
121
  --kui-edge-inset-block-end: 0px;
133
122
  --kui-edge-inset-inline-start: 0px;
@@ -139,3 +128,13 @@
139
128
  display: block;
140
129
  height: 100%;
141
130
  }
131
+
132
+ /* As the only child of a Workbench region (its main area or a panel's
133
+ content, which the Workbench marks with `data-workbench-main` /
134
+ `data-workbench-panel-content`), a SplitView fills the region, so a
135
+ composed toolbar's footer (or the app's own) sits at the region's bottom
136
+ edge rather than under short content. */
137
+ :is([data-workbench-main], [data-workbench-panel-content])
138
+ > [data-component="split-view"]:only-child {
139
+ height: 100%;
140
+ }
@@ -160,25 +160,6 @@
160
160
  margin-inline-end: var(--kui-layout-item-gap, 0.5rem);
161
161
  font-size: var(--kui-font-xs);
162
162
  }
163
- /* The badge is taller than the title's line. Negative block margins keep it
164
- out of the line-height calculation, so a wrapped title's lines stay evenly
165
- spaced whichever line the badge lands on. */
166
- .kui-state-banner__badge {
167
- margin-block: -0.5em;
168
- margin-inline-end: var(--kui-layout-item-gap, 0.5rem);
169
- vertical-align: baseline;
170
- }
171
- /* A placeholder badge holds a skeleton instead of text. With no text, the
172
- skeleton's baseline would be synthesized from its bottom edge, sitting the
173
- badge higher than the live one by a font-dependent amount. A zero-width
174
- character gives it a text baseline in the badge's own font and line
175
- height, exactly where the live badge's text baseline falls on every
176
- platform. */
177
- .kui-state-banner[data-placeholder="true"]
178
- .kui-state-banner__badge
179
- > *::before {
180
- content: "\200b";
181
- }
182
163
  /* The clip lives on an inner span, not on the detail itself. WebKit still
183
164
  applies the CSS 2.1 rule that an inline-block whose overflow is not
184
165
  `visible` takes its baseline from its bottom margin edge, so a clipped
@@ -40,12 +40,17 @@
40
40
  .kui-popup-surface {
41
41
  display: inline-flex;
42
42
  }
43
- .kui-popup-surface[data-inset="standard"] > wa-dropdown::part(menu) {
43
+ /* The surface insets the menu of a raw wa-dropdown it wraps. A PopupMenu
44
+ applies the surface's inset to itself (popup-menu.css). */
45
+ .kui-popup-surface[data-inset="standard"]
46
+ > wa-dropdown:not(.kui-popup-menu)::part(menu) {
44
47
  padding: var(--kui-wa-surface-inset, 0.5rem);
45
48
  }
46
- .kui-popup-surface[data-inset="compact"] > wa-dropdown::part(menu) {
49
+ .kui-popup-surface[data-inset="compact"]
50
+ > wa-dropdown:not(.kui-popup-menu)::part(menu) {
47
51
  padding: 0.25rem;
48
52
  }
49
- .kui-popup-surface[data-inset="list-zero"] > wa-dropdown::part(menu) {
53
+ .kui-popup-surface[data-inset="list-zero"]
54
+ > wa-dropdown:not(.kui-popup-menu)::part(menu) {
50
55
  padding: 0;
51
56
  }
@@ -38,32 +38,17 @@
38
38
  --kui-tab-bar-background: var(--kui-color-neutral-fill-quiet);
39
39
  --kui-tab-bar-border: var(--kui-color-neutral-border-quiet);
40
40
  }
41
- /* A segmented strip's outer ends follow the pill track. The first tab's
42
- leading corners, and a filled strip's last tab's trailing corners, are
43
- pill-rounded, and a compact tab is inset from the track's ends by the same
44
- distance as from its top and bottom, so each end is concentric with the
45
- track. Only fill allocation carries the last tab to the track's trailing
46
- end; an intrinsic strip's last tab stops short of it and keeps the segment
47
- radius, as do the corners between tabs. */
41
+ /* A segmented strip's outer ends follow the pill track: a compact tab is inset
42
+ from the track's ends by the same distance as from its top and bottom, so
43
+ each end is concentric with the track. AppTab rounds its own outer corners
44
+ to match in this context (see app-tab.css); TabBar never styles AppTab. */
48
45
  .kui-tab-bar[data-presentation="segmented"]
49
- .kui-tab-bar__tabs:has(> [data-component="app-tab"][data-size="compact"]) {
46
+ .kui-tab-bar__tabs:has(> .kui-app-tab[data-size="compact"]) {
50
47
  padding-inline: calc(
51
48
  (var(--kui-toolbar-group-size, calc(2px + 2.625rem)) - 2rem) /
52
49
  2 - 1px
53
50
  );
54
51
  }
55
- .kui-tab-bar[data-presentation="segmented"]
56
- .kui-tab-bar__tabs
57
- > [data-component="app-tab"]:first-child {
58
- border-start-start-radius: var(--kui-radius-pill);
59
- border-end-start-radius: var(--kui-radius-pill);
60
- }
61
- .kui-tab-bar[data-presentation="segmented"][data-allocation="fill"]
62
- .kui-tab-bar__tabs
63
- > [data-component="app-tab"]:last-child {
64
- border-start-end-radius: var(--kui-radius-pill);
65
- border-end-end-radius: var(--kui-radius-pill);
66
- }
67
52
  .kui-tab-bar[data-presentation="inspector"] {
68
53
  min-height: 2.125rem;
69
54
  padding: 0;
@@ -72,14 +57,6 @@
72
57
  min-height: 2.125rem;
73
58
  border-radius: var(--kui-radius-s);
74
59
  }
75
- .kui-tab-bar[data-allocation="fill"] [data-component="app-tab"] {
76
- min-width: 0;
77
- flex: 1 1 0;
78
- }
79
- .kui-tab-bar[data-allocation="fill"] [data-component="app-tab"] > [role="tab"] {
80
- width: 100%;
81
- justify-content: center;
82
- }
83
60
  .kui-tab-bar[data-trailing-placement="adjacent"] .kui-tab-bar__tabs {
84
61
  flex: 0 1 auto;
85
62
  }
@@ -100,3 +77,77 @@
100
77
  .kui-tab-bar__end {
101
78
  margin-inline-start: auto;
102
79
  }
80
+
81
+ /* Overflow dividers: a line on each side of the tab strip beyond which tabs
82
+ are scrolled out of view, as `wireScrollDividers` reports through the
83
+ strip's `data-scroll-overflow` (physical sides). A rail strip has no
84
+ visible track, so the bar draws the line with its own pseudo-elements,
85
+ ordered onto the strip's edges: `::before` between the leading zone and the
86
+ strip, `::after` between the strip and the trailing zone. Each is 1px wide
87
+ and gives back its width and one gap through a negative margin, so it
88
+ overlaps the strip's edge and never moves a tab or an action; hidden, it is
89
+ transparent. A segmented or inspector strip already draws a bordered track,
90
+ so its overflowing side takes the divider color on that border instead of
91
+ a straight line across its rounded end. */
92
+ .kui-tab-bar > .kui-tab-bar__leading {
93
+ order: -2;
94
+ }
95
+
96
+ .kui-tab-bar > :is(.kui-tab-bar__trailing, .kui-tab-bar__end) {
97
+ order: 1;
98
+ }
99
+
100
+ .kui-tab-bar::before,
101
+ .kui-tab-bar::after {
102
+ content: "";
103
+ position: relative;
104
+ z-index: 1;
105
+ width: 1px;
106
+ background: transparent;
107
+ pointer-events: none;
108
+ align-self: stretch;
109
+ flex: none;
110
+ }
111
+
112
+ .kui-tab-bar::before {
113
+ order: -1;
114
+ margin-inline-end: calc(-1px - var(--kui-toolbar-gap, 0.5rem));
115
+ }
116
+
117
+ .kui-tab-bar::after {
118
+ margin-inline-start: calc(-1px - var(--kui-toolbar-gap, 0.5rem));
119
+ }
120
+
121
+ .kui-tab-bar[data-presentation="rail"]:dir(ltr):has(
122
+ > .kui-tab-bar__tabs[data-scroll-overflow*="l"]
123
+ )::before,
124
+ .kui-tab-bar[data-presentation="rail"]:dir(rtl):has(
125
+ > .kui-tab-bar__tabs[data-scroll-overflow*="r"]
126
+ )::before,
127
+ .kui-tab-bar[data-presentation="rail"]:dir(ltr):has(
128
+ > .kui-tab-bar__tabs[data-scroll-overflow*="r"]
129
+ )::after,
130
+ .kui-tab-bar[data-presentation="rail"]:dir(rtl):has(
131
+ > .kui-tab-bar__tabs[data-scroll-overflow*="l"]
132
+ )::after {
133
+ background: var(
134
+ --kui-tab-bar-divider-color,
135
+ var(--kui-color-neutral-border-normal)
136
+ );
137
+ }
138
+
139
+ .kui-tab-bar:not([data-presentation="rail"])
140
+ > .kui-tab-bar__tabs[data-scroll-overflow*="l"] {
141
+ border-left-color: var(
142
+ --kui-tab-bar-divider-color,
143
+ var(--kui-color-neutral-border-normal)
144
+ );
145
+ }
146
+
147
+ .kui-tab-bar:not([data-presentation="rail"])
148
+ > .kui-tab-bar__tabs[data-scroll-overflow*="r"] {
149
+ border-right-color: var(
150
+ --kui-tab-bar-divider-color,
151
+ var(--kui-color-neutral-border-normal)
152
+ );
153
+ }
@@ -66,18 +66,16 @@
66
66
  scroll-padding-block-start: var(--kui-edge-inset-block-start);
67
67
  }
68
68
 
69
- .kui-tab-scaffold__scene:not(
70
- :has(
71
- > :is(
72
- [data-component="pane"],
73
- [data-component="nav-stack"],
74
- [data-component="split-view"],
75
- [data-component="workbench"],
76
- [data-component="tab-scaffold"]
77
- ):only-child
78
- )
79
- )
80
- > * {
69
+ .kui-tab-scaffold__scene
70
+ > :not(
71
+ :is(
72
+ [data-component="pane"],
73
+ [data-component="nav-stack"],
74
+ [data-component="split-view"],
75
+ [data-component="workbench"],
76
+ [data-component="tab-scaffold"]
77
+ ):only-child
78
+ ) {
81
79
  --kui-edge-inset-block-start: 0px;
82
80
  --kui-edge-inset-block-end: 0px;
83
81
  --kui-edge-inset-inline-start: 0px;
@@ -98,10 +96,24 @@
98
96
  );
99
97
  padding-inline: var(--_kui-tab-scaffold-safe-inline-start)
100
98
  var(--_kui-tab-scaffold-safe-inline-end);
101
- border-block-start: 1px solid var(--kui-color-border);
99
+ /* Chrome divider: with `chromeDividers="scroll"` (the default, no
100
+ attribute) the bar's 1px top border shows only while the active scene's
101
+ content continues below it — never at the scroll end or when the content
102
+ fits. `wireScrollDividers` reports that state through
103
+ `data-scroll-divider`; `always` shows it without the wiring, and `none`
104
+ never. The border is always there and only its color changes, so
105
+ showing it never moves the bar or a tab. */
106
+ border-block-start: 1px solid
107
+ var(--_kui-tab-scaffold-bar-divider, transparent);
102
108
  background: var(--kui-color-surface);
103
109
  }
104
110
 
111
+ .kui-tab-scaffold:not([data-chrome-dividers])
112
+ > .kui-tab-scaffold__bar[data-scroll-divider*="t"],
113
+ .kui-tab-scaffold[data-chrome-dividers="always"] > .kui-tab-scaffold__bar {
114
+ --_kui-tab-scaffold-bar-divider: var(--kui-color-neutral-border-normal);
115
+ }
116
+
105
117
  .kui-tab-scaffold__tab {
106
118
  display: flex;
107
119
  flex: 1 1 0;
@@ -120,7 +132,7 @@
120
132
  }
121
133
 
122
134
  .kui-tab-scaffold__tab[aria-selected="true"] {
123
- color: var(--kui-color-accent-text);
135
+ color: var(--kui-color-brand-on-quiet);
124
136
  }
125
137
 
126
138
  .kui-tab-scaffold__tab:focus-visible {
@@ -129,10 +141,34 @@
129
141
  }
130
142
 
131
143
  .kui-tab-scaffold__tab-icon {
144
+ position: relative;
132
145
  display: grid;
133
146
  place-items: center;
134
147
  }
135
148
 
149
+ /* The iOS tab-bar badge: over the icon's top-trailing corner, its leading
150
+ edge just past the icon's center line so a longer count grows outward. The
151
+ Badge keeps its own geometry; only this anchor is positioned. Without an
152
+ icon the badge stays in flow above the label. */
153
+ .kui-tab-scaffold__tab-badge {
154
+ display: flex;
155
+ pointer-events: none;
156
+ }
157
+
158
+ .kui-tab-scaffold__tab-icon > .kui-tab-scaffold__tab-badge {
159
+ position: absolute;
160
+ inset-block-start: -0.4375rem;
161
+ inset-inline-start: calc(50% + 0.1875rem);
162
+ }
163
+
164
+ /* The text-free dot never grows, so it centers on the icon's top-trailing
165
+ corner instead: half over the glyph, half outside it. */
166
+ .kui-tab-scaffold__tab-icon
167
+ > .kui-tab-scaffold__tab-badge[data-badge-kind="dot"] {
168
+ inset-block-start: -0.125rem;
169
+ inset-inline-start: calc(100% - 0.3125rem);
170
+ }
171
+
136
172
  .kui-tab-scaffold__tab-icon svg {
137
173
  width: 1.375rem;
138
174
  height: 1.375rem;
@@ -146,3 +182,13 @@
146
182
  text-overflow: ellipsis;
147
183
  white-space: nowrap;
148
184
  }
185
+
186
+ /* As the only child of a Workbench region (its main area or a panel's
187
+ content, which the Workbench marks with `data-workbench-main` /
188
+ `data-workbench-panel-content`), a TabScaffold fills the region, so a
189
+ composed toolbar's footer (or the app's own) sits at the region's bottom
190
+ edge rather than under short content. */
191
+ :is([data-workbench-main], [data-workbench-panel-content])
192
+ > [data-component="tab-scaffold"]:only-child {
193
+ height: 100%;
194
+ }
@@ -10,7 +10,7 @@
10
10
  }
11
11
 
12
12
  .kui-text[data-tone="danger"] {
13
- color: var(--kui-color-danger-text);
13
+ color: var(--kui-color-danger-on-quiet);
14
14
  }
15
15
 
16
16
  .kui-text[data-size="compact"] {
@@ -30,3 +30,19 @@ span.kui-text {
30
30
  border: 0;
31
31
  padding: 0;
32
32
  }
33
+
34
+ /* A ListHeader's label: the title's single text child, set as a compact,
35
+ uppercase, single-line label that truncates with an ellipsis. The title is
36
+ a div around a heading or, for a toggle header, the toggle button around
37
+ an inline span. */
38
+ .kui-list-header__title > .kui-text {
39
+ min-width: 0;
40
+ margin: 0;
41
+ overflow: hidden;
42
+ font-size: var(--kui-font-xs);
43
+ font-weight: 650;
44
+ letter-spacing: 0.04em;
45
+ text-overflow: ellipsis;
46
+ text-transform: uppercase;
47
+ white-space: nowrap;
48
+ }
@@ -1,8 +1,8 @@
1
1
  .kui-token-search {
2
2
  --kui-token-search-background: var(--kui-color-surface);
3
- --kui-token-search-border: var(--kui-color-border);
4
- --kui-token-search-token-background: var(--kui-color-accent);
5
- --kui-token-search-token-foreground: var(--kui-color-accent-text);
3
+ --kui-token-search-border: var(--kui-color-neutral-border-normal);
4
+ --kui-token-search-token-background: var(--kui-color-brand-fill-normal);
5
+ --kui-token-search-token-foreground: var(--kui-color-brand-on-quiet);
6
6
  --kui-token-search-line-size: 2.125rem;
7
7
 
8
8
  display: grid;
@@ -53,7 +53,7 @@
53
53
  padding-block: calc((var(--kui-token-search-line-size) - 1.35em) / 2) 0;
54
54
  box-sizing: border-box;
55
55
  outline: 0;
56
- caret-color: var(--kui-color-accent-text);
56
+ caret-color: var(--kui-color-brand-on-quiet);
57
57
  font-size: var(--kui-font-s);
58
58
  line-height: 1.35;
59
59
  white-space: pre-wrap;