material-plus-ui 1.8.0 → 1.10.0

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 (332) hide show
  1. package/README.md +10 -6
  2. package/dist/a2ui/catalog.d.ts +104 -0
  3. package/dist/a2ui/catalog.js +1 -0
  4. package/dist/a2ui/components/MPA2uiAudioPlayer.d.ts +1 -0
  5. package/dist/a2ui/components/MPA2uiAudioPlayer.js +2 -0
  6. package/dist/a2ui/components/MPA2uiButton.d.ts +1 -0
  7. package/dist/a2ui/components/MPA2uiButton.js +2 -0
  8. package/dist/a2ui/components/MPA2uiCard.d.ts +1 -0
  9. package/dist/a2ui/components/MPA2uiCard.js +2 -0
  10. package/dist/a2ui/components/MPA2uiCheckBox.d.ts +1 -0
  11. package/dist/a2ui/components/MPA2uiCheckBox.js +2 -0
  12. package/dist/a2ui/components/MPA2uiChoicePicker.d.ts +1 -0
  13. package/dist/a2ui/components/MPA2uiChoicePicker.js +2 -0
  14. package/dist/a2ui/components/MPA2uiColumn.d.ts +1 -0
  15. package/dist/a2ui/components/MPA2uiColumn.js +2 -0
  16. package/dist/a2ui/components/MPA2uiDateTimeInput.d.ts +1 -0
  17. package/dist/a2ui/components/MPA2uiDateTimeInput.js +2 -0
  18. package/dist/a2ui/components/MPA2uiDivider.d.ts +1 -0
  19. package/dist/a2ui/components/MPA2uiDivider.js +2 -0
  20. package/dist/a2ui/components/MPA2uiIcon.d.ts +1 -0
  21. package/dist/a2ui/components/MPA2uiIcon.js +2 -0
  22. package/dist/a2ui/components/MPA2uiImage.d.ts +1 -0
  23. package/dist/a2ui/components/MPA2uiImage.js +2 -0
  24. package/dist/a2ui/components/MPA2uiList.d.ts +1 -0
  25. package/dist/a2ui/components/MPA2uiList.js +2 -0
  26. package/dist/a2ui/components/MPA2uiModal.d.ts +1 -0
  27. package/dist/a2ui/components/MPA2uiModal.js +2 -0
  28. package/dist/a2ui/components/MPA2uiRow.d.ts +1 -0
  29. package/dist/a2ui/components/MPA2uiRow.js +2 -0
  30. package/dist/a2ui/components/MPA2uiSlider.d.ts +1 -0
  31. package/dist/a2ui/components/MPA2uiSlider.js +2 -0
  32. package/dist/a2ui/components/MPA2uiTabs.d.ts +1 -0
  33. package/dist/a2ui/components/MPA2uiTabs.js +2 -0
  34. package/dist/a2ui/components/MPA2uiText.d.ts +1 -0
  35. package/dist/a2ui/components/MPA2uiText.js +2 -0
  36. package/dist/a2ui/components/MPA2uiTextField.d.ts +1 -0
  37. package/dist/a2ui/components/MPA2uiTextField.js +2 -0
  38. package/dist/a2ui/components/MPA2uiVideo.d.ts +1 -0
  39. package/dist/a2ui/components/MPA2uiVideo.js +2 -0
  40. package/dist/a2ui/extended/MPA2uiBarChart.d.ts +1 -0
  41. package/dist/a2ui/extended/MPA2uiBarChart.js +2 -0
  42. package/dist/a2ui/extended/MPA2uiDataTable.d.ts +1 -0
  43. package/dist/a2ui/extended/MPA2uiDataTable.js +2 -0
  44. package/dist/a2ui/extended/MPA2uiLineChart.d.ts +1 -0
  45. package/dist/a2ui/extended/MPA2uiLineChart.js +2 -0
  46. package/dist/a2ui/extended/MPA2uiPieChart.d.ts +1 -0
  47. package/dist/a2ui/extended/MPA2uiPieChart.js +2 -0
  48. package/dist/a2ui/extended/MPA2uiStatistic.d.ts +1 -0
  49. package/dist/a2ui/extended/MPA2uiStatistic.js +2 -0
  50. package/dist/a2ui/extended/api.d.ts +1436 -0
  51. package/dist/a2ui/extended/api.js +1 -0
  52. package/dist/a2ui/extended/chart.d.ts +26 -0
  53. package/dist/a2ui/extended/chart.js +1 -0
  54. package/dist/a2ui/index.d.ts +103 -0
  55. package/dist/a2ui/index.js +1 -0
  56. package/dist/a2ui/internal/children.d.ts +28 -0
  57. package/dist/a2ui/internal/children.js +1 -0
  58. package/dist/a2ui/internal/common.d.ts +113 -0
  59. package/dist/a2ui/internal/common.js +1 -0
  60. package/dist/a2ui/internal/icons.d.ts +3 -0
  61. package/dist/a2ui/internal/icons.js +1 -0
  62. package/dist/components/accordion/MPAccordion.d.ts +13 -0
  63. package/dist/components/accordion/MPAccordion.js +1 -1
  64. package/dist/components/accordion/index.d.ts +1 -1
  65. package/dist/components/alert/MPAlert.d.ts +1 -1
  66. package/dist/components/animate-counter/MPAnimateCounter.js +1 -1
  67. package/dist/components/animate-grow/MPAnimateGrow.d.ts +1 -1
  68. package/dist/components/animate-headline/MPAnimateHeadline.d.ts +8 -0
  69. package/dist/components/animate-headline/MPAnimateHeadline.js +1 -1
  70. package/dist/components/animate-lighting/MPAnimateLighting.js +1 -1
  71. package/dist/components/animate-marquee/MPAnimateMarquee.js +1 -1
  72. package/dist/components/animate-scramble/MPAnimateScramble.d.ts +8 -0
  73. package/dist/components/animate-scramble/MPAnimateScramble.js +1 -1
  74. package/dist/components/animate-slide/MPAnimateSlide.d.ts +1 -1
  75. package/dist/components/animate-split/MPAnimateSplit.d.ts +8 -0
  76. package/dist/components/animate-split/MPAnimateSplit.js +1 -1
  77. package/dist/components/animate-typing/MPAnimateTyping.d.ts +10 -2
  78. package/dist/components/animate-typing/MPAnimateTyping.js +1 -1
  79. package/dist/components/animate-zoom/MPAnimateZoom.d.ts +2 -2
  80. package/dist/components/app-logo/MPAppLogo.d.ts +6 -1
  81. package/dist/components/area-chart/MPAreaChart.d.ts +18 -3
  82. package/dist/components/area-chart/MPAreaChart.js +1 -1
  83. package/dist/components/avatar/MPAvatar.d.ts +17 -1
  84. package/dist/components/avatar/MPAvatar.js +1 -1
  85. package/dist/components/bar-chart/MPBarChart.d.ts +15 -5
  86. package/dist/components/bar-chart/MPBarChart.js +1 -1
  87. package/dist/components/blockquote/MPBlockquote.d.ts +1 -1
  88. package/dist/components/box/MPBox.d.ts +1 -1
  89. package/dist/components/breadcrumb/MPBreadcrumb.d.ts +8 -0
  90. package/dist/components/breadcrumb/MPBreadcrumb.js +1 -1
  91. package/dist/components/carousel/MPCarousel.js +1 -1
  92. package/dist/components/checkbox/MPCheckbox.js +1 -1
  93. package/dist/components/chip/MPChip.d.ts +1 -1
  94. package/dist/components/code-block/MPCodeBlock.js +1 -1
  95. package/dist/components/combobox/MPCombobox.js +1 -1
  96. package/dist/components/command-palette/MPCommandPalette.js +1 -1
  97. package/dist/components/config/MPConfigProvider.d.ts +17 -1
  98. package/dist/components/config/MPConfigProvider.js +1 -1
  99. package/dist/components/confirm/MPConfirmProvider.js +1 -1
  100. package/dist/components/data-table/MPDataTable.d.ts +0 -34
  101. package/dist/components/data-table/MPDataTable.js +1 -1
  102. package/dist/components/date-range-picker/MPDateRangePicker.js +1 -1
  103. package/dist/components/drawer/MPDrawer.d.ts +13 -1
  104. package/dist/components/drawer/MPDrawer.js +1 -1
  105. package/dist/components/empty/MPEmpty.d.ts +1 -1
  106. package/dist/components/file-picker/MPFilePicker.js +1 -1
  107. package/dist/components/form/MPForm.d.ts +3 -0
  108. package/dist/components/form/MPForm.js +1 -1
  109. package/dist/components/gauge-chart/MPGaugeChart.js +1 -1
  110. package/dist/components/header/MPHeader.js +1 -1
  111. package/dist/components/heatmap-chart/MPHeatmapChart.d.ts +12 -3
  112. package/dist/components/heatmap-chart/MPHeatmapChart.js +1 -1
  113. package/dist/components/image/MPImage.d.ts +5 -0
  114. package/dist/components/image/MPImage.js +1 -1
  115. package/dist/components/line-chart/MPLineChart.d.ts +20 -2
  116. package/dist/components/line-chart/MPLineChart.js +1 -1
  117. package/dist/components/locale/MPLocaleProvider.d.ts +15 -30
  118. package/dist/components/locale/MPLocaleProvider.js +1 -1
  119. package/dist/components/menu/MPMenu.d.ts +9 -1
  120. package/dist/components/menu/MPMenu.js +1 -1
  121. package/dist/components/meter/MPMeter.d.ts +5 -0
  122. package/dist/components/meter/MPMeter.js +1 -1
  123. package/dist/components/mockup/MPMockup.js +1 -1
  124. package/dist/components/navigation-menu/MPNavigationMenu.d.ts +27 -1
  125. package/dist/components/navigation-menu/MPNavigationMenu.js +1 -1
  126. package/dist/components/number-field/MPNumberField.d.ts +2 -1
  127. package/dist/components/number-field/MPNumberField.js +1 -1
  128. package/dist/components/otp-field/MPOtpField.js +1 -1
  129. package/dist/components/page-layout/MPPageLayout.js +1 -1
  130. package/dist/components/pagination/MPPagination.d.ts +8 -0
  131. package/dist/components/pagination/MPPagination.js +1 -1
  132. package/dist/components/panes/MPPanes.js +1 -1
  133. package/dist/components/pie-chart/MPPieChart.d.ts +23 -1
  134. package/dist/components/pie-chart/MPPieChart.js +1 -1
  135. package/dist/components/pill/MPPill.js +1 -1
  136. package/dist/components/progress-box/MPProgressBox.js +1 -1
  137. package/dist/components/progress-circular/MPProgressCircular.js +1 -1
  138. package/dist/components/progress-linear/MPProgressLinear.js +1 -1
  139. package/dist/components/radio-group/MPRadioGroup.js +1 -1
  140. package/dist/components/scatter-chart/MPScatterChart.d.ts +5 -1
  141. package/dist/components/scatter-chart/MPScatterChart.js +1 -1
  142. package/dist/components/sidebar/MPSidebar.d.ts +11 -0
  143. package/dist/components/sidebar/MPSidebar.js +1 -1
  144. package/dist/components/slider/MPSlider.d.ts +5 -0
  145. package/dist/components/slider/MPSlider.js +1 -1
  146. package/dist/components/snackbar/MPSnackbar.js +1 -1
  147. package/dist/components/sparkline/MPSparkline.d.ts +14 -1
  148. package/dist/components/sparkline/MPSparkline.js +1 -1
  149. package/dist/components/switch/MPSwitch.js +1 -1
  150. package/dist/components/tabs/MPTabs.js +1 -1
  151. package/dist/components/text-field/MPTextField.js +1 -1
  152. package/dist/components/timeline-chart/MPTimelineChart.d.ts +6 -2
  153. package/dist/components/timeline-chart/MPTimelineChart.js +1 -1
  154. package/dist/components/tour/MPTour.js +1 -1
  155. package/dist/components/transfer/MPTransfer.js +1 -1
  156. package/dist/components/tree-select/MPTreeSelect.js +1 -1
  157. package/dist/components/tree-view/MPTreeView.d.ts +8 -0
  158. package/dist/components/tree-view/MPTreeView.js +1 -1
  159. package/dist/components/typography/MPTypography.d.ts +1 -1
  160. package/dist/hooks/index.d.ts +4 -2
  161. package/dist/hooks/index.js +1 -1
  162. package/dist/hooks/mpColorSchemeScript.d.ts +46 -0
  163. package/dist/hooks/mpColorSchemeScript.js +1 -0
  164. package/dist/hooks/useMPColorScheme.d.ts +2 -47
  165. package/dist/hooks/useMPColorScheme.js +1 -1
  166. package/dist/hooks/useMPMediaQuery.js +1 -1
  167. package/dist/hooks/useMPOnScreen.js +1 -1
  168. package/dist/internal/Calendar.js +1 -1
  169. package/dist/internal/ChartChrome.d.ts +73 -14
  170. package/dist/internal/ChartChrome.js +1 -1
  171. package/dist/internal/ChartFrame.d.ts +24 -4
  172. package/dist/internal/ChartFrame.js +1 -1
  173. package/dist/internal/FieldOutline.d.ts +9 -1
  174. package/dist/internal/FieldOutline.js +1 -1
  175. package/dist/internal/RenderedLink.d.ts +20 -0
  176. package/dist/internal/RenderedLink.js +2 -0
  177. package/dist/internal/SupportingText.js +1 -1
  178. package/dist/internal/animate.d.ts +4 -0
  179. package/dist/internal/animate.js +1 -1
  180. package/dist/internal/box-size.d.ts +22 -0
  181. package/dist/internal/box-size.js +2 -0
  182. package/dist/internal/chart.d.ts +111 -13
  183. package/dist/internal/chart.js +1 -1
  184. package/dist/internal/color-scheme-keys.d.ts +13 -0
  185. package/dist/internal/color-scheme-keys.js +1 -0
  186. package/dist/internal/color-scheme.d.ts +11 -2
  187. package/dist/internal/color-scheme.js +1 -1
  188. package/dist/internal/config.d.ts +2 -0
  189. package/dist/internal/date.d.ts +2 -8
  190. package/dist/internal/date.js +1 -1
  191. package/dist/internal/highlight.js +1 -1
  192. package/dist/internal/i18n.d.ts +4 -53
  193. package/dist/internal/i18n.js +1 -1
  194. package/dist/internal/intersection.d.ts +50 -0
  195. package/dist/internal/intersection.js +2 -0
  196. package/dist/internal/intl.d.ts +22 -21
  197. package/dist/internal/intl.js +1 -1
  198. package/dist/internal/keys.d.ts +0 -9
  199. package/dist/internal/keys.js +1 -1
  200. package/dist/internal/layout-effect.d.ts +7 -0
  201. package/dist/internal/layout-effect.js +2 -0
  202. package/dist/internal/locale.d.ts +10 -2
  203. package/dist/internal/media.d.ts +1 -0
  204. package/dist/internal/media.js +1 -0
  205. package/dist/internal/messages/chart.d.ts +1 -1
  206. package/dist/internal/messages/chart.js +1 -1
  207. package/dist/internal/occurrence.d.ts +18 -0
  208. package/dist/internal/occurrence.js +1 -0
  209. package/dist/internal/page-layout.js +1 -1
  210. package/dist/internal/progress.d.ts +5 -0
  211. package/dist/internal/ref.d.ts +9 -0
  212. package/dist/internal/ref.js +1 -0
  213. package/dist/internal/remember.d.ts +36 -0
  214. package/dist/internal/remember.js +1 -0
  215. package/dist/internal/surface.d.ts +7 -1
  216. package/dist/internal/surface.js +1 -1
  217. package/dist/internal/text.d.ts +10 -4
  218. package/dist/internal/text.js +1 -1
  219. package/dist/internal/window-class.d.ts +8 -0
  220. package/dist/internal/window-class.js +1 -1
  221. package/dist/locales/ar.js +1 -1
  222. package/dist/locales/de.js +1 -1
  223. package/dist/locales/es.js +1 -1
  224. package/dist/locales/fr.js +1 -1
  225. package/dist/locales/hi.js +1 -1
  226. package/dist/locales/id.js +1 -1
  227. package/dist/locales/it.js +1 -1
  228. package/dist/locales/ja.js +1 -1
  229. package/dist/locales/ko.js +1 -1
  230. package/dist/locales/nl.js +1 -1
  231. package/dist/locales/pl.js +1 -1
  232. package/dist/locales/pt.js +1 -1
  233. package/dist/locales/ru.js +1 -1
  234. package/dist/locales/th.js +1 -1
  235. package/dist/locales/tr.js +1 -1
  236. package/dist/locales/vi.js +1 -1
  237. package/dist/locales/zh-hans.js +1 -1
  238. package/dist/locales/zh-hant.js +1 -1
  239. package/dist/styles/accordion.css +1 -1
  240. package/dist/styles/alert.css +1 -1
  241. package/dist/styles/animate-appear.css +1 -1
  242. package/dist/styles/animate-blink.css +1 -1
  243. package/dist/styles/animate-counter.css +1 -1
  244. package/dist/styles/animate-fade.css +1 -1
  245. package/dist/styles/animate-float.css +1 -1
  246. package/dist/styles/animate-grow.css +1 -1
  247. package/dist/styles/animate-headline.css +1 -1
  248. package/dist/styles/animate-lighting.css +1 -1
  249. package/dist/styles/animate-marquee.css +1 -1
  250. package/dist/styles/animate-reveal.css +1 -1
  251. package/dist/styles/animate-rotate.css +1 -1
  252. package/dist/styles/animate-scramble.css +1 -1
  253. package/dist/styles/animate-shake.css +1 -1
  254. package/dist/styles/animate-slide.css +1 -1
  255. package/dist/styles/animate-split.css +1 -1
  256. package/dist/styles/animate-typing.css +1 -1
  257. package/dist/styles/animate-zoom.css +1 -1
  258. package/dist/styles/area-chart.css +1 -1
  259. package/dist/styles/avatar.css +1 -1
  260. package/dist/styles/bar-chart.css +1 -1
  261. package/dist/styles/blockquote.css +1 -1
  262. package/dist/styles/box.css +1 -1
  263. package/dist/styles/breadcrumb.css +1 -1
  264. package/dist/styles/calendar.css +1 -1
  265. package/dist/styles/card.css +1 -1
  266. package/dist/styles/carousel.css +1 -1
  267. package/dist/styles/checkbox.css +1 -1
  268. package/dist/styles/chip.css +1 -1
  269. package/dist/styles/collapsible.css +1 -1
  270. package/dist/styles/color-picker.css +1 -1
  271. package/dist/styles/combobox.css +1 -1
  272. package/dist/styles/command-palette.css +1 -1
  273. package/dist/styles/confirm.css +1 -1
  274. package/dist/styles/data-table.css +1 -1
  275. package/dist/styles/date-picker.css +1 -1
  276. package/dist/styles/date-range-picker.css +1 -1
  277. package/dist/styles/date-time-picker.css +1 -1
  278. package/dist/styles/dialog.css +1 -1
  279. package/dist/styles/drawer.css +1 -1
  280. package/dist/styles/empty.css +1 -1
  281. package/dist/styles/floating-bottom-navigation.css +1 -1
  282. package/dist/styles/footer.css +1 -1
  283. package/dist/styles/gauge-chart.css +1 -1
  284. package/dist/styles/header.css +1 -1
  285. package/dist/styles/heatmap-chart.css +1 -1
  286. package/dist/styles/highlight.css +1 -1
  287. package/dist/styles/hover-card.css +1 -1
  288. package/dist/styles/image.css +1 -1
  289. package/dist/styles/line-chart.css +1 -1
  290. package/dist/styles/list.css +1 -1
  291. package/dist/styles/menu.css +1 -1
  292. package/dist/styles/menubar.css +1 -1
  293. package/dist/styles/meter.css +1 -1
  294. package/dist/styles/navigation-menu.css +1 -1
  295. package/dist/styles/number-field.css +1 -1
  296. package/dist/styles/otp-field.css +1 -1
  297. package/dist/styles/overlay.css +1 -1
  298. package/dist/styles/page-layout.css +1 -1
  299. package/dist/styles/pie-chart.css +1 -1
  300. package/dist/styles/pill.css +1 -1
  301. package/dist/styles/popconfirm.css +1 -1
  302. package/dist/styles/popover.css +1 -1
  303. package/dist/styles/progress-box.css +1 -1
  304. package/dist/styles/progress-circular.css +1 -1
  305. package/dist/styles/progress-linear.css +1 -1
  306. package/dist/styles/radio-group.css +1 -1
  307. package/dist/styles/scatter-chart.css +1 -1
  308. package/dist/styles/select.css +1 -1
  309. package/dist/styles/sidebar.css +1 -1
  310. package/dist/styles/slider.css +1 -1
  311. package/dist/styles/snackbar.css +1 -1
  312. package/dist/styles/sparkline.css +1 -1
  313. package/dist/styles/spoiler.css +1 -1
  314. package/dist/styles/stack.css +1 -1
  315. package/dist/styles/statistic.css +1 -1
  316. package/dist/styles/switch.css +1 -1
  317. package/dist/styles/table.css +1 -1
  318. package/dist/styles/tabs.css +1 -1
  319. package/dist/styles/text-field.css +1 -1
  320. package/dist/styles/time-picker.css +1 -1
  321. package/dist/styles/timeline-chart.css +1 -1
  322. package/dist/styles/tokens.css +1 -1
  323. package/dist/styles/toolbar.css +1 -1
  324. package/dist/styles/tour.css +1 -1
  325. package/dist/styles/transfer.css +1 -1
  326. package/dist/styles/tree-select.css +1 -1
  327. package/dist/styles/tree-view.css +1 -1
  328. package/dist/styles/typography.css +1 -1
  329. package/dist/styles.css +1 -1
  330. package/dist/tailwind.css +116 -4
  331. package/dist/types.d.ts +208 -1
  332. package/package.json +25 -4
