@kerfjs/ui 5.0.0-beta.97 → 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 (416) 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 +504 -80
  47. package/ai/skill.md +41 -14
  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 +39 -8
  59. package/dist/catalog.js +55 -32
  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-AYHC62OZ.js → chunk-CMETHPKR.js} +26 -29
  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-BU23Z5HZ.js → chunk-PYBBYSZ3.js} +13 -18
  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-BvSKY448.d.ts → nav-stack-VXTumzKa.d.ts} +53 -4
  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-register.js +11 -0
  189. package/dist/select-register.js.map +1 -1
  190. package/dist/select.js +1 -1
  191. package/dist/skeleton.js +1 -1
  192. package/dist/spacer.js +1 -1
  193. package/dist/split-button.js +1 -1
  194. package/dist/split-view.d.ts +7 -5
  195. package/dist/split-view.js +6 -3
  196. package/dist/split-view.js.map +1 -1
  197. package/dist/state-banner.d.ts +6 -1
  198. package/dist/state-banner.js +1 -1
  199. package/dist/styles/anchored-surface.css +27 -1
  200. package/dist/styles/catalog/components/catalog-example-stack.css +5 -0
  201. package/dist/styles/catalog/components/catalog-example.css +33 -0
  202. package/dist/styles/catalog/components/catalog-stage.css +7 -0
  203. package/dist/styles/chip.css +70 -0
  204. package/dist/styles/components/actions/popup-menu/popup-menu.css +21 -4
  205. package/dist/styles/components/actions/toolbar/toolbar.css +19 -0
  206. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +75 -1
  207. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +75 -0
  208. package/dist/styles/components/collections/list/list.css +77 -7
  209. package/dist/styles/components/collections/list-action-row/list-action-row.css +177 -22
  210. package/dist/styles/components/collections/list-item/list-item.css +158 -11
  211. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +27 -1
  212. package/dist/styles/components/feedback/chip/chip.css +70 -0
  213. package/dist/styles/components/feedback/state-banner/state-banner.css +24 -13
  214. package/dist/styles/components/forms/composer/composer.css +100 -0
  215. package/dist/styles/components/forms/select/select.css +1 -0
  216. package/dist/styles/components/forms/token-search-field/token-search-field.css +13 -2
  217. package/dist/styles/components/layout/pane/pane.css +81 -2
  218. package/dist/styles/components/navigation/nav-stack/nav-stack.css +84 -0
  219. package/dist/styles/components/navigation/tab-bar/tab-bar.css +15 -4
  220. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +79 -4
  221. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +195 -0
  222. package/dist/styles/composer.css +100 -0
  223. package/dist/styles/foundation.css +66 -0
  224. package/dist/styles/list-action-row.css +177 -22
  225. package/dist/styles/list-item.css +158 -11
  226. package/dist/styles/list.css +77 -7
  227. package/dist/styles/nav-stack.css +84 -0
  228. package/dist/styles/pane.css +81 -2
  229. package/dist/styles/popup-menu.css +21 -4
  230. package/dist/styles/select.css +1 -0
  231. package/dist/styles/state-banner.css +24 -13
  232. package/dist/styles/styles.css +1 -0
  233. package/dist/styles/surface-scaffold.css +195 -0
  234. package/dist/styles/tab-bar.css +15 -4
  235. package/dist/styles/tab-navigator.css +79 -4
  236. package/dist/styles/token-search-field.css +13 -2
  237. package/dist/styles/toolbar-control-group.css +75 -1
  238. package/dist/styles/toolbar-text.css +75 -0
  239. package/dist/styles/toolbar.css +19 -0
  240. package/dist/styles/webawesome.css +18 -0
  241. package/dist/surface-scaffold-register.d.ts +6 -1
  242. package/dist/surface-scaffold-register.js +89 -3
  243. package/dist/surface-scaffold-register.js.map +1 -1
  244. package/dist/surface-scaffold.d.ts +66 -7
  245. package/dist/surface-scaffold.js +1 -1
  246. package/dist/tab-navigator.d.ts +23 -2
  247. package/dist/tab-navigator.js +2 -0
  248. package/dist/tab-navigator.js.map +1 -1
  249. package/dist/token-search-field.d.ts +1 -1
  250. package/dist/token-search-field.js +1 -1
  251. package/dist/{token-search-model-DTcTXWMS.d.ts → token-search-model-aYR0YAei.d.ts} +32 -2
  252. package/dist/token-search-model.d.ts +1 -1
  253. package/dist/toolbar-control-group.js +1 -1
  254. package/dist/toolbar-text.js +1 -1
  255. package/dist/toolbar.d.ts +1 -0
  256. package/dist/value-table.js +1 -1
  257. package/dist/wire-catalog.d.ts +3 -2
  258. package/dist/wire-catalog.js +2 -2
  259. package/dist/wire-composers.d.ts +16 -0
  260. package/dist/wire-composers.js +3 -0
  261. package/dist/wire-composers.js.map +1 -0
  262. package/dist/wire-list-focus-scroll.d.ts +16 -0
  263. package/dist/wire-list-focus-scroll.js +3 -0
  264. package/dist/wire-list-focus-scroll.js.map +1 -0
  265. package/dist/wire-nav-stack.js +135 -0
  266. package/dist/wire-nav-stack.js.map +1 -1
  267. package/dist/wire-scroll-dividers.d.ts +9 -0
  268. package/dist/wire-scroll-dividers.js +1 -1
  269. package/dist/wire-tab-bars.js +1 -1
  270. package/dist/wire-tab-navigator.d.ts +3 -1
  271. package/dist/wire-tab-navigator.js +133 -1
  272. package/dist/wire-tab-navigator.js.map +1 -1
  273. package/dist/wire-token-search-fields.d.ts +1 -1
  274. package/dist/wire-token-search-fields.js +1 -1
  275. package/dist/workbench.d.ts +8 -3
  276. package/dist/workbench.js +2 -1
  277. package/docs/accessibility.md +132 -3
  278. package/docs/anchored-surface.md +46 -4
  279. package/docs/app-layouts.md +23 -2
  280. package/docs/apple-hig.md +1 -0
  281. package/docs/catalog.md +61 -9
  282. package/docs/collapsible-panel.md +9 -6
  283. package/docs/component-contract.md +46 -13
  284. package/docs/component-selection.md +147 -20
  285. package/docs/composer.md +143 -0
  286. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
  287. package/docs/design/templates/choice-chips/multiple.svg +1 -0
  288. package/docs/design/templates/choice-chips-dark.svg +1 -1
  289. package/docs/design/templates/choice-chips.svg +1 -1
  290. package/docs/design/templates/composer/chat-dark.svg +1 -0
  291. package/docs/design/templates/composer/chat.svg +1 -0
  292. package/docs/design/templates/composer/prompt-dark.svg +1 -0
  293. package/docs/design/templates/composer/prompt.svg +1 -0
  294. package/docs/design/templates/composer-dark.svg +1 -0
  295. package/docs/design/templates/composer.svg +1 -0
  296. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  297. package/docs/design/templates/empty-state/filtered.svg +1 -1
  298. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  299. package/docs/design/templates/empty-state/with-action.svg +1 -1
  300. package/docs/design/templates/empty-state-dark.svg +1 -1
  301. package/docs/design/templates/empty-state.svg +1 -1
  302. package/docs/design/templates/list/compact-dark.svg +1 -1
  303. package/docs/design/templates/list/compact.svg +1 -1
  304. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  305. package/docs/design/templates/list-action-row/default.svg +1 -1
  306. package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
  307. package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
  308. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  309. package/docs/design/templates/list-action-row/selected.svg +1 -1
  310. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -1
  311. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -1
  312. package/docs/design/templates/list-action-row-dark.svg +1 -1
  313. package/docs/design/templates/list-action-row.svg +1 -1
  314. package/docs/design/templates/list-dark.svg +1 -1
  315. package/docs/design/templates/list-header/size-l-dark.svg +1 -1
  316. package/docs/design/templates/list-header/size-l.svg +1 -1
  317. package/docs/design/templates/list-header/size-m-dark.svg +1 -1
  318. package/docs/design/templates/list-header/size-m.svg +1 -1
  319. package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
  320. package/docs/design/templates/list-header/size-xl.svg +1 -1
  321. package/docs/design/templates/list-header-dark.svg +1 -1
  322. package/docs/design/templates/list-header.svg +1 -1
  323. package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
  324. package/docs/design/templates/list-item/icon-tile.svg +1 -0
  325. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  326. package/docs/design/templates/list-item/selected.svg +1 -1
  327. package/docs/design/templates/list-item-dark.svg +1 -1
  328. package/docs/design/templates/list-item.svg +1 -1
  329. package/docs/design/templates/list.svg +1 -1
  330. package/docs/design/templates/segmented-control-dark.svg +1 -1
  331. package/docs/design/templates/segmented-control.svg +1 -1
  332. package/docs/design/templates/skeleton-dark.svg +1 -1
  333. package/docs/design/templates/skeleton.svg +1 -1
  334. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  335. package/docs/design/templates/state-banner/danger.svg +1 -1
  336. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
  337. package/docs/design/templates/state-banner/info-badge.svg +1 -1
  338. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  339. package/docs/design/templates/state-banner/info.svg +1 -1
  340. package/docs/design/templates/state-banner/strip-dark.svg +1 -1
  341. package/docs/design/templates/state-banner/strip.svg +1 -1
  342. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  343. package/docs/design/templates/state-banner/success.svg +1 -1
  344. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  345. package/docs/design/templates/state-banner/warning.svg +1 -1
  346. package/docs/design/templates/state-banner-dark.svg +1 -1
  347. package/docs/design/templates/state-banner.svg +1 -1
  348. package/docs/design/templates/tab-bar-dark.svg +1 -1
  349. package/docs/design/templates/tab-bar.svg +1 -1
  350. package/docs/design/templates/token-search-field-dark.svg +1 -1
  351. package/docs/design/templates/token-search-field.svg +1 -1
  352. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  353. package/docs/design/templates/toolbar-control-group.svg +1 -1
  354. package/docs/design/templates/toolbar-dark.svg +1 -1
  355. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  356. package/docs/design/templates/toolbar-text/default.svg +1 -1
  357. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  358. package/docs/design/templates/toolbar-text/large.svg +1 -1
  359. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  360. package/docs/design/templates/toolbar-text.svg +1 -1
  361. package/docs/design/templates/toolbar.svg +1 -1
  362. package/docs/design/templates/value-table/details-dark.svg +1 -1
  363. package/docs/design/templates/value-table/details.svg +1 -1
  364. package/docs/design/templates/value-table-dark.svg +1 -1
  365. package/docs/design/templates/value-table.svg +1 -1
  366. package/docs/design-philosophy.md +9 -1
  367. package/docs/examples/command-palette-adapter.tsx +3 -3
  368. package/docs/layout.md +147 -14
  369. package/docs/nav-stack.md +132 -8
  370. package/docs/recipes.md +9 -9
  371. package/docs/split-view.md +3 -3
  372. package/docs/sunken-panel.md +2 -2
  373. package/docs/surface-scaffold.md +138 -7
  374. package/docs/tab-navigator.md +38 -1
  375. package/docs/type-contracts.md +16 -16
  376. package/docs/ui-analyzer.md +3 -1
  377. package/docs/ui-doctor.md +71 -0
  378. package/docs/ux-demo.md +6 -6
  379. package/docs/webawesome-theme.md +7 -0
  380. package/docs/workbench.md +10 -6
  381. package/docs/writing.md +152 -0
  382. package/doctor/copy-capitalization-checks.mjs +591 -0
  383. package/doctor/index.mjs +17 -8
  384. package/llms.txt +105 -11
  385. package/package.json +15 -1
  386. package/ux-demo/recipes/app-shell.tsx +11 -11
  387. package/ux-demo/recipes/collapsible-sidebar.tsx +12 -11
  388. package/ux-demo/recipes/compact-toolbar.tsx +10 -10
  389. package/ux-demo/recipes/composer-form.tsx +8 -8
  390. package/ux-demo/recipes/list-detail-dialog.tsx +13 -13
  391. package/ux-demo/recipes/list-workspace-states.tsx +13 -13
  392. package/ux-demo/recipes/loading-inspector.tsx +10 -10
  393. package/ux-demo/recipes/navigation-sidebar.tsx +7 -7
  394. package/ux-demo/recipes/navigation-stack.tsx +5 -5
  395. package/ux-demo/recipes/workspace-header.tsx +5 -5
  396. package/dist/chunk-36TL6BCR.js.map +0 -1
  397. package/dist/chunk-4LOK4634.js +0 -21
  398. package/dist/chunk-4LOK4634.js.map +0 -1
  399. package/dist/chunk-6BRRUPJY.js.map +0 -1
  400. package/dist/chunk-6STQXRT4.js.map +0 -1
  401. package/dist/chunk-76PWEN5Y.js +0 -64
  402. package/dist/chunk-76PWEN5Y.js.map +0 -1
  403. package/dist/chunk-AYHC62OZ.js.map +0 -1
  404. package/dist/chunk-BU23Z5HZ.js.map +0 -1
  405. package/dist/chunk-DQDTZE4W.js +0 -70
  406. package/dist/chunk-DQDTZE4W.js.map +0 -1
  407. package/dist/chunk-FOQK4F3L.js.map +0 -1
  408. package/dist/chunk-GJYQ27C2.js.map +0 -1
  409. package/dist/chunk-JYD7G4RG.js.map +0 -1
  410. package/dist/chunk-KQDU7Z7P.js.map +0 -1
  411. package/dist/chunk-P74VXMB6.js.map +0 -1
  412. package/dist/chunk-PBT3CPPY.js.map +0 -1
  413. package/dist/chunk-PRG4CL3Q.js.map +0 -1
  414. package/dist/chunk-ROZLJULF.js.map +0 -1
  415. package/dist/chunk-U657IHFB.js.map +0 -1
  416. package/dist/chunk-V6W56V3N.js.map +0 -1
