@react-md/core 6.3.4 → 6.5.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 (477) hide show
  1. package/dist/CoreProviders.d.ts +1 -0
  2. package/dist/CoreProviders.js.map +1 -1
  3. package/dist/_a11y.scss +3 -1
  4. package/dist/_base.scss +3 -0
  5. package/dist/_box-shadows.scss +20 -12
  6. package/dist/_core.scss +2 -1
  7. package/dist/_utils.scss +32 -10
  8. package/dist/app-bar/AppBar.js.map +1 -1
  9. package/dist/app-bar/AppBarTitle.js.map +1 -1
  10. package/dist/app-bar/_app-bar.scss +3 -3
  11. package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -1
  12. package/dist/autocomplete/_autocomplete.scss +20 -16
  13. package/dist/autocomplete/types.js.map +1 -1
  14. package/dist/autocomplete/utils.js.map +1 -1
  15. package/dist/avatar/Avatar.js.map +1 -1
  16. package/dist/avatar/_avatar.scss +2 -1
  17. package/dist/button/Button.js.map +1 -1
  18. package/dist/button/FloatingActionButton.js.map +1 -1
  19. package/dist/button/_button.scss +9 -5
  20. package/dist/card/Card.js.map +1 -1
  21. package/dist/card/CardContent.js.map +1 -1
  22. package/dist/card/ClickableCard.js.map +1 -1
  23. package/dist/card/_card.scss +6 -6
  24. package/dist/chip/Chip.js.map +1 -1
  25. package/dist/chip/_chip.scss +6 -6
  26. package/dist/datetime/NativeDateField.js.map +1 -1
  27. package/dist/datetime/NativeTimeField.js.map +1 -1
  28. package/dist/datetime/useDateField.js.map +1 -1
  29. package/dist/datetime/useTimeField.js.map +1 -1
  30. package/dist/dialog/Dialog.js.map +1 -1
  31. package/dist/dialog/DialogContainer.js.map +1 -1
  32. package/dist/dialog/DialogContent.js.map +1 -1
  33. package/dist/dialog/DialogFooter.js.map +1 -1
  34. package/dist/dialog/_dialog.scss +6 -6
  35. package/dist/divider/Divider.js.map +1 -1
  36. package/dist/divider/_divider.scss +6 -2
  37. package/dist/draggable/useDraggable.js.map +1 -1
  38. package/dist/draggable/utils.js.map +1 -1
  39. package/dist/expansion-panel/ExpansionPanelHeader.js.map +1 -1
  40. package/dist/files/FileInput.js.map +1 -1
  41. package/dist/files/useFileUpload.js.map +1 -1
  42. package/dist/files/validation.js.map +1 -1
  43. package/dist/focus/useFocusContainer.js.map +1 -1
  44. package/dist/form/Fieldset.d.ts +19 -0
  45. package/dist/form/Fieldset.js +22 -2
  46. package/dist/form/Fieldset.js.map +1 -1
  47. package/dist/form/FormMessageContainer.js.map +1 -1
  48. package/dist/form/FormMessageCounter.js.map +1 -1
  49. package/dist/form/InputToggle.js.map +1 -1
  50. package/dist/form/Legend.d.ts +27 -5
  51. package/dist/form/Legend.js +39 -6
  52. package/dist/form/Legend.js.map +1 -1
  53. package/dist/form/Listbox.js.map +1 -1
  54. package/dist/form/ListboxProvider.js.map +1 -1
  55. package/dist/form/NativeSelect.js.map +1 -1
  56. package/dist/form/Password.js.map +1 -1
  57. package/dist/form/ResizingTextAreaWrapper.js.map +1 -1
  58. package/dist/form/Select.d.ts +24 -0
  59. package/dist/form/Select.js +14 -3
  60. package/dist/form/Select.js.map +1 -1
  61. package/dist/form/SelectedOption.d.ts +1 -2
  62. package/dist/form/SelectedOption.js +2 -2
  63. package/dist/form/SelectedOption.js.map +1 -1
  64. package/dist/form/Slider.js.map +1 -1
  65. package/dist/form/SliderContainer.js.map +1 -1
  66. package/dist/form/SliderThumb.js.map +1 -1
  67. package/dist/form/SliderTrack.js.map +1 -1
  68. package/dist/form/SliderValueMarks.js.map +1 -1
  69. package/dist/form/Switch.js.map +1 -1
  70. package/dist/form/TextArea.js.map +1 -1
  71. package/dist/form/TextField.js.map +1 -1
  72. package/dist/form/TextFieldContainer.js.map +1 -1
  73. package/dist/form/_fieldset.scss +7 -0
  74. package/dist/form/_input-toggle.scss +6 -5
  75. package/dist/form/_label.scss +2 -2
  76. package/dist/form/_legend.scss +77 -0
  77. package/dist/form/_slider.scss +7 -5
  78. package/dist/form/_switch.scss +7 -5
  79. package/dist/form/_text-field.scss +52 -15
  80. package/dist/form/defaultGetSelectedOptionChildren.d.ts +1 -0
  81. package/dist/form/fieldsetStyles.d.ts +6 -1
  82. package/dist/form/fieldsetStyles.js +3 -2
  83. package/dist/form/fieldsetStyles.js.map +1 -1
  84. package/dist/form/getSelectedOptionChildren.d.ts +1 -0
  85. package/dist/form/inputToggleStyles.js.map +1 -1
  86. package/dist/form/labelStyles.d.ts +1 -1
  87. package/dist/form/labelStyles.js +1 -1
  88. package/dist/form/labelStyles.js.map +1 -1
  89. package/dist/form/legendStyles.d.ts +83 -0
  90. package/dist/form/legendStyles.js +25 -0
  91. package/dist/form/legendStyles.js.map +1 -0
  92. package/dist/form/selectUtils.js.map +1 -1
  93. package/dist/form/textFieldContainerStyles.js.map +1 -1
  94. package/dist/form/types.d.ts +28 -6
  95. package/dist/form/types.js.map +1 -1
  96. package/dist/form/useCheckboxGroup.js.map +1 -1
  97. package/dist/form/useCombobox.js.map +1 -1
  98. package/dist/form/useNumberField.js +16 -19
  99. package/dist/form/useNumberField.js.map +1 -1
  100. package/dist/form/useRangeSlider.js.map +1 -1
  101. package/dist/form/useSlider.js.map +1 -1
  102. package/dist/form/useTextField.js.map +1 -1
  103. package/dist/hoverMode/useHoverMode.js.map +1 -1
  104. package/dist/icon/FontIcon.js.map +1 -1
  105. package/dist/icon/IconRotator.js.map +1 -1
  106. package/dist/icon/MaterialIcon.js.map +1 -1
  107. package/dist/icon/MaterialSymbol.js.map +1 -1
  108. package/dist/icon/SVGIcon.js.map +1 -1
  109. package/dist/icon/config.d.ts +0 -1
  110. package/dist/icon/config.js +10 -7
  111. package/dist/icon/config.js.map +1 -1
  112. package/dist/icon/materialConfig.js.map +1 -1
  113. package/dist/icon/styles.js.map +1 -1
  114. package/dist/interaction/UserInteractionModeProvider.js +6 -4
  115. package/dist/interaction/UserInteractionModeProvider.js.map +1 -1
  116. package/dist/interaction/_interaction.scss +5 -3
  117. package/dist/interaction/types.js.map +1 -1
  118. package/dist/interaction/useElementInteraction.js.map +1 -1
  119. package/dist/layout/LayoutAppBar.d.ts +6 -6
  120. package/dist/layout/LayoutAppBar.js +6 -6
  121. package/dist/layout/LayoutAppBar.js.map +1 -1
  122. package/dist/layout/LayoutNav.js.map +1 -1
  123. package/dist/layout/LayoutWindowSplitter.js.map +1 -1
  124. package/dist/layout/Main.js.map +1 -1
  125. package/dist/layout/useExpandableLayout.js +43 -0
  126. package/dist/layout/useExpandableLayout.js.map +1 -1
  127. package/dist/layout/useHorizontalLayoutTransition.js.map +1 -1
  128. package/dist/layout/useLayoutTree.js.map +1 -1
  129. package/dist/layout/useLayoutWindowSplitter.js.map +1 -1
  130. package/dist/layout/useResizableLayout.js.map +1 -1
  131. package/dist/link/Link.js.map +1 -1
  132. package/dist/link/SkipToMainContent.js +19 -21
  133. package/dist/link/SkipToMainContent.js.map +1 -1
  134. package/dist/list/List.js.map +1 -1
  135. package/dist/list/ListItem.js.map +1 -1
  136. package/dist/list/ListItemAddon.js.map +1 -1
  137. package/dist/list/ListItemLink.js.map +1 -1
  138. package/dist/list/ListSubheader.js.map +1 -1
  139. package/dist/list/getListItemHeight.js.map +1 -1
  140. package/dist/list/listItemStyles.js.map +1 -1
  141. package/dist/list/types.js.map +1 -1
  142. package/dist/media-queries/AppSizeProvider.d.ts +2 -0
  143. package/dist/media-queries/AppSizeProvider.js +3 -2
  144. package/dist/media-queries/AppSizeProvider.js.map +1 -1
  145. package/dist/media-queries/appSize.d.ts +3 -0
  146. package/dist/media-queries/appSize.js +3 -1
  147. package/dist/media-queries/appSize.js.map +1 -1
  148. package/dist/media-queries/config.d.ts +11 -0
  149. package/dist/media-queries/config.js +26 -0
  150. package/dist/media-queries/config.js.map +1 -0
  151. package/dist/menu/DropdownMenu.js.map +1 -1
  152. package/dist/menu/Menu.js.map +1 -1
  153. package/dist/menu/MenuItemButton.js.map +1 -1
  154. package/dist/menu/MenuItemFileInput.js.map +1 -1
  155. package/dist/menu/MenuItemInputToggle.js.map +1 -1
  156. package/dist/menu/MenuItemSeparator.js.map +1 -1
  157. package/dist/menu/MenuVisibilityProvider.js.map +1 -1
  158. package/dist/menu/MenuWidget.js.map +1 -1
  159. package/dist/menu/useContextMenu.js.map +1 -1
  160. package/dist/movement/types.d.ts +28 -3
  161. package/dist/movement/types.js.map +1 -1
  162. package/dist/movement/useKeyboardMovementProvider.js +96 -47
  163. package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
  164. package/dist/navigation/CollapsibleNavGroup.js.map +1 -1
  165. package/dist/navigation/NavItem.js.map +1 -1
  166. package/dist/navigation/NavItemButton.js.map +1 -1
  167. package/dist/navigation/NavItemLink.js.map +1 -1
  168. package/dist/navigation/getTableOfContentsHeadings.js.map +1 -1
  169. package/dist/navigation/types.js.map +1 -1
  170. package/dist/overlay/Overlay.js.map +1 -1
  171. package/dist/positioning/createHorizontalPosition.js.map +1 -1
  172. package/dist/positioning/createVerticalPosition.js.map +1 -1
  173. package/dist/positioning/useFixedPositioning.js.map +1 -1
  174. package/dist/progress/CircularProgress.js.map +1 -1
  175. package/dist/progress/LinearProgress.js.map +1 -1
  176. package/dist/progress/linearProgressStyles.js.map +1 -1
  177. package/dist/responsive-item/ResponsiveItem.js.map +1 -1
  178. package/dist/responsive-item/ResponsiveItemOverlay.js.map +1 -1
  179. package/dist/searching/caseInsensitive.js.map +1 -1
  180. package/dist/segmented-button/SegmentedButton.js.map +1 -1
  181. package/dist/segmented-button/SegmentedButtonContainer.js.map +1 -1
  182. package/dist/segmented-button/segmentedButtonStyles.js.map +1 -1
  183. package/dist/sheet/Sheet.js.map +1 -1
  184. package/dist/snackbar/Toast.js.map +1 -1
  185. package/dist/snackbar/_snackbar.scss +3 -3
  186. package/dist/spinbutton/SpinButton.d.ts +16 -0
  187. package/dist/spinbutton/SpinButton.js +55 -0
  188. package/dist/spinbutton/SpinButton.js.map +1 -0
  189. package/dist/spinbutton/SpinButtonGroupProvider.d.ts +17 -0
  190. package/dist/spinbutton/SpinButtonGroupProvider.js +19 -0
  191. package/dist/spinbutton/SpinButtonGroupProvider.js.map +1 -0
  192. package/dist/spinbutton/defaults.d.ts +9 -0
  193. package/dist/spinbutton/defaults.js +25 -0
  194. package/dist/spinbutton/defaults.js.map +1 -0
  195. package/dist/spinbutton/types.d.ts +324 -0
  196. package/dist/spinbutton/types.js +5 -0
  197. package/dist/spinbutton/types.js.map +1 -0
  198. package/dist/spinbutton/useSpinButton.d.ts +5 -0
  199. package/dist/spinbutton/useSpinButton.js +260 -0
  200. package/dist/spinbutton/useSpinButton.js.map +1 -0
  201. package/dist/spinbutton/useSpinButtonGroupProvider.d.ts +27 -0
  202. package/dist/spinbutton/useSpinButtonGroupProvider.js +49 -0
  203. package/dist/spinbutton/useSpinButtonGroupProvider.js.map +1 -0
  204. package/dist/spinbutton/utils/deselectNode.d.ts +5 -0
  205. package/dist/spinbutton/utils/deselectNode.js +17 -0
  206. package/dist/spinbutton/utils/deselectNode.js.map +1 -0
  207. package/dist/spinbutton/utils/resolveInputEvent.d.ts +30 -0
  208. package/dist/spinbutton/utils/resolveInputEvent.js +53 -0
  209. package/dist/spinbutton/utils/resolveInputEvent.js.map +1 -0
  210. package/dist/spinbutton/utils/selectNode.d.ts +5 -0
  211. package/dist/spinbutton/utils/selectNode.js +15 -0
  212. package/dist/spinbutton/utils/selectNode.js.map +1 -0
  213. package/dist/table/StickyTableSection.js.map +1 -1
  214. package/dist/table/Table.js.map +1 -1
  215. package/dist/table/TableBody.js.map +1 -1
  216. package/dist/table/TableCellContent.js.map +1 -1
  217. package/dist/table/TableCheckbox.js.map +1 -1
  218. package/dist/table/TableFooter.js.map +1 -1
  219. package/dist/table/TableHeader.js.map +1 -1
  220. package/dist/table/TableRadio.js.map +1 -1
  221. package/dist/table/TableRow.js.map +1 -1
  222. package/dist/table/useStickyTableSection.js.map +1 -1
  223. package/dist/tabs/SimpleTabPanel.js.map +1 -1
  224. package/dist/tabs/SimpleTabPanels.js.map +1 -1
  225. package/dist/tabs/Tab.js.map +1 -1
  226. package/dist/tabs/TabList.js.map +1 -1
  227. package/dist/tabs/TabListScrollButton.js.map +1 -1
  228. package/dist/tabs/_tabs.scss +5 -6
  229. package/dist/tabs/useMaxTabPanelHeight.js.map +1 -1
  230. package/dist/test-utils/data-testid.js.map +1 -1
  231. package/dist/test-utils/mocks/match-media.js +5 -5
  232. package/dist/test-utils/mocks/match-media.js.map +1 -1
  233. package/dist/test-utils/vitest/timers.d.ts +1 -1
  234. package/dist/test-utils/vitest/timers.js +1 -1
  235. package/dist/test-utils/vitest/timers.js.map +1 -1
  236. package/dist/theme/_a11y.scss +3 -1
  237. package/dist/theme/_theme.scss +16 -12
  238. package/dist/tooltip/Tooltip.js.map +1 -1
  239. package/dist/tooltip/TooltipHoverModeProvider.js.map +1 -1
  240. package/dist/tooltip/useTooltip.js.map +1 -1
  241. package/dist/transition/CSSTransition.js.map +1 -1
  242. package/dist/transition/Collapse.js.map +1 -1
  243. package/dist/transition/CrossFade.js.map +1 -1
  244. package/dist/transition/ScaleTransition.js.map +1 -1
  245. package/dist/transition/SkeletonPlaceholder.js.map +1 -1
  246. package/dist/transition/Slide.js.map +1 -1
  247. package/dist/transition/SlideContainer.js.map +1 -1
  248. package/dist/transition/types.js.map +1 -1
  249. package/dist/transition/useCollapseTransition.js.map +1 -1
  250. package/dist/transition/useCrossFadeTransition.js.map +1 -1
  251. package/dist/transition/useMaxWidthTransition.js.map +1 -1
  252. package/dist/transition/useScaleTransition.js.map +1 -1
  253. package/dist/transition/useSkeletonPlaceholder.js.map +1 -1
  254. package/dist/tree/Tree.js.map +1 -1
  255. package/dist/tree/TreeItem.js.map +1 -1
  256. package/dist/tree/TreeProvider.js.map +1 -1
  257. package/dist/tree/styles.js.map +1 -1
  258. package/dist/tree/types.js.map +1 -1
  259. package/dist/tree/useTreeMovement.js.map +1 -1
  260. package/dist/typography/HighlightTextMark.js.map +1 -1
  261. package/dist/typography/Mark.js.map +1 -1
  262. package/dist/typography/TextContainer.js.map +1 -1
  263. package/dist/typography/Typography.js.map +1 -1
  264. package/dist/typography/_typography.scss +0 -1
  265. package/dist/useElementSize.js.map +1 -1
  266. package/dist/useIntersectionObserver.js.map +1 -1
  267. package/dist/useMutationObserver.js.map +1 -1
  268. package/dist/useWindowSize.js.map +1 -1
  269. package/dist/utils/getNumberOfDigits.d.ts +7 -0
  270. package/dist/utils/getNumberOfDigits.js +11 -0
  271. package/dist/utils/getNumberOfDigits.js.map +1 -0
  272. package/dist/utils/nearest.js +2 -1
  273. package/dist/utils/nearest.js.map +1 -1
  274. package/dist/utils/useDevEffect.d.ts +7 -0
  275. package/dist/utils/useDevEffect.js +8 -0
  276. package/dist/utils/useDevEffect.js.map +1 -0
  277. package/dist/window-splitter/WindowSplitter.js +3 -2
  278. package/dist/window-splitter/WindowSplitter.js.map +1 -1
  279. package/dist/window-splitter/_window-splitter.scss +65 -19
  280. package/dist/window-splitter/styles.d.ts +9 -0
  281. package/dist/window-splitter/styles.js +3 -2
  282. package/dist/window-splitter/styles.js.map +1 -1
  283. package/dist/window-splitter/useWindowSplitter.js.map +1 -1
  284. package/package.json +38 -30
  285. package/src/CoreProviders.tsx +1 -0
  286. package/src/app-bar/AppBar.tsx +1 -2
  287. package/src/app-bar/AppBarTitle.tsx +1 -2
  288. package/src/autocomplete/AutocompleteListboxChildren.tsx +3 -1
  289. package/src/autocomplete/types.ts +24 -19
  290. package/src/autocomplete/utils.ts +9 -6
  291. package/src/avatar/Avatar.tsx +2 -1
  292. package/src/button/Button.tsx +2 -1
  293. package/src/button/FloatingActionButton.tsx +2 -1
  294. package/src/card/Card.tsx +2 -1
  295. package/src/card/CardContent.tsx +1 -2
  296. package/src/card/ClickableCard.tsx +1 -2
  297. package/src/chip/Chip.tsx +2 -1
  298. package/src/datetime/NativeDateField.tsx +2 -1
  299. package/src/datetime/NativeTimeField.tsx +2 -1
  300. package/src/datetime/useDateField.ts +13 -8
  301. package/src/datetime/useTimeField.ts +13 -8
  302. package/src/dialog/Dialog.tsx +2 -1
  303. package/src/dialog/DialogContainer.tsx +1 -2
  304. package/src/dialog/DialogContent.tsx +1 -2
  305. package/src/dialog/DialogFooter.tsx +1 -2
  306. package/src/divider/Divider.tsx +1 -2
  307. package/src/draggable/useDraggable.ts +4 -4
  308. package/src/draggable/utils.ts +4 -2
  309. package/src/expansion-panel/ExpansionPanelHeader.tsx +1 -2
  310. package/src/files/FileInput.tsx +2 -1
  311. package/src/files/useFileUpload.ts +6 -6
  312. package/src/files/validation.ts +1 -2
  313. package/src/focus/useFocusContainer.ts +4 -4
  314. package/src/form/Fieldset.tsx +25 -3
  315. package/src/form/FormMessageContainer.tsx +1 -2
  316. package/src/form/FormMessageCounter.tsx +1 -2
  317. package/src/form/InputToggle.tsx +3 -3
  318. package/src/form/Legend.tsx +55 -10
  319. package/src/form/Listbox.tsx +1 -2
  320. package/src/form/ListboxProvider.ts +3 -2
  321. package/src/form/NativeSelect.tsx +2 -1
  322. package/src/form/Password.tsx +4 -2
  323. package/src/form/ResizingTextAreaWrapper.tsx +1 -2
  324. package/src/form/Select.tsx +55 -3
  325. package/src/form/SelectedOption.tsx +2 -4
  326. package/src/form/Slider.tsx +2 -1
  327. package/src/form/SliderContainer.tsx +1 -2
  328. package/src/form/SliderThumb.tsx +6 -3
  329. package/src/form/SliderTrack.tsx +2 -1
  330. package/src/form/SliderValueMarks.tsx +1 -2
  331. package/src/form/Switch.tsx +2 -1
  332. package/src/form/TextArea.tsx +1 -2
  333. package/src/form/TextField.tsx +2 -1
  334. package/src/form/TextFieldContainer.tsx +1 -2
  335. package/src/form/fieldsetStyles.ts +18 -3
  336. package/src/form/inputToggleStyles.ts +4 -2
  337. package/src/form/labelStyles.ts +1 -1
  338. package/src/form/legendStyles.ts +132 -0
  339. package/src/form/selectUtils.ts +3 -2
  340. package/src/form/textFieldContainerStyles.ts +1 -2
  341. package/src/form/types.ts +35 -17
  342. package/src/form/useCheckboxGroup.ts +3 -2
  343. package/src/form/useCombobox.ts +8 -3
  344. package/src/form/useNumberField.ts +36 -35
  345. package/src/form/useRangeSlider.ts +1 -2
  346. package/src/form/useSlider.ts +1 -2
  347. package/src/form/useTextField.ts +8 -3
  348. package/src/hoverMode/useHoverMode.ts +4 -8
  349. package/src/icon/FontIcon.tsx +1 -2
  350. package/src/icon/IconRotator.tsx +1 -2
  351. package/src/icon/MaterialIcon.tsx +2 -1
  352. package/src/icon/MaterialSymbol.tsx +2 -1
  353. package/src/icon/SVGIcon.tsx +1 -2
  354. package/src/icon/config.tsx +10 -7
  355. package/src/icon/materialConfig.ts +1 -2
  356. package/src/icon/styles.ts +1 -2
  357. package/src/interaction/UserInteractionModeProvider.tsx +9 -4
  358. package/src/interaction/types.ts +1 -2
  359. package/src/interaction/useElementInteraction.tsx +3 -2
  360. package/src/layout/LayoutAppBar.tsx +6 -6
  361. package/src/layout/LayoutNav.tsx +2 -1
  362. package/src/layout/LayoutWindowSplitter.tsx +2 -1
  363. package/src/layout/Main.tsx +1 -2
  364. package/src/layout/useExpandableLayout.ts +63 -5
  365. package/src/layout/useHorizontalLayoutTransition.ts +1 -2
  366. package/src/layout/useLayoutTree.ts +2 -2
  367. package/src/layout/useLayoutWindowSplitter.ts +6 -6
  368. package/src/layout/useResizableLayout.ts +3 -6
  369. package/src/link/Link.tsx +1 -2
  370. package/src/link/SkipToMainContent.tsx +20 -23
  371. package/src/list/List.tsx +1 -2
  372. package/src/list/ListItem.tsx +2 -1
  373. package/src/list/ListItemAddon.tsx +2 -1
  374. package/src/list/ListItemLink.tsx +2 -1
  375. package/src/list/ListSubheader.tsx +1 -2
  376. package/src/list/getListItemHeight.ts +8 -9
  377. package/src/list/listItemStyles.ts +1 -2
  378. package/src/list/types.ts +1 -2
  379. package/src/media-queries/AppSizeProvider.tsx +8 -10
  380. package/src/media-queries/appSize.ts +3 -0
  381. package/src/media-queries/config.ts +41 -0
  382. package/src/menu/DropdownMenu.tsx +4 -5
  383. package/src/menu/Menu.tsx +2 -1
  384. package/src/menu/MenuItemButton.tsx +1 -2
  385. package/src/menu/MenuItemFileInput.tsx +2 -1
  386. package/src/menu/MenuItemInputToggle.tsx +3 -3
  387. package/src/menu/MenuItemSeparator.tsx +2 -1
  388. package/src/menu/MenuVisibilityProvider.tsx +4 -2
  389. package/src/menu/MenuWidget.tsx +1 -2
  390. package/src/menu/useContextMenu.ts +4 -2
  391. package/src/movement/types.ts +52 -13
  392. package/src/movement/useKeyboardMovementProvider.ts +77 -38
  393. package/src/navigation/CollapsibleNavGroup.tsx +1 -2
  394. package/src/navigation/NavItem.tsx +1 -2
  395. package/src/navigation/NavItemButton.tsx +2 -1
  396. package/src/navigation/NavItemLink.tsx +2 -1
  397. package/src/navigation/getTableOfContentsHeadings.ts +1 -2
  398. package/src/navigation/types.ts +1 -2
  399. package/src/overlay/Overlay.tsx +2 -1
  400. package/src/positioning/createHorizontalPosition.ts +10 -12
  401. package/src/positioning/createVerticalPosition.ts +10 -11
  402. package/src/positioning/useFixedPositioning.ts +6 -3
  403. package/src/progress/CircularProgress.tsx +2 -1
  404. package/src/progress/LinearProgress.tsx +2 -1
  405. package/src/progress/linearProgressStyles.ts +1 -2
  406. package/src/responsive-item/ResponsiveItem.tsx +1 -2
  407. package/src/responsive-item/ResponsiveItemOverlay.tsx +2 -1
  408. package/src/searching/caseInsensitive.ts +2 -4
  409. package/src/segmented-button/SegmentedButton.tsx +2 -1
  410. package/src/segmented-button/SegmentedButtonContainer.tsx +2 -1
  411. package/src/segmented-button/segmentedButtonStyles.ts +1 -2
  412. package/src/sheet/Sheet.tsx +1 -2
  413. package/src/snackbar/Toast.tsx +2 -1
  414. package/src/spinbutton/SpinButton.tsx +98 -0
  415. package/src/spinbutton/SpinButtonGroupProvider.tsx +32 -0
  416. package/src/spinbutton/defaults.ts +45 -0
  417. package/src/spinbutton/types.ts +413 -0
  418. package/src/spinbutton/useSpinButton.ts +311 -0
  419. package/src/spinbutton/useSpinButtonGroupProvider.ts +104 -0
  420. package/src/spinbutton/utils/deselectNode.ts +17 -0
  421. package/src/spinbutton/utils/resolveInputEvent.ts +112 -0
  422. package/src/spinbutton/utils/selectNode.ts +15 -0
  423. package/src/table/StickyTableSection.tsx +2 -1
  424. package/src/table/Table.tsx +1 -2
  425. package/src/table/TableBody.tsx +2 -1
  426. package/src/table/TableCellContent.tsx +1 -2
  427. package/src/table/TableCheckbox.tsx +1 -2
  428. package/src/table/TableFooter.tsx +1 -2
  429. package/src/table/TableHeader.tsx +1 -2
  430. package/src/table/TableRadio.tsx +1 -2
  431. package/src/table/TableRow.tsx +1 -2
  432. package/src/table/useStickyTableSection.tsx +1 -2
  433. package/src/tabs/SimpleTabPanel.tsx +2 -1
  434. package/src/tabs/SimpleTabPanels.tsx +2 -1
  435. package/src/tabs/Tab.tsx +3 -6
  436. package/src/tabs/TabList.tsx +2 -1
  437. package/src/tabs/TabListScrollButton.tsx +1 -2
  438. package/src/tabs/useMaxTabPanelHeight.ts +7 -4
  439. package/src/test-utils/data-testid.ts +1 -2
  440. package/src/test-utils/mocks/match-media.ts +5 -10
  441. package/src/test-utils/vitest/timers.ts +1 -1
  442. package/src/tooltip/Tooltip.tsx +2 -1
  443. package/src/tooltip/TooltipHoverModeProvider.tsx +1 -2
  444. package/src/tooltip/useTooltip.ts +9 -5
  445. package/src/transition/CSSTransition.tsx +2 -1
  446. package/src/transition/Collapse.tsx +4 -2
  447. package/src/transition/CrossFade.tsx +2 -1
  448. package/src/transition/ScaleTransition.tsx +2 -1
  449. package/src/transition/SkeletonPlaceholder.tsx +1 -2
  450. package/src/transition/Slide.tsx +2 -1
  451. package/src/transition/SlideContainer.tsx +1 -2
  452. package/src/transition/types.ts +15 -16
  453. package/src/transition/useCollapseTransition.ts +6 -5
  454. package/src/transition/useCrossFadeTransition.ts +3 -2
  455. package/src/transition/useMaxWidthTransition.ts +1 -2
  456. package/src/transition/useScaleTransition.ts +3 -2
  457. package/src/transition/useSkeletonPlaceholder.ts +1 -2
  458. package/src/tree/Tree.tsx +2 -1
  459. package/src/tree/TreeItem.tsx +2 -1
  460. package/src/tree/TreeProvider.tsx +4 -4
  461. package/src/tree/styles.ts +1 -2
  462. package/src/tree/types.ts +1 -2
  463. package/src/tree/useTreeMovement.ts +1 -2
  464. package/src/typography/HighlightTextMark.tsx +1 -2
  465. package/src/typography/Mark.tsx +1 -2
  466. package/src/typography/TextContainer.tsx +1 -2
  467. package/src/typography/Typography.tsx +1 -2
  468. package/src/useElementSize.ts +7 -4
  469. package/src/useIntersectionObserver.ts +3 -2
  470. package/src/useMutationObserver.ts +3 -2
  471. package/src/useWindowSize.ts +4 -2
  472. package/src/utils/getNumberOfDigits.ts +18 -0
  473. package/src/utils/nearest.ts +2 -1
  474. package/src/utils/useDevEffect.ts +9 -0
  475. package/src/window-splitter/WindowSplitter.tsx +5 -2
  476. package/src/window-splitter/styles.ts +13 -2
  477. package/src/window-splitter/useWindowSplitter.ts +3 -1
