@slotted/react 0.1.0-beta.10 → 0.1.0-beta.11

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 (336) hide show
  1. package/dist/action-bar-z2DPc1Wy.js +285 -0
  2. package/dist/action-bar.js +1 -1
  3. package/dist/action-sheet-BnedGewu.js +360 -0
  4. package/dist/action-sheet.js +1 -1
  5. package/dist/{alert-BTcqbG8w.js → alert-BTAXJ69M.js} +5 -5
  6. package/dist/alert.js +1 -1
  7. package/dist/{app-shell-BlkqQrOx.js → app-shell-Cb_kDBeV.js} +232 -173
  8. package/dist/app-shell.js +1 -1
  9. package/dist/{attachment-zlOPJvIm.js → attachment-D1O4qS8H.js} +28 -28
  10. package/dist/attachment.js +1 -1
  11. package/dist/{breadcrumb-DCGynpkb.js → breadcrumb-CnFjxxI2.js} +10 -10
  12. package/dist/breadcrumb.js +1 -1
  13. package/dist/{button-BCVjdzkn.js → button-D31perSu.js} +2 -2
  14. package/dist/button.js +2 -2
  15. package/dist/{calendar-qGUJ-kAy.js → calendar-DZyC1gAT.js} +8 -8
  16. package/dist/calendar.js +1 -1
  17. package/dist/{carousel-CjRTu8m7.js → carousel-Dso3gcYd.js} +14 -14
  18. package/dist/carousel.js +1 -1
  19. package/dist/cascader-BbajBwsX.js +1157 -0
  20. package/dist/cascader.js +1 -1
  21. package/dist/{chart-CPFq3jIE.js → chart-Bb6ctahn.js} +9 -9
  22. package/dist/chart.js +1 -1
  23. package/dist/{checkbox-CMY2KIih.js → checkbox-C_8GVtjD.js} +3 -3
  24. package/dist/{checkbox-group-DzMtLF7f.js → checkbox-group-DXCcusol.js} +2 -2
  25. package/dist/checkbox-group.js +1 -1
  26. package/dist/checkbox.js +1 -1
  27. package/dist/{code-block-Bh_2Eg3M.js → code-block-C4mtsROE.js} +8 -8
  28. package/dist/code-block.js +1 -1
  29. package/dist/{color-picker-DlepH5co.js → color-picker-JZPnPb7s.js} +49 -49
  30. package/dist/color-picker.js +1 -1
  31. package/dist/{column-manager-CV9tCnKa.js → column-manager-BDUj-WIs.js} +31 -31
  32. package/dist/column-manager.js +1 -1
  33. package/dist/combobox-Dn69QwGX.js +904 -0
  34. package/dist/combobox.js +1 -1
  35. package/dist/command-palette-Dh1HKz_F.js +744 -0
  36. package/dist/command-palette.js +1 -1
  37. package/dist/{context-menu-Dbc0KkFp.js → context-menu-uJjEmAN3.js} +1 -1
  38. package/dist/context-menu.js +1 -1
  39. package/dist/{currency-field--wIfgVAx.js → currency-field-lHcrNJ7X.js} +13 -13
  40. package/dist/currency-field.js +1 -1
  41. package/dist/{dashboard-grid-D_LbWfdZ.js → dashboard-grid-z-SOm9H0.js} +65 -65
  42. package/dist/dashboard-grid.js +1 -1
  43. package/dist/{data-grid-XH5fGoGj.js → data-grid-DQCvXMJA.js} +1330 -1278
  44. package/dist/data-grid.js +1 -1
  45. package/dist/data-list-BgdkA3bD.js +587 -0
  46. package/dist/data-list.js +1 -1
  47. package/dist/{date-field-BrNyJBiJ.js → date-field-B2lQzE3p.js} +5 -5
  48. package/dist/date-field.js +1 -1
  49. package/dist/{date-picker-Nl55so0C.js → date-picker-DpTRb-Y1.js} +16 -16
  50. package/dist/date-picker.js +1 -1
  51. package/dist/{date-range-picker-DLkvfUJD.js → date-range-picker-CBUPJep5.js} +17 -17
  52. package/dist/date-range-picker.js +1 -1
  53. package/dist/{datetime-field-CZRhRDPb.js → datetime-field-BZ44uJ_B.js} +7 -7
  54. package/dist/datetime-field.js +1 -1
  55. package/dist/{datetime-picker-_GHra2WL.js → datetime-picker-BK_bV3Yr.js} +21 -21
  56. package/dist/datetime-picker.js +1 -1
  57. package/dist/{datetime-range-picker-Dy1A0Wqy.js → datetime-range-picker-ChdbRgzQ.js} +21 -21
  58. package/dist/datetime-range-picker.js +1 -1
  59. package/dist/{description-list-Cc4JYZ-3.js → description-list-CYlfHDwx.js} +11 -11
  60. package/dist/description-list.js +1 -1
  61. package/dist/{detail-panel-BI_wHSoz.js → detail-panel-DimjnPI8.js} +91 -91
  62. package/dist/detail-panel.js +1 -1
  63. package/dist/{dialog-B6MP7GYI.js → dialog-BB5MdJex.js} +108 -108
  64. package/dist/dialog.js +1 -1
  65. package/dist/docs/action-bar.json +4 -4
  66. package/dist/docs/action-bar.md +3 -3
  67. package/dist/docs/calendar.md +2 -2
  68. package/dist/docs/command-palette.json +1 -0
  69. package/dist/docs/command-palette.md +1 -1
  70. package/dist/docs/data-grid.examples.md +8 -2
  71. package/dist/docs/data-grid.json +25 -3
  72. package/dist/docs/data-grid.md +4 -1
  73. package/dist/docs/data-grid.props.md +2 -1
  74. package/dist/docs/detail-panel.json +4 -2
  75. package/dist/docs/detail-panel.md +15 -5
  76. package/dist/docs/dialog.json +1 -0
  77. package/dist/docs/dialog.md +1 -1
  78. package/dist/docs/drawer.json +6 -4
  79. package/dist/docs/drawer.md +3 -3
  80. package/dist/docs/event-calendar.md +2 -2
  81. package/dist/docs/guidelines/index.md +4 -3
  82. package/dist/docs/guidelines/layout-alignment.md +17 -7
  83. package/dist/docs/guidelines/list-pages.md +3 -3
  84. package/dist/docs/page-header.json +18 -2
  85. package/dist/docs/page-header.md +5 -3
  86. package/dist/docs/page.json +1 -0
  87. package/dist/docs/page.md +1 -1
  88. package/dist/docs/rating.md +1 -1
  89. package/dist/docs/section.json +1 -1
  90. package/dist/docs/section.md +1 -1
  91. package/dist/docs/skills/compose-screen/SKILL.md +12 -4
  92. package/dist/docs/skills/review-screen/SKILL.md +20 -18
  93. package/dist/docs/skills/theme-app/SKILL.md +12 -1
  94. package/dist/docs/toast.json +1 -0
  95. package/dist/docs/toast.md +1 -1
  96. package/dist/docs/tokens.md +1 -1
  97. package/dist/docs/toolbar.json +1 -1
  98. package/dist/docs/toolbar.md +1 -1
  99. package/dist/docs/typography.md +1 -1
  100. package/dist/{drawer-CkpFlKYa.js → drawer-fyPyxnYQ.js} +216 -206
  101. package/dist/drawer.js +1 -1
  102. package/dist/entity-picker-ClyhBTyK.js +1283 -0
  103. package/dist/entity-picker.js +1 -1
  104. package/dist/{event-calendar-BDjI5T44.js → event-calendar-COgC24UG.js} +23 -23
  105. package/dist/event-calendar.js +1 -1
  106. package/dist/{field-group-CCM2vPKL.js → field-group-Bj-EbPIU.js} +2 -2
  107. package/dist/field-group.js +1 -1
  108. package/dist/{field-CzSGs7wo.js → field-tnEZiRLg.js} +19 -19
  109. package/dist/field.js +1 -1
  110. package/dist/filter-bar-BRuCz79-.js +1342 -0
  111. package/dist/filter-bar.js +1 -1
  112. package/dist/{form-CDq04WDY.js → form-DEcJ7tHf.js} +1 -1
  113. package/dist/form.js +1 -1
  114. package/dist/{fullscreen-6GW4naDP.js → fullscreen-BwweNj3-.js} +13 -13
  115. package/dist/fullscreen.js +1 -1
  116. package/dist/{hover-card-aadyPXzF.js → hover-card-BWcU37Yp.js} +1 -1
  117. package/dist/hover-card.js +1 -1
  118. package/dist/{i18n-DpW8lqJ1.js → i18n-D7xXDd8-.js} +11 -4
  119. package/dist/i18n.js +1 -1
  120. package/dist/{icon-button-CRB218_z.js → icon-button-DbSZKGT4.js} +73 -71
  121. package/dist/{import-export-center-DUrNwRKP.js → import-export-center-CYf0Qxl_.js} +291 -289
  122. package/dist/import-export-center.js +1 -1
  123. package/dist/index.js +100 -100
  124. package/dist/{kbd-Z4YmSPRy.js → kbd-dNz8QHfL.js} +1 -1
  125. package/dist/kbd.js +1 -1
  126. package/dist/{link-BsSlZ1ts.js → link-DLPyg54C.js} +5 -5
  127. package/dist/link.js +1 -1
  128. package/dist/{listbox-VFcfZT70.js → listbox-BSqx_ARf.js} +1 -1
  129. package/dist/listbox.js +1 -1
  130. package/dist/{loading-overlay-BZPBDK4w.js → loading-overlay-BLIrcaoj.js} +9 -9
  131. package/dist/loading-overlay.js +1 -1
  132. package/dist/{markdown-BmCU_sOv.js → markdown-DccRb1xf.js} +17 -17
  133. package/dist/markdown.js +1 -1
  134. package/dist/{menu-parts-DS9JEUCt.js → menu-parts-CNNHRduK.js} +42 -42
  135. package/dist/menu.js +1 -1
  136. package/dist/{menubar-BV43BKep.js → menubar-Bdr6zigi.js} +1 -1
  137. package/dist/menubar.js +1 -1
  138. package/dist/message-BkTiWsUp.js +436 -0
  139. package/dist/message-scroller-akQEtQLn.js +218 -0
  140. package/dist/message-scroller.js +1 -1
  141. package/dist/message.js +1 -1
  142. package/dist/{multi-select-YaxhhH9y.js → multi-select-BvlJIEtz.js} +445 -443
  143. package/dist/multi-select.js +1 -1
  144. package/dist/{navigation-menu-parts-B64gKl8B.js → navigation-menu-parts-CEW4fgCo.js} +12 -12
  145. package/dist/navigation-menu.js +1 -1
  146. package/dist/{notification-center-Ci-OLWTO.js → notification-center-BQO0Ey3h.js} +40 -40
  147. package/dist/notification-center.js +1 -1
  148. package/dist/{number-field-BYQmPyM-.js → number-field-D1MqT8_A.js} +13 -13
  149. package/dist/number-field.js +1 -1
  150. package/dist/{otp-input-BKO0WPZc.js → otp-input-Cub9H9Di.js} +1 -1
  151. package/dist/otp-input.js +1 -1
  152. package/dist/{page-CfjGviUA.js → page-CwYmBoZQ.js} +1 -1
  153. package/dist/{page-header-w_PFLnLG.js → page-header-CMxCQqu_.js} +117 -114
  154. package/dist/page-header.js +1 -1
  155. package/dist/page.js +1 -1
  156. package/dist/{pagination-Cm9665gb.js → pagination-IEuos7H1.js} +12 -12
  157. package/dist/pagination.js +1 -1
  158. package/dist/{popover-D1krYeP-.js → popover-C7NpEzq6.js} +22 -22
  159. package/dist/popover.js +1 -1
  160. package/dist/prompt-composer-Cu8bj1Vb.js +276 -0
  161. package/dist/prompt-composer.js +1 -1
  162. package/dist/{prose-Bl5OjXTb.js → prose-CQN4Bqqh.js} +1 -1
  163. package/dist/prose.js +1 -1
  164. package/dist/{radio-group-D9VTBLUB.js → radio-group-BHlDgCLk.js} +2 -2
  165. package/dist/radio-group.js +1 -1
  166. package/dist/{rating-BRqsV5OF.js → rating-Cr0lXaAV.js} +15 -15
  167. package/dist/rating.js +1 -1
  168. package/dist/{saved-views-C_76obIv.js → saved-views-CyLSn8a2.js} +151 -151
  169. package/dist/saved-views.js +1 -1
  170. package/dist/{scroll-area-vrm2bbtZ.js → scroll-area-Fr0PmnRS.js} +1 -1
  171. package/dist/scroll-area.js +1 -1
  172. package/dist/{segmented-control-5DTOKO3g.js → segmented-control-uPnQYklX.js} +2 -2
  173. package/dist/segmented-control.js +1 -1
  174. package/dist/select-C0JYHwBy.js +1020 -0
  175. package/dist/select.js +1 -1
  176. package/dist/{side-navigation-MNMSkj9b.js → side-navigation-D8lRpHwj.js} +64 -64
  177. package/dist/side-navigation.js +1 -1
  178. package/dist/{skeleton-DyOwgYmF.js → skeleton-DeEOmm1y.js} +1 -1
  179. package/dist/skeleton.js +1 -1
  180. package/dist/{slider-OMe1DAC-.js → slider-BSI1xvjw.js} +2 -2
  181. package/dist/slider.js +1 -1
  182. package/dist/{sparkline-ChkaLVdY.js → sparkline-CYU4_lCD.js} +1 -1
  183. package/dist/sparkline.js +1 -1
  184. package/dist/spinner-ring-DyfaYloA.js +19 -0
  185. package/dist/{split-button-DbmRwfMC.js → split-button-CkbylOMN.js} +2 -2
  186. package/dist/split-button.js +1 -1
  187. package/dist/{stat-card-BSnsTmsq.js → stat-card-CAh4SdeY.js} +16 -16
  188. package/dist/stat-card.js +1 -1
  189. package/dist/{status-indicator-CyKhBdvN.js → status-indicator-BVMnpcm8.js} +4 -4
  190. package/dist/status-indicator.js +1 -1
  191. package/dist/{stepper-Cw1Auv3n.js → stepper-BLfvMz04.js} +16 -16
  192. package/dist/stepper.js +1 -1
  193. package/dist/styles/action-bar.css +1 -1
  194. package/dist/styles/action-sheet.css +2 -2
  195. package/dist/styles/button.css +2 -2
  196. package/dist/styles/cascader.css +2 -2
  197. package/dist/styles/chart.css +1 -1
  198. package/dist/styles/column-manager.css +3 -3
  199. package/dist/styles/command-palette.css +3 -3
  200. package/dist/styles/dashboard-grid.css +2 -2
  201. package/dist/styles/data-grid.css +3 -3
  202. package/dist/styles/data-list.css +2 -2
  203. package/dist/styles/detail-panel.css +4 -4
  204. package/dist/styles/dialog.css +1 -1
  205. package/dist/styles/drawer.css +1 -1
  206. package/dist/styles/entity-picker.css +1 -1
  207. package/dist/styles/event-calendar.css +1 -1
  208. package/dist/styles/filter-bar.css +3 -3
  209. package/dist/styles/import-export-center.css +4 -4
  210. package/dist/styles/index.css +12 -12
  211. package/dist/styles/markdown.css +2 -2
  212. package/dist/styles/multi-select.css +1 -1
  213. package/dist/styles/notification-center.css +3 -3
  214. package/dist/styles/page-header.css +2 -2
  215. package/dist/styles/page.css +1 -1
  216. package/dist/styles/prompt-composer.css +1 -1
  217. package/dist/styles/saved-views.css +2 -2
  218. package/dist/styles/split-button.css +2 -2
  219. package/dist/styles/table.css +2 -2
  220. package/dist/styles/tabs.css +1 -1
  221. package/dist/styles/timeline.css +1 -1
  222. package/dist/styles/toast.css +1 -1
  223. package/dist/styles/tour.css +2 -2
  224. package/dist/styles/transfer.css +2 -2
  225. package/dist/styles/upload.css +1 -1
  226. package/dist/styles/wizard.css +2 -2
  227. package/dist/styles.css +1 -1
  228. package/dist/{switch-CQ1rpuKa.js → switch-BHyKHqeI.js} +5 -5
  229. package/dist/switch.js +1 -1
  230. package/dist/{table-DpGTPtnb.js → table-C8zOHDcY.js} +30 -30
  231. package/dist/{table-of-contents-BFVERMZy.js → table-of-contents-BAIuPCdy.js} +8 -8
  232. package/dist/table-of-contents.js +1 -1
  233. package/dist/table.js +1 -1
  234. package/dist/{tag-aX7uyAN0.js → tag-XYGEPUHR.js} +14 -14
  235. package/dist/tag.js +1 -1
  236. package/dist/{tags-input-BgpS22sf.js → tags-input-ClYSd-No.js} +40 -40
  237. package/dist/tags-input.js +1 -1
  238. package/dist/text-field-Cguj75tn.js +205 -0
  239. package/dist/text-field.js +1 -1
  240. package/dist/{textarea-DNCjsQYd.js → textarea-BKsh_jAo.js} +1 -1
  241. package/dist/textarea.js +1 -1
  242. package/dist/{time-field-Cm6iBjwH.js → time-field-BIE4WMpS.js} +7 -7
  243. package/dist/time-field.js +1 -1
  244. package/dist/{time-picker-Ce18FSO2.js → time-picker-CNfafRDF.js} +18 -18
  245. package/dist/time-picker.js +1 -1
  246. package/dist/{time-range-picker-kDnw4PQ3.js → time-range-picker-D7gM_Wno.js} +20 -20
  247. package/dist/time-range-picker.js +1 -1
  248. package/dist/timeline-BLadNUkS.js +449 -0
  249. package/dist/timeline.js +1 -1
  250. package/dist/{toast-58ex8PDK.js → toast-CjbiXiza.js} +16 -16
  251. package/dist/toast.js +1 -1
  252. package/dist/{toggle-group-YxVJlCnI.js → toggle-group-BZmghKac.js} +1 -1
  253. package/dist/toggle-group.js +1 -1
  254. package/dist/toolbar-BI4ZepBs.js +243 -0
  255. package/dist/toolbar.js +1 -1
  256. package/dist/{top-navigation-DorkYBnR.js → top-navigation-BTZpx5VA.js} +13 -13
  257. package/dist/top-navigation.js +1 -1
  258. package/dist/{tour-CwK_m_Jp.js → tour-_CQ1kYov.js} +23 -23
  259. package/dist/tour.js +1 -1
  260. package/dist/{transfer-DxGDWIEt.js → transfer-BVhBdIGp.js} +59 -59
  261. package/dist/transfer.js +1 -1
  262. package/dist/tree-DfI9UWLA.js +794 -0
  263. package/dist/tree.js +1 -1
  264. package/dist/types/action-bar/action-bar-overflow.d.ts.map +1 -1
  265. package/dist/types/action-bar/action-bar.types.d.ts +2 -2
  266. package/dist/types/action-sheet/action-sheet-parts.d.ts.map +1 -1
  267. package/dist/types/app-shell/app-shell-parts.d.ts.map +1 -1
  268. package/dist/types/app-shell/app-shell.d.ts.map +1 -1
  269. package/dist/types/app-shell/app-shell.types.d.ts +21 -14
  270. package/dist/types/app-shell/app-shell.types.d.ts.map +1 -1
  271. package/dist/types/app-shell/index.d.ts +1 -1
  272. package/dist/types/app-shell/index.d.ts.map +1 -1
  273. package/dist/types/button/button-indicator.d.ts.map +1 -1
  274. package/dist/types/button/spinner-ring.d.ts +8 -0
  275. package/dist/types/button/spinner-ring.d.ts.map +1 -0
  276. package/dist/types/cascader/cascader-surface.d.ts.map +1 -1
  277. package/dist/types/cascader/cascader.d.ts.map +1 -1
  278. package/dist/types/combobox/combobox-parts.d.ts.map +1 -1
  279. package/dist/types/command-palette/command-palette.d.ts.map +1 -1
  280. package/dist/types/data-grid/data-grid-body.d.ts +7 -2
  281. package/dist/types/data-grid/data-grid-body.d.ts.map +1 -1
  282. package/dist/types/data-grid/data-grid-context.d.ts +2 -1
  283. package/dist/types/data-grid/data-grid-context.d.ts.map +1 -1
  284. package/dist/types/data-grid/data-grid-header.d.ts.map +1 -1
  285. package/dist/types/data-grid/data-grid.d.ts +1 -1
  286. package/dist/types/data-grid/data-grid.d.ts.map +1 -1
  287. package/dist/types/data-grid/data-grid.types.d.ts +12 -0
  288. package/dist/types/data-grid/data-grid.types.d.ts.map +1 -1
  289. package/dist/types/data-grid/index.d.ts +1 -1
  290. package/dist/types/data-grid/index.d.ts.map +1 -1
  291. package/dist/types/detail-panel/detail-panel-parts.d.ts +2 -1
  292. package/dist/types/detail-panel/detail-panel-parts.d.ts.map +1 -1
  293. package/dist/types/drawer/drawer-parts.d.ts.map +1 -1
  294. package/dist/types/entity-picker/entity-picker-control.d.ts.map +1 -1
  295. package/dist/types/filter-bar/filter-bar.d.ts.map +1 -1
  296. package/dist/types/i18n/slotted-provider.d.ts +6 -0
  297. package/dist/types/i18n/slotted-provider.d.ts.map +1 -1
  298. package/dist/types/import-export-center/import-export-center.d.ts.map +1 -1
  299. package/dist/types/message/message-parts.d.ts.map +1 -1
  300. package/dist/types/message-scroller/message-scroller.d.ts.map +1 -1
  301. package/dist/types/multi-select/multi-select-parts.d.ts.map +1 -1
  302. package/dist/types/page-header/page-header-defaults.d.ts +1 -1
  303. package/dist/types/page-header/page-header-defaults.d.ts.map +1 -1
  304. package/dist/types/page-header/page-header.d.ts +1 -1
  305. package/dist/types/page-header/page-header.d.ts.map +1 -1
  306. package/dist/types/page-header/page-header.types.d.ts +9 -0
  307. package/dist/types/page-header/page-header.types.d.ts.map +1 -1
  308. package/dist/types/prompt-composer/prompt-composer.d.ts.map +1 -1
  309. package/dist/types/select/select-parts.d.ts.map +1 -1
  310. package/dist/types/text-field/text-field.d.ts.map +1 -1
  311. package/dist/types/timeline/timeline-parts.d.ts.map +1 -1
  312. package/dist/types/timeline/timeline.d.ts.map +1 -1
  313. package/dist/types/toolbar/toolbar-overflow.d.ts.map +1 -1
  314. package/dist/types/toolbar/toolbar.types.d.ts +2 -2
  315. package/dist/types/tree/tree-parts.d.ts.map +1 -1
  316. package/dist/{upload-CEDsfMWz.js → upload-N2-nyO8x.js} +65 -65
  317. package/dist/upload.js +1 -1
  318. package/dist/{wizard-B3p7zCSj.js → wizard-CK1x2fs3.js} +16 -16
  319. package/dist/wizard.js +1 -1
  320. package/package.json +6 -6
  321. package/dist/action-bar-CJgBierN.js +0 -283
  322. package/dist/action-sheet-tRrjm7WQ.js +0 -358
  323. package/dist/cascader-DqlC1z5b.js +0 -1154
  324. package/dist/combobox-YWFkxaQ3.js +0 -902
  325. package/dist/command-palette-DXNq-zKN.js +0 -741
  326. package/dist/data-list-DZCN_uW1.js +0 -587
  327. package/dist/entity-picker-CFwLGQeU.js +0 -1281
  328. package/dist/filter-bar-G50WdRac.js +0 -1340
  329. package/dist/message-Dtck9RJy.js +0 -434
  330. package/dist/message-scroller-niUJ8RoL.js +0 -216
  331. package/dist/prompt-composer-sh_TXKYZ.js +0 -273
  332. package/dist/select-BFx5EgAa.js +0 -1018
  333. package/dist/text-field-DL_uhNXV.js +0 -203
  334. package/dist/timeline-pEL30Jp8.js +0 -446
  335. package/dist/toolbar-BtIyVbs4.js +0 -241
  336. package/dist/tree-DbLRyItM.js +0 -792