@@ -139,9 +139,12 @@
139
139
  );
140
140
  --kui-toolbar-control-border: var(--kui-toolbar-control-dark-border, #353536);
141
141
  --kui-toolbar-control-color: var(--kui-color-neutral-on-loud);
142
+ /* A 14% surface wash over the loud fill: visible hover feedback that keeps
143
+ the on-loud icon above 3:1 over a light page (about 3.4:1; a 28% wash
144
+ measured 2.7:1) and well above it in dark (about 5.8:1). */
142
145
  --kui-toolbar-control-hover-background: color-mix(
143
146
  in srgb,
144
- var(--kui-color-surface) 28%,
147
+ var(--kui-color-surface) 14%,
145
148
  transparent
146
149
  );
147
150
  }
@@ -384,6 +387,39 @@
384
387
  background: transparent;
385
388
  }
386
389
 
390
+ /* In overlay NavStack chrome (`chromePresentation="overlay"`), an overlay
391
+ NavStack bottom toolbar (`bottomToolbarPresentation="overlay"`), cross-fading
392
+ copies included, an overlay Pane header (`headerPresentation="overlay"`), or
393
+ a DialogSurface floating header's actions (`headerPresentation="floating"`),
394
+ the group sits on the translucent chrome material with arbitrary content
395
+ scrolling beneath it. Its quiet control color over its own translucent fill
396
+ falls below AA there over the worst-case backdrop (about 3.0:1 in light
397
+ over black, 3.5:1 in dark over white), so an untoned group's controls take
398
+ the normal text color (well above 4.5:1 in both), as an untoned
399
+ ToolbarText's title does. A dark-toned group (or an avatar scrim) keeps its
400
+ own loud colors. */
401
+ .kui-pane[data-header-presentation="overlay"]
402
+ > .kui-pane__header
403
+ .kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]),
404
+ .kui-dialog-surface[data-header-presentation="floating"]
405
+ > wa-dialog
406
+ > .kui-toolbar-control-group[slot="header-actions"]:not(
407
+ [data-tone="dark"],
408
+ [data-scrim="true"]
409
+ ),
410
+ .kui-dialog-surface[data-header-presentation="floating"]
411
+ > wa-dialog
412
+ > [slot="header-actions"]
413
+ .kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]),
414
+ .kui-nav-stack[data-chrome-presentation="overlay"]
415
+ > .kui-nav-stack__chrome
416
+ .kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]),
417
+ .kui-nav-stack[data-bottom-toolbar-presentation="overlay"]
418
+ > .kui-nav-stack__bottom
419
+ .kui-toolbar-control-group:not([data-tone="dark"], [data-scrim="true"]) {
420
+ --kui-toolbar-control-color: var(--kui-color-text);
421
+ }
422
+
387
423
  /* `selectedChrome="none"`: a pressed control paints like its unpressed
388
424
  neighbors, for an icon-state toggle whose glyph already shows the state.
389
425
  One button opts out alone with `data-selected-chrome="none"`. After the
@@ -732,6 +768,44 @@
732
768
  background: transparent;
733
769
  }
734
770
 
771
+ /* A lone control's hover replaces the whole group's fill (above). A dark
772
+ group's hover tint is a translucent surface wash meant to lie OVER its loud
773
+ fill, as it does on one control of a dark group; replacing the fill with it
774
+ left a near-white circle behind the dark tone's white icon on a light page
775
+ (about 1.3:1). So a dark lone group keeps its fill and paints the tint over
776
+ it as an image layer. Avatar groups paint their image as the background and
777
+ keep the plain rule. */
778
+ .kui-toolbar-control-group[data-tone="dark"][data-single="true"]:not(
779
+ [data-content="avatar"]
780
+ ):has(
781
+ > :is(
782
+ button:not(:disabled, [aria-disabled="true"]),
783
+ wa-button:not([disabled]),
784
+ .kui-popup-menu,
785
+ wa-dropdown:not(.kui-popup-menu),
786
+ .kui-select,
787
+ .kui-toolbar-action-link
788
+ )
789
+ ):hover,
790
+ .kui-toolbar-control-group[data-tone="dark"]:not(
791
+ [data-single="true"],
792
+ [data-content="avatar"]
793
+ ):has(
794
+ > :is(
795
+ button:not(:disabled, [aria-disabled="true"]),
796
+ wa-button:not([disabled]),
797
+ .kui-select,
798
+ .kui-toolbar-action-link
799
+ ):nth-child(1 of :where(:not([data-toolbar-visibility-state]))):where(
800
+ :nth-last-child(1 of :not([data-toolbar-visibility-state]))
801
+ )
802
+ ):hover {
803
+ background-color: var(--kui-toolbar-control-background);
804
+ background-image: linear-gradient(
805
+ var(--kui-toolbar-control-hover-background) 0 0
806
+ );
807
+ }
808
+
735
809
  /* A toolbar Select beside other controls highlights its own pill on hover
736
810
  (select.css); a lone Select instead lifts the whole group (above). */
