@kerfjs/ui 5.0.0-beta.98 → 5.0.0-beta.99

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 (407) hide show
  1. package/README.md +42 -1
  2. package/ai/application-ui-diagnostic-ids-v1.json +1 -0
  3. package/ai/component-catalog.json +487 -66
  4. package/ai/component-catalog.schema.json +1 -1
  5. package/ai/component-composition-rules.json +22 -2
  6. package/ai/component-composition.json +360 -33
  7. package/ai/component-composition.schema.json +1 -1
  8. package/ai/components/README.md +18 -17
  9. package/ai/components/anchored-surface.md +13 -0
  10. package/ai/components/application-tabs.md +1 -1
  11. package/ai/components/chip.md +9 -5
  12. package/ai/components/choice-chips.md +15 -8
  13. package/ai/components/collapsible-panel.md +3 -2
  14. package/ai/components/composer.md +83 -0
  15. package/ai/components/content-item.md +2 -2
  16. package/ai/components/corner-status.md +1 -1
  17. package/ai/components/document-baseline.md +3 -3
  18. package/ai/components/foundation.md +2 -2
  19. package/ai/components/layout.md +1 -1
  20. package/ai/components/list-action-row.md +5 -1
  21. package/ai/components/list-item.md +5 -1
  22. package/ai/components/list.md +19 -3
  23. package/ai/components/nav-stack.md +11 -2
  24. package/ai/components/pane.md +13 -4
  25. package/ai/components/popup-menu.md +4 -4
  26. package/ai/components/recipe-app-shell.md +3 -3
  27. package/ai/components/recipe-collapsible-sidebar.md +3 -3
  28. package/ai/components/recipe-compact-toolbar.md +1 -1
  29. package/ai/components/recipe-composer-form.md +3 -3
  30. package/ai/components/recipe-list-detail-dialog.md +2 -2
  31. package/ai/components/recipe-list-workspace-states.md +3 -3
  32. package/ai/components/recipe-loading-inspector.md +1 -1
  33. package/ai/components/recipe-navigation-sidebar.md +3 -3
  34. package/ai/components/recipe-navigation-stack.md +3 -3
  35. package/ai/components/recipe-workspace-header.md +3 -3
  36. package/ai/components/resize.md +2 -2
  37. package/ai/components/split-view.md +4 -2
  38. package/ai/components/sunken-panel.md +2 -2
  39. package/ai/components/surface-scaffold.md +15 -3
  40. package/ai/components/tab-bar.md +1 -0
  41. package/ai/components/tab-navigator.md +4 -0
  42. package/ai/components/toolbar-control-group.md +2 -0
  43. package/ai/components/toolbar-text.md +1 -0
  44. package/ai/components/toolbar.md +1 -0
  45. package/ai/components/workbench.md +1 -0
  46. package/ai/public-api-signatures-v1.md +487 -77
  47. package/ai/skill.md +40 -13
  48. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  49. package/analyzer/component-ownership.mjs +1 -1
  50. package/analyzer/index.mjs +41 -14
  51. package/dist/anchored-surface.d.ts +30 -2
  52. package/dist/anchored-surface.js +1 -1
  53. package/dist/app-tab.js +1 -1
  54. package/dist/browser/composer.js +4 -0
  55. package/dist/catalog-resources.d.ts +3 -2
  56. package/dist/catalog-resources.js +4 -4
  57. package/dist/catalog-resources.js.map +1 -1
  58. package/dist/catalog.d.ts +22 -5
  59. package/dist/catalog.js +50 -31
  60. package/dist/catalog.js.map +1 -1
  61. package/dist/chip.d.ts +41 -9
  62. package/dist/chip.js +1 -1
  63. package/dist/choice-chips.d.ts +40 -16
  64. package/dist/choice-chips.js +1 -1
  65. package/dist/chunk-34U4ANDJ.js +119 -0
  66. package/dist/chunk-34U4ANDJ.js.map +1 -0
  67. package/dist/{chunk-36TL6BCR.js → chunk-3GLYIIFR.js} +34 -6
  68. package/dist/chunk-3GLYIIFR.js.map +1 -0
  69. package/dist/{chunk-HWY4BSLS.js → chunk-3VXDSIBJ.js} +2 -2
  70. package/dist/{chunk-HWY4BSLS.js.map → chunk-3VXDSIBJ.js.map} +1 -1
  71. package/dist/chunk-3WYREXW4.js +120 -0
  72. package/dist/chunk-3WYREXW4.js.map +1 -0
  73. package/dist/chunk-AV7CPAPT.js +82 -0
  74. package/dist/chunk-AV7CPAPT.js.map +1 -0
  75. package/dist/{chunk-XK4E225T.js → chunk-B53PS2LE.js} +2 -2
  76. package/dist/{chunk-XK4E225T.js.map → chunk-B53PS2LE.js.map} +1 -1
  77. package/dist/{chunk-R42D2BAO.js → chunk-CA7LNX3J.js} +2 -2
  78. package/dist/{chunk-R42D2BAO.js.map → chunk-CA7LNX3J.js.map} +1 -1
  79. package/dist/{chunk-AZWE2FB5.js → chunk-CMETHPKR.js} +12 -15
  80. package/dist/chunk-CMETHPKR.js.map +1 -0
  81. package/dist/{chunk-Y43B6DS3.js → chunk-CVD5IZGB.js} +2 -2
  82. package/dist/{chunk-Y43B6DS3.js.map → chunk-CVD5IZGB.js.map} +1 -1
  83. package/dist/{chunk-6STQXRT4.js → chunk-CXZXHZTR.js} +121 -12
  84. package/dist/chunk-CXZXHZTR.js.map +1 -0
  85. package/dist/{chunk-GZE2XVKC.js → chunk-DZJ4GBSP.js} +3 -3
  86. package/dist/{chunk-GZE2XVKC.js.map → chunk-DZJ4GBSP.js.map} +1 -1
  87. package/dist/chunk-ELCMSQNJ.js +49 -0
  88. package/dist/chunk-ELCMSQNJ.js.map +1 -0
  89. package/dist/{chunk-P74VXMB6.js → chunk-EOO6PYGF.js} +7 -14
  90. package/dist/chunk-EOO6PYGF.js.map +1 -0
  91. package/dist/{chunk-PRG4CL3Q.js → chunk-FR76ZJQC.js} +21 -19
  92. package/dist/chunk-FR76ZJQC.js.map +1 -0
  93. package/dist/{chunk-QQ3TTWFH.js → chunk-G3J7JDP6.js} +1 -1
  94. package/dist/{chunk-QQ3TTWFH.js.map → chunk-G3J7JDP6.js.map} +1 -1
  95. package/dist/{chunk-IGTWXPTN.js → chunk-HGV7J4T6.js} +3 -3
  96. package/dist/{chunk-IGTWXPTN.js.map → chunk-HGV7J4T6.js.map} +1 -1
  97. package/dist/{chunk-YWQGSUF2.js → chunk-HLDRH23D.js} +3 -3
  98. package/dist/{chunk-YWQGSUF2.js.map → chunk-HLDRH23D.js.map} +1 -1
  99. package/dist/{chunk-PBT3CPPY.js → chunk-HQZYKJ56.js} +24 -4
  100. package/dist/chunk-HQZYKJ56.js.map +1 -0
  101. package/dist/{chunk-V6W56V3N.js → chunk-HZPHCSCS.js} +16 -3
  102. package/dist/chunk-HZPHCSCS.js.map +1 -0
  103. package/dist/{chunk-GJYQ27C2.js → chunk-INI4WDWC.js} +8 -1
  104. package/dist/chunk-INI4WDWC.js.map +1 -0
  105. package/dist/{chunk-U657IHFB.js → chunk-IQSRHXZR.js} +10 -4
  106. package/dist/chunk-IQSRHXZR.js.map +1 -0
  107. package/dist/{chunk-KQDU7Z7P.js → chunk-K4AT3V3J.js} +2 -1
  108. package/dist/chunk-K4AT3V3J.js.map +1 -0
  109. package/dist/{chunk-QIAPOWHH.js → chunk-KCS6NJ3O.js} +2 -2
  110. package/dist/{chunk-QIAPOWHH.js.map → chunk-KCS6NJ3O.js.map} +1 -1
  111. package/dist/{chunk-UKKRPP56.js → chunk-LOSRXZAH.js} +2 -2
  112. package/dist/{chunk-UKKRPP56.js.map → chunk-LOSRXZAH.js.map} +1 -1
  113. package/dist/{chunk-ROZLJULF.js → chunk-MF6ZUUJZ.js} +8 -3
  114. package/dist/chunk-MF6ZUUJZ.js.map +1 -0
  115. package/dist/{chunk-6IVNMC6R.js → chunk-MHMWQ7RB.js} +2 -2
  116. package/dist/{chunk-6IVNMC6R.js.map → chunk-MHMWQ7RB.js.map} +1 -1
  117. package/dist/{chunk-JYD7G4RG.js → chunk-PIVY32AE.js} +15 -5
  118. package/dist/chunk-PIVY32AE.js.map +1 -0
  119. package/dist/{chunk-527IAEWG.js → chunk-PYBBYSZ3.js} +10 -17
  120. package/dist/chunk-PYBBYSZ3.js.map +1 -0
  121. package/dist/chunk-QDSZTQXL.js +28 -0
  122. package/dist/chunk-QDSZTQXL.js.map +1 -0
  123. package/dist/{chunk-YXOMI7ES.js → chunk-QIG4IGUP.js} +2 -2
  124. package/dist/{chunk-YXOMI7ES.js.map → chunk-QIG4IGUP.js.map} +1 -1
  125. package/dist/{chunk-6BRRUPJY.js → chunk-QROYYGWU.js} +3 -3
  126. package/dist/chunk-QROYYGWU.js.map +1 -0
  127. package/dist/{chunk-FOQK4F3L.js → chunk-RHD7RKGI.js} +28 -7
  128. package/dist/chunk-RHD7RKGI.js.map +1 -0
  129. package/dist/{chunk-BBU2SPRE.js → chunk-T4WJ5VGP.js} +4 -4
  130. package/dist/{chunk-BBU2SPRE.js.map → chunk-T4WJ5VGP.js.map} +1 -1
  131. package/dist/{chunk-6NOLL5KG.js → chunk-TGLUDQP2.js} +3 -3
  132. package/dist/{chunk-6NOLL5KG.js.map → chunk-TGLUDQP2.js.map} +1 -1
  133. package/dist/{chunk-HO6FU3G7.js → chunk-TLMMFQWM.js} +4 -4
  134. package/dist/{chunk-HO6FU3G7.js.map → chunk-TLMMFQWM.js.map} +1 -1
  135. package/dist/chunk-UMKV7YVQ.js +20 -0
  136. package/dist/chunk-UMKV7YVQ.js.map +1 -0
  137. package/dist/{chunk-M2NRCFRO.js → chunk-VFYO3UGZ.js} +2 -2
  138. package/dist/{chunk-M2NRCFRO.js.map → chunk-VFYO3UGZ.js.map} +1 -1
  139. package/dist/{chunk-YOKEL75M.js → chunk-WVS6CUCT.js} +2 -2
  140. package/dist/{chunk-YOKEL75M.js.map → chunk-WVS6CUCT.js.map} +1 -1
  141. package/dist/{chunk-MN3POJFN.js → chunk-YMUIQRWK.js} +2 -2
  142. package/dist/{chunk-MN3POJFN.js.map → chunk-YMUIQRWK.js.map} +1 -1
  143. package/dist/{chunk-Y3LC7JQO.js → chunk-YOA5W5ZH.js} +2 -2
  144. package/dist/{chunk-Y3LC7JQO.js.map → chunk-YOA5W5ZH.js.map} +1 -1
  145. package/dist/{chunk-44A6LP54.js → chunk-YQ2AC4E2.js} +2 -2
  146. package/dist/{chunk-44A6LP54.js.map → chunk-YQ2AC4E2.js.map} +1 -1
  147. package/dist/chunk-ZNROKDSZ.js +54 -0
  148. package/dist/chunk-ZNROKDSZ.js.map +1 -0
  149. package/dist/collapsible-panel.d.ts +3 -2
  150. package/dist/collapsible-panel.js +4 -3
  151. package/dist/collapsible-panel.js.map +1 -1
  152. package/dist/composer.d.ts +62 -0
  153. package/dist/composer.js +5 -0
  154. package/dist/composer.js.map +1 -0
  155. package/dist/corner-status.d.ts +1 -1
  156. package/dist/corner-status.js +1 -1
  157. package/dist/css-values.d.ts +9 -1
  158. package/dist/css-values.js +1 -1
  159. package/dist/disclosure-arrow.js +1 -1
  160. package/dist/empty-state.js +1 -1
  161. package/dist/grid.js +1 -1
  162. package/dist/icon-button.js +1 -1
  163. package/dist/icon-toggle-button.js +1 -1
  164. package/dist/index.d.ts +10 -5
  165. package/dist/index.js +40 -37
  166. package/dist/list-action-row.d.ts +10 -2
  167. package/dist/list-action-row.js +1 -1
  168. package/dist/list-header.js +1 -1
  169. package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
  170. package/dist/list-item.d.ts +10 -3
  171. package/dist/list-item.js +1 -1
  172. package/dist/list.d.ts +36 -4
  173. package/dist/list.js +1 -1
  174. package/dist/loading-spinner.js +1 -1
  175. package/dist/lucide-icon.js +1 -1
  176. package/dist/{nav-stack-Cp3Y8kJ9.d.ts → nav-stack-VXTumzKa.d.ts} +48 -3
  177. package/dist/nav-stack.d.ts +3 -2
  178. package/dist/nav-stack.js +2 -1
  179. package/dist/pane.d.ts +40 -3
  180. package/dist/pane.js +1 -1
  181. package/dist/{panel-toolbar-CL9tYOkh.d.ts → panel-toolbar-vg6Ir5Dy.d.ts} +6 -1
  182. package/dist/popup-menu-register.d.ts +2 -1
  183. package/dist/popup-menu-register.js +97 -22
  184. package/dist/popup-menu-register.js.map +1 -1
  185. package/dist/popup-menu.js +1 -1
  186. package/dist/row.js +1 -1
  187. package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
  188. package/dist/select.js +1 -1
  189. package/dist/skeleton.js +1 -1
  190. package/dist/spacer.js +1 -1
  191. package/dist/split-button.js +1 -1
  192. package/dist/split-view.d.ts +7 -5
  193. package/dist/split-view.js +6 -3
  194. package/dist/split-view.js.map +1 -1
  195. package/dist/state-banner.d.ts +6 -1
  196. package/dist/state-banner.js +1 -1
  197. package/dist/styles/anchored-surface.css +27 -1
  198. package/dist/styles/catalog/components/catalog-example.css +33 -0
  199. package/dist/styles/catalog/components/catalog-stage.css +7 -0
  200. package/dist/styles/chip.css +70 -0
  201. package/dist/styles/components/actions/popup-menu/popup-menu.css +14 -4
  202. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +75 -1
  203. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +66 -0
  204. package/dist/styles/components/collections/list/list.css +77 -7
  205. package/dist/styles/components/collections/list-action-row/list-action-row.css +177 -22
  206. package/dist/styles/components/collections/list-item/list-item.css +158 -11
  207. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +27 -1
  208. package/dist/styles/components/feedback/chip/chip.css +70 -0
  209. package/dist/styles/components/feedback/state-banner/state-banner.css +24 -13
  210. package/dist/styles/components/forms/composer/composer.css +100 -0
  211. package/dist/styles/components/forms/token-search-field/token-search-field.css +13 -2
  212. package/dist/styles/components/layout/pane/pane.css +81 -2
  213. package/dist/styles/components/navigation/nav-stack/nav-stack.css +84 -0
  214. package/dist/styles/components/navigation/tab-bar/tab-bar.css +15 -4
  215. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +79 -4
  216. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +195 -0
  217. package/dist/styles/composer.css +100 -0
  218. package/dist/styles/foundation.css +40 -0
  219. package/dist/styles/list-action-row.css +177 -22
  220. package/dist/styles/list-item.css +158 -11
  221. package/dist/styles/list.css +77 -7
  222. package/dist/styles/nav-stack.css +84 -0
  223. package/dist/styles/pane.css +81 -2
  224. package/dist/styles/popup-menu.css +14 -4
  225. package/dist/styles/state-banner.css +24 -13
  226. package/dist/styles/styles.css +1 -0
  227. package/dist/styles/surface-scaffold.css +195 -0
  228. package/dist/styles/tab-bar.css +15 -4
  229. package/dist/styles/tab-navigator.css +79 -4
  230. package/dist/styles/token-search-field.css +13 -2
  231. package/dist/styles/toolbar-control-group.css +75 -1
  232. package/dist/styles/toolbar-text.css +66 -0
  233. package/dist/surface-scaffold-register.d.ts +6 -1
  234. package/dist/surface-scaffold-register.js +89 -3
  235. package/dist/surface-scaffold-register.js.map +1 -1
  236. package/dist/surface-scaffold.d.ts +66 -7
  237. package/dist/surface-scaffold.js +1 -1
  238. package/dist/tab-navigator.d.ts +23 -2
  239. package/dist/tab-navigator.js +2 -0
  240. package/dist/tab-navigator.js.map +1 -1
  241. package/dist/token-search-field.d.ts +1 -1
  242. package/dist/token-search-field.js +1 -1
  243. package/dist/{token-search-model-DTcTXWMS.d.ts → token-search-model-aYR0YAei.d.ts} +32 -2
  244. package/dist/token-search-model.d.ts +1 -1
  245. package/dist/toolbar-control-group.js +1 -1
  246. package/dist/toolbar-text.js +1 -1
  247. package/dist/toolbar.d.ts +1 -0
  248. package/dist/value-table.js +1 -1
  249. package/dist/wire-catalog.d.ts +3 -2
  250. package/dist/wire-catalog.js +2 -2
  251. package/dist/wire-composers.d.ts +16 -0
  252. package/dist/wire-composers.js +3 -0
  253. package/dist/wire-composers.js.map +1 -0
  254. package/dist/wire-list-focus-scroll.d.ts +16 -0
  255. package/dist/wire-list-focus-scroll.js +3 -0
  256. package/dist/wire-list-focus-scroll.js.map +1 -0
  257. package/dist/wire-nav-stack.js +135 -0
  258. package/dist/wire-nav-stack.js.map +1 -1
  259. package/dist/wire-scroll-dividers.d.ts +9 -0
  260. package/dist/wire-scroll-dividers.js +1 -1
  261. package/dist/wire-tab-bars.js +1 -1
  262. package/dist/wire-tab-navigator.d.ts +3 -1
  263. package/dist/wire-tab-navigator.js +133 -1
  264. package/dist/wire-tab-navigator.js.map +1 -1
  265. package/dist/wire-token-search-fields.d.ts +1 -1
  266. package/dist/wire-token-search-fields.js +1 -1
  267. package/dist/workbench.d.ts +8 -3
  268. package/dist/workbench.js +2 -1
  269. package/docs/accessibility.md +132 -3
  270. package/docs/anchored-surface.md +46 -4
  271. package/docs/app-layouts.md +23 -2
  272. package/docs/apple-hig.md +1 -0
  273. package/docs/catalog.md +54 -8
  274. package/docs/collapsible-panel.md +9 -6
  275. package/docs/component-contract.md +41 -12
  276. package/docs/component-selection.md +143 -19
  277. package/docs/composer.md +143 -0
  278. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
  279. package/docs/design/templates/choice-chips/multiple.svg +1 -0
  280. package/docs/design/templates/choice-chips-dark.svg +1 -1
  281. package/docs/design/templates/choice-chips.svg +1 -1
  282. package/docs/design/templates/composer/chat-dark.svg +1 -0
  283. package/docs/design/templates/composer/chat.svg +1 -0
  284. package/docs/design/templates/composer/prompt-dark.svg +1 -0
  285. package/docs/design/templates/composer/prompt.svg +1 -0
  286. package/docs/design/templates/composer-dark.svg +1 -0
  287. package/docs/design/templates/composer.svg +1 -0
  288. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  289. package/docs/design/templates/empty-state/filtered.svg +1 -1
  290. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  291. package/docs/design/templates/empty-state/with-action.svg +1 -1
  292. package/docs/design/templates/empty-state-dark.svg +1 -1
  293. package/docs/design/templates/empty-state.svg +1 -1
  294. package/docs/design/templates/list/compact-dark.svg +1 -1
  295. package/docs/design/templates/list/compact.svg +1 -1
  296. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  297. package/docs/design/templates/list-action-row/default.svg +1 -1
  298. package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
  299. package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
  300. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  301. package/docs/design/templates/list-action-row/selected.svg +1 -1
  302. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -1
  303. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -1
  304. package/docs/design/templates/list-action-row-dark.svg +1 -1
  305. package/docs/design/templates/list-action-row.svg +1 -1
  306. package/docs/design/templates/list-dark.svg +1 -1
  307. package/docs/design/templates/list-header/size-l-dark.svg +1 -1
  308. package/docs/design/templates/list-header/size-l.svg +1 -1
  309. package/docs/design/templates/list-header/size-m-dark.svg +1 -1
  310. package/docs/design/templates/list-header/size-m.svg +1 -1
  311. package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
  312. package/docs/design/templates/list-header/size-xl.svg +1 -1
  313. package/docs/design/templates/list-header-dark.svg +1 -1
  314. package/docs/design/templates/list-header.svg +1 -1
  315. package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
  316. package/docs/design/templates/list-item/icon-tile.svg +1 -0
  317. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  318. package/docs/design/templates/list-item/selected.svg +1 -1
  319. package/docs/design/templates/list-item-dark.svg +1 -1
  320. package/docs/design/templates/list-item.svg +1 -1
  321. package/docs/design/templates/list.svg +1 -1
  322. package/docs/design/templates/segmented-control-dark.svg +1 -1
  323. package/docs/design/templates/segmented-control.svg +1 -1
  324. package/docs/design/templates/skeleton-dark.svg +1 -1
  325. package/docs/design/templates/skeleton.svg +1 -1
  326. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  327. package/docs/design/templates/state-banner/danger.svg +1 -1
  328. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
  329. package/docs/design/templates/state-banner/info-badge.svg +1 -1
  330. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  331. package/docs/design/templates/state-banner/info.svg +1 -1
  332. package/docs/design/templates/state-banner/strip-dark.svg +1 -1
  333. package/docs/design/templates/state-banner/strip.svg +1 -1
  334. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  335. package/docs/design/templates/state-banner/success.svg +1 -1
  336. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  337. package/docs/design/templates/state-banner/warning.svg +1 -1
  338. package/docs/design/templates/state-banner-dark.svg +1 -1
  339. package/docs/design/templates/state-banner.svg +1 -1
  340. package/docs/design/templates/tab-bar-dark.svg +1 -1
  341. package/docs/design/templates/tab-bar.svg +1 -1
  342. package/docs/design/templates/token-search-field-dark.svg +1 -1
  343. package/docs/design/templates/token-search-field.svg +1 -1
  344. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  345. package/docs/design/templates/toolbar-control-group.svg +1 -1
  346. package/docs/design/templates/toolbar-dark.svg +1 -1
  347. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  348. package/docs/design/templates/toolbar-text/default.svg +1 -1
  349. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  350. package/docs/design/templates/toolbar-text/large.svg +1 -1
  351. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  352. package/docs/design/templates/toolbar-text.svg +1 -1
  353. package/docs/design/templates/toolbar.svg +1 -1
  354. package/docs/design/templates/value-table/details-dark.svg +1 -1
  355. package/docs/design/templates/value-table/details.svg +1 -1
  356. package/docs/design/templates/value-table-dark.svg +1 -1
  357. package/docs/design/templates/value-table.svg +1 -1
  358. package/docs/design-philosophy.md +9 -1
  359. package/docs/examples/command-palette-adapter.tsx +3 -3
  360. package/docs/layout.md +147 -14
  361. package/docs/nav-stack.md +112 -2
  362. package/docs/recipes.md +9 -9
  363. package/docs/split-view.md +3 -3
  364. package/docs/sunken-panel.md +2 -2
  365. package/docs/surface-scaffold.md +138 -7
  366. package/docs/tab-navigator.md +38 -1
  367. package/docs/type-contracts.md +16 -16
  368. package/docs/ui-analyzer.md +3 -1
  369. package/docs/ui-doctor.md +71 -0
  370. package/docs/ux-demo.md +6 -6
  371. package/docs/workbench.md +10 -6
  372. package/docs/writing.md +152 -0
  373. package/doctor/copy-capitalization-checks.mjs +591 -0
  374. package/doctor/index.mjs +17 -8
  375. package/llms.txt +105 -11
  376. package/package.json +15 -1
  377. package/ux-demo/recipes/app-shell.tsx +11 -11
  378. package/ux-demo/recipes/collapsible-sidebar.tsx +12 -11
  379. package/ux-demo/recipes/compact-toolbar.tsx +10 -10
  380. package/ux-demo/recipes/composer-form.tsx +8 -8
  381. package/ux-demo/recipes/list-detail-dialog.tsx +13 -13
  382. package/ux-demo/recipes/list-workspace-states.tsx +13 -13
  383. package/ux-demo/recipes/loading-inspector.tsx +10 -10
  384. package/ux-demo/recipes/navigation-sidebar.tsx +7 -7
  385. package/ux-demo/recipes/navigation-stack.tsx +5 -5
  386. package/ux-demo/recipes/workspace-header.tsx +5 -5
  387. package/dist/chunk-36TL6BCR.js.map +0 -1
  388. package/dist/chunk-4LOK4634.js +0 -21
  389. package/dist/chunk-4LOK4634.js.map +0 -1
  390. package/dist/chunk-527IAEWG.js.map +0 -1
  391. package/dist/chunk-6BRRUPJY.js.map +0 -1
  392. package/dist/chunk-6STQXRT4.js.map +0 -1
  393. package/dist/chunk-76PWEN5Y.js +0 -64
  394. package/dist/chunk-76PWEN5Y.js.map +0 -1
  395. package/dist/chunk-AZWE2FB5.js.map +0 -1
  396. package/dist/chunk-DQDTZE4W.js +0 -70
  397. package/dist/chunk-DQDTZE4W.js.map +0 -1
  398. package/dist/chunk-FOQK4F3L.js.map +0 -1
  399. package/dist/chunk-GJYQ27C2.js.map +0 -1
  400. package/dist/chunk-JYD7G4RG.js.map +0 -1
  401. package/dist/chunk-KQDU7Z7P.js.map +0 -1
  402. package/dist/chunk-P74VXMB6.js.map +0 -1
  403. package/dist/chunk-PBT3CPPY.js.map +0 -1
  404. package/dist/chunk-PRG4CL3Q.js.map +0 -1
  405. package/dist/chunk-ROZLJULF.js.map +0 -1
  406. package/dist/chunk-U657IHFB.js.map +0 -1
  407. package/dist/chunk-V6W56V3N.js.map +0 -1