package/dist/tailwind.css CHANGED
@@ -95,6 +95,27 @@
95
95
  * Only the *derived* colours need it. Everything else here is a literal value
96
96
  * with no `var()` to freeze, so plain inheritance from `:root` is enough.
97
97
  *
98
+ * ## Why `*` and `::backdrop`, but not `::before` and `::after`
99
+ *
100
+ * The rule reaches every element of the page it is loaded into, not only the
101
+ * ones this library rendered, so what it costs per element is a cost to the
102
+ * whole page. A `::before` or `::after` in the selector multiplies it: a
103
+ * browser has to resolve both pseudo-elements of every element on the page to
104
+ * find out whether either one draws anything, and resolving each one means
105
+ * substituting all of the roles below again.
106
+ *
107
+ * Neither needs its own copy. A `::before` and an `::after` inherit from the
108
+ * element they belong to, which already holds the roles as resolved where it
109
+ * sits, and nothing sets a source colour, a tone stop or a role on a
110
+ * pseudo-element — so the copy they would compute is the copy they inherit.
111
+ * `::placeholder` and `::marker` have always been read this way. `::backdrop`
112
+ * stays, because before 2024 it inherited from nothing at all.
113
+ *
114
+ * Measured on a plain page of 1,430 elements with nothing of this library on
115
+ * it, the first style pass took 164ms in WebKit with the pseudo-elements in the
116
+ * selector and 21ms without them, against 9ms with no stylesheet at all;
117
+ * Firefox went from 68ms to 26ms. iOS runs every browser on WebKit.
118
+ *
98
119
  * The computed results are `--_mp-*`: private, read by the components, and not