@@ -52,6 +52,10 @@
52
52
  "popin",
53
53
  "scroll"
54
54
  ],
55
+ "resizeMode": [
56
+ "live",
57
+ "deferred"
58
+ ],
55
59
  "activatable": [
56
60
  true,
57
61
  false
@@ -99,6 +103,7 @@
99
103
  "filterDebounce": 300,
100
104
  "loadMoreThreshold": 20,
101
105
  "loadMoreTrigger": "scroll",
106
+ "resizeMode": "live",
102
107
  "pageSizes": [
103
108
  25,
104
109
  50,
@@ -151,6 +156,7 @@
151
156
  "column-menu",
152
157
  "column-menu-description",
153
158
  "resizer",
159
+ "resize-guide",
154
160
  "drop-indicator",
155
161
  "filter-row",
156
162
  "filter-cell",
@@ -272,6 +278,12 @@
272
278
  "required": false,
273
279
  "purpose": "The pointer’s handle on the trailing edge; a double press fits the column."
274
280
  },
281
+ {
282
+ "part": "resize-guide",
283
+ "element": "div[aria-hidden]",
284
+ "required": false,
285
+ "purpose": "Under resizeMode=\"deferred\", the line a drag moves by translate across the scroller’s height; the width is applied on release."
286
+ },
275
287
  {
276
288
  "part": "drop-indicator",
277
289
  "element": "div",
@@ -905,6 +917,13 @@
905
917
  "appliesTo": "DataGrid",
906
918
  "description": "Asked for the next page when hasMore is true."
907
919
  },
920
+ {
921
+ "name": "resizeMode",
922
+ "type": "'live' | 'deferred'",
923
+ "defaultValue": "live",
924
+ "appliesTo": "DataGrid",
925
+ "description": "How a pointer drag of a resizer applies the width: on every move, or once on release while a guide (the resize-guide part) follows the pointer and the rows stay still. Escape during a deferred drag leaves the width. The keyboard step and autofit apply at once in either mode."
926
+ },
908
927
  {
909
928
  "name": "loadMoreTrigger",
910
929
  "type": "'scroll' | 'button' | 'both'",
@@ -1101,7 +1120,7 @@
1101
1120
  "type": "component",
1102
1121
  "defaultValue": "—",
1103
1122
  "appliesTo": "Application",
1104
- "description": "Sets variant, striped, stickyHeader, stickyTo, selectionMode, editMode, filterRow, virtualize, rowHeight, columnOverflow, overscan, pageSizes, filterDebounce, loadMoreThreshold, loadMoreTrigger and skeletonRows once for a subtree. A grid that states one itself still wins. Its words and its locale come from the language in force (SlottedProvider)."
1123
+ "description": "Sets variant, striped, stickyHeader, stickyTo, selectionMode, editMode, filterRow, virtualize, rowHeight, columnOverflow, overscan, pageSizes, filterDebounce, loadMoreThreshold, loadMoreTrigger, resizeMode and skeletonRows once for a subtree. A grid that states one itself still wins. Its words and its locale come from the language in force (SlottedProvider)."
1105
1124
  },
1106
1125
  {
1107
1126
  "name": "@slotted/core/grid",
@@ -1204,6 +1223,7 @@
1204
1223
  }
1205
1224
  ],