@@ -10,9 +10,30 @@
10
10
  --kui-list-action-row-trailing-hover-background: var(
11
11
  --kui-color-neutral-fill-normal
12
12
  );
13
+ /* The leading (and trailing) content inset. An inherited
14
+ `--kui-list-row-padding-inline` on the containing List sets it for every
15
+ ListItem and ListActionRow at once; the +1px wherever it is used stands in
16
+ for the 1px border ListItem draws and this row paints as a box-shadow, so
17
+ both row kinds start their leading icons on one edge. */
18
+ --_kui-list-action-row-padding-inline: var(
19
+ --kui-list-row-padding-inline,
20
+ var(--kui-layout-item-padding, 0.5rem)
21
+ );
22
+ /* The leading icon size, shared with ListItem through an inherited
23
+ `--kui-list-row-icon-size` on the containing List, so a mixed list keeps
24
+ its labels on one edge. It defaults to ListItem's 18px row icon. */
25
+ --_kui-list-action-row-icon-size: var(--kui-list-row-icon-size, 1.125rem);
26
+ /* The row's minimum height and the primary button's block padding follow
27
+ density together, so a single-line label never holds a compact row
28
+ taller than its minimum (the label's own minimum is the difference). */
29
+ --_kui-list-action-row-min-height: 2.75rem;
30
+ --_kui-list-action-row-padding-block: var(
31
+ --kui-layout-item-padding,
32
+ 0.5rem
33
+ );
13
34
  display: flex;