@@ -3,6 +3,7 @@
3
3
  import { useCallback, useRef, useState } from "react";
4
4
 
5
5
  import { type UseStateInitializer, type UseStateSetter } from "../types.js";
6
+ import { useIsomorphicLayoutEffect } from "../useIsomorphicLayoutEffect.js";
6
7
  import { withinRange } from "../utils/withinRange.js";
7
8
  import { useFormReset } from "./useFormReset.js";
8
9
  import {
@@ -47,7 +48,8 @@ export interface NumberFieldConstraints {
47
48
  * - Renamed `fixOnBlur` to `updateValueOnBlur`
48
49
  */
49
50
  export interface NumberFieldHookOptions
50
- extends Omit<TextFieldHookOptions, "defaultValue" | "isNumber">,
51
+ extends
52
+ Omit<TextFieldHookOptions, "defaultValue" | "isNumber">,
51
53
  NumberFieldConstraints {
52
54
  /**
53
55
  * @defaultValue `undefined`
@@ -112,42 +114,45 @@ export interface NumberFieldHookOptions
112
114
  }
113
115
 
114
116
  /** @since 6.0.0 */
115
- export interface NumberFieldHookState
116
- extends Omit<TextFieldHookState, "value"> {
117
+ export interface NumberFieldHookState extends Omit<
118
+ TextFieldHookState,
119
+ "value"
120
+ > {
117
121
  value: number | undefined;
118
122
  }
119
123
 
120
124
  /** @since 2.5.6 */
121
125
  export interface ProvidedNumberFieldProps
122
- extends ProvidedTextFieldProps,
123
- NumberFieldConstraints {
126
+ extends ProvidedTextFieldProps, NumberFieldConstraints {
124
127
  type: "number";
125
128
  }
126
129
 
127
130
  /** @since 2.5.6 */
128
131
  export interface ProvidedNumberFieldMessageProps
129
- extends ProvidedTextFieldMessageProps,
130
- NumberFieldConstraints {
132
+ extends ProvidedTextFieldMessageProps, NumberFieldConstraints {
131
133
  type: "number";
132
134
  }
133
135
 
134
136
  /** @since 6.0.0 */
135
- export interface NumberFieldImplementation
136
- extends Omit<TextFieldImplementation, "value" | "setState"> {
137
+ export interface NumberFieldImplementation extends Omit<
138
+ TextFieldImplementation,
139
+ "value" | "setState"
140
+ > {
137
141
  value: number | undefined;
138
142
  setState: UseStateSetter<NumberFieldHookState>;
139
143
  fieldProps: ProvidedNumberFieldProps;
140
144
  }
141
145
 
142
146
  /** @since 6.0.0 */
143
- export interface NumberFieldWithMessageImplementation
144
- extends NumberFieldImplementation {
147
+ export interface NumberFieldWithMessageImplementation extends NumberFieldImplementation {
145
148
  fieldProps: ProvidedNumberFieldMessageProps;
146
149
  }
147
150
 
148
151
  /** @since 6.0.0 */
149
- export interface ValidatedNumberFieldImplementation
150
- extends Omit<ValidatedTextFieldImplementation, "value" | "setState"> {
152
+ export interface ValidatedNumberFieldImplementation extends Omit<
153
+ ValidatedTextFieldImplementation,
154
+ "value" | "setState"
155
+ > {
151
156
  value: number | undefined;
152
157
  setState: UseStateSetter<NumberFieldHookState>;
153
158
  fieldProps: ProvidedNumberFieldProps | ProvidedNumberFieldMessageProps;
@@ -439,35 +444,31 @@ export function useNumberField(
439
444
  },
440
445
  });
441
446
 
447
+ const { error, errorMessage } = remaining;
448
+ const prevState = useRef({
449
+ error,
450
+ errorMessage,
451
+ value: number,
452
+ } satisfies NumberFieldHookState);
453
+ useIsomorphicLayoutEffect(() => {
454
+ prevState.current = {
455
+ error,
456
+ errorMessage,
457
+ value: number,
458
+ };
459
+ });
442
460
  const reset = useCallback(() => {
443
461
  resetTextField();
444
462
  setNumber(initial.current);
445
463
  }, [resetTextField]);
446
464
  const setState = useCallback<UseStateSetter<NumberFieldHookState>>(
447
465
  (nextState) => {
448
- if (typeof nextState === "function") {
449
- setNumber((prevNumber) => {
450
- let nextNumber: number | undefined = prevNumber;
451
- setTextFieldState((prevState) => {
452
- const updated = nextState({
453
- ...prevState,
454
- value: prevNumber,
455
- });
456
-
457
- nextNumber = updated.value;
458
-
459
- return {
460
- ...updated,
461
- value: `${nextNumber ?? ""}`,
462
- };
463
- });
464
-
465
- return nextNumber;
466
- });
467
- return;
468
- }
466
+ const resolvedNextState =
467
+ typeof nextState === "function"
468
+ ? nextState(prevState.current)
469
+ : nextState;
469
470
 
470
- const { value, error, errorMessage } = nextState;
471
+ const { value, error, errorMessage } = resolvedNextState;
471
472
  setNumber(value);
472
473
  setTextFieldState({
473
474
  value: `${value ?? ""}`,
@@ -31,8 +31,7 @@ export interface RangeSliderOptions extends SliderValueOptions {
31
31
  * @since 6.0.0
32
32
  */
33
33
  export interface RangeSliderImplementation
34
- extends Required<SliderValueOptions>,
35
- RangeSliderState {}
34
+ extends Required<SliderValueOptions>, RangeSliderState {}
36
35
 
37
36
  /**
38
37
  * @example Range Slider Example
@@ -45,8 +45,7 @@ export interface SliderState {
45
45
  * @since 6.0.0
46
46
  */
47
47
  export interface SliderImplementation
48
- extends Required<SliderValueOptions>,
49
- SliderState {}
48
+ extends Required<SliderValueOptions>, SliderState {}
50
49
 
51
50
  /**
52
51
  * @since 6.0.0
@@ -125,7 +125,8 @@ export interface TextFieldHookState {
125
125
  * @since 2.5.0
126
126
  */
127
127
  export interface ProvidedFormMessageProps
128
- extends Pick<FormMessageProps, "id" | "theme" | "children">,
128
+ extends
129
+ Pick<FormMessageProps, "id" | "theme" | "children">,
129
130
  Required<Pick<TextFieldProps, "error">>,
130
131
  Partial<Pick<FormMessageInputLengthCounterProps, "length" | "maxLength">> {}
131
132
 
@@ -137,7 +138,9 @@ export interface ProvidedFormMessageProps
137
138
  */
138
139
  export interface ProvidedTextFieldProps<
139
140
  E extends HTMLInputElement | HTMLTextAreaElement = HTMLInputElement,
140
- > extends TextFieldValidationOptions,
141
+ >
142
+ extends
143
+ TextFieldValidationOptions,
141
144
  Required<TextFieldChangeHandlers<E>>,
142
145
  Required<Pick<TextFieldProps, "id" | "name" | "value" | "error">>,
143
146
  Pick<TextFieldProps, "aria-describedby" | "rightAddon"> {
@@ -288,7 +291,9 @@ export interface TextFieldHookComponentOptions<
288
291
  /** @since 2.5.6 */
289
292
  export interface TextFieldHookOptions<
290
293
  E extends HTMLInputElement | HTMLTextAreaElement = HTMLInputElement,
291
- > extends TextFieldValidationOptions,
294
+ >
295
+ extends
296
+ TextFieldValidationOptions,
292
297
  TextFieldHookComponentOptions<E>,
293
298
  TextFieldChangeHandlers<E> {
294
299
  /**
@@ -36,8 +36,7 @@ export interface HoverModeConfigurationOptions extends SimpleHoverModeContext {
36
36
  /**
37
37
  * @since 6.0.0
38
38
  */
39
- export interface ControlledHoverModeOptions
40
- extends HoverModeConfigurationOptions {
39
+ export interface ControlledHoverModeOptions extends HoverModeConfigurationOptions {
41
40
  setVisible: UseStateSetter<boolean>;
42
41
  }
43
42
 
@@ -53,16 +52,14 @@ export interface ControlledHoverModeImplementation {
53
52
  /**
54
53
  * @since 6.0.0
55
54
  */
56
- export interface UncontrolledHoverModeOptions
57
- extends HoverModeConfigurationOptions {
55
+ export interface UncontrolledHoverModeOptions extends HoverModeConfigurationOptions {
58
56
  defaultVisible?: UseStateInitializer<boolean>;
59
57
  }
60
58
 
61
59
  /**
62
60
  * @since 6.0.0
63
61
  */
64
- export interface UncontrolledHoverModeImplementation
65
- extends ControlledHoverModeImplementation {
62
+ export interface UncontrolledHoverModeImplementation extends ControlledHoverModeImplementation {
66
63
  visible: boolean;
67
64
  setVisible: UseStateSetter<boolean>;
68
65
  }
@@ -70,8 +67,7 @@ export interface UncontrolledHoverModeImplementation
70
67
  /**
71
68
  * @since 6.0.0
72
69
  */
73
- export interface HoverModeImplementation
74
- extends ControlledHoverModeImplementation {
70
+ export interface HoverModeImplementation extends ControlledHoverModeImplementation {
75
71
  visible?: boolean;
76
72
  setVisible?: UseStateSetter<boolean>;
77
73
  }
@@ -12,8 +12,7 @@ import { type FontIconClassNameOptions, icon } from "./styles.js";
12
12
  * `inline` and `theme` props.
13
13
  */
14
14
  export interface FontIconProps
15
- extends HTMLAttributes<HTMLSpanElement>,
16
- FontIconClassNameOptions {
15
+ extends HTMLAttributes<HTMLSpanElement>, FontIconClassNameOptions {
17
16
  /** @defaultValue `true` */
18
17
  "aria-hidden"?: AriaAttributes["aria-hidden"];
19
18
 
@@ -15,8 +15,7 @@ import { type IconRotatorClassNameOptions, iconRotator } from "./styles.js";
15
15
  * @since 6.0.0 Removed `animate` prop and added `disableTransition`
16
16
  */
17
17
  export interface IconRotatorBaseProps
18
- extends HTMLAttributes<HTMLSpanElement>,
19
- IconRotatorClassNameOptions {
18
+ extends HTMLAttributes<HTMLSpanElement>, IconRotatorClassNameOptions {
20
19
  /**
21
20
  * An optional style to apply to the surrounding span when the `forceIconWrap`
22
21
  * prop is enabled or the children is not a single react element.
@@ -6,7 +6,8 @@ import { type MaterialIconClassNameOptions, icon } from "./styles.js";
6
6
 
7
7
  /** @since 6.0.0 */
8
8
  export interface MaterialIconProps
9
- extends HTMLAttributes<HTMLSpanElement>,
9
+ extends
10
+ HTMLAttributes<HTMLSpanElement>,
10
11
  Partial<MaterialIconClassNameOptions> {
11
12
  /**
12
13
  * The icon name to use
@@ -24,7 +24,8 @@ declare module "react" {
24
24
  * @since 6.0.0
25
25
  */
26
26
  export interface MaterialSymbolProps
27
- extends HTMLAttributes<HTMLSpanElement>,
27
+ extends
28
+ HTMLAttributes<HTMLSpanElement>,
28
29
  MaterialSymbolCustomization,
29
30
  Partial<MaterialSymbolClassNameOptions> {
30
31
  /** @defaultValue `true` */
@@ -6,8 +6,7 @@ import { type SVGIconClassNameOptions, icon } from "./styles.js";
6
6
  * @since 6.0.0 Added the `inline` and `theme` props.
7
7
  */
8
8
  export interface SVGIconProps
9
- extends HTMLAttributes<SVGSVGElement>,
10
- SVGIconClassNameOptions {
9
+ extends HTMLAttributes<SVGSVGElement>, SVGIconClassNameOptions {
11
10
  /**
12
11
  * Boolean if the SVG should gain the `focusable` attribute. This is disabled
13
12
  * by default since IE11 and Edge actually default this to true and keyboard's
@@ -213,7 +213,6 @@ export type ConfigurableIconName = keyof ConfigurableIcons;
213
213
  * ICON_CONFIG.upload = <FileUploadIcon />;
214
214
  * ```
215
215
  *
216
- *
217
216
  * @since 6.0.0
218
217
  */
219
218
  export const ICON_CONFIG: ConfiguredIcons = {
@@ -289,13 +288,17 @@ export const ICON_CONFIG: ConfiguredIcons = {
289
288
  * @since 6.0.0
290
289
  */
291
290
  export function configureIcons(overrides: ConfiguredIcons): void {
292
- Object.entries(overrides).forEach(([name, value]) => {
293
- if (process.env.NODE_ENV !== "production" && !(name in ICON_CONFIG)) {
294
- throw new Error(`${name} is an invalid react-md icon name.`);
295
- }
291
+ if (process.env.NODE_ENV !== "production") {
292
+ Object.entries(overrides).forEach(([name, value]) => {
293
+ if (!(name in ICON_CONFIG)) {
294
+ throw new Error(`${name} is an invalid react-md icon name.`);
295
+ }
296
296
 
297
- ICON_CONFIG[name as keyof ConfiguredIcons] = value;
298
- });
297
+ ICON_CONFIG[name as keyof ConfiguredIcons] = value;
298
+ });
299
+ } else {
300
+ Object.assign(ICON_CONFIG, overrides);
301
+ }
299
302
  }
300
303
 
301
304
  /**
@@ -152,8 +152,7 @@ export type MaterialSymbolConfiguration = Required<MaterialSymbolCustomization>;
152
152
  * @since 6.0.0
153
153
  */
154
154
  export interface MaterialConfiguration
155
- extends MaterialIconConfiguration,
156
- MaterialSymbolConfiguration {}
155
+ extends MaterialIconConfiguration, MaterialSymbolConfiguration {}
157
156
 
158
157
  /**
159
158
  * @since 6.0.0
@@ -87,8 +87,7 @@ export interface MaterialIconClassNameOptions extends SVGIconClassNameOptions {
87
87
  }
88
88
 
89
89
  /** @since 6.0.0 */
90
- export interface MaterialSymbolClassNameOptions
91
- extends SVGIconClassNameOptions {
90
+ export interface MaterialSymbolClassNameOptions extends SVGIconClassNameOptions {
92
91
  family: MaterialSymbolFamily;
93
92
  }
94
93
 
@@ -43,6 +43,8 @@ export function useUserInteractionMode(): UserInteractionMode {
43
43
  /** @internal */
44
44
  const TOUCH_TIMEOUT = 1200;
45
45
 
46
+ const DATE_NOW = (): number => Date.now();
47
+
46
48
  export interface UserInteractionModeProviderProps {
47
49
  children: ReactNode;
48
50
  }
@@ -84,7 +86,10 @@ export interface UserInteractionModeProviderProps {
84
86
  export function UserInteractionModeProvider(
85
87
  props: UserInteractionModeProviderProps
86
88
  ): ReactElement {
87
- const { children } = props;
89
+ const { children, now = DATE_NOW } =
90
+ props as UserInteractionModeProviderProps & {
91
+ now?: () => number;
92
+ };
88
93
  const { __root } = useContext(context);
89
94
  if (__root) {
90
95
  throw new Error(
@@ -145,7 +150,7 @@ export function UserInteractionModeProvider(
145
150
  };
146
151
 
147
152
  const handleTouchStart = (): void => {
148
- lastTouchTime.current = Date.now();
153
+ lastTouchTime.current = now();
149
154
  isTouchContextMenu.current = false;
150
155
  setMode("touch");
151
156
  };
@@ -153,7 +158,7 @@ export function UserInteractionModeProvider(
153
158
  const handleMouseMove = (): void => {
154
159
  if (
155
160
  isTouchContextMenu.current ||
156
- Date.now() - lastTouchTime.current < TOUCH_TIMEOUT
161
+ now() - lastTouchTime.current < TOUCH_TIMEOUT
157
162
  ) {
158
163
  isTouchContextMenu.current = false;
159
164
  return;
@@ -189,7 +194,7 @@ export function UserInteractionModeProvider(
189
194
  window.removeEventListener("contextmenu", handleContextMenu, true);
190
195
  }
191
196
  };
192
- }, [mode]);
197
+ }, [mode, now]);
193
198
 
194
199
  const value = useMemo<UserInteractionModeContext>(
195
200
  () => ({
@@ -187,8 +187,7 @@ export interface RippleTransitionCallbacks {
187
187
  * @since 6.0.0
188
188
  * @internal
189
189
  */
190
- export interface ProvidedRippleContainerProps
191
- extends RippleTransitionCallbacks {
190
+ export interface ProvidedRippleContainerProps extends RippleTransitionCallbacks {
192
191
  ripples: RippleStateList;
193
192
  }
194
193
 
@@ -34,8 +34,9 @@ declare module "react" {
34
34
  export const PRESSED_CLASS_NAME = "rmd-pressed";
35
35
 
36
36
  /** @since 6.0.0 */
37
- export interface ElementInteractionOptions<E extends HTMLElement>
38
- extends Partial<ElementInteractionHandlers<E>> {
37
+ export interface ElementInteractionOptions<
38
+ E extends HTMLElement,
39
+ > extends Partial<ElementInteractionHandlers<E>> {
39
40
  /**
40
41
  * This can be used to override the {@link INTERACTION_CONFIG.mode}
41
42
  *
@@ -42,21 +42,21 @@ export interface LayoutAppBarProps extends AppBarProps {
42
42
  *
43
43
  * @example Static Height
44
44
  * ```scss
45
- * @use "everything";
45
+ * @use "everything" as *;
46
46
  *
47
47
  * :root {
48
- * @include everything.layout-set-var(header-height, everything.$app-bar-height);
48
+ * @include layout-set-var(header-height, $app-bar-height);
49
49
  * }
50
50
  * ```
51
51
  *
52
52
  * @example Media Query Height Changes
53
53
  * ```scss
54
- * @use "everything";
54
+ * @use "everything" as *;
55
55
  *
56
56
  * :root {
57
- * @include everything.layout-set-var(header-height, everything.$app-bar-height);
58
- * @include everything.tablet-media {
59
- * @include everything.layout-set-var(header-height, everything.$app-bar-dense-height);
57
+ * @include layout-set-var(header-height, $app-bar-height);
58
+ * @include tablet-media {
59
+ * @include layout-set-var(header-height, $app-bar-dense-height);
60
60
  * }
61
61
  * }
62
62
  * ```
@@ -22,7 +22,8 @@ import { layoutNav } from "./layoutNavStyles.js";
22
22
  * @since 6.0.0
23
23
  */
24
24
  export interface LayoutNavProps
25
- extends HTMLAttributes<HTMLDivElement>,
25
+ extends
26
+ HTMLAttributes<HTMLDivElement>,
26
27
  BaseSheetClassNameOptions,
27
28
  TransitionCallbacks,
28
29
  TransitionActions {
@@ -18,7 +18,8 @@ import {
18
18
  * @since 6.0.0
19
19
  */
20
20
  export interface LayoutWindowSplitterProps
21
- extends WindowSplitterWidgetProps<HTMLButtonElement>,
21
+ extends
22
+ WindowSplitterWidgetProps<HTMLButtonElement>,
22
23
  Omit<
23
24
  BaseWindowSplitterProps,
24
25
  keyof WindowSplitterWidgetProps<HTMLButtonElement>
@@ -27,8 +27,7 @@ export type CustomMainElement = ElementType<
27
27
  * @since 6.0.0
28
28
  */
29
29
  export interface MainProps
30
- extends HTMLAttributes<HTMLElement>,
31
- MainClassNameOptions {
30
+ extends HTMLAttributes<HTMLElement>, MainClassNameOptions {
32
31
  /**
33
32
  * @defaultValue `"main"`
34
33
  */
@@ -6,10 +6,12 @@ import { useSsr } from "../SsrProvider.js";
6
6
  import { useAppSize } from "../media-queries/AppSizeProvider.js";
7
7
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
8
8
  import { type AppSize } from "../media-queries/appSize.js";
9
+ import { MEDIA_QUERY_CONFIG } from "../media-queries/config.js";
9
10
  import { useMediaQuery } from "../media-queries/useMediaQuery.js";
10
11
  import { type CSSTransitionElementProps } from "../transition/types.js";
11
12
  import { type CssPosition, type UseStateInitializer } from "../types.js";
12
13
  import { useToggle } from "../useToggle.js";
14
+ import { useDevEffect } from "../utils/useDevEffect.js";
13
15
  import { type LayoutNavProps } from "./LayoutNav.js";
14
16
  import {
15
17
  type HorizontalLayoutTransitionOptions,
@@ -26,6 +28,8 @@ import {
26
28
  useTemporaryLayout,
27
29
  } from "./useTemporaryLayout.js";
28
30
 
31
+ let loggedOnce = false;
32
+
29
33
  /**
30
34
  * @since 6.0.0
31
35
  */
@@ -78,7 +82,8 @@ export interface ExpandableLayoutOptions extends TemporaryLayoutOptions {
78
82
  * @since 6.0.0
79
83
  */
80
84
  export interface ProvidedLayoutMainProps
81
- extends ProvidedTemporaryLayoutMainProps,
85
+ extends
86
+ ProvidedTemporaryLayoutMainProps,
82
87
  CSSTransitionElementProps<HTMLElement> {}
83
88
 
84
89
  /**
@@ -98,16 +103,14 @@ export type ProvidedLayoutAppBarProps = ProvidedTemporaryLayoutAppBarProps &
98
103
  /**
99
104
  * @since 6.0.0
100
105
  */
101
- export interface ProvidedExpandableLayoutNavToggleProps
102
- extends ProvidedLayoutNavToggleProps {
106
+ export interface ProvidedExpandableLayoutNavToggleProps extends ProvidedLayoutNavToggleProps {
103
107
  className: string;
104
108
  }
105
109
 
106
110
  /**
107
111
  * @since 6.0.0
108
112
  */
109
- export interface ExpandableLayoutImplementation
110
- extends TemporaryLayoutImplementation {
113
+ export interface ExpandableLayoutImplementation extends TemporaryLayoutImplementation {
111
114
  temporary: boolean;
112
115
  persistent: boolean;
113
116
  expanded: boolean;
@@ -264,6 +267,61 @@ export function useExpandableLayout(
264
267
  ? isPhone || (temporaryUntil === "desktop" && !isDesktop)
265
268
  : !matches;
266
269
 
270
+ useDevEffect(() => {
271
+ if (process.env.NODE_ENV === "test") {
272
+ return;
273
+ }
274
+
275
+ let query: string;
276
+ if (temporaryUntil === "tablet" || temporaryUntil === "desktop") {
277
+ const minWidth =
278
+ temporaryUntil === "tablet"
279
+ ? MEDIA_QUERY_CONFIG.tabletMinWidth
280
+ : MEDIA_QUERY_CONFIG.desktopMinWidth;
281
+ query = `screen and (min-width: ${minWidth})`;
282
+ } else {
283
+ query = temporaryUntil;
284
+ }
285
+
286
+ const timeout = window.setTimeout(() => {
287
+ let found = false;
288
+ for (let i = 0; i < document.styleSheets.length; i++) {
289
+ const sheet = document.styleSheets[i];
290
+
291
+ try {
292
+ const rules = sheet.cssRules;
293
+ for (let j = 0; j < rules.length; j++) {
294
+ const rule = rules[j];
295
+ if (
296
+ rule.cssText.includes(".rmd-layout") &&
297
+ rule.cssText.includes(`@media ${query}`)
298
+ ) {
299
+ found = true;
300
+ return;
301
+ }
302
+ }
303
+ } catch {
304
+ //
305
+ }
306
+ }
307
+
308
+ if (!found && !loggedOnce) {
309
+ loggedOnce = true;
310
+ // eslint-disable-next-line no-console
311
+ console.error(
312
+ `The react-md expandable layout has set \`temporaryUntil: "${temporaryUntil}"\` but the corresponding styles have not been found.` +
313
+ " This usually means the `$layout-navigation-breakpoint` or `temporaryUntil` value should be updated match.\n\n" +
314
+ "See https://react-md.dev/getting-started/layout#updating-the-layout-to-be-temporary-until-a-specific-breakpoint-optional " +
315
+ "for more information."
316
+ );
317
+ }
318
+ }, 3000);
319
+
320
+ return () => {
321
+ window.clearTimeout(timeout);
322
+ };
323
+ }, [temporaryUntil]);
324
+
267
325
  return {
268
326
  visible,
269
327
  temporary,
@@ -25,8 +25,7 @@ export const DEFAULT_HORIZONTAL_LAYOUT_TRANSITION_CLASSNAMES = {
25
25
  /**
26
26
  * @since 6.0.0
27
27
  */
28
- export interface HorizontalLayoutTransitionOptions
29
- extends PreconfiguredCSSTransitionOptions<HTMLElement> {
28
+ export interface HorizontalLayoutTransitionOptions extends PreconfiguredCSSTransitionOptions<HTMLElement> {
30
29
  /**
31
30
  * @see {@link DEFAULT_SHEET_TIMEOUT}
32
31
  * @defaultValue `DEFAULT_SHEET_TIMEOUT`
@@ -87,8 +87,8 @@ export interface LayoutTreeOptions<
87
87
  */
88
88
  export interface LayoutTreeImplementation<
89
89
  T extends TreeItemNode = DefaultTreeItemNode,
90
- > extends Pick<TreeProps<T>, "data">,
91
- TreeImplementation {}
90
+ >
91
+ extends Pick<TreeProps<T>, "data">, TreeImplementation {}
92
92
 
93
93
  /**
94
94
  * Before considering to use a `Tree` for site navigation, it is important to
@@ -13,8 +13,10 @@ import {
13
13
  /**
14
14
  * @since 6.0.0
15
15
  */
16
- export interface LayoutWindowSplitterOptions
17
- extends Omit<WindowSplitterOptions, "min" | "max"> {
16
+ export interface LayoutWindowSplitterOptions extends Omit<
17
+ WindowSplitterOptions,
18
+ "min" | "max"
19
+ > {
18
20
  /**
19
21
  * @see {@link WindowSplitterOptions.min}
20
22
  * @defaultValue `96`
@@ -51,8 +53,7 @@ export interface LayoutWindowSplitterOptions
51
53
  /**
52
54
  * @since 6.0.0
53
55
  */
54
- export interface ProvidedLayoutWindowSplitterProps
55
- extends WindowSplitterWidgetProps<HTMLButtonElement> {
56
+ export interface ProvidedLayoutWindowSplitterProps extends WindowSplitterWidgetProps<HTMLButtonElement> {
56
57
  /** @defaultValue {@link WindowSplitterImplementation.value} */
57
58
  navWidth: number;
58
59
  }
@@ -60,8 +61,7 @@ export interface ProvidedLayoutWindowSplitterProps
60
61
  /**
61
62
  * @since 6.0.0
62
63
  */
63
- export interface LayoutWindowSplitterImplementation
64
- extends WindowSplitterImplementation {
64
+ export interface LayoutWindowSplitterImplementation extends WindowSplitterImplementation {
65
65
  splitterProps: ProvidedLayoutWindowSplitterProps;
66
66
  }
67
67
 
@@ -16,8 +16,7 @@ import {
16
16
  * @since 6.0.0
17
17
  */
18
18
  export interface ResizableLayoutOptions
19
- extends ExpandableLayoutOptions,
20
- LayoutWindowSplitterOptions {
19
+ extends ExpandableLayoutOptions, LayoutWindowSplitterOptions {
21
20
  /**
22
21
  * This id will be used as the `aria-controls` prop for the
23
22
  * `LayoutWindowSplitter` and should be applied to the `LayoutNav` as an `id`.
@@ -30,16 +29,14 @@ export interface ResizableLayoutOptions
30
29
  /**
31
30
  * @since 6.0.0
32
31
  */
33
- export interface ProvidedResizableLayoutNavProps
34
- extends ProvidedLayoutNavProps {
32
+ export interface ProvidedResizableLayoutNavProps extends ProvidedLayoutNavProps {
35
33
  id: string;
36
34
  }
37
35
 
38
36
  /**
39
37
  * @since 6.0.0
40
38
  */
41
- export interface ResizableLayoutImplementation
42
- extends ExpandableLayoutImplementation {
39
+ export interface ResizableLayoutImplementation extends ExpandableLayoutImplementation {
43
40
  expandableNavProps: ProvidedResizableLayoutNavProps;
44
41
  windowSplitterProps: LayoutWindowSplitterProps;
45
42
  }