737
811
 
@@ -129,6 +129,81 @@ button.kui-toolbar-text:focus-visible {
129
129
  font-size: var(--kui-font-2xs);
130
130
  }
131
131
 
132
+ /* A lone title in a balanced center is a navigation bar's title (a NavStack
133
+ view beside its back control): it keeps the page-title color it had leading
134
+ at the root, at whatever size, so the title does not dim as it centers. */
135
+ .kui-toolbar[data-center-align="balanced"]
136
+ > .kui-toolbar__center
137
+ > .kui-toolbar-text:only-child:not([data-tone]) {
138
+ color: var(--kui-color-text);
139
+ }
140
+
141
+ /* In an overlay Pane header (`headerPresentation="overlay"`), overlay
142
+ NavStack chrome (`chromePresentation="overlay"`), or an overlay NavStack
143
+ bottom toolbar (`bottomToolbarPresentation="overlay"`), cross-fading
144
+ copies included, the title sits on the translucent chrome material with
145
+ arbitrary content scrolling beneath it. Quiet colors fall below AA there
146
+ over the worst-case backdrop (the material over black in light, white in
147
+ dark): the default title color
148
+ measures about 3.8:1 (light) and the description about 3.2:1 (light) and
149
+ 4.1:1 (dark). The title takes the normal text color (about 10.5:1 and
150
+ 8.3:1), and the description lifts halfway toward it (about 5.9:1 in both
151
+ themes), so it still reads as secondary but keeps AA. A ToolbarText in a
152
+ DialogSurface floating header (`headerPresentation="floating"`), slotted
153
+ as the dialog's label or into its header actions, sits on the raised chrome
154
+ material and takes the same lift. See docs/accessibility.md "Chrome
155
+ material". */
156
+ .kui-pane[data-header-presentation="overlay"]
157
+ > .kui-pane__header
158
+ .kui-toolbar-text:not([data-tone]),
159
+ .kui-dialog-surface[data-header-presentation="floating"]
160
+ > wa-dialog
161
+ > .kui-toolbar-text:is([slot="label"], [slot="header-actions"]):not(
162
+ [data-tone]
163
+ ),
164
+ .kui-dialog-surface[data-header-presentation="floating"]
165
+ > wa-dialog
166
+ > :is([slot="label"], [slot="header-actions"])
167
+ .kui-toolbar-text:not([data-tone]),
168
+ .kui-nav-stack[data-chrome-presentation="overlay"]
169
+ > .kui-nav-stack__chrome
170
+ .kui-toolbar-text:not([data-tone]),
171
+ .kui-nav-stack[data-bottom-toolbar-presentation="overlay"]
172
+ > .kui-nav-stack__bottom
173
+ .kui-toolbar-text:not([data-tone]) {
174
+ color: var(--kui-color-text);
175
+ }
176
+
177
+ .kui-pane[data-header-presentation="overlay"]
178
+ > .kui-pane__header
179
+ .kui-toolbar-text:not([data-tone])
180
+ .kui-toolbar-text__description,
181
+ .kui-dialog-surface[data-header-presentation="floating"]
182
+ > wa-dialog
183
+ > .kui-toolbar-text:is([slot="label"], [slot="header-actions"]):not(
184
+ [data-tone]
185
+ )
186
+ .kui-toolbar-text__description,
187
+ .kui-dialog-surface[data-header-presentation="floating"]
188
+ > wa-dialog
189
+ > :is([slot="label"], [slot="header-actions"])
190
+ .kui-toolbar-text:not([data-tone])
191
+ .kui-toolbar-text__description,
192
+ .kui-nav-stack[data-chrome-presentation="overlay"]
193
+ > .kui-nav-stack__chrome
194
+ .kui-toolbar-text:not([data-tone])
195
+ .kui-toolbar-text__description,
196
+ .kui-nav-stack[data-bottom-toolbar-presentation="overlay"]
197
+ > .kui-nav-stack__bottom
198
+ .kui-toolbar-text:not([data-tone])
199
+ .kui-toolbar-text__description {
200
+ color: color-mix(
201
+ in srgb,
202
+ var(--kui-color-text-quiet),
203
+ var(--kui-color-text) 50%
204
+ );
205
+ }
206
+
132
207
  .kui-toolbar-text[data-tone="dark"] {
133
208
  color: var(--kui-color-neutral-on-loud);
134
209
  }