99
120
  * a name to set. Material Web marks its own internal tokens the same way. The
100
121
  * indirection is load-bearing — it is what keeps a consumer's
@@ -530,8 +551,6 @@
530
551
  * passes the edge by less than 4% of one channel.
531
552
  */
532
553
  *,
533
- ::before,
534
- ::after,
535
554
  ::backdrop {
536
555
  /*
537
556
  * The grey each accent tone sits on, in linear light: an OKLCh lightness
@@ -2045,8 +2064,6 @@
2045
2064
  }
2046
2065
 
2047
2066
  *,
2048
- ::before,
2049
- ::after,
2050
2067
  ::backdrop {
2051
2068
  --_mp-color-primary: var(
2052
2069
  --mp-sys-color-primary,
@@ -3849,6 +3866,21 @@
3849
3866
  }
3850
3867
  }
3851
3868
 
3869
+ /*
3870
+ * And the same for a page read without JavaScript.
3871
+ *
3872
+ * An entrance waiting for `trigger="visible"`, `manual` or `hover` sits paused
3873
+ * on its first frame until script starts it, and with no script that is
3874
+ * forever: the content was in the markup and drawn at `opacity: 0`, invisible
3875
+ * to the reader and present for nobody but a crawler. With scripting off the
3876
+ * entrance is dropped and the content shown, which is what it was carrying.
3877
+ */
3878
+ @media (scripting: none) {
3879
+ .mp-anim {
3880
+ animation: none;
3881
+ }
3882
+ }
3883
+
3852
3884
  /*
3853
3885
  * Lighting: a light travelling around the outside of something.
3854
3886
  *
@@ -3917,6 +3949,23 @@
3917
3949
  }
3918
3950
  }
3919
3951
 
3952
+ /*
3953
+ * The endless loops, held while they are off screen.
3954
+ *
3955
+ * `data-mp-offscreen` is written by the component while its element is out of
3956
+ * the viewport. A loop nobody can see is still one the browser runs — a style
3957
+ * pass a frame for the glow's angle, and a layout pass a frame for the linear
3958
+ * indicator, whose bars move by `inset`. Paused, each carries on from where it
3959
+ * stopped when it comes back, which for a loop is no difference at all.
3960
+ */
3961
+ .mp-anim-lighting[data-mp-offscreen]::before,
3962
+ .mp-progress-linear[data-mp-offscreen] .mp-progress-linear-lead,
3963
+ .mp-progress-linear[data-mp-offscreen] .mp-progress-linear-trail,
3964
+ .mp-progress-circular[data-mp-offscreen] .mp-progress-circular-turn,
3965
+ .mp-progress-circular[data-mp-offscreen] .mp-progress-circular-arc {
3966
+ animation-play-state: paused;
3967
+ }
3968
+
3920
3969
  /*
3921
3970
  * Marquee: two identical copies, both moving by exactly one copy plus the gap.
3922
3971
  *
@@ -4469,3 +4518,66 @@
4469
4518
  inline-size: calc(var(--_mp-tree-indent) / 2 - 2px);
4470
4519
  border-block-start: 1px solid var(--_mp-color-outline-variant);
4471
4520
  }
4521
+
4522
+ /* ---------------------------------------------------------------------------
4523
+ * A fixed header's room, before the layout has measured it
4524
+ *
4525
+ * `MPPageLayout` keeps a fixed `MPHeader` from covering the top of the page by
4526
+ * measuring the bar and padding the page by its height. The measurement is an
4527
+ * effect, so on a server-rendered page the content was drawn under the bar and
4528
+ * then pushed down by its height once the page had hydrated — a layout shift
4529
+ * of a whole header's worth, on every page with one.
4530
+ *
4531
+ * These give the padding a first answer that needs no script: a fixed bar's
4532
+ * height is its size's rung on the ladder, plus a pixel for the rule an
4533
+ * `outlined` one draws under itself. The measurement still wins the moment it
4534
+ * arrives, and it then moves nothing unless the bar's content made it taller
4535
+ * than its rung. Only a bar that is the layout's own header is counted — the
4536
+ * slot it sits in when the header spans the page, or the content column's when
4537
+ * it does not — so a layout nested inside another does not answer for it.
4538
+ *
4539
+ * In a browser without `:has()` there is no first answer, which is how every
4540
+ * browser behaved before.
4541
+ * ------------------------------------------------------------------------- */
4542
+
4543
+ .mp-page-layout:is(
4544
+ :has(> .mp-header[data-mp-position='fixed'][data-mp-variant='outlined']),
4545
+ :has(> div > div > .mp-header[data-mp-position='fixed'][data-mp-variant='outlined'])
4546
+ ) {
4547
+ --_mp-layout-header-rule: 1px;
4548
+ }
4549
+
4550
+ .mp-page-layout:is(
4551
+ :has(> .mp-header[data-mp-position='fixed'][data-mp-size='xs']),
4552
+ :has(> div > div > .mp-header[data-mp-position='fixed'][data-mp-size='xs'])
4553
+ ) {
4554
+ --_mp-layout-header-seed: calc(3rem + var(--_mp-layout-header-rule, 0px));
4555
+ }
4556
+
4557
+ .mp-page-layout:is(
4558
+ :has(> .mp-header[data-mp-position='fixed'][data-mp-size='sm']),
4559
+ :has(> div > div > .mp-header[data-mp-position='fixed'][data-mp-size='sm'])
4560
+ ) {
4561
+ --_mp-layout-header-seed: calc(3.5rem + var(--_mp-layout-header-rule, 0px));
4562
+ }
4563
+
4564
+ .mp-page-layout:is(
4565
+ :has(> .mp-header[data-mp-position='fixed'][data-mp-size='md']),
4566
+ :has(> div > div > .mp-header[data-mp-position='fixed'][data-mp-size='md'])
4567
+ ) {
4568
+ --_mp-layout-header-seed: calc(4rem + var(--_mp-layout-header-rule, 0px));
4569
+ }
4570
+
4571
+ .mp-page-layout:is(
4572
+ :has(> .mp-header[data-mp-position='fixed'][data-mp-size='lg']),
4573
+ :has(> div > div > .mp-header[data-mp-position='fixed'][data-mp-size='lg'])
4574
+ ) {
4575
+ --_mp-layout-header-seed: calc(5rem + var(--_mp-layout-header-rule, 0px));
4576
+ }
4577
+
4578
+ .mp-page-layout:is(
4579
+ :has(> .mp-header[data-mp-position='fixed'][data-mp-size='xl']),
4580
+ :has(> div > div > .mp-header[data-mp-position='fixed'][data-mp-size='xl'])
4581
+ ) {
4582
+ --_mp-layout-header-seed: calc(6rem + var(--_mp-layout-header-rule, 0px));
4583
+ }
package/dist/types.d.ts CHANGED
@@ -309,8 +309,70 @@ export interface MPTimelineSeries {
309
309
  /** Overrides the palette slot this row would otherwise take. */
310
310
  color?: MPColor | (string & {});
311
311
  }
312
+ /**
313
+ * How the series of a stacking chart are piled up.
314
+ *
315
+ * - `false` — side by side, or overlapping. The parts are compared with each
316
+ * other.
317
+ * - `true` — on each other, so the far edge is the total. The totals are
318
+ * compared and the parts make them up.
319
+ * - `'percent'` — on each other and normalised, so every column is full. The
320
+ * **composition** is compared and the totals are gone from the picture.
321
+ *
322
+ * A percent stack answers "what is this made of" and refuses to answer "how
323
+ * much of it is there", which is the trade it makes and the reason it is a
324
+ * third setting rather than a flag on the second. Two columns of wildly
325
+ * different size are drawn identically, so the total belongs somewhere else on
326
+ * the page — a figure beside the chart, or a second chart.
327
+ *
328
+ * A negative has no share of a whole, so a percent stack leaves it out the way
329
+ * `MPPieChart` does. The table behind the chart still has the number.
330
+ */
331
+ export type MPChartStack = boolean | 'percent';
312
332
  /** How a line gets from one point to the next. */
313
333
  export type MPChartCurve = 'linear' | 'smooth' | 'step';
334
+ /**
335
+ * What a line or an area does where a series has no value.
336
+ *
337
+ * - `break` — the line stops and starts again on the far side. The default,
338
+ * because a straight run through values nobody has is the one kind of
339
+ * invented data a reader never questions: it looks exactly like the rest of
340
+ * the line.
341
+ * - `connect` — the two sides are joined, and the joining run is drawn
342
+ * **dashed** so the picture still says which part of it was measured. An
343
+ * area's fill closes across the gap as well.
344
+ * - `zero` — the missing reading is drawn at zero, and the value axis is
345
+ * widened to hold it. Right where a gap really does mean "none of it
346
+ * happened", and wrong where it means "nobody was counting".
347
+ *
348
+ * Only the drawing changes. The hover panel and the table behind the chart
349
+ * still report a gap as a gap, whichever of the three is chosen, because they
350
+ * are the copy of the data a reader gets when they need the number itself.
351
+ */
352
+ export type MPChartGaps = 'break' | 'connect' | 'zero';
353
+ /**
354
+ * What an axis does with a tick label too wide for the room it has.
355
+ *
356
+ * - `auto` — leaves the labels flat while they fit and turns them when they do
357
+ * not. The default, because flat labels are what a reader takes in fastest
358
+ * and a name cut to "Onbo…" has lost the thing it was there to say.
359
+ * - `truncate` — cuts a long label with an ellipsis and never turns anything.
360
+ * - `rotate` — turns every label 45°.
361
+ * - `vertical` — stands every label on end.
362
+ *
363
+ * The last two turn **all** of the labels rather than only the long ones: a row
364
+ * at two different angles is a row a reader has to scan twice.
365
+ *
366
+ * Only the axis along the **bottom** reads it. Labels stacked up the side
367
+ * already have a row each, which is the room a turn would be buying them.
368
+ *
369
+ * And `auto` turns names rather than ticks. A value axis is a ruler, so showing
370
+ * every nth of its labels loses nothing a reader cannot interpolate; where the
371
+ * bottom of a chart is one — a bar chart on its side, a scatter — `auto` leaves
372
+ * it striding. `rotate` and `vertical` still apply there when they are asked
373
+ * for by name.
374
+ */
375
+ export type MPChartTickLabels = 'auto' | 'truncate' | 'rotate' | 'vertical';
314
376
  /**
315
377
  * Which values are written onto the marks themselves.
316
378
  *
@@ -320,6 +382,20 @@ export type MPChartCurve = 'linear' | 'smooth' | 'step';
320
382
  * `all` is there for the eight-bar chart where it genuinely is the answer.
321
383
  */
322
384
  export type MPChartValueLabels = 'none' | 'last' | 'extremes' | 'all';
385
+ /**
386
+ * What ink a chart writes the text naming a series in.
387
+ *
388
+ * `'ink'` is `on-surface-variant` — one colour for every name, whichever mark
389
+ * it belongs to. `'series'` matches the name to its mark, which pairs a long
390
+ * legend with a crowded plot faster than a swatch alone can.
391
+ *
392
+ * The trade is contrast. The eight palette slots are fitted to 3:1 against the
393
+ * surface, which is the bar a **mark** has to clear; small text is held to
394
+ * 4.5:1, and a series colour does not reach it. So the swatch carries the
395
+ * colour by default and the word stays legible, and this is the caller saying
396
+ * their chart is better off the other way round.
397
+ */
398
+ export type MPChartLabelColor = 'ink' | 'series';
323
399
  /**
324
400
  * What the pointer uncovers.
325
401
  *
@@ -348,13 +424,42 @@ export interface MPChartTooltipItem {
348
424
  export interface MPChartTooltipContext {
349
425
  index: number;
350
426
  category: MPChartCategory;
351
- /** Only the series that are visible and have a value here. */
427
+ /** Only the series that are visible and have a value here, in `sort`'s order. */
352
428
  items: readonly MPChartTooltipItem[];
429
+ /** What they add up to, where the chart is a picture of that sum. */
430
+ total?: string;
353
431
  }