1206
1225
  "accessibility": [
1226
+ "`columns`, `disabledKeys` and a function `rowKey` are compared by identity: a new array or function on a render of the parent re-renders every mounted row, so declare them at module scope or memoise them. The renderers — `cellRenderers`, `editorRenderers`, `renderCell`, `renderEditor`, `renderHeader`, `renderGroup`, `renderDetail` — `messages` and `tree` are read when a row renders and may be written inline. A row renders again for its own row object, selection, cursor, edit or expansion, and for a change of `columns` or the language; a renderer whose output reads state outside its row is refreshed by memoising `columns` on that state.",
1207
1227
  "The root is role=\"grid\": a composite widget with one tab stop. The current cell — or the single simple widget inside it, a link, a button or a checkbox — is the only element with tabindex=\"0\"; Tab enters there and leaves the grid to the next control of the page, which is what the APG requires of a grid and what a table cannot give.",
1208
1228
  "Every row carries aria-rowindex against aria-rowcount on the root, and every cell aria-colindex against aria-colcount, always: the grid windows its rows and columns, so the DOM is never the whole set, and the counts are what let a screen reader say “row 4,812 of 9,000”.",
1209
1229
  "aria-sort is written on the first sort key’s header only — the practice says more than one is ambiguous — and the whole order is announced through the live announcer: “Sorted by Carrier ascending, Weight descending”. A resize announces the column and its width; a filter announces its sentence through describeFilter; a copy announces the count.",
@@ -1260,6 +1280,8 @@
1260
1280
  "--slotted-data-grid-pin-shadow-size",
1261
1281
  "--slotted-data-grid-radius",
1262
1282
  "--slotted-data-grid-range-surface",
1283
+ "--slotted-data-grid-resize-guide-color",
1284
+ "--slotted-data-grid-resize-guide-width",
1263
1285
  "--slotted-data-grid-row-block-size",
1264
1286
  "--slotted-data-grid-row-color-selected",
1265
1287
  "--slotted-data-grid-row-max-block-size",
@@ -1385,7 +1407,7 @@
1385
1407
  "title": "Row selection",
1386
1408
  "note": "single chooses one row with a press; multiple draws the checkbox column, pinned to the start: Shift extends from the anchor, Shift+Space toggles the row from any cell, Ctrl+A and the header checkbox cover every row the query left and say so in their name.",
1387
1409
  "language": "tsx",
1388
- "source": "import { useState } from 'react';\nimport type { GridColumn } from '@slotted/core/grid';\nimport { DataGrid } from '@slotted/react/data-grid';\nimport { Text } from '@slotted/react/typography';\n\ninterface Shipment {\n id: string;\n customer: string;\n destination: string;\n carrier: string;\n status: string;\n shipped: string;\n weight: number;\n cost: number;\n priority: boolean;\n}\n\nconst CUSTOMERS = [\n 'Alfreds Futterkiste',\n \"Bon app'\",\n 'Ernst Handel',\n 'Folk och fä HB',\n 'Hanari Carnes',\n 'Island Trading',\n 'QUICK-Stop',\n 'Wartian Herkku',\n];\nconst DESTINATIONS = [\n 'Berlin, DE',\n 'Marseille, FR',\n 'Graz, AT',\n 'Bräcke, SE',\n 'Rio de Janeiro, BR',\n 'Cowes, UK',\n 'Boise, US',\n 'Oulu, FI',\n];\nconst CARRIERS = ['UPS', 'FedEx', 'DHL', 'USPS'];\nconst STATUSES = ['In transit', 'Delivered', 'Delayed', 'Customs'];\n\nfunction shipments(count: number): Shipment[] {\n let seed = 7;\n const next = () => (seed = (seed * 1664525 + 1013904223) % 4294967296) / 4294967296;\n const pick = <T,>(list: readonly T[]) => list[Math.floor(next() * list.length)]!;\n return Array.from({ length: count }, (_, index) => {\n const weight = Math.round(next() * 9000) / 10;\n return {\n id: `SH-${3301 + index}`,\n customer: pick(CUSTOMERS),\n destination: pick(DESTINATIONS),\n carrier: pick(CARRIERS),\n status: pick(STATUSES),\n shipped: `2026-09-${String(1 + Math.floor(next() * 28)).padStart(2, '0')}`,\n weight,\n cost: Math.round(weight * (2 + next() * 3) * 100) / 100,\n priority: next() < 0.3,\n };\n });\n}\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\nconst money = (value: unknown) => (typeof value === 'number' ? USD.format(value) : '');\nconst kilograms = (value: unknown) => (typeof value === 'number' ? `${value.toFixed(1)} kg` : '');\n\nconst COLUMNS: GridColumn<Shipment>[] = [\n { id: 'id', label: 'Shipment', accessor: 'id', rowHeader: true, width: 120, text: 'nowrap' },\n { id: 'customer', label: 'Customer', accessor: 'customer', flex: 1, minWidth: 180 },\n { id: 'destination', label: 'Destination', accessor: 'destination', width: 170 },\n {\n id: 'carrier',\n label: 'Carrier',\n accessor: 'carrier',\n kind: 'set',\n width: 110,\n options: CARRIERS.map((value) => ({ value, label: value })),\n },\n {\n id: 'status',\n label: 'Status',\n accessor: 'status',\n kind: 'set',\n width: 120,\n options: STATUSES.map((value) => ({ value, label: value })),\n },\n { id: 'shipped', label: 'Shipped', accessor: 'shipped', kind: 'date', width: 130 },\n {\n id: 'weight',\n label: 'Weight',\n accessor: 'weight',\n kind: 'number',\n width: 110,\n format: kilograms,\n },\n { id: 'cost', label: 'Cost', accessor: 'cost', kind: 'number', width: 120, format: money },\n];\n\nconst ROWS = shipments(12);\n\nexport default function DataGridSelection() {\n const [value, setValue] = useState<string | readonly string[] | null>(['SH-3302', 'SH-3303']);\n const count = Array.isArray(value) ? value.length : value === null ? 0 : 1;\n\n return (\n <DataGrid\n aria-label=\"Shipments\"\n columns={COLUMNS}\n rowKey=\"id\"\n rows={ROWS}\n disabledKeys={['SH-3305']}\n footer={\n <Text size=\"sm\" tone=\"muted\">\n {count} selected\n </Text>\n }\n height=\"24rem\"\n onValueChange={setValue}\n selectionMode=\"multiple\"\n value={value}\n />\n );\n}\n",
1410
+ "source": "import { useState } from 'react';\nimport type { GridColumn } from '@slotted/core/grid';\nimport { DataGrid } from '@slotted/react/data-grid';\nimport { Text } from '@slotted/react/typography';\n\ninterface Shipment {\n id: string;\n customer: string;\n destination: string;\n carrier: string;\n status: string;\n shipped: string;\n weight: number;\n cost: number;\n priority: boolean;\n}\n\nconst CUSTOMERS = [\n 'Alfreds Futterkiste',\n \"Bon app'\",\n 'Ernst Handel',\n 'Folk och fä HB',\n 'Hanari Carnes',\n 'Island Trading',\n 'QUICK-Stop',\n 'Wartian Herkku',\n];\nconst DESTINATIONS = [\n 'Berlin, DE',\n 'Marseille, FR',\n 'Graz, AT',\n 'Bräcke, SE',\n 'Rio de Janeiro, BR',\n 'Cowes, UK',\n 'Boise, US',\n 'Oulu, FI',\n];\nconst CARRIERS = ['UPS', 'FedEx', 'DHL', 'USPS'];\nconst STATUSES = ['In transit', 'Delivered', 'Delayed', 'Customs'];\n\nfunction shipments(count: number): Shipment[] {\n let seed = 7;\n const next = () => (seed = (seed * 1664525 + 1013904223) % 4294967296) / 4294967296;\n const pick = <T,>(list: readonly T[]) => list[Math.floor(next() * list.length)]!;\n return Array.from({ length: count }, (_, index) => {\n const weight = Math.round(next() * 9000) / 10;\n return {\n id: `SH-${3301 + index}`,\n customer: pick(CUSTOMERS),\n destination: pick(DESTINATIONS),\n carrier: pick(CARRIERS),\n status: pick(STATUSES),\n shipped: `2026-09-${String(1 + Math.floor(next() * 28)).padStart(2, '0')}`,\n weight,\n cost: Math.round(weight * (2 + next() * 3) * 100) / 100,\n priority: next() < 0.3,\n };\n });\n}\n\nconst USD = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });\nconst money = (value: unknown) => (typeof value === 'number' ? USD.format(value) : '');\nconst kilograms = (value: unknown) => (typeof value === 'number' ? `${value.toFixed(1)} kg` : '');\n\nconst COLUMNS: GridColumn<Shipment>[] = [\n { id: 'id', label: 'Shipment', accessor: 'id', rowHeader: true, width: 120, text: 'nowrap' },\n { id: 'customer', label: 'Customer', accessor: 'customer', flex: 1, minWidth: 180 },\n { id: 'destination', label: 'Destination', accessor: 'destination', width: 170 },\n {\n id: 'carrier',\n label: 'Carrier',\n accessor: 'carrier',\n kind: 'set',\n width: 110,\n options: CARRIERS.map((value) => ({ value, label: value })),\n },\n {\n id: 'status',\n label: 'Status',\n accessor: 'status',\n kind: 'set',\n width: 120,\n options: STATUSES.map((value) => ({ value, label: value })),\n },\n { id: 'shipped', label: 'Shipped', accessor: 'shipped', kind: 'date', width: 130 },\n {\n id: 'weight',\n label: 'Weight',\n accessor: 'weight',\n kind: 'number',\n width: 110,\n format: kilograms,\n },\n { id: 'cost', label: 'Cost', accessor: 'cost', kind: 'number', width: 120, format: money },\n];\n\nconst ROWS = shipments(12);\nconst DISABLED = ['SH-3305'];\n\nexport default function DataGridSelection() {\n const [value, setValue] = useState<string | readonly string[] | null>(['SH-3302', 'SH-3303']);\n const count = Array.isArray(value) ? value.length : value === null ? 0 : 1;\n\n return (\n <DataGrid\n aria-label=\"Shipments\"\n columns={COLUMNS}\n rowKey=\"id\"\n rows={ROWS}\n disabledKeys={DISABLED}\n footer={\n <Text size=\"sm\" tone=\"muted\">\n {count} selected\n </Text>\n }\n height=\"24rem\"\n onValueChange={setValue}\n selectionMode=\"multiple\"\n value={value}\n />\n );\n}\n",
1389
1411
  "verdict": "example"
1390
1412
  },