@@ -8,10 +8,15 @@
8
8
  --_kui-list-column-gap: var(--_kui-list-gap);
9
9
  --_kui-list-row-gap: var(--_kui-list-gap);
10
10
  --_kui-list-flex: 0 1 auto;
11
- --_kui-list-inset-top: 0;
12
- --_kui-list-inset-right: 0;
13
- --_kui-list-inset-bottom: 0;
14
- --_kui-list-inset-left: 0;
11
+ --_kui-list-inset-top: 0px;
12
+ --_kui-list-inset-right: 0px;
13
+ --_kui-list-inset-bottom: 0px;
14
+ --_kui-list-inset-left: 0px;
15
+ --_kui-list-clearance-start: 0px;
16
+ --_kui-list-clearance-end: 0px;
17
+ --_kui-list-ring-room: 0px;
18
+ --_kui-list-max-height: none;
19
+ --_kui-list-min-height: 0px;
15
20
  --_kui-list-divider-top: transparent;
16
21
  --_kui-list-divider-right: transparent;
17
22
  --_kui-list-divider-bottom: transparent;
@@ -19,10 +24,15 @@
19
24
 
20
25
  display: flex;
21
26
  min-width: 0;
22
- min-height: 0;
27
+ min-height: var(--_kui-list-min-height);
28
+ max-height: var(--_kui-list-max-height);
23
29
  box-sizing: border-box;