432
+ /**
433
+ * What order the rows of a hover panel come in.
434
+ *
435
+ * - `series` — the order they were passed, which is the order the legend lists
436
+ * them in and the order the colours were handed out in. A reader who has
437
+ * learned the legend can find a row without reading it.
438
+ * - `value` — largest first. What a chart of eight series wants: the row a
439
+ * reader is looking for is usually the big one, and hunting for it down a
440
+ * list in a fixed order is the work the panel exists to save.
441
+ *
442
+ * Neither is right for every chart, which is why there is a prop. Ties keep
443
+ * their series order, so a panel never reorders itself over nothing.
444
+ */
445
+ export type MPChartTooltipSort = 'series' | 'value';
354
446
  /** The hover layer, where `true` and `false` are not enough. */
355
447
  export interface MPChartTooltip {
356
448
  /** @default 'index', or 'item' where the marks are not arranged in columns */
357
449
  mode?: MPChartTooltipMode;
450
+ /** @default 'series' */
451
+ sort?: MPChartTooltipSort;
452
+ /**
453
+ * Adds a row for what the column adds up to.
454
+ *
455
+ * On by default where the chart **is** that total — a stack, whose whole
456
+ * point is the height of the column — and off everywhere else. A percent
457
+ * stack is left out of that: its total is 100% at every category, and a row
458
+ * that says the same thing four times is a row nobody reads. An unstacked
459
+ * chart is off because its series are not parts of anything, and adding them
460
+ * up would be the panel inventing a quantity.
461
+ */
462
+ total?: boolean;
358
463
  /**
359
464
  * The line dropped through the plot at the active category. On in `index`
360
465
  * mode and never drawn in `item` mode: a crosshair says "these numbers all
@@ -402,12 +507,114 @@ export interface MPChartAxis {
402
507
  tickCount?: number;
403
508
  /** How a tick is written, overriding the chart's own `format`. */
404
509
  tickFormat?: (value: MPChartCategory, index: number) => React.ReactNode;
510
+ /**
511
+ * What to do with a label too wide for the room it has: cut it, or turn it.
512
+ *
513
+ * Read by the axis along the **bottom** only — the category axis on an
514
+ * upright chart, and the value axis on one turned on its side. Labels down
515
+ * the left already have a row each.
516
+ * @default 'auto'
517
+ */
518
+ tickLabels?: MPChartTickLabels;
405
519
  /**
406
520
  * How much room it keeps for its ticks and its label, in pixels. Measured off
407
521
  * the ticks themselves otherwise. Set it when a long category name needs
408
522
  * more, or when two charts stacked on a dashboard have to line their plots up.
409
523
  */
410
524
  thickness?: number;
525
+ /**
526
+ * Lines and bands drawn across the plot at places on **this** axis' scale — a
527
+ * target, a threshold, the range a reading should stay inside.
528
+ *
529
+ * The scale is widened to hold them, because a target the plot is cropped
530
+ * above is a target nobody can see. Pin `min` or `max` to stop that.
531
+ *
532
+ * Read by an axis that has a scale: the value axis always, and the category
533
+ * axis where it runs on numbers rather than on names. A row of categories has
534
+ * no place between two of them for a line to be at.
535
+ */
536
+ references?: readonly MPChartReference[];
537
+ }
538
+ /**
539
+ * A line drawn across the plot at a place on one of its scales, or a band where
540
+ * it has two ends.
541
+ *
542
+ * A target, a service level, the day a release went out, the range a reading is
543
+ * meant to stay inside. It is **not** data: it is a fact the reader brought
544
+ * with them, so it is drawn in the chrome's ink rather than out of the series
545
+ * palette, and a chart is never asked to invent one.
546
+ *
547
+ * The axis it is given to is the scale its `value` is on, which is also the
548
+ * axis it is drawn perpendicular to — a reference on the value axis of an
549
+ * upright chart is a horizontal line, and the same reference on a chart turned
550
+ * on its side is a vertical one.
551
+ */
552
+ export interface MPChartReference {
553
+ /**
554
+ * Where it sits, on that axis' own scale. A `Date` on an axis of dates, which
555
+ * is the one place a reference is most often asked for — today, a release, a
556
+ * deadline.
557
+ */
558
+ value: number | Date;
559
+ /**
560
+ * And where it ends, which makes it a **band** rather than a line: the range
561
+ * a reading should stay inside, the window something was down for.
562
+ */
563
+ to?: number | Date;
564
+ /**
565
+ * What it is called, written at its own end of the line and read out with the
566
+ * chart. A line nobody can name is a line nobody can use.
567
+ */
568
+ label?: React.ReactNode;
569
+ /**
570
+ * Which family it wears. An `MPColor`, or any CSS colour.
571
+ *
572
+ * The outline role by default, which is what keeps a reference reading as
573
+ * chrome rather than as another series. `error` is the one worth reaching
574
+ * for: a threshold somebody is watching is exactly what that role is for.
575
+ */
576
+ color?: MPColor | (string & {});
577
+ /**
578
+ * Draws it dashed, so it cannot be mistaken for a gridline or a baseline.
579
+ * @default true
580
+ */
581
+ dashed?: boolean;
582
+ }
583
+ /**
584
+ * Dragging a range out of a long category axis.
585
+ *
586
+ * What it is for is the chart with ninety points on it, where the shape of one
587
+ * week is inside a picture of a quarter. A reader drags across the plot, the
588
+ * chart redraws to what they picked, and the scale re-fits to it — so the
589
+ * window is a *chart of that range* rather than a magnified picture of the
590
+ * whole one.
591
+ *
592
+ * Everything follows the window: the value scale, the hover panel, the spoken
593
+ * readout and the table behind the picture. The table is what a reader who
594
+ * cannot see the plot is given **instead** of it, so a table still listing
595
+ * ninety points would be describing a chart that is not on the page.
596
+ *
597
+ * Only a chart whose categories are a row of slots takes it. A scatter has two
598
+ * value axes and no row to cut, and a pie has no axis at all.
599
+ */
600
+ export interface MPChartZoom {
601
+ /**
602
+ * The range drawn, as a first and last **category index**, or `null` for all
603
+ * of them. Use with `onRangeChange` for a controlled window.
604
+ */
605
+ range?: readonly [number, number] | null;
606
+ /** Where the window starts out. Ignored once `range` is given. */
607
+ defaultRange?: readonly [number, number] | null;
608
+ /** Called with what the reader dragged, and with `null` when they reset it. */
609
+ onRangeChange?: (range: readonly [number, number] | null) => void;
610
+ /**
611
+ * The fewest categories a drag may leave.
612
+ *
613
+ * Two, because a window of one category is not a chart of anything — there is
614
+ * no distance left in it for a line to have travelled.
615
+ * @default 2
616
+ */
617
+ min?: number;
411
618
  }