1391
1413
  {
@@ -1601,7 +1623,7 @@
1601
1623
  "title": "Pictures in cells",
1602
1624
  "note": "A renderer draws anything: an avatar beside the name, a thumbnail in a custom column. A stated rowHeight is the drawn row as well as the windowed one, so ten thousand rows of 56 pixels scroll to the right place. A cell with a picture and a name is one flex row of the renderer’s own; the grid lays out the renderer’s first element as the value.",
1603
1625
  "language": "tsx",
1604
- "source": "<DataGrid\n cellRenderers={{\n customer: ({ row }) => (\n <span className=\"customer\">\n <Avatar name={row.customer} size=\"sm\" />\n <span>{row.customer}</span>\n </span>\n ),\n photo: ({ row }) => <Image alt=\"\" radius=\"sm\" ratio=\"landscape\" src={row.photo} />,\n }}\n columns={[...columns, { id: 'photo', label: 'Cargo', kind: 'custom', sortable: false }]}\n rowHeight={56}\n/>;\n",
1626
+ "source": "const MEDIA_COLUMNS: DataGridColumn<Shipment>[] = [\n ...columns,\n { id: 'photo', label: 'Cargo', kind: 'custom', sortable: false },\n];\n\n<DataGrid\n cellRenderers={{\n customer: ({ row }) => (\n <span className=\"customer\">\n <Avatar name={row.customer} size=\"sm\" />\n <span>{row.customer}</span>\n </span>\n ),\n photo: ({ row }) => <Image alt=\"\" radius=\"sm\" ratio=\"landscape\" src={row.photo} />,\n }}\n columns={MEDIA_COLUMNS}\n rowHeight={56}\n/>;\n",
1605
1627
  "verdict": "excerpt"
1606
1628
  },