24
- padding: var(--_kui-list-inset-top, 0) var(--_kui-list-inset-right, 0)
25
- var(--_kui-list-inset-bottom, 0) var(--_kui-list-inset-left, 0);
30
+ padding: calc(
31
+ var(--_kui-list-inset-top, 0px) + var(--_kui-list-clearance-start)
32
+ )
33
+ var(--_kui-list-inset-right, 0)
34
+ calc(var(--_kui-list-inset-bottom, 0px) + var(--_kui-list-clearance-end))
35
+ var(--_kui-list-inset-left, 0);
26
36
  flex: var(--_kui-list-flex, initial);
27
37
  flex-direction: column;
28
38
  align-items: stretch;
@@ -97,6 +107,21 @@
97
107
  }
98
108
  }
99
109
 
110
+ /* `frame`: a bordered, rounded stack (a result picker). Its 4px inset on
111
+ every side replaces any side-selected or document inset, and is exactly
112
+ the reach of a row's focus ring (3px ring, 1px offset), so the first and
113
+ last rows' rings stay inside a scrolling frame's clip at the scroll
114
+ extremes. (The ring-room scroll padding every scrollable List carries
115
+ handles a row stopped mid-scroll.) */
116
+ .kui-list[data-frame="true"] {
117
+ --_kui-list-inset-top: var(--kui-space-2xs);
118
+ --_kui-list-inset-right: var(--kui-space-2xs);
119
+ --_kui-list-inset-bottom: var(--kui-space-2xs);
120
+ --_kui-list-inset-left: var(--kui-space-2xs);
121
+ border: 1px solid var(--kui-color-neutral-border-normal);
122
+ border-radius: var(--kui-radius-m);
123
+ }
124
+
100
125
  .kui-list[data-h-align="left"] {
101
126
  align-items: flex-start;
102
127
  align-content: flex-start;
@@ -124,11 +149,56 @@
124
149
  justify-content: space-between;
125
150
  }