412
619
  /** Where the legend sits, and what it does when it is used. */
413
620
  export interface MPChartLegend {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "material-plus-ui",
3
- "version": "1.8.0",
3
+ "version": "1.10.0",
4
4
  "description": "A React component library written from the Material Design 3 specification and extended past it — wider versions of the components it names, and the charts, data table and command palette it does not. Built on Base UI and Tailwind CSS v4, themed with CSS custom properties so it coexists with an existing Material setup. ESM only, types included.",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -18,7 +18,7 @@
18
18
  "url": "https://github.com/jooy2/material-plus-ui/issues"
19
19
  },
20
20
  "scripts": {
21
- "build": "npm run format:fix && node scripts/clean-dist.mjs && tsc --project tsconfig.prod.json && node scripts/specify-imports.mjs && node scripts/annotate-pure.mjs && npm run minify && node scripts/mark-client.mjs && node scripts/build-styles.mjs && node scripts/build-split-styles.mjs && node scripts/measure-bundle.mjs",
21
+ "build": "npm run format:fix && node scripts/clean-dist.mjs && tsc --project tsconfig.prod.json && node scripts/specify-imports.mjs && node scripts/annotate-pure.mjs && npm run minify && node scripts/mark-client.mjs && node scripts/build-styles.mjs && node scripts/build-split-styles.mjs && node scripts/build-a2ui-catalog.mjs && node scripts/measure-bundle.mjs",
22
22
  "lint": "eslint . --ext .js,.ts .",
23
23
  "lint:fix": "eslint . --ext .js,.ts --fix .",
24
24
  "minify": "terser-glob 'dist/**/*.js' --config-file terser.config.json",
@@ -59,6 +59,11 @@
59
59
  "module": "./dist/hooks/index.js",
60
60
  "default": "./dist/hooks/index.js"
61
61
  },