1607
1629
  {
@@ -122,6 +122,7 @@ export default function DataGridBasic() {
122
122
  | `column-menu` | button | no |
123
123
  | `column-menu-description` | div[aria-hidden] | no |
124
124
  | `resizer` | div[aria-hidden] | no |
125
+ | `resize-guide` | div[aria-hidden] | no |
125
126
  | `drop-indicator` | div | no |
126
127
  | `filter-row` | div[role="row"] | no |
127
128
  | `filter-cell` | div[role="gridcell"] | no |
@@ -191,6 +192,7 @@ See [data-grid.props.md](./data-grid.props.md).
191
192
  | `filterRow` | `true`, `false` | `false` |
192
193
  | `virtualize` | `auto`, `true`, `false` | `auto` |
193
194
  | `columnOverflow` | `auto`, `popin`, `scroll` | `auto` |
195
+ | `resizeMode` | `live`, `deferred` | `live` |
194
196
  | `activatable` | `true`, `false` | `false` |
195
197
  | `align` | `start`, `center`, `end` | `start` |
196
198
  | `numeric` | `true`, `false` | `false` |
@@ -199,6 +201,7 @@ See [data-grid.props.md](./data-grid.props.md).
199
201
 
200
202
  ## Rules
201
203
 
204
+ - `columns`, `disabledKeys` and a function `rowKey` are compared by identity: a new array or function on a render of the parent re-renders every mounted row, so declare them at module scope or memoise them. The renderers — `cellRenderers`, `editorRenderers`, `renderCell`, `renderEditor`, `renderHeader`, `renderGroup`, `renderDetail` — `messages` and `tree` are read when a row renders and may be written inline. A row renders again for its own row object, selection, cursor, edit or expansion, and for a change of `columns` or the language; a renderer whose output reads state outside its row is refreshed by memoising `columns` on that state.
202
205
  - The root is role="grid": a composite widget with one tab stop. The current cell — or the single simple widget inside it, a link, a button or a checkbox — is the only element with tabindex="0"; Tab enters there and leaves the grid to the next control of the page, which is what the APG requires of a grid and what a table cannot give.
203
206
  - Every row carries aria-rowindex against aria-rowcount on the root, and every cell aria-colindex against aria-colcount, always: the grid windows its rows and columns, so the DOM is never the whole set, and the counts are what let a screen reader say “row 4,812 of 9,000”.
204
207
  - aria-sort is written on the first sort key’s header only — the practice says more than one is ambiguous — and the whole order is announced through the live announcer: “Sorted by Carrier ascending, Weight descending”. A resize announces the column and its width; a filter announces its sentence through describeFilter; a copy announces the count.
@@ -208,7 +211,7 @@ See [data-grid.props.md](./data-grid.props.md).
208
211
 
209
212
  ## Tokens
210
213
 
211
- `--slotted-border-strong`, `--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-font-size-md`, `--slotted-control-font-size-sm`, `--slotted-control-gap-md`, `--slotted-control-height-lg`, `--slotted-control-height-md`, `--slotted-control-height-sm`, `--slotted-control-icon-size-md`, `--slotted-control-inner-size-sm`, `--slotted-control-invalid-edge-width`, `--slotted-control-padding-inline-md`, `--slotted-control-padding-inline-sm`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-data-grid-band-surface`, `--slotted-data-grid-block-size`, `--slotted-data-grid-border-color`, `--slotted-data-grid-border-color-strong`, `--slotted-data-grid-border-width`, `--slotted-data-grid-cell-padding-block`, `--slotted-data-grid-cell-padding-inline`, `--slotted-data-grid-changed-surface`, `--slotted-data-grid-color`, `--slotted-data-grid-color-muted`, `--slotted-data-grid-control-radius`, `--slotted-data-grid-cursor-color`, `--slotted-data-grid-filter-operator-size`, `--slotted-data-grid-filter-panel-size`, `--slotted-data-grid-filter-panel-size-date`, `--slotted-data-grid-filter-panel-size-datetime`, `--slotted-data-grid-font-family`, `--slotted-data-grid-font-size`, `--slotted-data-grid-gap`, `--slotted-data-grid-head-block-size`, `--slotted-data-grid-header-surface`, `--slotted-data-grid-header-surface-hover`, `--slotted-data-grid-icon-size`, `--slotted-data-grid-indent`, `--slotted-data-grid-pin-shadow-color`, `--slotted-data-grid-pin-shadow-size`, `--slotted-data-grid-radius`, `--slotted-data-grid-range-surface`, `--slotted-data-grid-row-block-size`, `--slotted-data-grid-row-color-selected`, `--slotted-data-grid-row-max-block-size`, `--slotted-data-grid-row-surface-hover`, `--slotted-data-grid-row-surface-selected`, `--slotted-data-grid-row-surface-selected-hover`, `--slotted-data-grid-row-surface-stripe`, `--slotted-data-grid-shadow`, `--slotted-data-grid-sticky-offset`, `--slotted-data-grid-sticky-offset-end`, `--slotted-data-grid-surface`, `--slotted-disabled-foreground`, `--slotted-duration-long`, `--slotted-duration-loop`, `--slotted-duration-short`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-color-invalid`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-size-xs`, `--slotted-font-weight-medium`, `--slotted-font-weight-regular`, `--slotted-font-weight-semibold`, `--slotted-ground`, `--slotted-line-height-md`, `--slotted-popover-gap`, `--slotted-popover-padding-block-sm`, `--slotted-popover-padding-inline-sm`, `--slotted-radius-md`, `--slotted-radius-sm`, `--slotted-scrim`, `--slotted-shadow-xs`, `--slotted-space-1`, `--slotted-space-2`, `--slotted-space-3`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-8`, `--slotted-surface`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-border`, `--slotted-tone-accent-solid`, `--slotted-tone-accent-subtle-hover`, `--slotted-tone-accent-surface`, `--slotted-tone-accent-text`, `--slotted-tone-danger-border`, `--slotted-tone-secondary-subtle-hover`, `--slotted-z-index-sticky`
214
+ `--slotted-border-strong`, `--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-font-size-md`, `--slotted-control-font-size-sm`, `--slotted-control-gap-md`, `--slotted-control-height-lg`, `--slotted-control-height-md`, `--slotted-control-height-sm`, `--slotted-control-icon-size-md`, `--slotted-control-inner-size-sm`, `--slotted-control-invalid-edge-width`, `--slotted-control-padding-inline-md`, `--slotted-control-padding-inline-sm`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-data-grid-band-surface`, `--slotted-data-grid-block-size`, `--slotted-data-grid-border-color`, `--slotted-data-grid-border-color-strong`, `--slotted-data-grid-border-width`, `--slotted-data-grid-cell-padding-block`, `--slotted-data-grid-cell-padding-inline`, `--slotted-data-grid-changed-surface`, `--slotted-data-grid-color`, `--slotted-data-grid-color-muted`, `--slotted-data-grid-control-radius`, `--slotted-data-grid-cursor-color`, `--slotted-data-grid-filter-operator-size`, `--slotted-data-grid-filter-panel-size`, `--slotted-data-grid-filter-panel-size-date`, `--slotted-data-grid-filter-panel-size-datetime`, `--slotted-data-grid-font-family`, `--slotted-data-grid-font-size`, `--slotted-data-grid-gap`, `--slotted-data-grid-head-block-size`, `--slotted-data-grid-header-surface`, `--slotted-data-grid-header-surface-hover`, `--slotted-data-grid-icon-size`, `--slotted-data-grid-indent`, `--slotted-data-grid-pin-shadow-color`, `--slotted-data-grid-pin-shadow-size`, `--slotted-data-grid-radius`, `--slotted-data-grid-range-surface`, `--slotted-data-grid-resize-guide-color`, `--slotted-data-grid-resize-guide-width`, `--slotted-data-grid-row-block-size`, `--slotted-data-grid-row-color-selected`, `--slotted-data-grid-row-max-block-size`, `--slotted-data-grid-row-surface-hover`, `--slotted-data-grid-row-surface-selected`, `--slotted-data-grid-row-surface-selected-hover`, `--slotted-data-grid-row-surface-stripe`, `--slotted-data-grid-shadow`, `--slotted-data-grid-sticky-offset`, `--slotted-data-grid-sticky-offset-end`, `--slotted-data-grid-surface`, `--slotted-disabled-foreground`, `--slotted-duration-long`, `--slotted-duration-loop`, `--slotted-duration-short`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-color-invalid`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-size-xs`, `--slotted-font-weight-medium`, `--slotted-font-weight-regular`, `--slotted-font-weight-semibold`, `--slotted-ground`, `--slotted-line-height-md`, `--slotted-popover-gap`, `--slotted-popover-padding-block-sm`, `--slotted-popover-padding-inline-sm`, `--slotted-radius-md`, `--slotted-radius-sm`, `--slotted-scrim`, `--slotted-shadow-xs`, `--slotted-space-1`, `--slotted-space-2`, `--slotted-space-3`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-8`, `--slotted-surface`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-border`, `--slotted-tone-accent-solid`, `--slotted-tone-accent-subtle-hover`, `--slotted-tone-accent-surface`, `--slotted-tone-accent-text`, `--slotted-tone-danger-border`, `--slotted-tone-secondary-subtle-hover`, `--slotted-z-index-sticky`
212
215
 
213
216
  ## Examples
214
217
 
@@ -68,6 +68,7 @@
68
68
  | `highlightChanges` | `boolean \| number` | false | DataGrid | Marks a mounted cell whose value changed between two rows, for the stated milliseconds (true is 1200). |
69
69
  | `loadMoreThreshold` | `number` | 20 | DataGrid | Rows left below the window before onLoadMore is called. |
70
70
  | `onLoadMore` | `() => void` | — | DataGrid | Asked for the next page when hasMore is true. |
71
+ | `resizeMode` | `'live' \| 'deferred'` | live | DataGrid | How a pointer drag of a resizer applies the width: on every move, or once on release while a guide (the resize-guide part) follows the pointer and the rows stay still. Escape during a deferred drag leaves the width. The keyboard step and autofit apply at once in either mode. |
71
72
  | `loadMoreTrigger` | `'scroll' \| 'button' \| 'both'` | scroll | DataGrid | What asks for the next page: nearing the end, with a loading status in the footer; a Load more control; or both. |
72
73
  | `loadMoreFailed` | `boolean` | false | DataGrid | The last page asked for failed: the automatic request stops and the footer offers Try again. |
73
74
  | `onRetry` | `() => void` | — | DataGrid | The error state’s Try again. |
@@ -95,7 +96,7 @@
95
96
  | `align` | `'start' \| 'center' \| 'end'` | start | GridColumn | Where the value sits; a number column sits at the end unless told otherwise. |
96
97
  | `numeric` | `boolean` | false | GridColumn | Tabular figures and end alignment; true for kind number. |
97
98
  | `text` | `'wrap' \| 'truncate' \| 'nowrap'` | truncate | GridColumn | What a long value does. |
98
- | `DataGridDefaultsProvider` | `component` | — | Application | Sets variant, striped, stickyHeader, stickyTo, selectionMode, editMode, filterRow, virtualize, rowHeight, columnOverflow, overscan, pageSizes, filterDebounce, loadMoreThreshold, loadMoreTrigger and skeletonRows once for a subtree. A grid that states one itself still wins. Its words and its locale come from the language in force (SlottedProvider). |
99
+ | `DataGridDefaultsProvider` | `component` | — | Application | Sets variant, striped, stickyHeader, stickyTo, selectionMode, editMode, filterRow, virtualize, rowHeight, columnOverflow, overscan, pageSizes, filterDebounce, loadMoreThreshold, loadMoreTrigger, resizeMode and skeletonRows once for a subtree. A grid that states one itself still wins. Its words and its locale come from the language in force (SlottedProvider). |
99
100
  | `@slotted/core/grid` | `module` | — | Application | applyQuery, emptyQuery, withSortPress, withColumnFilter, withSearch, withPageIndex, withGroup, toGridParams, fromGridParams, normalizeColumnState, serializeColumnState, parseColumnState: the engine the grid runs on, for a server mock, a URL and a saved view. |
100
101
  | `renderCell, renderEditor, renderHeader, renderDetail, renderGroup, renderEmpty, renderFilterOperand` | `render props` | — | DataGrid | Every surface a consumer replaces, per grid or per column through cellRenderers and editorRenderers. row, cell, head and body are fixed: the layout and the roles are theirs. |
101
102
  | `footer` | `ReactNode` | — | DataGrid | Pagination, a page-size select, a count: the consumer’s own controls in the bar the grid draws. |
@@ -392,6 +392,8 @@
392
392
  "--slotted-detail-panel-aside-size-md",
393
393
  "--slotted-detail-panel-aside-size-sm",
394
394
  "--slotted-detail-panel-border",
395
+ "--slotted-detail-panel-footer-backdrop-filter",
396
+ "--slotted-detail-panel-footer-background",
395
397
  "--slotted-detail-panel-gap-lg",
396
398
  "--slotted-detail-panel-gap-md",
397
399
  "--slotted-detail-panel-gap-sm",
@@ -453,9 +455,9 @@
453
455
  {
454
456
  "id": "hosts",
455
457
  "title": "Three hosts, one anatomy",
456
- "note": "The same panel as a page’s content at level 1, as a drawer’s body with the drawer’s own close in the header actions, and as a split’s pane scrolling itself. Nothing in the panel names its host: scroll=\"self\" is the one difference a pane makes.",
458
+ "note": "The same panel as a page’s content at level 1, as a drawer’s body with the drawer’s own close in the header actions, and as a split’s pane scrolling itself. Nothing in the panel names its host: scroll=\"self\" is the one difference a pane makes. A pane that paints a ground of its own declares --slotted-page-ground with that ground, so a sticky section header inside the panel matches the pane and not the page.",
457
459
  "language": "tsx",
458
- "source": "<Drawer open={open} onOpenChange={setOpen}>\n <DrawerPanel>\n <DrawerBody>\n <DetailPanel recordKey={order.id} footer={<OrderFooter />}>\n …\n </DetailPanel>\n </DrawerBody>\n </DrawerPanel>\n</Drawer>;\n\n<DetailPanel recordKey={order.id} scroll=\"self\">\n …\n</DetailPanel>;\n",
460
+ "source": "<Drawer open={open} onOpenChange={setOpen}>\n <DrawerPanel>\n <DrawerBody>\n <DetailPanel recordKey={order.id} footer={<OrderFooter />}>\n …\n </DetailPanel>\n </DrawerBody>\n </DrawerPanel>\n</Drawer>;\n\n<div\n className=\"pane\"\n style={\n {\n background: 'var(--slotted-surface)',\n '--slotted-page-ground': 'var(--slotted-surface)',\n } as CSSProperties\n }\n>\n <DetailPanel recordKey={order.id} scroll=\"self\">\n …\n </DetailPanel>\n</div>;\n",
459
461
  "verdict": "excerpt"
460
462
  },
461
463
  {
@@ -106,7 +106,7 @@ Excerpt — not a complete module
106
106
 
107
107
  ## Tokens
108
108
 
109
- `--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-gap-md`, `--slotted-detail-panel-aside-size-lg`, `--slotted-detail-panel-aside-size-md`, `--slotted-detail-panel-aside-size-sm`, `--slotted-detail-panel-border`, `--slotted-detail-panel-gap-lg`, `--slotted-detail-panel-gap-md`, `--slotted-detail-panel-gap-sm`, `--slotted-detail-panel-inset-block-lg`, `--slotted-detail-panel-inset-block-md`, `--slotted-detail-panel-inset-block-sm`, `--slotted-detail-panel-rhythm`, `--slotted-duration-short`, `--slotted-easing-enter`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-sans`, `--slotted-page-ground`, `--slotted-space-12`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-space-9`, `--slotted-surface`, `--slotted-text`, `--slotted-text-muted`, `--slotted-z-index-sticky`
109
+ `--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-gap-md`, `--slotted-detail-panel-aside-size-lg`, `--slotted-detail-panel-aside-size-md`, `--slotted-detail-panel-aside-size-sm`, `--slotted-detail-panel-border`, `--slotted-detail-panel-footer-backdrop-filter`, `--slotted-detail-panel-footer-background`, `--slotted-detail-panel-gap-lg`, `--slotted-detail-panel-gap-md`, `--slotted-detail-panel-gap-sm`, `--slotted-detail-panel-inset-block-lg`, `--slotted-detail-panel-inset-block-md`, `--slotted-detail-panel-inset-block-sm`, `--slotted-detail-panel-rhythm`, `--slotted-duration-short`, `--slotted-easing-enter`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-sans`, `--slotted-page-ground`, `--slotted-space-12`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-space-9`, `--slotted-surface`, `--slotted-text`, `--slotted-text-muted`, `--slotted-z-index-sticky`
110
110
 
111
111
  ## Examples
112
112
 
@@ -157,7 +157,7 @@ Excerpt — not a complete module
157
157
 
158
158
  ### Three hosts, one anatomy
159
159
 
160
- The same panel as a page’s content at level 1, as a drawer’s body with the drawer’s own close in the header actions, and as a split’s pane scrolling itself. Nothing in the panel names its host: scroll="self" is the one difference a pane makes.
160
+ The same panel as a page’s content at level 1, as a drawer’s body with the drawer’s own close in the header actions, and as a split’s pane scrolling itself. Nothing in the panel names its host: scroll="self" is the one difference a pane makes. A pane that paints a ground of its own declares --slotted-page-ground with that ground, so a sticky section header inside the panel matches the pane and not the page.
161
161
 
162
162
  Excerpt — not a complete module
163
163
 
@@ -172,9 +172,19 @@ Excerpt — not a complete module
172
172
  </DrawerPanel>
173
173
  </Drawer>;
174
174
 
175
- <DetailPanel recordKey={order.id} scroll="self">
176
- …
177
- </DetailPanel>;
175
+ <div
176
+ className="pane"
177
+ style={
178
+ {
179
+ background: 'var(--slotted-surface)',
180
+ '--slotted-page-ground': 'var(--slotted-surface)',
181
+ } as CSSProperties
182
+ }
183
+ >
184
+ <DetailPanel recordKey={order.id} scroll="self">
185
+ …
186
+ </DetailPanel>
187
+ </div>;
178
188
  ```
179
189
 
180
190
  ### Previous and next: focus follows the record
@@ -768,6 +768,7 @@
768
768
  "--slotted-control-radius",
769
769
  "--slotted-control-transition-duration",
770
770
  "--slotted-control-transition-easing",
771
+ "--slotted-dialog-backdrop-filter",
771
772
  "--slotted-dialog-body-color",
772
773
  "--slotted-dialog-border-color",
773
774
  "--slotted-dialog-close-active-background",
@@ -247,7 +247,7 @@ export default function DialogBasic() {
247
247
 
248
248
  ## Tokens
249
249
 
250
- `--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-icon-size-lg`, `--slotted-control-inner-size-lg`, `--slotted-control-radius`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-dialog-body-color`, `--slotted-dialog-border-color`, `--slotted-dialog-close-active-background`, `--slotted-dialog-close-color`, `--slotted-dialog-close-hover-background`, `--slotted-dialog-color`, `--slotted-dialog-description-color`, `--slotted-dialog-footer-surface`, `--slotted-dialog-measure`, `--slotted-dialog-padding-block`, `--slotted-dialog-padding-block-sm`, `--slotted-dialog-padding-inline`, `--slotted-dialog-padding-inline-sm`, `--slotted-dialog-radius`, `--slotted-dialog-rule-color`, `--slotted-dialog-scrim`, `--slotted-dialog-surface`, `--slotted-dialog-title-color`, `--slotted-dialog-title-font-family`, `--slotted-duration-long`, `--slotted-duration-medium`, `--slotted-duration-short`, `--slotted-easing-exit`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-heading`, `--slotted-font-family-sans`, `--slotted-font-size-lg`, `--slotted-font-size-md`, `--slotted-font-size-xl`, `--slotted-font-weight-semibold`, `--slotted-line-height-md`, `--slotted-radius-lg`, `--slotted-radius-sm`, `--slotted-scrim`, `--slotted-shadow-lg`, `--slotted-space-12`, `--slotted-space-2`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-surface-raised`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-text`, `--slotted-tone-danger-text`, `--slotted-tone-info-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-tone-secondary-text`, `--slotted-tone-success-text`, `--slotted-tone-warning-text`, `--slotted-z-index-overlay`
250
+ `--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-icon-size-lg`, `--slotted-control-inner-size-lg`, `--slotted-control-radius`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-dialog-backdrop-filter`, `--slotted-dialog-body-color`, `--slotted-dialog-border-color`, `--slotted-dialog-close-active-background`, `--slotted-dialog-close-color`, `--slotted-dialog-close-hover-background`, `--slotted-dialog-color`, `--slotted-dialog-description-color`, `--slotted-dialog-footer-surface`, `--slotted-dialog-measure`, `--slotted-dialog-padding-block`, `--slotted-dialog-padding-block-sm`, `--slotted-dialog-padding-inline`, `--slotted-dialog-padding-inline-sm`, `--slotted-dialog-radius`, `--slotted-dialog-rule-color`, `--slotted-dialog-scrim`, `--slotted-dialog-surface`, `--slotted-dialog-title-color`, `--slotted-dialog-title-font-family`, `--slotted-duration-long`, `--slotted-duration-medium`, `--slotted-duration-short`, `--slotted-easing-exit`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-heading`, `--slotted-font-family-sans`, `--slotted-font-size-lg`, `--slotted-font-size-md`, `--slotted-font-size-xl`, `--slotted-font-weight-semibold`, `--slotted-line-height-md`, `--slotted-radius-lg`, `--slotted-radius-sm`, `--slotted-scrim`, `--slotted-shadow-lg`, `--slotted-space-12`, `--slotted-space-2`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-surface-raised`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-text`, `--slotted-tone-danger-text`, `--slotted-tone-info-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-tone-secondary-text`, `--slotted-tone-success-text`, `--slotted-tone-warning-text`, `--slotted-z-index-overlay`
251
251
 
252
252
  ## Examples
253
253
 
@@ -58,7 +58,7 @@
58
58
  "defaults": {
59
59
  "mode": "overlay",
60
60
  "side": "end",
61
- "size": "md",
61
+ "size": "content on top and bottom, md on start and end",
62
62
  "mount": "active",
63
63
  "modal": true,
64
64
  "escape": "close",
@@ -89,7 +89,8 @@
89
89
  "focus-visible",
90
90
  "open",
91
91
  "loading",
92
- "dragging"
92
+ "dragging",
93
+ "expanded"
93
94
  ],
94
95
  "parts": [
95
96
  "root",
@@ -260,9 +261,9 @@
260
261
  {
261
262
  "name": "size",
262
263
  "type": "'sm' | 'md' | 'lg' | 'xl' | 'full' | 'content'",
263
- "defaultValue": "md",
264
+ "defaultValue": "content on top and bottom, md on start and end",
264
265
  "appliesTo": "Drawer, DrawerDefaultsProvider",
265
- "description": "The panel’s measure at rest: one of the steps sm (18rem), md (24rem), lg (30rem), xl (40rem) and full, or content, which fits what the panel holds, up to 4rem short of the screen. When unset, content on top and bottom and md on start and end. A step wider than the screen is held to it."
266
+ "description": "The panel’s measure at rest: one of the steps sm (18rem), md (24rem), lg (30rem), xl (40rem) and full, or content, which fits what the panel holds, up to 4rem short of the screen. A step wider than the screen is held to it."
266
267
  },
267
268
  {
268
269
  "name": "mount",
@@ -466,6 +467,7 @@
466
467
  "--slotted-drawer-extent-xl",
467
468
  "--slotted-drawer-footer-surface",
468
469
  "--slotted-drawer-radius",
470
+ "--slotted-drawer-radius-expanded",
469
471
  "--slotted-drawer-resizer-line-active-color",
470
472
  "--slotted-drawer-resizer-line-color",
471
473
  "--slotted-drawer-rule-color",
@@ -122,7 +122,7 @@ export default function DrawerBasic() {
122
122
  | `snapPoints` | `readonly number[]` | — | Drawer | The stops the measure moves between, as fractions. With them an arrow key moves to the next stop, Home and End go to the first and the last, and a drag is released onto the nearest. |
123
123
  | `mode` | `'overlay' \| 'inline'` | overlay | Drawer, DrawerDefaultsProvider | overlay puts the drawer over the page, in a portal; inline puts it in your own layout. The value can change while the drawer is open, and the panel’s content and the state of its fields are kept across the change. |
124
124
  | `side` | `'start' \| 'end' \| 'top' \| 'bottom'` | end | Drawer, DrawerDefaultsProvider | The edge the panel comes from. start and end follow the writing direction, so the drawer changes sides in a right-to-left document. |
125
- | `size` | `'sm' \| 'md' \| 'lg' \| 'xl' \| 'full' \| 'content'` | md | Drawer, DrawerDefaultsProvider | The panel’s measure at rest: one of the steps sm (18rem), md (24rem), lg (30rem), xl (40rem) and full, or content, which fits what the panel holds, up to 4rem short of the screen. When unset, content on top and bottom and md on start and end. A step wider than the screen is held to it. |
125
+ | `size` | `'sm' \| 'md' \| 'lg' \| 'xl' \| 'full' \| 'content'` | content on top and bottom, md on start and end | Drawer, DrawerDefaultsProvider | The panel’s measure at rest: one of the steps sm (18rem), md (24rem), lg (30rem), xl (40rem) and full, or content, which fits what the panel holds, up to 4rem short of the screen. A step wider than the screen is held to it. |
126
126
  | `mount` | `'active' \| 'lazy' \| 'eager'` | active | Drawer, DrawerDefaultsProvider | When an overlay layer is in the document: active only while it is open or closing, lazy from the first open on, and eager from the start, inert while closed. An inline drawer is always in the document. |
127
127
  | `modal` | `boolean` | true | Drawer, DrawerDefaultsProvider | Whether the page behind is inert, its scroll is locked and focus is contained in the panel, and whether the panel carries aria-modal. The scrim is painted either way. Always false under mode="inline". |
128
128
  | `escape` | `'close' \| 'none'` | close | Drawer, DrawerDefaultsProvider | Whether Escape asks to close the drawer. Escape reaches only the topmost layer, and a layer that refuses it does not pass it to the one below. |
@@ -159,7 +159,7 @@ export default function DrawerBasic() {
159
159
  | --- | --- | --- |
160
160
  | `mode` | `overlay`, `inline` | `overlay` |
161
161
  | `side` | `start`, `end`, `top`, `bottom` | `end` |
162
- | `size` | `sm`, `md`, `lg`, `xl`, `full`, `content` | `md` |
162
+ | `size` | `sm`, `md`, `lg`, `xl`, `full`, `content` | content on top and bottom, md on start and end |
163
163
  | `mount` | `active`, `lazy`, `eager` | `active` |
164
164
  | `modal` | `true`, `false` | `true` |
165
165
  | `escape` | `close`, `none` | `close` |
@@ -180,7 +180,7 @@ export default function DrawerBasic() {
180
180
 
181
181
  ## Tokens
182
182
 
183
- `--slotted-border-strong`, `--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-icon-size-md`, `--slotted-control-inner-size-md`, `--slotted-control-radius`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-drawer-body-color`, `--slotted-drawer-border-color`, `--slotted-drawer-close-active-background`, `--slotted-drawer-close-color`, `--slotted-drawer-close-hover-background`, `--slotted-drawer-color`, `--slotted-drawer-description-color`, `--slotted-drawer-extent`, `--slotted-drawer-extent-lg`, `--slotted-drawer-extent-md`, `--slotted-drawer-extent-sm`, `--slotted-drawer-extent-xl`, `--slotted-drawer-footer-surface`, `--slotted-drawer-radius`, `--slotted-drawer-resizer-line-active-color`, `--slotted-drawer-resizer-line-color`, `--slotted-drawer-rule-color`, `--slotted-drawer-scrim`, `--slotted-drawer-sheet-inline-size`, `--slotted-drawer-surface`, `--slotted-drawer-title-color`, `--slotted-drawer-title-font-family`, `--slotted-duration-instant`, `--slotted-duration-long`, `--slotted-duration-medium`, `--slotted-duration-short`, `--slotted-easing-enter`, `--slotted-easing-exit`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-heading`, `--slotted-font-family-sans`, `--slotted-font-size-lg`, `--slotted-font-size-md`, `--slotted-font-size-xl`, `--slotted-font-weight-semibold`, `--slotted-line-height-lg`, `--slotted-line-height-md`, `--slotted-radius-full`, `--slotted-radius-lg`, `--slotted-radius-sm`, `--slotted-scrim`, `--slotted-shadow-lg`, `--slotted-space-11`, `--slotted-space-12`, `--slotted-space-2`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-space-9`, `--slotted-surface-raised`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-z-index-overlay`
183
+ `--slotted-border-strong`, `--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-icon-size-md`, `--slotted-control-inner-size-md`, `--slotted-control-radius`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-drawer-body-color`, `--slotted-drawer-border-color`, `--slotted-drawer-close-active-background`, `--slotted-drawer-close-color`, `--slotted-drawer-close-hover-background`, `--slotted-drawer-color`, `--slotted-drawer-description-color`, `--slotted-drawer-extent`, `--slotted-drawer-extent-lg`, `--slotted-drawer-extent-md`, `--slotted-drawer-extent-sm`, `--slotted-drawer-extent-xl`, `--slotted-drawer-footer-surface`, `--slotted-drawer-radius`, `--slotted-drawer-radius-expanded`, `--slotted-drawer-resizer-line-active-color`, `--slotted-drawer-resizer-line-color`, `--slotted-drawer-rule-color`, `--slotted-drawer-scrim`, `--slotted-drawer-sheet-inline-size`, `--slotted-drawer-surface`, `--slotted-drawer-title-color`, `--slotted-drawer-title-font-family`, `--slotted-duration-instant`, `--slotted-duration-long`, `--slotted-duration-medium`, `--slotted-duration-short`, `--slotted-easing-enter`, `--slotted-easing-exit`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-heading`, `--slotted-font-family-sans`, `--slotted-font-size-lg`, `--slotted-font-size-md`, `--slotted-font-size-xl`, `--slotted-font-weight-semibold`, `--slotted-line-height-lg`, `--slotted-line-height-md`, `--slotted-radius-full`, `--slotted-radius-lg`, `--slotted-radius-sm`, `--slotted-scrim`, `--slotted-shadow-lg`, `--slotted-space-11`, `--slotted-space-12`, `--slotted-space-2`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-space-9`, `--slotted-surface-raised`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-z-index-overlay`
184
184
 
185
185
  ## Examples
186
186
 
@@ -165,8 +165,8 @@ Excerpt — not a complete module
165
165
  | `listRange` | `week`, `month` | `week` |
166
166
  | `compact` | `list`, `keep` | `list` |
167
167
  | `selectionMode` | `none`, `range` | `none` |
168
- | `weekNumbers` | `off`, `on` | `false` |
169
- | `fixedWeeks` | `off`, `on` | `false` |
168
+ | `weekNumbers` | `off`, `on` | false |
169
+ | `fixedWeeks` | `off`, `on` | false |
170
170
  | `status` | `confirmed`, `tentative`, `cancelled` | — |
171
171
  | `color` | `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8` | — |
172
172
 
@@ -57,10 +57,11 @@ Every active rule, one line each. Load this first; load a topic file when the ta
57
57
  | FM-17 | SHOULD | The fields of a form are written as its direct children, in a `field-group` or in a `grid` for fields that stand side by side; the form spaces consecutive fields by `--slotted-form-field-gap`, and no field carries a margin of its own. | `forms.md` |
58
58
  | LA-01 | SHOULD | A pager under a paged region is aligned to the end of the line. | `layout-alignment.md` |
59
59
  | LA-02 | MUST | A consumer's row in the navigation column's pinned parts is inset by `--slotted-app-shell-row-inset` and starts with a mark column `--slotted-app-shell-row-mark` wide, the avatar centred in it. | `layout-alignment.md` |
60
- | LA-03 | SHOULD | Below the header's narrow step the actions beside a plain title fit on the title's line: a labelled action becomes its icon-only form, and two or more actions stand in a `toolbar` that folds into its menu. | `layout-alignment.md` |
60
+ | LA-03 | SHOULD | Below the header's narrow step the header's actions occupy one row: one action beside a plain title becomes its icon-only form, and two or more stand in a `toolbar` that folds into its menu, each item with its counterpart and the primary one without, so it stays. Beside a plain title that row is the title's line; under a rich title (visual, marks, subheading) `page-header` gives the toolbar a full row of its own. | `layout-alignment.md` |
61
61
  | LA-04 | SHOULD | Tabs that change the page's content stand in `page-header`'s `tabs` slot, not in the body. | `layout-alignment.md` |
62
62
  | LA-05 | MUST | Fields on one line are aligned to the start of the block axis, so every control of the line starts at the same height and has the same height whatever stands under it. A button on the line stands on the controls' row, not on the labels' or the help's. | `layout-alignment.md` |
63
63
  | LA-06 | MUST | The element's offset starts at the page's published `--slotted-page-sticky-top`, the measured height of the chrome that stays (the stuck page-header's title area, a sticky section's header), and an element that may be taller than what stays visible caps its height by the same property and scrolls inside. | `layout-alignment.md` |
64
+ | LA-07 | MUST | The bar holds one row below its narrow step: the action that confirms declares no counterpart and stays, every other action declares a counterpart, and the bar's overflow control ends the run. | `layout-alignment.md` |
64
65
  | LG-01 | SHOULD | The row states the signed change at the unit's own precision, what caused it as words that lead to that record, where and when it happened and who did it; a cause without a screen leads to the ledger narrowed to what that cause moved, and no identifier is shown raw. | `ledgers.md` |
65
66
  | LG-02 | SHOULD | The balance after each movement is drawn only where the ledger is narrowed to one item in one place, and it is walked back from that position's current quantity. | `ledgers.md` |
66
67
  | LP-01 | SHOULD | The grid shows the selection column, the row header and the columns of highest priority that fit; the others move into the row's pop-in as labelled values, by `priority`, outside the column state, and no row is wider than the frame. | `list-pages.md` |
@@ -73,9 +74,9 @@ Every active rule, one line each. Load this first; load a topic file when the ta
73
74
  | LP-09 | SHOULD | The queue is the list of the records the work is written against, narrowed by the states in which the work can be done and by the reader's scope, stated as the page's place; opening a row opens the form that does the work for a reader who can do it. | `list-pages.md` |
74
75
  | LP-10 | SHOULD | The chart stands in the header's second tab, beside the list's own, and never as a block above the list. | `list-pages.md` |
75
76
  | LP-11 | SHOULD | Where the primary input is a touch screen, the list tools leave out the row density: the theme raises every density's rows to the touch target, and the tools keep the sort, the views and the columns on one line. | `list-pages.md` |
76
- | LP-12 | MUST | From 600 pixels of the page's width the listing takes the height the bar and the messages leave and scrolls its own rows while the page does not scroll; below 600 the page's `fill` does not apply, the listing is as tall as its rows and the page scrolls. | `list-pages.md` |
77
+ | LP-12 | MUST | From 600 pixels of the page's width the listing takes the height the bar and the messages leave and scrolls its own rows while the page does not scroll; below 600 the page's `fill` does not apply, the listing is as tall as its rows and the page scrolls. Below 600 the grid therefore windows nothing, and a store that can pass a hundred rows is served in pages: the grid asks for the next one when its last `loadMoreThreshold` rows come into view of the page's scroller, not of its own box. | `list-pages.md` |
77
78
  | LP-13 | SHOULD | The mark takes the `sm` `size`; the default `md` belongs to a record's header and to a region with room around it. | `list-pages.md` |
78
- | LP-14 | MUST | A list that can hold more than a hundred rows, or more than twenty columns, is a `data-grid`, which windows rows and middle columns under its default `virtualize` of `auto`; `table` is for sets the page bounds, such as a statement's lines or a record's related rows. | `list-pages.md` |
79
+ | LP-14 | MUST | A list that can hold more than a hundred rows, or more than twenty columns, is a `data-grid`, which windows rows and middle columns under its default `virtualize` of `auto` wherever it has a height of its own; below 600 pixels, where it is as tall as its rows (LP-12), the store is served in pages instead. `table` is for sets the page bounds, such as a statement's lines or a record's related rows. | `list-pages.md` |
79
80
  | LP-15 | SHOULD | A grid that stands on the page's surface beside other blocks takes the `framed` `variant`; a grid that is the page's only body under a `bleed` page may stay `ruled`; `plain` is for a grid inside a `card` or a panel that already draws the frame. | `list-pages.md` |
80
81
  | LP-16 | SHOULD | A list page's header holds a subheading that says what the list covers, the control of the period when the list reads one, the page's figures for that period in the header area as label-over-figure pairs, and the primary action as the last, solid control; a refresh control is an icon button and never the only action. | `list-pages.md` |
81
82
  | LP-17 | SHOULD | The column of kind `actions` stays pinned to the end, which is the grid's default, and the row header is pinned to the start with `pinned: 'start'` when it is the first column; no other column is pinned without a reason the page states. | `list-pages.md` |
@@ -54,15 +54,15 @@ Do: Read the two published measures on the row. In the rail the words are hidden
54
54
  Don't: Write a bare avatar and text into the header, or pad the header by a number.
55
55
  Check: The header's avatar and the first destination's icon share a left edge, in the column, in the rail and in the overlay.
56
56
 
57
- ### LA-03 · A phone's header keeps its actions on the title's line
57
+ ### LA-03 · A phone's header keeps its actions on one row
58
58
 
59
59
  Level: SHOULD
60
- Applies to: what a consumer places in `page-header`'s `actions`, beside a plain title — one heading, no visual, no subheading
61
- Rule: Below the header's narrow step the actions beside a plain title fit on the title's line: a labelled action becomes its icon-only form, and two or more actions stand in a `toolbar` that folds into its menu.
62
- Why: The row wraps when the actions cannot share the line with the title, and a wrapped row under a one-line heading puts the title at the start of one line and the actions at the end of the next, aligned with nothing.
63
- Do: Write the action twice — the labelled control and its icon-only twin with the same accessible name, the same states and the same handler — and show one per side of the header's own container query. Under a rich title (visual, marks, subheading), the actions row below the title reads as a toolbar row of its own and may stay.
64
- Don't: Leave a labelled button that wraps, or shrink the control under the touch target to make it fit.
65
- Check: At the narrowest phone width with a coarse pointer, the title and its action share one line; the icon-only control has the labelled control's name.
60
+ Applies to: what a consumer places in `page-header`'s `actions`, under any title
61
+ Rule: Below the header's narrow step the header's actions occupy one row: one action beside a plain title becomes its icon-only form, and two or more stand in a `toolbar` that folds into its menu, each item with its counterpart and the primary one without, so it stays. Beside a plain title that row is the title's line; under a rich title (visual, marks, subheading) `page-header` gives the toolbar a full row of its own.
62
+ Why: Loose actions wrap, and a wrapped row under a heading puts the title at the start of one line and the actions at the end of the next, aligned with nothing; four labelled buttons in an inline row took three rows of a phone's header.
63
+ Do: Write the action twice — the labelled control and its icon-only twin with the same accessible name, the same states and the same handler — and show one per side of the header's own container query; write two or more as `toolbar` items with counterparts.
64
+ Don't: Leave labelled buttons in an inline row that wraps, or shrink a control under the touch target to make it fit.
65
+ Check: At 360 pixels with a coarse pointer, the header's actions occupy one row, and every action is reachable in it or in its menu.
66
66
 
67
67
  ### LA-04 · A page's views are the header's tabs
68
68
 
@@ -93,3 +93,13 @@ Why: An offset from the scroller's edge alone — `inset-block-start: var(--slot
93
93
  Do: Write `inset-block-start: calc(var(--slotted-page-sticky-top, 0px) + <gap>)` and, when the element can outgrow the view, `max-block-size: calc(100dvh - var(--slotted-page-sticky-top, 0px) - <room for the app's own bars>)` with `overflow: auto`.
94
94
  Don't: Measure the header in the screen's own code, or hard-code its height: the header collapses, wraps and changes with the density, and the page already measures it.
95
95
  Check: Scroll the page until the header sticks, at two scroll positions: the sticky element's top stands at or below the bottom of the stuck header's title area each time.
96
+
97
+ ### LA-07 · A page footer's action-bar holds one row on a phone
98
+
99
+ Level: MUST
100
+ Applies to: an `action-bar` in a page's footer or a detail panel's footer
101
+ Rule: The bar holds one row below its narrow step: the action that confirms declares no counterpart and stays, every other action declares a counterpart, and the bar's overflow control ends the run.
102
+ Why: A bar without an overflow control stacks its actions into a column below 24rem: three actions stood in a footer 164 pixels tall on a 358 pixel phone, a quarter of the screen that the content scrolls under.
103
+ Do: Give each action that is not the confirming one its counterpart, and close the run with the bar's overflow control.
104
+ Don't: Leave the secondary actions without counterparts, or drop the overflow control from a bar of three or more actions.
105
+ Check: At 360 pixels with a coarse pointer, the footer's actions occupy one row and the overflow control holds the actions that folded.
@@ -149,11 +149,11 @@ Check: With touch emulation at 390 pixels the filter bar's `end` slot is one lin
149
149
 
150
150
  Level: MUST
151
151
  Applies to: a page whose body is a `data-grid` or a `table` over a store, with a bar or a message above it
152
- Rule: From 600 pixels of the page's width the listing takes the height the bar and the messages leave and scrolls its own rows while the page does not scroll; below 600 the page's `fill` does not apply, the listing is as tall as its rows and the page scrolls.
152
+ Rule: From 600 pixels of the page's width the listing takes the height the bar and the messages leave and scrolls its own rows while the page does not scroll; below 600 the page's `fill` does not apply, the listing is as tall as its rows and the page scrolls. Below 600 the grid therefore windows nothing, and a store that can pass a hundred rows is served in pages: the grid asks for the next one when its last `loadMoreThreshold` rows come into view of the page's scroller, not of its own box.
153
153
  Why: Two scrollers on one screen let the wheel answer whichever is under the pointer; and on a phone a filled page left the rows 155 pixels of a 667-pixel screen under a header, a banner and the tools.
154
154
  Do: Write the page with `fill`; make the region a flex column that takes its parent's full height with a zero minimum, and give the listing `flex: 1 1 0` with `min-block-size: 0`, and below 600 pixels a flex basis of auto, so the listing fills a column that has a height and takes its rows' height in one that has none. The page's footer bar (LP-03) stays outside it.
155
155
  Don't: Keep the zero basis below 600 pixels, which collapses the listing to nothing once the column loses its height, or give it an `auto` basis above 600, where its rows' height climbs the column and the page scrolls again.
156
- Check: At 1280 with a full page of rows, the document's scroll height equals its client height and the wheel over a row moves the rows; at 375×667 the document scrolls and the grid is as tall as its rows.
156
+ Check: At 1280 with a full page of rows, the document's scroll height equals its client height and the wheel over a row moves the rows; at 375×667 the document scrolls, the grid is as tall as its rows, opening the page over a store served 30 rows at a time requests pages only until the grid's last `loadMoreThreshold` rows are below the screen's edge, and scrolling to the end requests the next one.
157
157
 
158
158
  ### LP-13 · A mark in a cell is the small step
159
159
 
@@ -169,7 +169,7 @@ Check: On every list, every `badge` and `tag` inside a cell of a `data-grid` or
169
169
 
170
170
  Level: MUST
171
171
  Applies to: a list of records whose count the reader does not bound — transactions, postings, imports
172
- Rule: A list that can hold more than a hundred rows, or more than twenty columns, is a `data-grid`, which windows rows and middle columns under its default `virtualize` of `auto`; `table` is for sets the page bounds, such as a statement's lines or a record's related rows.
172
+ Rule: A list that can hold more than a hundred rows, or more than twenty columns, is a `data-grid`, which windows rows and middle columns under its default `virtualize` of `auto` wherever it has a height of its own; below 600 pixels, where it is as tall as its rows (LP-12), the store is served in pages instead. `table` is for sets the page bounds, such as a statement's lines or a record's related rows.
173
173
  Why: `table` mounts every cell: a hundred rows of twenty columns measured 93 ms in one task with a production build of React in Chrome and 160 ms with a development build, and the count of rows the store returns sets that cost.
174
174
  Do: Give the store's list a `data-grid` with its query, and keep `table` for the bounded sets inside a record or a document.
175
175
  Don't: Render an unbounded store into a `table`, or page a `table` to keep it under a hundred rows where the grid's window would have kept the whole set reachable.
@@ -12,6 +12,10 @@
12
12
  "plain",
13
13
  "floating"
14
14
  ],
15
+ "material": [
16
+ false,
17
+ true
18
+ ],
15
19
  "size": [
16
20
  "sm",
17
21
  "md",
@@ -35,6 +39,7 @@
35
39
  "level": "1",
36
40
  "collapse": "scroll",
37
41
  "variant": "band",
42
+ "material": false,
38
43
  "expanded": true,
39
44
  "pinned": false,
40
45
  "loading": false
@@ -256,7 +261,14 @@
256
261
  "type": "'band' | 'plain' | 'floating'",
257
262
  "defaultValue": "band",
258
263
  "appliesTo": "PageHeader, PageHeaderDefaultsProvider",
259
- "description": "band is a strip of the surface with a hairline under it, the page’s own header; plain paints no ground at rest and takes the surface back once content passes under the chrome (data-stuck), for a header inside a region with a ground of its own; floating is a box with the hairline all round and rounded corners that, once stuck, slides to an inset below the scroller’s edge and lifts by a shadow, for a header that stands inside padding"
264
+ "description": "band is a strip of the surface with a hairline under it, the page’s own header; plain paints no ground at rest and takes the surface back once content passes under the chrome (data-stuck), for a header inside a region with a ground of its own; floating is a box with the hairline all round and rounded corners that, once stuck, slides to an inset below the scroller’s edge and lifts by a shadow, for a header that stands inside padding. The ground changes over --slotted-page-header-ground-duration (the medium duration) with --slotted-page-header-ground-easing (the standard easing); a duration of 0s makes the change instant"
265
+ },
266
+ {
267
+ "name": "material",
268
+ "type": "boolean",
269
+ "defaultValue": "false",
270
+ "appliesTo": "PageHeader, PageHeaderDefaultsProvider",
271
+ "description": "Once content passes under the chrome (data-stuck), its ground is the theme’s --slotted-surface-material and its backdrop filter --slotted-material-backdrop, in every variant; at rest each variant keeps its ground. --slotted-page-header-background and --slotted-page-header-backdrop-filter still win. The theme makes both opaque under prefers-reduced-transparency and forced colours"
260
272
  },
261
273
  {
262
274
  "name": "size",
@@ -412,12 +424,15 @@
412
424
  "--slotted-line-height-md",
413
425
  "--slotted-line-height-sm",
414
426
  "--slotted-line-height-xl",
427
+ "--slotted-material-backdrop",
415
428
  "--slotted-page-header-backdrop-filter",
416
429
  "--slotted-page-header-background",
417
430
  "--slotted-page-header-border",
418
431
  "--slotted-page-header-control-size",
419
432
  "--slotted-page-header-description-measure",
420
433
  "--slotted-page-header-gap",
434
+ "--slotted-page-header-ground-duration",
435
+ "--slotted-page-header-ground-easing",
421
436
  "--slotted-page-header-heading-size-lg",
422
437
  "--slotted-page-header-heading-size-md",
423
438
  "--slotted-page-header-heading-size-sm",
@@ -439,6 +454,7 @@
439
454
  "--slotted-space-5",
440
455
  "--slotted-space-6",
441
456
  "--slotted-surface",
457
+ "--slotted-surface-material",
442
458
  "--slotted-target-comfortable",
443
459
  "--slotted-target-min",
444
460
  "--slotted-text",
@@ -551,7 +567,7 @@
551
567
  {
552
568
  "id": "narrow",
553
569
  "title": "Below 600 pixels",
554
- "note": "The family answers its own inline size: the header is not sticky and scrolls away with the page, nothing collapses it on scroll and the toggle still folds the area in place; the breadcrumbs go and the way back stays, the title steps down, the subheading takes one line, and the figure takes a row above the content. Actions written as Toolbar overflow=\"menu\", each item with its counterpart, stay on the title row and fold what does not fit into the menu, where every action is still reachable; loose actions and the navigation take the row under the title.",
570
+ "note": "The family answers its own inline size: the header is not sticky and scrolls away with the page, nothing collapses it on scroll and the toggle still folds the area in place; the breadcrumbs go and the way back stays, the title steps down, the subheading takes one line, and the figure takes a row above the content. Actions written as Toolbar overflow=\"menu\", each item with its counterpart, stay on the title row beside a plain title, and take a full row of their own under a rich one (a visual, marks or a subheading); either way they fold what does not fit into the menu, where every action is still reachable; loose actions and the navigation take the row under the title.",
555
571
  "language": "tsx",
556
572
  "source": "<PageHeader>…</PageHeader>;\n",
557
573
  "verdict": "excerpt"
@@ -62,7 +62,8 @@ Excerpt — not a complete module
62
62
  | `defaultExpanded` | `boolean` | — | PageHeader | The value an uncontrolled header area starts from, read once |
63
63
  | `pinned` | `boolean` | false | PageHeader | Present means the consumer owns the pin’s state. Pinned, the whole header stays while the page scrolls |
64
64
  | `defaultPinned` | `boolean` | — | PageHeader | The value an uncontrolled pin starts from, read once |
65
- | `variant` | `'band' \| 'plain' \| 'floating'` | band | PageHeader, PageHeaderDefaultsProvider | band is a strip of the surface with a hairline under it, the page’s own header; plain paints no ground at rest and takes the surface back once content passes under the chrome (data-stuck), for a header inside a region with a ground of its own; floating is a box with the hairline all round and rounded corners that, once stuck, slides to an inset below the scroller’s edge and lifts by a shadow, for a header that stands inside padding |
65
+ | `variant` | `'band' \| 'plain' \| 'floating'` | band | PageHeader, PageHeaderDefaultsProvider | band is a strip of the surface with a hairline under it, the page’s own header; plain paints no ground at rest and takes the surface back once content passes under the chrome (data-stuck), for a header inside a region with a ground of its own; floating is a box with the hairline all round and rounded corners that, once stuck, slides to an inset below the scroller’s edge and lifts by a shadow, for a header that stands inside padding. The ground changes over --slotted-page-header-ground-duration (the medium duration) with --slotted-page-header-ground-easing (the standard easing); a duration of 0s makes the change instant |
66
+ | `material` | `boolean` | false | PageHeader, PageHeaderDefaultsProvider | Once content passes under the chrome (data-stuck), its ground is the theme’s --slotted-surface-material and its backdrop filter --slotted-material-backdrop, in every variant; at rest each variant keeps its ground. --slotted-page-header-background and --slotted-page-header-backdrop-filter still win. The theme makes both opaque under prefers-reduced-transparency and forced colours |
66
67
  | `size` | `'sm' \| 'md' \| 'lg'` | md | PageHeader, PageHeaderDefaultsProvider | The step the title sits at, on the type scale. The snapped title takes the step below |
67
68
  | `level` | `'1' \| '2' \| '3'` | 1 | PageHeader, PageHeaderDefaultsProvider | The rank of the heading, which decides its element. A page’s own header is 1 |
68
69
  | `collapse` | `'scroll' \| 'manual'` | scroll | PageHeader, PageHeaderDefaultsProvider | scroll collapses the area when it leaves the scrollport and re-opens it when it returns; manual leaves it to the toggle, the pin and the application, and the whole header stays while the page scrolls |
@@ -90,6 +91,7 @@ Excerpt — not a complete module
90
91
  | Axis | Values | Default |
91
92
  | --- | --- | --- |
92
93
  | `variant` | `band`, `plain`, `floating` | `band` |
94
+ | `material` | `false`, `true` | `false` |
93
95
  | `size` | `sm`, `md`, `lg` | `md` |
94
96
  | `level` | `1`, `2`, `3` | `1` |
95
97
  | `collapse` | `scroll`, `manual` | `scroll` |
@@ -105,7 +107,7 @@ Excerpt — not a complete module
105
107
 
106
108
  ## Tokens
107
109
 
108
- `--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-gap-md`, `--slotted-control-gap-sm`, `--slotted-control-height-md`, `--slotted-control-height-sm`, `--slotted-control-icon-size-md`, `--slotted-control-icon-size-sm`, `--slotted-control-radius`, `--slotted-disabled-foreground`, `--slotted-duration-medium`, `--slotted-duration-short`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-heading`, `--slotted-font-family-sans`, `--slotted-font-size-2xl`, `--slotted-font-size-3xl`, `--slotted-font-size-lg`, `--slotted-font-size-md`, `--slotted-font-size-sm`, `--slotted-font-size-xl`, `--slotted-font-weight-medium`, `--slotted-font-weight-semibold`, `--slotted-line-height-2xl`, `--slotted-line-height-3xl`, `--slotted-line-height-lg`, `--slotted-line-height-md`, `--slotted-line-height-sm`, `--slotted-line-height-xl`, `--slotted-page-header-backdrop-filter`, `--slotted-page-header-background`, `--slotted-page-header-border`, `--slotted-page-header-control-size`, `--slotted-page-header-description-measure`, `--slotted-page-header-gap`, `--slotted-page-header-heading-size-lg`, `--slotted-page-header-heading-size-md`, `--slotted-page-header-heading-size-sm`, `--slotted-page-header-inset`, `--slotted-page-header-padding-block`, `--slotted-page-header-radius`, `--slotted-page-header-shadow`, `--slotted-page-header-snapped-heading-size-lg`, `--slotted-page-header-snapped-heading-size-md`, `--slotted-page-header-snapped-heading-size-sm`, `--slotted-radius-full`, `--slotted-radius-lg`, `--slotted-radius-sm`, `--slotted-shadow-sm`, `--slotted-space-1`, `--slotted-space-2`, `--slotted-space-3`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-surface`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-subtle-hover`, `--slotted-tone-accent-surface`, `--slotted-tone-accent-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-toolbar-inset`, `--slotted-z-index-sticky`
110
+ `--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-gap-md`, `--slotted-control-gap-sm`, `--slotted-control-height-md`, `--slotted-control-height-sm`, `--slotted-control-icon-size-md`, `--slotted-control-icon-size-sm`, `--slotted-control-radius`, `--slotted-disabled-foreground`, `--slotted-duration-medium`, `--slotted-duration-short`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-heading`, `--slotted-font-family-sans`, `--slotted-font-size-2xl`, `--slotted-font-size-3xl`, `--slotted-font-size-lg`, `--slotted-font-size-md`, `--slotted-font-size-sm`, `--slotted-font-size-xl`, `--slotted-font-weight-medium`, `--slotted-font-weight-semibold`, `--slotted-line-height-2xl`, `--slotted-line-height-3xl`, `--slotted-line-height-lg`, `--slotted-line-height-md`, `--slotted-line-height-sm`, `--slotted-line-height-xl`, `--slotted-material-backdrop`, `--slotted-page-header-backdrop-filter`, `--slotted-page-header-background`, `--slotted-page-header-border`, `--slotted-page-header-control-size`, `--slotted-page-header-description-measure`, `--slotted-page-header-gap`, `--slotted-page-header-ground-duration`, `--slotted-page-header-ground-easing`, `--slotted-page-header-heading-size-lg`, `--slotted-page-header-heading-size-md`, `--slotted-page-header-heading-size-sm`, `--slotted-page-header-inset`, `--slotted-page-header-padding-block`, `--slotted-page-header-radius`, `--slotted-page-header-shadow`, `--slotted-page-header-snapped-heading-size-lg`, `--slotted-page-header-snapped-heading-size-md`, `--slotted-page-header-snapped-heading-size-sm`, `--slotted-radius-full`, `--slotted-radius-lg`, `--slotted-radius-sm`, `--slotted-shadow-sm`, `--slotted-space-1`, `--slotted-space-2`, `--slotted-space-3`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-surface`, `--slotted-surface-material`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-subtle-hover`, `--slotted-tone-accent-surface`, `--slotted-tone-accent-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-toolbar-inset`, `--slotted-z-index-sticky`
109
111
 
110
112
  ## Examples
111
113
 
@@ -315,7 +317,7 @@ Excerpt — not a complete module
315
317
 
316
318
  ### Below 600 pixels
317
319
 
318
- The family answers its own inline size: the header is not sticky and scrolls away with the page, nothing collapses it on scroll and the toggle still folds the area in place; the breadcrumbs go and the way back stays, the title steps down, the subheading takes one line, and the figure takes a row above the content. Actions written as Toolbar overflow="menu", each item with its counterpart, stay on the title row and fold what does not fit into the menu, where every action is still reachable; loose actions and the navigation take the row under the title.
320
+ The family answers its own inline size: the header is not sticky and scrolls away with the page, nothing collapses it on scroll and the toggle still folds the area in place; the breadcrumbs go and the way back stays, the title steps down, the subheading takes one line, and the figure takes a row above the content. Actions written as Toolbar overflow="menu", each item with its counterpart, stay on the title row beside a plain title, and take a full row of their own under a rich one (a visual, marks or a subheading); either way they fold what does not fit into the menu, where every action is still reachable; loose actions and the navigation take the row under the title.
319
321
 
320
322
  Excerpt — not a complete module
321
323
 
@@ -235,6 +235,7 @@
235
235
  "--slotted-font-family-sans",
236
236
  "--slotted-page-background-sunken",
237
237
  "--slotted-page-background-surface",
238
+ "--slotted-page-footer-backdrop-filter",
238
239
  "--slotted-page-footer-background",
239
240
  "--slotted-page-footer-border",
240
241
  "--slotted-page-footer-padding-block",