14
35
  width: calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem)));
15
- min-height: 2.75rem;
36
+ min-height: var(--_kui-list-action-row-min-height);
16
37
  margin-inline: var(--kui-layout-inline-margin, 0.5rem);
17
38
  border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
18
39
  color: var(--kui-list-action-row-color);
@@ -22,12 +43,8 @@
22
43
  }
23
44
 
24
45
  .kui-list-action-row[data-density="compact"] {
25
- min-height: 2.25rem;
26
- }
27
-
28
- .kui-list-action-row[data-density="compact"]
29
- :is(.kui-list-action-row__primary, .kui-list-action-row__trailing-action) {
30
- min-height: 2.25rem;
46
+ --_kui-list-action-row-min-height: 2.25rem;
47
+ --_kui-list-action-row-padding-block: 0.25rem;
31
48
  }
32
49
 
33
50
  .kui-list-action-row[data-divider="before"],
@@ -60,9 +77,12 @@
60
77
  border-end-end-radius: 0;
61
78
  }
62
79
 
63
- .kui-list-action-row:not([data-placeholder="true"]):has(
64
- .kui-list-action-row__primary:hover
65
- ) {
80
+ /* A selected or pressed row keeps its selected tint while hovered. */
81
+ .kui-list-action-row:not(
82
+ [data-placeholder="true"],
83
+ [data-selected="true"],
84
+ [data-pressed="true"]
85
+ ):has(.kui-list-action-row__primary:hover) {
66
86
  --kui-list-action-row-border: var(--kui-list-action-row-hover-border);
67
87
  --kui-list-action-row-background: var(--kui-list-action-row-hover-background);
68
88
  }
@@ -97,7 +117,7 @@
97
117
  .kui-list-action-row[data-drop-position]::after {
98
118
  position: absolute;
99
119
  z-index: 1;
100
- inset-inline: var(--kui-layout-item-padding, 0.5rem);
120
+ inset-inline: var(--_kui-list-action-row-padding-inline);
101
121
  height: var(--kui-list-action-row-drop-indicator-width, 2px);
102
122
  border-radius: var(--kui-radius-pill);
103
123
  background: var(
@@ -119,7 +139,7 @@
119
139
  .kui-list-action-row__primary,
120
140
  .kui-list-action-row__trailing-action {
121
141
  height: auto !important;
122
- min-height: 2.75rem;
142
+ min-height: var(--_kui-list-action-row-min-height);
123
143
  padding: 0;
124
144
  border: 0;
125
145
  appearance: none;
@@ -134,8 +154,9 @@
134
154
  display: block;
135
155
  flex: 1 1 auto;
136
156
  min-width: 2.75rem;
137
- padding: var(--kui-layout-item-padding, 0.5rem);
138
- padding-inline-start: calc(1px + var(--kui-layout-item-padding, 0.5rem));
157
+ padding-block: var(--_kui-list-action-row-padding-block);
158
+ padding-inline: calc(1px + var(--_kui-list-action-row-padding-inline))
159
+ var(--_kui-list-action-row-padding-inline);
139
160
  text-align: start;
140
161
  }
141
162
 
@@ -167,10 +188,10 @@
167
188
  .kui-list-action-row__icon {
168
189
  position: absolute;
169
190
  inset-block-start: 50%;
170
- inset-inline-start: calc(1px + var(--kui-layout-item-padding, 0.5rem));
191
+ inset-inline-start: calc(1px + var(--_kui-list-action-row-padding-inline));
171
192
  display: grid;
172
- width: 1.5rem;
173
- height: 1.5rem;
193
+ width: var(--_kui-list-action-row-icon-size);
194
+ height: var(--_kui-list-action-row-icon-size);
174
195
  color: currentColor;
175
196
  transform: translateY(-50%);
176
197
  place-items: center;
@@ -178,15 +199,16 @@
178
199
 
179
200
  .kui-list-action-row__icon svg {
180
201
  display: block;
181
- width: 1.5rem;
182
- height: 1.5rem;
202
+ width: var(--_kui-list-action-row-icon-size);
203
+ height: var(--_kui-list-action-row-icon-size);
183
204
  }
184
205
 
185
206
  .kui-list-action-row__label {
186
207
  display: grid;
187
208
  min-width: 0;
188
209
  min-height: calc(
189
- 2.75rem - (2 * var(--kui-layout-item-padding, 0.5rem))
210
+ var(--_kui-list-action-row-min-height) -
211
+ (2 * var(--_kui-list-action-row-padding-block))
190
212
  );
191
213
  overflow: hidden;
192
214
  white-space: nowrap;
@@ -226,7 +248,8 @@
226
248
 
227
249
  .kui-list-action-row[data-has-icon="true"] .kui-list-action-row__label {
228
250
  margin-inline-start: calc(
229
- 1.5rem + var(--kui-layout-item-gap, 0.5rem)
251
+ var(--_kui-list-action-row-icon-size) +
252
+ var(--kui-layout-item-gap, 0.5rem)
230
253
  );
231
254
  }
232
255
 
@@ -244,7 +267,7 @@
244
267
 
245
268
  .kui-list-action-row[data-multiline="true"] .kui-list-action-row__icon {
246
269
  inset-block-start: calc(
247
- var(--kui-layout-item-padding, 0.5rem) + (1lh / 2)
270
+ var(--_kui-list-action-row-padding-block) + (1lh / 2)
248
271
  );
249
272
  }
250
273
 
@@ -291,7 +314,139 @@
291
314
  height: 1rem;
292
315
  }
293
316
 
317
+ /* A filled icon tile (`iconTile`): the leading icon sits in a 32px rounded
318
+ tile with an 18px glyph, 6px clear of a standard 44px row's edges (a
319
+ compact row is at least 42px tall) like a ListItem tile. The 6px radius
320
+ is concentric with the row's 12px corner at that clearance. */
321
+ .kui-list-action-row[data-icon-tile] {
322
+ --_kui-list-action-row-icon-tile-size: 2rem;
323
+ }
324
+
325
+ .kui-list-action-row[data-icon-tile][data-density="compact"] {
326
+ --_kui-list-action-row-min-height: 2.625rem;
327
+ }
328
+
329
+ .kui-list-action-row[data-icon-tile] .kui-list-action-row__icon {
330
+ width: var(--_kui-list-action-row-icon-tile-size);
331
+ height: var(--_kui-list-action-row-icon-tile-size);
332
+ border-radius: var(--kui-radius-m, 0.375rem);
333
+ color: var(--_kui-list-action-row-icon-tile-foreground, currentColor);
334
+ background: var(--_kui-list-action-row-icon-tile-fill, transparent);
335
+ box-shadow: inset 0 0 0 1px
336
+ var(--_kui-list-action-row-icon-tile-border, transparent);
337
+ }
338
+
339
+ .kui-list-action-row[data-icon-tile] .kui-list-action-row__icon svg {
340
+ width: 1.125rem;
341
+ height: 1.125rem;
342
+ }
343
+
344
+ .kui-list-action-row[data-has-icon="true"][data-icon-tile]
345
+ .kui-list-action-row__label {
346
+ margin-inline-start: calc(
347
+ var(--_kui-list-action-row-icon-tile-size) +
348
+ var(--kui-layout-item-gap, 0.5rem)
349
+ );
350
+ }
351
+
352
+ /* An application fill defaults its glyph to black or white, whichever
353
+ contrasts with the fill's lightness. */
354
+ .kui-list-action-row[data-icon-tile="color"] .kui-list-action-row__icon {
355
+ color: var(--_kui-list-action-row-icon-tile-foreground, #fff);
356
+ }
357
+
358
+ @supports (color: oklch(from red l c h)) {
359
+ .kui-list-action-row[data-icon-tile="color"] .kui-list-action-row__icon {
360
+ color: var(
361
+ --_kui-list-action-row-icon-tile-foreground,
362
+ oklch(
363
+ from var(--_kui-list-action-row-icon-tile-fill)
364
+ clamp(0, (0.68 - l) * 1000, 1) 0 0
365
+ )
366
+ );
367
+ }
368
+ }
369
+
370
+ .kui-list-action-row[data-icon-tile-tone="neutral"] .kui-list-action-row__icon {
371
+ --_kui-list-action-row-icon-tile-fill: var(--kui-color-neutral-fill-quiet);
372
+ --_kui-list-action-row-icon-tile-border: var(
373
+ --kui-color-neutral-border-quiet
374
+ );
375
+ --_kui-list-action-row-icon-tile-foreground: var(
376
+ --kui-color-neutral-on-quiet
377
+ );
378
+ }
379
+
380
+ .kui-list-action-row[data-icon-tile-tone="brand"] .kui-list-action-row__icon {
381
+ --_kui-list-action-row-icon-tile-fill: var(--kui-color-brand-fill-quiet);
382
+ --_kui-list-action-row-icon-tile-border: var(--kui-color-brand-border-quiet);
383
+ --_kui-list-action-row-icon-tile-foreground: var(--kui-color-brand-on-quiet);
384
+ }
385
+
386
+ .kui-list-action-row[data-icon-tile-tone="success"] .kui-list-action-row__icon {
387
+ --_kui-list-action-row-icon-tile-fill: var(--kui-color-success-fill-quiet);
388
+ --_kui-list-action-row-icon-tile-border: var(
389
+ --kui-color-success-border-quiet
390
+ );
391
+ --_kui-list-action-row-icon-tile-foreground: var(
392
+ --kui-color-success-on-quiet
393
+ );
394
+ }
395
+
396
+ .kui-list-action-row[data-icon-tile-tone="warning"] .kui-list-action-row__icon {
397
+ --_kui-list-action-row-icon-tile-fill: var(--kui-color-warning-fill-quiet);
398
+ --_kui-list-action-row-icon-tile-border: var(
399
+ --kui-color-warning-border-quiet
400
+ );
401
+ --_kui-list-action-row-icon-tile-foreground: var(
402
+ --kui-color-warning-on-quiet
403
+ );
404
+ }
405
+
406
+ .kui-list-action-row[data-icon-tile-tone="danger"] .kui-list-action-row__icon {
407
+ --_kui-list-action-row-icon-tile-fill: var(--kui-color-danger-fill-quiet);
408
+ --_kui-list-action-row-icon-tile-border: var(--kui-color-danger-border-quiet);
409
+ --_kui-list-action-row-icon-tile-foreground: var(--kui-color-danger-on-quiet);
410
+ }
411
+
412
+ /* A loading row shows a tile-sized skeleton in place of the fill. */
413
+ .kui-list-action-row[data-icon-tile][data-placeholder="true"]
414
+ .kui-list-action-row__icon {
415
+ background: transparent;
416
+ box-shadow: none;
417
+ }
418
+
419
+ /* A wrapped label keeps its first line centered on the tile: the tile sits
420
+ 6px below the row's top like a single-line row's, and the label starts
421
+ half the difference between the tile and its line box lower. */
422
+ .kui-list-action-row[data-icon-tile][data-multiline="true"]
423
+ .kui-list-action-row__primary {
424
+ padding-block: 0.375rem;
425
+ }
426
+
427
+ .kui-list-action-row[data-icon-tile][data-multiline="true"]
428
+ .kui-list-action-row__icon {
429
+ inset-block-start: calc(
430
+ 0.375rem + (var(--_kui-list-action-row-icon-tile-size) / 2)
431
+ );
432
+ }
433
+
434
+ .kui-list-action-row[data-icon-tile][data-multiline="true"]
435
+ .kui-list-action-row__label {
436
+ box-sizing: border-box;
437
+ min-height: var(--_kui-list-action-row-icon-tile-size);
438
+ padding-block-start: max(
439
+ 0px,
440
+ (var(--_kui-list-action-row-icon-tile-size) - 1lh) / 2
441
+ );
442
+ }
443
+
294
444
  @media (forced-colors: active) {
445
+ .kui-list-action-row[data-icon-tile] .kui-list-action-row__icon {
446
+ outline: 1px solid CanvasText;
447
+ outline-offset: -1px;
448
+ }
449
+
295
450
  .kui-list-action-row[data-drop-position]::after {
296
451
  background: Highlight;
297
452
  forced-color-adjust: none;
@@ -1,4 +1,12 @@
1
1
  .kui-list-item {
2
+ /* The leading icon size. An inherited `--kui-list-row-icon-size` on the
3
+ containing List sizes ListItem and ListActionRow icons together, so a
4
+ mixed list keeps its labels on one edge; `--kui-list-item-icon-size`
5
+ still wins for ListItem rows that set it. */
6
+ --_kui-list-item-icon-size: var(
7
+ --kui-list-item-icon-size,
8
+ var(--kui-list-row-icon-size, 1.125rem)
9
+ );
2
10
  display: grid;
3
11
  width: calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem)));
4
12
  min-height: var(--kui-list-item-min-height, 2.75rem);
@@ -10,7 +18,10 @@
10
18
  );
11
19
  padding-inline: var(
12
20
  --kui-list-item-padding-inline,
13
- var(--kui-layout-item-padding, 0.5rem)
21
+ var(
22
+ --kui-list-row-padding-inline,
23
+ var(--kui-layout-item-padding, 0.5rem)
24
+ )
14
25
  );
15
26
  box-sizing: border-box;
16
27
  border: var(--kui-list-item-border-width, 1px) solid
@@ -85,7 +96,7 @@
85
96
  .kui-list-item[data-has-icon="true"] {
86
97
  grid-template-columns: var(
87
98
  --kui-list-item-columns,
88
- var(--kui-list-item-icon-size, 1.125rem) minmax(0, 1fr) auto
99
+ var(--_kui-list-item-icon-size) minmax(0, 1fr) auto
89
100
  );
90
101
  }
91
102
 
@@ -109,7 +120,12 @@
109
120
  grid-column: 2;
110
121
  }
111
122
 
112
- .kui-list-item:hover:not([data-placeholder="true"]) {
123
+ /* A selected or current row keeps its selected tint while hovered. */
124
+ .kui-list-item:hover:not(
125
+ [data-placeholder="true"],
126
+ [aria-current="page"],
127
+ [aria-pressed="true"]
128
+ ) {
113
129
  border-color: var(
114
130
  --kui-list-item-hover-border,
115
131
  var(--kui-color-neutral-border-normal)
@@ -160,16 +176,16 @@
160
176
 
161
177
  .kui-list-item__icon {
162
178
  display: grid;
163
- width: var(--kui-list-item-icon-size, 1.125rem);
164
- height: var(--kui-list-item-icon-size, 1.125rem);
179
+ width: var(--_kui-list-item-icon-size);
180
+ height: var(--_kui-list-item-icon-size);
165
181
  color: var(--kui-list-item-icon-color, currentColor);
166
182
  place-items: center;
167
183
  }
168
184
 
169
185
  .kui-list-item__icon svg {
170
186
  display: block;
171
- width: var(--kui-list-item-icon-size, 1.125rem);
172
- height: var(--kui-list-item-icon-size, 1.125rem);
187
+ width: var(--_kui-list-item-icon-size);
188
+ height: var(--_kui-list-item-icon-size);
173
189
  }
174
190
 
175
191
  .kui-list-item__label {
@@ -225,9 +241,7 @@
225
241
 
226
242
  .kui-list-item[data-multiline="true"] .kui-list-item__icon {
227
243
  align-self: start;
228
- margin-block-start: calc(
229
- (1lh - var(--kui-list-item-icon-size, 1.125rem)) / 2
230
- );
244
+ margin-block-start: calc((1lh - var(--_kui-list-item-icon-size)) / 2);
231
245
  }
232
246
 
233
247
  .kui-list-item[data-multiline="true"][data-icon-align="center"]
@@ -275,7 +289,10 @@
275
289
  z-index: 1;
276
290
  inset-inline: var(
277
291
  --kui-list-item-padding-inline,
278
- var(--kui-layout-item-padding, 0.5rem)
292
+ var(
293
+ --kui-list-row-padding-inline,
294
+ var(--kui-layout-item-padding, 0.5rem)
295
+ )
279
296
  );
280
297
  height: var(--kui-list-item-drop-indicator-width, 2px);
281
298
  border-radius: var(--kui-radius-pill);
@@ -312,3 +329,133 @@
312
329
  width: 1rem;
313
330
  height: 1rem;
314
331
  }
332
+
333
+ /* A filled icon tile (`iconTile`): the leading icon sits in a 32px rounded
334
+ tile with an 18px glyph. The tile overhangs the content box by up to 3px
335
+ into the block padding, so a single-line row keeps its density height
336
+ (44px standard, 52px spacious) and a compact row grows only to 42px; the
337
+ tile then sits 6px (5px compact) clear of the row edges, like a
338
+ ListActionRow tile, and rows with descriptions keep their height. The 6px
339
+ radius is concentric with the row's 12px corner at that clearance. */
340
+ .kui-list-item[data-icon-tile] {
341
+ --_kui-list-item-icon-tile-size: 2rem;
342
+ --_kui-list-item-icon-tile-overhang: 0.1875rem;
343
+ }
344
+
345
+ .kui-list-item[data-icon-tile][data-density="compact"] {
346
+ --_kui-list-item-icon-tile-overhang: 0px;
347
+ /* Native buttons take a form-control height, so a compact tile row
348
+ declares its tile-sized minimum rather than relying on content height. */
349
+ min-height: var(--kui-list-item-min-height, 2.625rem);
350
+ }
351
+
352
+ .kui-list-item[data-has-icon="true"][data-icon-tile] {
353
+ grid-template-columns: var(
354
+ --kui-list-item-columns,
355
+ var(--_kui-list-item-icon-tile-size) minmax(0, 1fr) auto
356
+ );
357
+ }
358
+
359
+ .kui-list-item[data-icon-tile] .kui-list-item__icon {
360
+ width: var(--_kui-list-item-icon-tile-size);
361
+ height: var(--_kui-list-item-icon-tile-size);
362
+ margin-block: calc(-1 * var(--_kui-list-item-icon-tile-overhang));
363
+ border-radius: var(--kui-radius-m, 0.375rem);
364
+ color: var(--_kui-list-item-icon-tile-foreground, currentColor);
365
+ background: var(--_kui-list-item-icon-tile-fill, transparent);
366
+ box-shadow: inset 0 0 0 1px
367
+ var(--_kui-list-item-icon-tile-border, transparent);
368
+ }
369
+
370
+ .kui-list-item[data-icon-tile] .kui-list-item__icon svg {
371
+ width: 1.125rem;
372
+ height: 1.125rem;
373
+ }
374
+
375
+ /* An application fill defaults its glyph to black or white, whichever
376
+ contrasts with the fill's lightness. */
377
+ .kui-list-item[data-icon-tile="color"] .kui-list-item__icon {
378
+ color: var(--_kui-list-item-icon-tile-foreground, #fff);
379
+ }
380
+
381
+ @supports (color: oklch(from red l c h)) {
382
+ .kui-list-item[data-icon-tile="color"] .kui-list-item__icon {
383
+ color: var(
384
+ --_kui-list-item-icon-tile-foreground,
385
+ oklch(
386
+ from var(--_kui-list-item-icon-tile-fill) clamp(0, (0.68 - l) * 1000, 1)
387
+ 0 0
388
+ )
389
+ );
390
+ }
391
+ }
392
+
393
+ .kui-list-item[data-icon-tile-tone="neutral"] .kui-list-item__icon {
394
+ --_kui-list-item-icon-tile-fill: var(--kui-color-neutral-fill-quiet);
395
+ --_kui-list-item-icon-tile-border: var(--kui-color-neutral-border-quiet);
396
+ --_kui-list-item-icon-tile-foreground: var(--kui-color-neutral-on-quiet);
397
+ }
398
+
399
+ .kui-list-item[data-icon-tile-tone="brand"] .kui-list-item__icon {
400
+ --_kui-list-item-icon-tile-fill: var(--kui-color-brand-fill-quiet);
401
+ --_kui-list-item-icon-tile-border: var(--kui-color-brand-border-quiet);
402
+ --_kui-list-item-icon-tile-foreground: var(--kui-color-brand-on-quiet);
403
+ }
404
+
405
+ .kui-list-item[data-icon-tile-tone="success"] .kui-list-item__icon {
406
+ --_kui-list-item-icon-tile-fill: var(--kui-color-success-fill-quiet);
407
+ --_kui-list-item-icon-tile-border: var(--kui-color-success-border-quiet);
408
+ --_kui-list-item-icon-tile-foreground: var(--kui-color-success-on-quiet);
409
+ }
410
+
411
+ .kui-list-item[data-icon-tile-tone="warning"] .kui-list-item__icon {
412
+ --_kui-list-item-icon-tile-fill: var(--kui-color-warning-fill-quiet);
413
+ --_kui-list-item-icon-tile-border: var(--kui-color-warning-border-quiet);
414
+ --_kui-list-item-icon-tile-foreground: var(--kui-color-warning-on-quiet);
415
+ }
416
+
417
+ .kui-list-item[data-icon-tile-tone="danger"] .kui-list-item__icon {
418
+ --_kui-list-item-icon-tile-fill: var(--kui-color-danger-fill-quiet);
419
+ --_kui-list-item-icon-tile-border: var(--kui-color-danger-border-quiet);
420
+ --_kui-list-item-icon-tile-foreground: var(--kui-color-danger-on-quiet);
421
+ }
422
+
423
+ /* A loading row shows a tile-sized skeleton in place of the fill. */
424
+ .kui-list-item[data-icon-tile][data-placeholder="true"] .kui-list-item__icon {
425
+ background: transparent;
426
+ box-shadow: none;
427
+ }
428
+
429
+ .kui-list-item[data-icon-tile][data-multiline="true"][data-icon-align="center"]
430
+ .kui-list-item__icon {
431
+ margin-block: calc(-1 * var(--_kui-list-item-icon-tile-overhang));
432
+ }
433
+
434
+ /* A wrapped label keeps its first line centered on the tile: the tile sits
435
+ at the top of the content box (less its overhang) and the label starts
436
+ the rest of the way down, instead of the tile overhanging the row edge. */
437
+ .kui-list-item[data-icon-tile][data-multiline="true"]:not(
438
+ [data-icon-align="center"]
439
+ )
440
+ .kui-list-item__icon {
441
+ margin-block-start: calc(-1 * var(--_kui-list-item-icon-tile-overhang));
442
+ }
443
+
444
+ .kui-list-item[data-icon-tile][data-multiline="true"]:not(
445
+ [data-icon-align="center"]
446
+ )
447
+ .kui-list-item__label {
448
+ align-self: start;
449
+ padding-block-start: max(
450
+ 0px,
451
+ (var(--_kui-list-item-icon-tile-size) - 1lh) / 2 -
452
+ var(--_kui-list-item-icon-tile-overhang)
453
+ );
454
+ }
455
+
456
+ @media (forced-colors: active) {
457
+ .kui-list-item[data-icon-tile] .kui-list-item__icon {
458
+ outline: 1px solid CanvasText;
459
+ outline-offset: -1px;
460
+ }
461
+ }
@@ -1,9 +1,20 @@
1
1
  .kui-anchored-surface {
2
+ /* The room beside the anchor on the side the surface opened, which
3
+ kerfjs/overlay publishes and refreshes on every reposition. Read-only for
4
+ content that sizes an inner scroller to it. */
5
+ --kui-anchored-surface-available-height: var(
6
+ --kerf-anchor-available-height,
7
+ calc(100dvh - 2 * var(--kui-space-xs, 8px))
8
+ );
9
+
2
10
  box-sizing: border-box;
3
11
  inset: auto;
4
12
  width: max-content;
5
13
  max-width: calc(100vw - 2 * var(--kui-space-xs, 8px));
6
- max-height: calc(100dvh - 2 * var(--kui-space-xs, 8px));
14
+ max-height: min(
15
+ calc(100dvh - 2 * var(--kui-space-xs, 8px)),
16
+ var(--kui-anchored-surface-available-height)
17
+ );
7
18
  overflow: auto;
8
19
  padding: var(--kui-anchored-surface-inset, var(--kui-space-xs, 8px));
9
20
  border: 1px solid var(--kui-color-neutral-border-normal);
@@ -13,3 +24,18 @@
13
24
  box-shadow: var(--kui-shadow-l);
14
25
  font: inherit;
15
26
  }
27
+
28
+ /* Dark tone for a popup anchored to dark media chrome: the loud, inverse tone
29
+ of a dark ToolbarControlGroup, so the surface takes the opposite of its
30
+ anchor's color scheme (the script picks the class when it opens). It flips
31
+ only the color scheme: every semantic token is a light-dark() pair, so the
32
+ surface fill, border, shadow, and the content's text, borders, and focus
33
+ rings all resolve to the other side by inheritance. No child is styled from
34
+ here. */
35
+ .kui-anchored-surface--scheme-dark {
36
+ color-scheme: dark;
37
+ }
38
+
39
+ .kui-anchored-surface--scheme-light {
40
+ color-scheme: light;
41
+ }
@@ -73,6 +73,26 @@
73
73
  background: transparent;
74
74
  }
75
75
 
76
+ /* Follows the surrounding foreground, such as the on-loud text of a
77
+ brand-loud ContentItem bubble. It paints no fill: any currentColor wash
78
+ over a loud surface lowers the contrast the surface's own text was tuned
79
+ to, so the chip draws its shape with a currentColor border instead (soft
80
+ for quiet, full strength for outline and solid). */
81
+ .kui-chip[data-tone="inherit"] {
82
+ --_kui-chip-border: color-mix(in srgb, currentColor 40%, transparent);
83
+
84
+ border-color: var(--_kui-chip-border);
85
+ color: inherit;
86
+ background: transparent;
87
+ }
88
+
89
+ .kui-chip[data-tone="inherit"]:is(
90
+ [data-appearance="outline"],
91
+ [data-appearance="solid"]
92
+ ) {
93
+ --_kui-chip-border: currentColor;
94
+ }
95
+
76
96
  .kui-chip[data-shape="rounded"] {
77
97
  border-radius: var(--kui-radius-s);
78
98
  }
@@ -93,6 +113,56 @@
93
113
  overflow: hidden;
94
114
  }
95
115
 
116
+ /* Link chip: a native anchor with the same geometry. Hover and press layer a
117
+ currentColor wash over whichever fill the appearance paints; an inherit
118
+ chip instead strengthens its border and underlines its label, so the
119
+ surrounding text contrast holds in every state. */
120
+ .kui-chip[data-link] {
121
+ --_kui-chip-wash: transparent;
122
+
123
+ background-image: linear-gradient(
124
+ var(--_kui-chip-wash),
125
+ var(--_kui-chip-wash)
126
+ );
127
+ text-decoration: none;
128
+ cursor: pointer;
129
+ }
130
+
131
+ .kui-chip[data-link]:hover {
132
+ --_kui-chip-wash: color-mix(in srgb, currentColor 10%, transparent);
133
+ }
134
+
135
+ .kui-chip[data-link]:active {
136
+ --_kui-chip-wash: color-mix(in srgb, currentColor 18%, transparent);
137
+ }
138
+
139
+ .kui-chip[data-link][data-tone="inherit"]:is(:hover, :active) {
140
+ --_kui-chip-wash: transparent;
141
+ --_kui-chip-border: currentColor;
142
+ }
143
+
144
+ /* The label clips for its ellipsis; a little block room keeps the hover
145
+ underline inside that clip without changing the chip's height. */
146
+ .kui-chip[data-link] .kui-chip__label {
147
+ padding-block: 0.2em;
148
+ }
149
+
150
+ .kui-chip[data-link][data-tone="inherit"]:is(:hover, :active) .kui-chip__label {
151
+ text-decoration: underline;
152
+ text-underline-offset: 0.12em;
153
+ }
154
+
155
+ .kui-chip[data-link]:focus-visible {
156
+ outline: var(--kui-focus-ring);
157
+ outline-offset: 2px;
158
+ }
159
+
160
+ /* The brand focus color can match a brand-loud surface; an inherit chip's
161
+ ring follows the surrounding foreground instead. */
162
+ .kui-chip[data-link][data-tone="inherit"]:focus-visible {
163
+ outline: 3px solid currentColor;
164
+ }
165
+
96
166
  .kui-chip__icon {
97
167
  display: inline-grid;
98
168
  width: 1em;