62
+ "./a2ui": {
63
+ "types": "./dist/a2ui/index.d.ts",
64
+ "module": "./dist/a2ui/index.js",
65
+ "default": "./dist/a2ui/index.js"
66
+ },
62
67
  "./components/*": {
63
68
  "types": "./dist/components/*/index.d.ts",
64
69
  "module": "./dist/components/*/index.js",
@@ -124,6 +129,8 @@
124
129
  "composition"
125
130
  ],
126
131
  "devDependencies": {
132
+ "@a2ui/react": "^0.11.1",
133
+ "@a2ui/web_core": "^0.11.0",
127
134
  "@base-ui/react": "^1.8.0",
128
135
  "@eslint/js": "^9.39.1",
129
136
  "@tailwindcss/postcss": "^4.3.3",
@@ -156,21 +163,35 @@
156
163
  "vitepress-i18n": "^1.4.0",
157
164
  "vitepress-sidebar": "^1.40.0",
158
165
  "vitest": "^5.0.1",
159
- "vitest-browser-react": "^2.3.0"
166
+ "vitest-browser-react": "^2.3.0",
167
+ "zod": "^3.25.76",
168
+ "zod-to-json-schema": "^3.25.2"
160
169
  },
161
170
  "dependencies": {
162
171
  "highlight.js": "^11.12.0",
163
172
  "lucide-react": "^1.47.0"
164
173
  },
165
174
  "peerDependencies": {
175
+ "@a2ui/react": "^0.11.0",
176
+ "@a2ui/web_core": "^0.11.0",
166
177
  "@base-ui/react": "^1.7.0",
167
178
  "@types/react": "^18.0.0 || ^19.0.0",
168
179
  "react": "^18.0.0 || ^19.0.0",
169
- "react-dom": "^18.0.0 || ^19.0.0"
180
+ "react-dom": "^18.0.0 || ^19.0.0",
181
+ "zod": "^3.25.76"
170
182
  },
171
183
  "peerDependenciesMeta": {
184
+ "@a2ui/react": {
185
+ "optional": true
186
+ },
187
+ "@a2ui/web_core": {
188
+ "optional": true
189
+ },
172
190
  "@types/react": {
173
191
  "optional": true
192
+ },
193
+ "zod": {
194
+ "optional": true
174
195
  }
175
196
  }
176
197
  }