126
151
 
152
+ /* A scrollable List's scroll padding is a row's focus-ring reach (3px ring,
153
+ 1px offset) plus 2px of slack, so a row focused or scrolled into view stops
154
+ with its ring inside the clip rather than flush against it: Chromium's
155
+ focus scroll stops 1px short of the padded target, and a row's fractional
156
+ position can cost another 0.3px. Scroll padding moves nothing at rest; at
157
+ the scroll extremes an unframed List's first and last rows still meet the
158
+ clip, which is what `frame`'s 4px inset is for. */
127
159
  .kui-list[data-scrollable="true"] {
160
+ --_kui-list-ring-room: calc(var(--kui-space-2xs) + 2px);
128
161
  overflow-y: auto;
129
162
  overscroll-behavior-y: contain;
130
163
  }
131
164
 
165
+ /* `scrollClearance`: chrome lying over the List's block edge (a dialog's
166
+ floating footer) publishes how far it covers that edge through the
167
+ inherited `--kui-scroll-clearance-block-*` context. The List adds it to its
168
+ own block padding and scroll padding, so rows scroll visibly beneath the
169
+ chrome while the first and last rows, and anything focused or scrolled into
170
+ view, still come to rest clear of it. */
171
+ .kui-list:is(
172
+ [data-scroll-clearance="block-start"],
173
+ [data-scroll-clearance="both"]
174
+ ) {
175
+ --_kui-list-clearance-start: var(--kui-scroll-clearance-block-start, 0px);
176
+ }
177
+
178
+ .kui-list:is(
179
+ [data-scroll-clearance="block-end"],
180
+ [data-scroll-clearance="both"]
181
+ ) {
182
+ --_kui-list-clearance-end: var(--kui-scroll-clearance-block-end, 0px);
183
+ }
184
+
185
+ .kui-list:is([data-scroll-clearance], [data-scrollable="true"]) {
186
+ scroll-padding-block: calc(
187
+ var(--_kui-list-clearance-start) + var(--_kui-list-ring-room)
188
+ )
189
+ calc(var(--_kui-list-clearance-end) + var(--_kui-list-ring-room));
190
+ }
191
+
192
+ /* In a Pane's scrolling content, a List that does not scroll itself keeps
193
+ its full height rather than shrinking to the content box. A shrunken List
194
+ lets its rows overflow its own box, and the scroller's block-end padding
195
+ (a bottom safe area, an overlay NavStack bottom toolbar's clearance)
196
+ follows the List's box, not those rows, so the last row could never
197
+ scroll clear of the edge. A `flex` basis still grows the List to fill. */
198
+ .kui-pane > .kui-pane__content > .kui-list:not([data-scrollable="true"]) {
199
+ flex-shrink: 0;
200
+ }
201
+
132
202
  /* A scrollable List owns the overflow, so its rows keep their natural height
133
203
  and scroll rather than shrink. Items that clip their own overflow (a
134
204
  ListItem) have a zero automatic minimum height, so the default
@@ -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;