@react-md/core 6.3.4 → 6.4.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 (450) hide show
  1. package/dist/CoreProviders.d.ts +1 -0
  2. package/dist/CoreProviders.js.map +1 -1
  3. package/dist/_base.scss +3 -0
  4. package/dist/_core.scss +1 -0
  5. package/dist/_utils.scss +15 -7
  6. package/dist/app-bar/AppBar.js.map +1 -1
  7. package/dist/app-bar/AppBarTitle.js.map +1 -1
  8. package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -1
  9. package/dist/autocomplete/types.js.map +1 -1
  10. package/dist/autocomplete/utils.js.map +1 -1
  11. package/dist/avatar/Avatar.js.map +1 -1
  12. package/dist/button/Button.js.map +1 -1
  13. package/dist/button/FloatingActionButton.js.map +1 -1
  14. package/dist/card/Card.js.map +1 -1
  15. package/dist/card/CardContent.js.map +1 -1
  16. package/dist/card/ClickableCard.js.map +1 -1
  17. package/dist/chip/Chip.js.map +1 -1
  18. package/dist/datetime/NativeDateField.js.map +1 -1
  19. package/dist/datetime/NativeTimeField.js.map +1 -1
  20. package/dist/datetime/useDateField.js.map +1 -1
  21. package/dist/datetime/useTimeField.js.map +1 -1
  22. package/dist/dialog/Dialog.js.map +1 -1
  23. package/dist/dialog/DialogContainer.js.map +1 -1
  24. package/dist/dialog/DialogContent.js.map +1 -1
  25. package/dist/dialog/DialogFooter.js.map +1 -1
  26. package/dist/divider/Divider.js.map +1 -1
  27. package/dist/draggable/useDraggable.js.map +1 -1
  28. package/dist/draggable/utils.js.map +1 -1
  29. package/dist/expansion-panel/ExpansionPanelHeader.js.map +1 -1
  30. package/dist/files/FileInput.js.map +1 -1
  31. package/dist/files/useFileUpload.js.map +1 -1
  32. package/dist/files/validation.js.map +1 -1
  33. package/dist/focus/useFocusContainer.js.map +1 -1
  34. package/dist/form/Fieldset.d.ts +19 -0
  35. package/dist/form/Fieldset.js +22 -2
  36. package/dist/form/Fieldset.js.map +1 -1
  37. package/dist/form/FormMessageContainer.js.map +1 -1
  38. package/dist/form/FormMessageCounter.js.map +1 -1
  39. package/dist/form/InputToggle.js.map +1 -1
  40. package/dist/form/Legend.d.ts +27 -5
  41. package/dist/form/Legend.js +39 -6
  42. package/dist/form/Legend.js.map +1 -1
  43. package/dist/form/Listbox.js.map +1 -1
  44. package/dist/form/ListboxProvider.js.map +1 -1
  45. package/dist/form/NativeSelect.js.map +1 -1
  46. package/dist/form/Password.js.map +1 -1
  47. package/dist/form/ResizingTextAreaWrapper.js.map +1 -1
  48. package/dist/form/Select.js.map +1 -1
  49. package/dist/form/Slider.js.map +1 -1
  50. package/dist/form/SliderContainer.js.map +1 -1
  51. package/dist/form/SliderThumb.js.map +1 -1
  52. package/dist/form/SliderTrack.js.map +1 -1
  53. package/dist/form/SliderValueMarks.js.map +1 -1
  54. package/dist/form/Switch.js.map +1 -1
  55. package/dist/form/TextArea.js.map +1 -1
  56. package/dist/form/TextField.js.map +1 -1
  57. package/dist/form/TextFieldContainer.js.map +1 -1
  58. package/dist/form/_fieldset.scss +7 -0
  59. package/dist/form/_legend.scss +68 -0
  60. package/dist/form/_text-field.scss +39 -4
  61. package/dist/form/fieldsetStyles.d.ts +6 -1
  62. package/dist/form/fieldsetStyles.js +3 -2
  63. package/dist/form/fieldsetStyles.js.map +1 -1
  64. package/dist/form/inputToggleStyles.js.map +1 -1
  65. package/dist/form/labelStyles.d.ts +1 -1
  66. package/dist/form/labelStyles.js +1 -1
  67. package/dist/form/labelStyles.js.map +1 -1
  68. package/dist/form/legendStyles.d.ts +83 -0
  69. package/dist/form/legendStyles.js +25 -0
  70. package/dist/form/legendStyles.js.map +1 -0
  71. package/dist/form/selectUtils.js.map +1 -1
  72. package/dist/form/textFieldContainerStyles.js.map +1 -1
  73. package/dist/form/types.d.ts +28 -6
  74. package/dist/form/types.js.map +1 -1
  75. package/dist/form/useCheckboxGroup.js.map +1 -1
  76. package/dist/form/useCombobox.js.map +1 -1
  77. package/dist/form/useNumberField.js +16 -19
  78. package/dist/form/useNumberField.js.map +1 -1
  79. package/dist/form/useRangeSlider.js.map +1 -1
  80. package/dist/form/useSlider.js.map +1 -1
  81. package/dist/form/useTextField.js.map +1 -1
  82. package/dist/hoverMode/useHoverMode.js.map +1 -1
  83. package/dist/icon/FontIcon.js.map +1 -1
  84. package/dist/icon/IconRotator.js.map +1 -1
  85. package/dist/icon/MaterialIcon.js.map +1 -1
  86. package/dist/icon/MaterialSymbol.js.map +1 -1
  87. package/dist/icon/SVGIcon.js.map +1 -1
  88. package/dist/icon/config.d.ts +0 -1
  89. package/dist/icon/config.js +10 -7
  90. package/dist/icon/config.js.map +1 -1
  91. package/dist/icon/materialConfig.js.map +1 -1
  92. package/dist/icon/styles.js.map +1 -1
  93. package/dist/interaction/UserInteractionModeProvider.js +6 -4
  94. package/dist/interaction/UserInteractionModeProvider.js.map +1 -1
  95. package/dist/interaction/types.js.map +1 -1
  96. package/dist/interaction/useElementInteraction.js.map +1 -1
  97. package/dist/layout/LayoutAppBar.d.ts +6 -6
  98. package/dist/layout/LayoutAppBar.js +6 -6
  99. package/dist/layout/LayoutAppBar.js.map +1 -1
  100. package/dist/layout/LayoutNav.js.map +1 -1
  101. package/dist/layout/LayoutWindowSplitter.js.map +1 -1
  102. package/dist/layout/Main.js.map +1 -1
  103. package/dist/layout/useExpandableLayout.js +43 -0
  104. package/dist/layout/useExpandableLayout.js.map +1 -1
  105. package/dist/layout/useHorizontalLayoutTransition.js.map +1 -1
  106. package/dist/layout/useLayoutTree.js.map +1 -1
  107. package/dist/layout/useLayoutWindowSplitter.js.map +1 -1
  108. package/dist/layout/useResizableLayout.js.map +1 -1
  109. package/dist/link/Link.js.map +1 -1
  110. package/dist/link/SkipToMainContent.js +19 -21
  111. package/dist/link/SkipToMainContent.js.map +1 -1
  112. package/dist/list/List.js.map +1 -1
  113. package/dist/list/ListItem.js.map +1 -1
  114. package/dist/list/ListItemAddon.js.map +1 -1
  115. package/dist/list/ListItemLink.js.map +1 -1
  116. package/dist/list/ListSubheader.js.map +1 -1
  117. package/dist/list/getListItemHeight.js.map +1 -1
  118. package/dist/list/listItemStyles.js.map +1 -1
  119. package/dist/list/types.js.map +1 -1
  120. package/dist/media-queries/AppSizeProvider.d.ts +2 -0
  121. package/dist/media-queries/AppSizeProvider.js +3 -2
  122. package/dist/media-queries/AppSizeProvider.js.map +1 -1
  123. package/dist/media-queries/appSize.d.ts +3 -0
  124. package/dist/media-queries/appSize.js +3 -1
  125. package/dist/media-queries/appSize.js.map +1 -1
  126. package/dist/media-queries/config.d.ts +11 -0
  127. package/dist/media-queries/config.js +26 -0
  128. package/dist/media-queries/config.js.map +1 -0
  129. package/dist/menu/DropdownMenu.js.map +1 -1
  130. package/dist/menu/Menu.js.map +1 -1
  131. package/dist/menu/MenuItemButton.js.map +1 -1
  132. package/dist/menu/MenuItemFileInput.js.map +1 -1
  133. package/dist/menu/MenuItemInputToggle.js.map +1 -1
  134. package/dist/menu/MenuItemSeparator.js.map +1 -1
  135. package/dist/menu/MenuVisibilityProvider.js.map +1 -1
  136. package/dist/menu/MenuWidget.js.map +1 -1
  137. package/dist/menu/useContextMenu.js.map +1 -1
  138. package/dist/movement/types.d.ts +28 -3
  139. package/dist/movement/types.js.map +1 -1
  140. package/dist/movement/useKeyboardMovementProvider.js +96 -47
  141. package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
  142. package/dist/navigation/CollapsibleNavGroup.js.map +1 -1
  143. package/dist/navigation/NavItem.js.map +1 -1
  144. package/dist/navigation/NavItemButton.js.map +1 -1
  145. package/dist/navigation/NavItemLink.js.map +1 -1
  146. package/dist/navigation/getTableOfContentsHeadings.js.map +1 -1
  147. package/dist/navigation/types.js.map +1 -1
  148. package/dist/overlay/Overlay.js.map +1 -1
  149. package/dist/positioning/createHorizontalPosition.js.map +1 -1
  150. package/dist/positioning/createVerticalPosition.js.map +1 -1
  151. package/dist/positioning/useFixedPositioning.js.map +1 -1
  152. package/dist/progress/CircularProgress.js.map +1 -1
  153. package/dist/progress/LinearProgress.js.map +1 -1
  154. package/dist/progress/linearProgressStyles.js.map +1 -1
  155. package/dist/responsive-item/ResponsiveItem.js.map +1 -1
  156. package/dist/responsive-item/ResponsiveItemOverlay.js.map +1 -1
  157. package/dist/searching/caseInsensitive.js.map +1 -1
  158. package/dist/segmented-button/SegmentedButton.js.map +1 -1
  159. package/dist/segmented-button/SegmentedButtonContainer.js.map +1 -1
  160. package/dist/segmented-button/segmentedButtonStyles.js.map +1 -1
  161. package/dist/sheet/Sheet.js.map +1 -1
  162. package/dist/snackbar/Toast.js.map +1 -1
  163. package/dist/spinbutton/SpinButton.d.ts +16 -0
  164. package/dist/spinbutton/SpinButton.js +55 -0
  165. package/dist/spinbutton/SpinButton.js.map +1 -0
  166. package/dist/spinbutton/SpinButtonGroupProvider.d.ts +17 -0
  167. package/dist/spinbutton/SpinButtonGroupProvider.js +19 -0
  168. package/dist/spinbutton/SpinButtonGroupProvider.js.map +1 -0
  169. package/dist/spinbutton/defaults.d.ts +9 -0
  170. package/dist/spinbutton/defaults.js +25 -0
  171. package/dist/spinbutton/defaults.js.map +1 -0
  172. package/dist/spinbutton/types.d.ts +324 -0
  173. package/dist/spinbutton/types.js +5 -0
  174. package/dist/spinbutton/types.js.map +1 -0
  175. package/dist/spinbutton/useSpinButton.d.ts +5 -0
  176. package/dist/spinbutton/useSpinButton.js +260 -0
  177. package/dist/spinbutton/useSpinButton.js.map +1 -0
  178. package/dist/spinbutton/useSpinButtonGroupProvider.d.ts +27 -0
  179. package/dist/spinbutton/useSpinButtonGroupProvider.js +49 -0
  180. package/dist/spinbutton/useSpinButtonGroupProvider.js.map +1 -0
  181. package/dist/spinbutton/utils/deselectNode.d.ts +5 -0
  182. package/dist/spinbutton/utils/deselectNode.js +17 -0
  183. package/dist/spinbutton/utils/deselectNode.js.map +1 -0
  184. package/dist/spinbutton/utils/resolveInputEvent.d.ts +30 -0
  185. package/dist/spinbutton/utils/resolveInputEvent.js +53 -0
  186. package/dist/spinbutton/utils/resolveInputEvent.js.map +1 -0
  187. package/dist/spinbutton/utils/selectNode.d.ts +5 -0
  188. package/dist/spinbutton/utils/selectNode.js +15 -0
  189. package/dist/spinbutton/utils/selectNode.js.map +1 -0
  190. package/dist/table/StickyTableSection.js.map +1 -1
  191. package/dist/table/Table.js.map +1 -1
  192. package/dist/table/TableBody.js.map +1 -1
  193. package/dist/table/TableCellContent.js.map +1 -1
  194. package/dist/table/TableCheckbox.js.map +1 -1
  195. package/dist/table/TableFooter.js.map +1 -1
  196. package/dist/table/TableHeader.js.map +1 -1
  197. package/dist/table/TableRadio.js.map +1 -1
  198. package/dist/table/TableRow.js.map +1 -1
  199. package/dist/table/useStickyTableSection.js.map +1 -1
  200. package/dist/tabs/SimpleTabPanel.js.map +1 -1
  201. package/dist/tabs/SimpleTabPanels.js.map +1 -1
  202. package/dist/tabs/Tab.js.map +1 -1
  203. package/dist/tabs/TabList.js.map +1 -1
  204. package/dist/tabs/TabListScrollButton.js.map +1 -1
  205. package/dist/tabs/useMaxTabPanelHeight.js.map +1 -1
  206. package/dist/test-utils/data-testid.js.map +1 -1
  207. package/dist/test-utils/mocks/match-media.js +5 -5
  208. package/dist/test-utils/mocks/match-media.js.map +1 -1
  209. package/dist/test-utils/vitest/timers.d.ts +1 -1
  210. package/dist/test-utils/vitest/timers.js +1 -1
  211. package/dist/test-utils/vitest/timers.js.map +1 -1
  212. package/dist/tooltip/Tooltip.js.map +1 -1
  213. package/dist/tooltip/TooltipHoverModeProvider.js.map +1 -1
  214. package/dist/tooltip/useTooltip.js.map +1 -1
  215. package/dist/transition/CSSTransition.js.map +1 -1
  216. package/dist/transition/Collapse.js.map +1 -1
  217. package/dist/transition/CrossFade.js.map +1 -1
  218. package/dist/transition/ScaleTransition.js.map +1 -1
  219. package/dist/transition/SkeletonPlaceholder.js.map +1 -1
  220. package/dist/transition/Slide.js.map +1 -1
  221. package/dist/transition/SlideContainer.js.map +1 -1
  222. package/dist/transition/types.js.map +1 -1
  223. package/dist/transition/useCollapseTransition.js.map +1 -1
  224. package/dist/transition/useCrossFadeTransition.js.map +1 -1
  225. package/dist/transition/useMaxWidthTransition.js.map +1 -1
  226. package/dist/transition/useScaleTransition.js.map +1 -1
  227. package/dist/transition/useSkeletonPlaceholder.js.map +1 -1
  228. package/dist/tree/Tree.js.map +1 -1
  229. package/dist/tree/TreeItem.js.map +1 -1
  230. package/dist/tree/TreeProvider.js.map +1 -1
  231. package/dist/tree/styles.js.map +1 -1
  232. package/dist/tree/types.js.map +1 -1
  233. package/dist/tree/useTreeMovement.js.map +1 -1
  234. package/dist/typography/HighlightTextMark.js.map +1 -1
  235. package/dist/typography/Mark.js.map +1 -1
  236. package/dist/typography/TextContainer.js.map +1 -1
  237. package/dist/typography/Typography.js.map +1 -1
  238. package/dist/typography/_typography.scss +0 -1
  239. package/dist/useElementSize.js.map +1 -1
  240. package/dist/useIntersectionObserver.js.map +1 -1
  241. package/dist/useMutationObserver.js.map +1 -1
  242. package/dist/useWindowSize.js.map +1 -1
  243. package/dist/utils/getNumberOfDigits.d.ts +7 -0
  244. package/dist/utils/getNumberOfDigits.js +11 -0
  245. package/dist/utils/getNumberOfDigits.js.map +1 -0
  246. package/dist/utils/nearest.js +2 -1
  247. package/dist/utils/nearest.js.map +1 -1
  248. package/dist/utils/useDevEffect.d.ts +7 -0
  249. package/dist/utils/useDevEffect.js +8 -0
  250. package/dist/utils/useDevEffect.js.map +1 -0
  251. package/dist/window-splitter/WindowSplitter.js +3 -2
  252. package/dist/window-splitter/WindowSplitter.js.map +1 -1
  253. package/dist/window-splitter/_window-splitter.scss +60 -12
  254. package/dist/window-splitter/styles.d.ts +9 -0
  255. package/dist/window-splitter/styles.js +3 -2
  256. package/dist/window-splitter/styles.js.map +1 -1
  257. package/dist/window-splitter/useWindowSplitter.js.map +1 -1
  258. package/package.json +37 -29
  259. package/src/CoreProviders.tsx +1 -0
  260. package/src/app-bar/AppBar.tsx +1 -2
  261. package/src/app-bar/AppBarTitle.tsx +1 -2
  262. package/src/autocomplete/AutocompleteListboxChildren.tsx +3 -1
  263. package/src/autocomplete/types.ts +24 -19
  264. package/src/autocomplete/utils.ts +9 -6
  265. package/src/avatar/Avatar.tsx +2 -1
  266. package/src/button/Button.tsx +2 -1
  267. package/src/button/FloatingActionButton.tsx +2 -1
  268. package/src/card/Card.tsx +2 -1
  269. package/src/card/CardContent.tsx +1 -2
  270. package/src/card/ClickableCard.tsx +1 -2
  271. package/src/chip/Chip.tsx +2 -1
  272. package/src/datetime/NativeDateField.tsx +2 -1
  273. package/src/datetime/NativeTimeField.tsx +2 -1
  274. package/src/datetime/useDateField.ts +13 -8
  275. package/src/datetime/useTimeField.ts +13 -8
  276. package/src/dialog/Dialog.tsx +2 -1
  277. package/src/dialog/DialogContainer.tsx +1 -2
  278. package/src/dialog/DialogContent.tsx +1 -2
  279. package/src/dialog/DialogFooter.tsx +1 -2
  280. package/src/divider/Divider.tsx +1 -2
  281. package/src/draggable/useDraggable.ts +4 -4
  282. package/src/draggable/utils.ts +4 -2
  283. package/src/expansion-panel/ExpansionPanelHeader.tsx +1 -2
  284. package/src/files/FileInput.tsx +2 -1
  285. package/src/files/useFileUpload.ts +6 -6
  286. package/src/files/validation.ts +1 -2
  287. package/src/focus/useFocusContainer.ts +4 -4
  288. package/src/form/Fieldset.tsx +25 -3
  289. package/src/form/FormMessageContainer.tsx +1 -2
  290. package/src/form/FormMessageCounter.tsx +1 -2
  291. package/src/form/InputToggle.tsx +3 -3
  292. package/src/form/Legend.tsx +55 -10
  293. package/src/form/Listbox.tsx +1 -2
  294. package/src/form/ListboxProvider.ts +3 -2
  295. package/src/form/NativeSelect.tsx +2 -1
  296. package/src/form/Password.tsx +4 -2
  297. package/src/form/ResizingTextAreaWrapper.tsx +1 -2
  298. package/src/form/Select.tsx +2 -1
  299. package/src/form/Slider.tsx +2 -1
  300. package/src/form/SliderContainer.tsx +1 -2
  301. package/src/form/SliderThumb.tsx +6 -3
  302. package/src/form/SliderTrack.tsx +2 -1
  303. package/src/form/SliderValueMarks.tsx +1 -2
  304. package/src/form/Switch.tsx +2 -1
  305. package/src/form/TextArea.tsx +1 -2
  306. package/src/form/TextField.tsx +2 -1
  307. package/src/form/TextFieldContainer.tsx +1 -2
  308. package/src/form/fieldsetStyles.ts +18 -3
  309. package/src/form/inputToggleStyles.ts +4 -2
  310. package/src/form/labelStyles.ts +1 -1
  311. package/src/form/legendStyles.ts +132 -0
  312. package/src/form/selectUtils.ts +3 -2
  313. package/src/form/textFieldContainerStyles.ts +1 -2
  314. package/src/form/types.ts +35 -17
  315. package/src/form/useCheckboxGroup.ts +3 -2
  316. package/src/form/useCombobox.ts +8 -3
  317. package/src/form/useNumberField.ts +36 -35
  318. package/src/form/useRangeSlider.ts +1 -2
  319. package/src/form/useSlider.ts +1 -2
  320. package/src/form/useTextField.ts +8 -3
  321. package/src/hoverMode/useHoverMode.ts +4 -8
  322. package/src/icon/FontIcon.tsx +1 -2
  323. package/src/icon/IconRotator.tsx +1 -2
  324. package/src/icon/MaterialIcon.tsx +2 -1
  325. package/src/icon/MaterialSymbol.tsx +2 -1
  326. package/src/icon/SVGIcon.tsx +1 -2
  327. package/src/icon/config.tsx +10 -7
  328. package/src/icon/materialConfig.ts +1 -2
  329. package/src/icon/styles.ts +1 -2
  330. package/src/interaction/UserInteractionModeProvider.tsx +9 -4
  331. package/src/interaction/types.ts +1 -2
  332. package/src/interaction/useElementInteraction.tsx +3 -2
  333. package/src/layout/LayoutAppBar.tsx +6 -6
  334. package/src/layout/LayoutNav.tsx +2 -1
  335. package/src/layout/LayoutWindowSplitter.tsx +2 -1
  336. package/src/layout/Main.tsx +1 -2
  337. package/src/layout/useExpandableLayout.ts +63 -5
  338. package/src/layout/useHorizontalLayoutTransition.ts +1 -2
  339. package/src/layout/useLayoutTree.ts +2 -2
  340. package/src/layout/useLayoutWindowSplitter.ts +6 -6
  341. package/src/layout/useResizableLayout.ts +3 -6
  342. package/src/link/Link.tsx +1 -2
  343. package/src/link/SkipToMainContent.tsx +20 -23
  344. package/src/list/List.tsx +1 -2
  345. package/src/list/ListItem.tsx +2 -1
  346. package/src/list/ListItemAddon.tsx +2 -1
  347. package/src/list/ListItemLink.tsx +2 -1
  348. package/src/list/ListSubheader.tsx +1 -2
  349. package/src/list/getListItemHeight.ts +8 -9
  350. package/src/list/listItemStyles.ts +1 -2
  351. package/src/list/types.ts +1 -2
  352. package/src/media-queries/AppSizeProvider.tsx +8 -10
  353. package/src/media-queries/appSize.ts +3 -0
  354. package/src/media-queries/config.ts +41 -0
  355. package/src/menu/DropdownMenu.tsx +4 -5
  356. package/src/menu/Menu.tsx +2 -1
  357. package/src/menu/MenuItemButton.tsx +1 -2
  358. package/src/menu/MenuItemFileInput.tsx +2 -1
  359. package/src/menu/MenuItemInputToggle.tsx +3 -3
  360. package/src/menu/MenuItemSeparator.tsx +2 -1
  361. package/src/menu/MenuVisibilityProvider.tsx +4 -2
  362. package/src/menu/MenuWidget.tsx +1 -2
  363. package/src/menu/useContextMenu.ts +4 -2
  364. package/src/movement/types.ts +52 -13
  365. package/src/movement/useKeyboardMovementProvider.ts +77 -38
  366. package/src/navigation/CollapsibleNavGroup.tsx +1 -2
  367. package/src/navigation/NavItem.tsx +1 -2
  368. package/src/navigation/NavItemButton.tsx +2 -1
  369. package/src/navigation/NavItemLink.tsx +2 -1
  370. package/src/navigation/getTableOfContentsHeadings.ts +1 -2
  371. package/src/navigation/types.ts +1 -2
  372. package/src/overlay/Overlay.tsx +2 -1
  373. package/src/positioning/createHorizontalPosition.ts +10 -12
  374. package/src/positioning/createVerticalPosition.ts +10 -11
  375. package/src/positioning/useFixedPositioning.ts +6 -3
  376. package/src/progress/CircularProgress.tsx +2 -1
  377. package/src/progress/LinearProgress.tsx +2 -1
  378. package/src/progress/linearProgressStyles.ts +1 -2
  379. package/src/responsive-item/ResponsiveItem.tsx +1 -2
  380. package/src/responsive-item/ResponsiveItemOverlay.tsx +2 -1
  381. package/src/searching/caseInsensitive.ts +2 -4
  382. package/src/segmented-button/SegmentedButton.tsx +2 -1
  383. package/src/segmented-button/SegmentedButtonContainer.tsx +2 -1
  384. package/src/segmented-button/segmentedButtonStyles.ts +1 -2
  385. package/src/sheet/Sheet.tsx +1 -2
  386. package/src/snackbar/Toast.tsx +2 -1
  387. package/src/spinbutton/SpinButton.tsx +98 -0
  388. package/src/spinbutton/SpinButtonGroupProvider.tsx +32 -0
  389. package/src/spinbutton/defaults.ts +45 -0
  390. package/src/spinbutton/types.ts +413 -0
  391. package/src/spinbutton/useSpinButton.ts +311 -0
  392. package/src/spinbutton/useSpinButtonGroupProvider.ts +104 -0
  393. package/src/spinbutton/utils/deselectNode.ts +17 -0
  394. package/src/spinbutton/utils/resolveInputEvent.ts +112 -0
  395. package/src/spinbutton/utils/selectNode.ts +15 -0
  396. package/src/table/StickyTableSection.tsx +2 -1
  397. package/src/table/Table.tsx +1 -2
  398. package/src/table/TableBody.tsx +2 -1
  399. package/src/table/TableCellContent.tsx +1 -2
  400. package/src/table/TableCheckbox.tsx +1 -2
  401. package/src/table/TableFooter.tsx +1 -2
  402. package/src/table/TableHeader.tsx +1 -2
  403. package/src/table/TableRadio.tsx +1 -2
  404. package/src/table/TableRow.tsx +1 -2
  405. package/src/table/useStickyTableSection.tsx +1 -2
  406. package/src/tabs/SimpleTabPanel.tsx +2 -1
  407. package/src/tabs/SimpleTabPanels.tsx +2 -1
  408. package/src/tabs/Tab.tsx +3 -6
  409. package/src/tabs/TabList.tsx +2 -1
  410. package/src/tabs/TabListScrollButton.tsx +1 -2
  411. package/src/tabs/useMaxTabPanelHeight.ts +7 -4
  412. package/src/test-utils/data-testid.ts +1 -2
  413. package/src/test-utils/mocks/match-media.ts +5 -10
  414. package/src/test-utils/vitest/timers.ts +1 -1
  415. package/src/tooltip/Tooltip.tsx +2 -1
  416. package/src/tooltip/TooltipHoverModeProvider.tsx +1 -2
  417. package/src/tooltip/useTooltip.ts +9 -5
  418. package/src/transition/CSSTransition.tsx +2 -1
  419. package/src/transition/Collapse.tsx +4 -2
  420. package/src/transition/CrossFade.tsx +2 -1
  421. package/src/transition/ScaleTransition.tsx +2 -1
  422. package/src/transition/SkeletonPlaceholder.tsx +1 -2
  423. package/src/transition/Slide.tsx +2 -1
  424. package/src/transition/SlideContainer.tsx +1 -2
  425. package/src/transition/types.ts +15 -16
  426. package/src/transition/useCollapseTransition.ts +6 -5
  427. package/src/transition/useCrossFadeTransition.ts +3 -2
  428. package/src/transition/useMaxWidthTransition.ts +1 -2
  429. package/src/transition/useScaleTransition.ts +3 -2
  430. package/src/transition/useSkeletonPlaceholder.ts +1 -2
  431. package/src/tree/Tree.tsx +2 -1
  432. package/src/tree/TreeItem.tsx +2 -1
  433. package/src/tree/TreeProvider.tsx +4 -4
  434. package/src/tree/styles.ts +1 -2
  435. package/src/tree/types.ts +1 -2
  436. package/src/tree/useTreeMovement.ts +1 -2
  437. package/src/typography/HighlightTextMark.tsx +1 -2
  438. package/src/typography/Mark.tsx +1 -2
  439. package/src/typography/TextContainer.tsx +1 -2
  440. package/src/typography/Typography.tsx +1 -2
  441. package/src/useElementSize.ts +7 -4
  442. package/src/useIntersectionObserver.ts +3 -2
  443. package/src/useMutationObserver.ts +3 -2
  444. package/src/useWindowSize.ts +4 -2
  445. package/src/utils/getNumberOfDigits.ts +18 -0
  446. package/src/utils/nearest.ts +2 -1
  447. package/src/utils/useDevEffect.ts +9 -0
  448. package/src/window-splitter/WindowSplitter.tsx +5 -2
  449. package/src/window-splitter/styles.ts +13 -2
  450. package/src/window-splitter/useWindowSplitter.ts +3 -1
@@ -4,15 +4,14 @@ import type { ListItemChildrenProps, ListItemHeight } from "./types.js";
4
4
  * @since 6.0.0
5
5
  * @internal
6
6
  */
7
- export interface ListItemHeightOptions
8
- extends Pick<
9
- ListItemChildrenProps,
10
- | "leftAddon"
11
- | "rightAddon"
12
- | "leftAddonType"
13
- | "rightAddonType"
14
- | "secondaryText"
15
- > {
7
+ export interface ListItemHeightOptions extends Pick<
8
+ ListItemChildrenProps,
9
+ | "leftAddon"
10
+ | "rightAddon"
11
+ | "leftAddonType"
12
+ | "rightAddonType"
13
+ | "secondaryText"
14
+ > {
16
15
  /**
17
16
  * @see {@link ListItemHeight}
18
17
  */
@@ -72,8 +72,7 @@ export interface ListItemClassNameOptions extends BaseListItemClassNameOptions {
72
72
  }
73
73
 
74
74
  /** @since 6.0.0 */
75
- export interface InternalListItemClassNameOptions
76
- extends ListItemClassNameOptions {
75
+ export interface InternalListItemClassNameOptions extends ListItemClassNameOptions {
77
76
  /**
78
77
  * @defaultValue `false`
79
78
  */
package/src/list/types.ts CHANGED
@@ -227,5 +227,4 @@ export interface ListItemChildrenTextProps {
227
227
  * @since 6.0.0 Renamed `textChildren` to `disableTextChildren`
228
228
  */
229
229
  export interface ListItemChildrenProps
230
- extends ListItemChildrenTextProps,
231
- ListItemChildrenAddonProps {}
230
+ extends ListItemChildrenTextProps, ListItemChildrenAddonProps {}
@@ -14,12 +14,8 @@ import {
14
14
  type AppSize,
15
15
  type AppSizeQueries,
16
16
  DEFAULT_APP_SIZE,
17
- DEFAULT_DESKTOP_LARGE_MIN_WIDTH,
18
- DEFAULT_DESKTOP_MIN_WIDTH,
19
- DEFAULT_PHONE_MAX_WIDTH,
20
- DEFAULT_TABLET_MAX_WIDTH,
21
- DEFAULT_TABLET_MIN_WIDTH,
22
17
  } from "./appSize.js";
18
+ import { MEDIA_QUERY_CONFIG } from "./config.js";
23
19
  import { useMediaQuery } from "./useMediaQuery.js";
24
20
 
25
21
  /** @internal */
@@ -71,6 +67,8 @@ export function useAppSize(): Readonly<AppSize> {
71
67
  * @since 6.0.0 Renamed from `AppSizeListenerProps`.
72
68
  * @since 6.0.0 Removed the `onChange` prop
73
69
  * @since 6.0.0 Renamed `defaultSize` to `ssrSize`
70
+ * @since 6.4.0 Deprecated the `AppSizeQueries` in favor
71
+ * of the `MEDIA_QUERY_CONFIG`
74
72
  */
75
73
  export interface AppSizeProviderProps extends AppSizeQueries {
76
74
  /**
@@ -95,11 +93,11 @@ export interface AppSizeProviderProps extends AppSizeQueries {
95
93
  export function AppSizeProvider(props: AppSizeProviderProps): ReactElement {
96
94
  const {
97
95
  ssrSize = DEFAULT_APP_SIZE,
98
- phoneMaxWidth = DEFAULT_PHONE_MAX_WIDTH,
99
- tabletMinWidth = DEFAULT_TABLET_MIN_WIDTH,
100
- tabletMaxWidth = DEFAULT_TABLET_MAX_WIDTH,
101
- desktopMinWidth = DEFAULT_DESKTOP_MIN_WIDTH,
102
- desktopLargeMinWidth = DEFAULT_DESKTOP_LARGE_MIN_WIDTH,
96
+ phoneMaxWidth = MEDIA_QUERY_CONFIG.phoneMaxWidth,
97
+ tabletMinWidth = MEDIA_QUERY_CONFIG.tabletMinWidth,
98
+ tabletMaxWidth = MEDIA_QUERY_CONFIG.tabletMaxWidth,
99
+ desktopMinWidth = MEDIA_QUERY_CONFIG.desktopMinWidth,
100
+ desktopLargeMinWidth = MEDIA_QUERY_CONFIG.desktopLargeMinWidth,
103
101
  children,
104
102
  } = props;
105
103
  const { __root } = useContext(context);
@@ -62,6 +62,9 @@ export interface AppSizeQueries {
62
62
  desktopLargeMinWidth?: QuerySize;
63
63
  }
64
64
 
65
+ /**
66
+ * @deprecated Use `MEDIA_QUERY_CONFIG` instead.
67
+ */
65
68
  export const DEFAULT_APP_SIZE_QUERIES: Readonly<AppSizeQueries> = {
66
69
  phoneMaxWidth: DEFAULT_PHONE_MAX_WIDTH,
67
70
  tabletMinWidth: DEFAULT_TABLET_MIN_WIDTH,
@@ -0,0 +1,41 @@
1
+ import {
2
+ type AppSizeQueries,
3
+ DEFAULT_DESKTOP_LARGE_MIN_WIDTH,
4
+ DEFAULT_DESKTOP_MIN_WIDTH,
5
+ DEFAULT_PHONE_MAX_WIDTH,
6
+ DEFAULT_TABLET_MAX_WIDTH,
7
+ DEFAULT_TABLET_MIN_WIDTH,
8
+ } from "./appSize.js";
9
+
10
+ /** @since 6.4.0 */
11
+ export type MediaQueryConfig = Required<AppSizeQueries>;
12
+
13
+ /**
14
+ * @since 6.4.0
15
+ */
16
+ export const MEDIA_QUERY_CONFIG: MediaQueryConfig = {
17
+ phoneMaxWidth: DEFAULT_PHONE_MAX_WIDTH,
18
+ tabletMinWidth: DEFAULT_TABLET_MIN_WIDTH,
19
+ tabletMaxWidth: DEFAULT_TABLET_MAX_WIDTH,
20
+ desktopMinWidth: DEFAULT_DESKTOP_MIN_WIDTH,
21
+ desktopLargeMinWidth: DEFAULT_DESKTOP_LARGE_MIN_WIDTH,
22
+ };
23
+
24
+ /**
25
+ * @since 6.4.0
26
+ */
27
+ export function configureMediaQueries(
28
+ queries: Readonly<Partial<MediaQueryConfig>>
29
+ ): void {
30
+ if (process.env.NODE_ENV !== "production") {
31
+ Object.entries(queries).forEach(([name, value]) => {
32
+ if (!(name in MEDIA_QUERY_CONFIG)) {
33
+ throw new Error(`${name} is an invalid react-md media query.`);
34
+ }
35
+
36
+ MEDIA_QUERY_CONFIG[name as keyof MediaQueryConfig] = value;
37
+ });
38
+ } else {
39
+ Object.assign(MEDIA_QUERY_CONFIG, queries);
40
+ }
41
+ }
@@ -29,7 +29,8 @@ import { MenuVisibilityProvider } from "./MenuVisibilityProvider.js";
29
29
  import { useMenuBarContext } from "./useMenuBarProvider.js";
30
30
 
31
31
  export interface BaseDropdownMenuProps
32
- extends MenuConfiguration,
32
+ extends
33
+ MenuConfiguration,
33
34
  MenuListConvenienceProps,
34
35
  MenuSheetConvenienceProps,
35
36
  MenuConvenienceProps {
@@ -37,12 +38,10 @@ export interface BaseDropdownMenuProps
37
38
  }
38
39
 
39
40
  export interface DropdownMenuButtonProps
40
- extends MenuButtonProps,
41
- BaseDropdownMenuProps {}
41
+ extends MenuButtonProps, BaseDropdownMenuProps {}
42
42
 
43
43
  export interface DropdownMenuItemButtonProps
44
- extends MenuItemButtonProps,
45
- BaseDropdownMenuProps {}
44
+ extends MenuItemButtonProps, BaseDropdownMenuProps {}
46
45
 
47
46
  /**
48
47
  * @since 6.0.0
package/src/menu/Menu.tsx CHANGED
@@ -215,7 +215,8 @@ export type MenuFixedPositioningOptions = Omit<
215
215
  * @since 6.0.0 Updated to use the latest Menu, Transition, and Portal API.
216
216
  */
217
217
  export interface MenuProps
218
- extends HTMLAttributes<HTMLDivElement>,
218
+ extends
219
+ HTMLAttributes<HTMLDivElement>,
219
220
  MenuConfiguration,
220
221
  MenuConfigurationProps,
221
222
  MenuFixedPositioningOptions,
@@ -23,8 +23,7 @@ const noop = (): void => {
23
23
  * @since 5.0.0
24
24
  */
25
25
  export interface MenuItemButtonProps
26
- extends BaseMenuButtonProps,
27
- MenuItemProps {}
26
+ extends BaseMenuButtonProps, MenuItemProps {}
28
27
 
29
28
  /**
30
29
  * **Client Component**
@@ -19,7 +19,8 @@ const noop = (): void => {
19
19
  * implementation.
20
20
  */
21
21
  export interface MenuItemFileInputProps
22
- extends Omit<MenuItemProps, "onChange">,
22
+ extends
23
+ Omit<MenuItemProps, "onChange">,
23
24
  Pick<
24
25
  InputHTMLAttributes<HTMLInputElement>,
25
26
  "accept" | "capture" | "multiple"
@@ -46,7 +46,8 @@ export type MenuItemInputToggleCheckedCallback = (
46
46
 
47
47
  /** @since 2.8.0 */
48
48
  export interface BaseMenuItemInputToggleProps
49
- extends HTMLAttributes<HTMLLIElement>,
49
+ extends
50
+ HTMLAttributes<HTMLLIElement>,
50
51
  ConfigurableInputToggleIconProps,
51
52
  ListItemChildrenTextProps {
52
53
  checked: boolean;
@@ -98,8 +99,7 @@ export interface BaseMenuItemInputToggleProps
98
99
  }
99
100
 
100
101
  export interface MenuItemCheckboxProps
101
- extends BaseMenuItemInputToggleProps,
102
- IndeterminateCheckboxProps {}
102
+ extends BaseMenuItemInputToggleProps, IndeterminateCheckboxProps {}
103
103
 
104
104
  export type MenuItemRadioProps = BaseMenuItemInputToggleProps;
105
105
 
@@ -8,7 +8,8 @@ import { useMenuConfiguration } from "./MenuConfigurationProvider.js";
8
8
 
9
9
  /** @since 5.0.0 */
10
10
  export interface MenuItemSeparatorProps
11
- extends HTMLAttributes<HTMLLIElement>,
11
+ extends
12
+ HTMLAttributes<HTMLLIElement>,
12
13
  Pick<DividerProps, "inset" | "vertical"> {}
13
14
 
14
15
  /**
@@ -14,8 +14,10 @@ import { type NonNullMutableRef, type UseStateObject } from "../types.js";
14
14
  * @since 5.0.0
15
15
  * @since 6.0.0 Added the `defaultFocusIndex` ref.
16
16
  */
17
- export interface MenuVisibilityContext
18
- extends UseStateObject<"visible", boolean> {
17
+ export interface MenuVisibilityContext extends UseStateObject<
18
+ "visible",
19
+ boolean
20
+ > {
19
21
  defaultFocusIndex: NonNullMutableRef<number>;
20
22
  }
21
23
 
@@ -23,8 +23,7 @@ const noop = (): void => {
23
23
  * @internal
24
24
  */
25
25
  export interface MenuWidgetProps
26
- extends HTMLAttributes<HTMLDivElement>,
27
- MenuListConvenienceProps {
26
+ extends HTMLAttributes<HTMLDivElement>, MenuListConvenienceProps {
28
27
  isSheet: boolean;
29
28
  horizontal: boolean;
30
29
  disableElevation?: boolean;
@@ -48,8 +48,10 @@ export interface ContextMenuHookOptions {
48
48
  * `ContextMenuImplementation` and dropped the `menuRef` and `menuNodeRef`
49
49
  * fields.
50
50
  */
51
- export interface ContextMenuImplementation
52
- extends UseStateObject<"visible", boolean> {
51
+ export interface ContextMenuImplementation extends UseStateObject<
52
+ "visible",
53
+ boolean
54
+ > {
53
55
  menuProps: ContextMenuProps;
54
56
  onContextMenu: <E extends HTMLElement>(event: MouseEvent<E>) => void;
55
57
  }
@@ -137,9 +137,17 @@ export interface KeyboardMovementBehavior {
137
137
 
138
138
  /**
139
139
  * @since 6.3.0
140
+ * @since 6.4.0 Added `force` option.
140
141
  */
141
142
  export interface KeyboardFocusFromKeyOptions {
142
143
  key: string;
144
+
145
+ /**
146
+ * @since 6.4.0
147
+ * @defaultValue `false`
148
+ */
149
+ force?: boolean;
150
+
143
151
  /** @defaultValue `false` */
144
152
  reversed?: boolean;
145
153
 
@@ -150,15 +158,29 @@ export interface KeyboardFocusFromKeyOptions {
150
158
  /**
151
159
  * @since 6.3.0
152
160
  */
153
- export type KeyboardFocusAction = (focusables?: readonly HTMLElement[]) => void;
161
+ export type KeyboardFocusAction = (
162
+ focusables?: readonly HTMLElement[],
163
+ force?: boolean
164
+ ) => void;
165
+
166
+ /**
167
+ * @since 6.4.0
168
+ */
169
+ export interface KeyboardMovementUpdateFocusIndexOptions {
170
+ index: number;
171
+ force?: boolean;
172
+ focusables?: readonly HTMLElement[];
173
+ }
154
174
 
155
175
  /**
156
176
  * @since 5.0.0
157
177
  * @since 6.0.0 Removed `attach`, `detach` and `watching`
178
+ * @since 6.3.0 Added `focusFirst`, `focusLast`, `focusNext`, `focusPrevious`
179
+ * and `focusFromKey`.
180
+ * @since 6.4.0 Added `focusCurrent` and `updateFocusIndex`
158
181
  * @internal
159
182
  */
160
- export interface KeyboardMovementContext
161
- extends Required<KeyboardMovementBehavior> {
183
+ export interface KeyboardMovementContext extends Required<KeyboardMovementBehavior> {
162
184
  /** {@inheritDoc KeyboardMovementConfig} */
163
185
  config: NonNullRef<KeyboardMovementConfig>;
164
186
 
@@ -195,6 +217,19 @@ export interface KeyboardMovementContext
195
217
  * @since 6.3.0
196
218
  */
197
219
  focusFromKey: (options: KeyboardFocusFromKeyOptions) => void;
220
+
221
+ /**
222
+ * @since 6.4.0
223
+ */
224
+ focusCurrent: (
225
+ focusables?: readonly HTMLElement[],
226
+ force?: boolean
227
+ ) => HTMLElement | undefined;
228
+
229
+ /**
230
+ * @since 6.4.0
231
+ */
232
+ updateFocusIndex: (options: KeyboardMovementUpdateFocusIndexOptions) => void;
198
233
  }
199
234
 
200
235
  /**
@@ -241,8 +276,9 @@ export type KeyboardMovementFocusChangeEventHandler = (
241
276
  * @since 6.0.0
242
277
  * @internal
243
278
  */
244
- export interface KeyboardMovementExtensionData<E extends HTMLElement>
245
- extends KeyboardMovementContext {
279
+ export interface KeyboardMovementExtensionData<
280
+ E extends HTMLElement,
281
+ > extends KeyboardMovementContext {
246
282
  event: KeyboardEvent<E>;
247
283
  currentFocusIndex: NonNullMutableRef<number>;
248
284
  setFocusIndex: (index: number, focusables: readonly HTMLElement[]) => void;
@@ -260,9 +296,13 @@ export type KeyboardMovementEventHandlers<E extends HTMLElement> = Pick<
260
296
  /**
261
297
  * @since 6.3.0
262
298
  */
263
- export interface SimpleKeyboardMovementWrapperOptions<E extends HTMLElement>
264
- extends KeyboardMovementEventHandlers<E> {
299
+ export interface SimpleKeyboardMovementWrapperOptions<
300
+ E extends HTMLElement,
301
+ > extends KeyboardMovementEventHandlers<E> {
265
302
  ref?: Ref<E>;
303
+
304
+ /** @defaultValue `false` */
305
+ disabled?: boolean;
266
306
  }
267
307
 
268
308
  /**
@@ -270,15 +310,13 @@ export interface SimpleKeyboardMovementWrapperOptions<E extends HTMLElement>
270
310
  * @internal
271
311
  */
272
312
  export interface KeyboardMovementProviderOptions<E extends HTMLElement>
273
- extends KeyboardMovementBehavior,
313
+ extends
314
+ KeyboardMovementBehavior,
274
315
  SimpleKeyboardMovementWrapperOptions<E>,
275
316
  KeyboardMovementConfiguration {
276
317
  /** @see {@link TabIndexBehavior} */
277
318
  tabIndexBehavior?: TabIndexBehavior;
278
319
 
279
- /** @defaultValue `false` */
280
- disabled?: boolean;
281
-
282
320
  /**
283
321
  * This is used to implement custom keyboard movement for the `keydown` event.
284
322
  */
@@ -332,8 +370,9 @@ export interface KeyboardMovementProviderOptions<E extends HTMLElement>
332
370
  * @since 6.0.0
333
371
  * @internal
334
372
  */
335
- export interface KeyboardMovementProps<E extends HTMLElement>
336
- extends Required<KeyboardMovementEventHandlers<E>> {
373
+ export interface KeyboardMovementProps<E extends HTMLElement> extends Required<
374
+ KeyboardMovementEventHandlers<E>
375
+ > {
337
376
  /**
338
377
  * This will only be provided if the {@link KeyboardMovementContext.tabIndexBehavior}
339
378
  * is set to `"virtual"`.
@@ -28,6 +28,7 @@ import {
28
28
  type KeyboardMovementContext,
29
29
  type KeyboardMovementProviderImplementation,
30
30
  type KeyboardMovementProviderOptions,
31
+ type KeyboardMovementUpdateFocusIndexOptions,
31
32
  } from "./types.js";
32
33
  import {
33
34
  getFirstFocusableIndex,
@@ -62,6 +63,8 @@ export const DEFAULT_KEYBOARD_MOVEMENT_CONTEXT: Readonly<KeyboardMovementContext
62
63
  focusNext: noop,
63
64
  focusPrevious: noop,
64
65
  focusFromKey: noop,
66
+ focusCurrent: (): undefined => {},
67
+ updateFocusIndex: noop,
65
68
  };
66
69
 
67
70
  /**
@@ -291,14 +294,18 @@ export function useKeyboardMovementProvider<E extends HTMLElement>(
291
294
 
292
295
  return getFocusableElements(container, programmatic);
293
296
  }, [getFocusableElements, nodeRef, programmatic]);
294
- const updateFocusIndex = useCallback(
295
- (index: number, focusables = getFocusableElementsFromRef()) => {
296
- if (currentFocusIndex.current === index || index === -1) {
297
+ const focusCurrent = useCallback(
298
+ (focusables = getFocusableElementsFromRef()): HTMLElement | undefined => {
299
+ const index = currentFocusIndex.current;
300
+ if (index === -1) {
297
301
  return;
298
302
  }
299
303
 
300
- currentFocusIndex.current = index;
301
304
  const focused = focusables[index];
305
+ if (!focused) {
306
+ return;
307
+ }
308
+
302
309
  if (tabIndexBehavior) {
303
310
  focused.scrollIntoView({
304
311
  block: "nearest",
@@ -311,65 +318,89 @@ export function useKeyboardMovementProvider<E extends HTMLElement>(
311
318
  focused.focus();
312
319
  }
313
320
 
314
- onFocusChange({
321
+ return focused;
322
+ },
323
+ [getFocusableElementsFromRef, tabIndexBehavior]
324
+ );
325
+ const updateFocusIndex = useCallback(
326
+ (options: KeyboardMovementUpdateFocusIndexOptions) => {
327
+ const {
315
328
  index,
316
- element: focused,
317
- });
329
+ force,
330
+ focusables = getFocusableElementsFromRef(),
331
+ } = options;
332
+ const isSameIndex = currentFocusIndex.current === index;
333
+ if ((!force && isSameIndex) || index === -1) {
334
+ return;
335
+ }
336
+
337
+ currentFocusIndex.current = index;
338
+ const focused = focusCurrent(focusables);
339
+ if (focused && !isSameIndex) {
340
+ onFocusChange({
341
+ index,
342
+ element: focused,
343
+ });
344
+ }
318
345
  },
319
- [getFocusableElementsFromRef, onFocusChange, tabIndexBehavior]
346
+ [focusCurrent, getFocusableElementsFromRef, onFocusChange]
320
347
  );
321
348
 
322
349
  const focusNext = useCallback(
323
- (focusables = getFocusableElementsFromRef()) => {
324
- updateFocusIndex(
325
- getNextFocusableIndex({
350
+ (focusables = getFocusableElementsFromRef(), force = false) => {
351
+ updateFocusIndex({
352
+ index: getNextFocusableIndex({
326
353
  loopable,
327
354
  increment: true,
328
355
  focusables,
329
356
  includeDisabled: true,
330
357
  currentFocusIndex: currentFocusIndex.current,
331
358
  }),
332
- focusables
333
- );
359
+ force,
360
+ focusables,
361
+ });
334
362
  },
335
363
  [getFocusableElementsFromRef, loopable, updateFocusIndex]
336
364
  );
337
365
  const focusPrevious = useCallback(
338
- (focusables = getFocusableElementsFromRef()) => {
339
- updateFocusIndex(
340
- getNextFocusableIndex({
366
+ (focusables = getFocusableElementsFromRef(), force = false) => {
367
+ updateFocusIndex({
368
+ index: getNextFocusableIndex({
341
369
  loopable,
342
370
  increment: false,
343
371
  focusables,
344
372
  includeDisabled: true,
345
373
  currentFocusIndex: currentFocusIndex.current,
346
374
  }),
347
- focusables
348
- );
375
+ force,
376
+ focusables,
377
+ });
349
378
  },
350
379
  [getFocusableElementsFromRef, loopable, updateFocusIndex]
351
380
  );
352
381
  const focusFirst = useCallback(
353
- (focusables = getFocusableElementsFromRef()) => {
354
- updateFocusIndex(
355
- getFirstFocusableIndex({
382
+ (focusables = getFocusableElementsFromRef(), force = false) => {
383
+ updateFocusIndex({
384
+ index: getFirstFocusableIndex({
356
385
  focusables,
357
386
  includeDisabled,
358
387
  }),
359
- focusables
360
- );
388
+ force,
389
+ focusables,
390
+ });
361
391
  },
362
392
  [getFocusableElementsFromRef, includeDisabled, updateFocusIndex]
363
393
  );
364
394
  const focusLast = useCallback(
365
- (focusables = getFocusableElementsFromRef()) => {
366
- updateFocusIndex(
367
- getLastFocusableIndex({
395
+ (focusables = getFocusableElementsFromRef(), force = false) => {
396
+ updateFocusIndex({
397
+ index: getLastFocusableIndex({
368
398
  focusables,
369
399
  includeDisabled,
370
400
  }),
371
- focusables
372
- );
401
+ force,
402
+ focusables,
403
+ });
373
404
  },
374
405
  [getFocusableElementsFromRef, includeDisabled, updateFocusIndex]
375
406
  );
@@ -377,6 +408,7 @@ export function useKeyboardMovementProvider<E extends HTMLElement>(
377
408
  (options: KeyboardFocusFromKeyOptions) => {
378
409
  const {
379
410
  key,
411
+ force,
380
412
  reversed,
381
413
  focusables = getFocusableElementsFromRef(),
382
414
  } = options;
@@ -391,7 +423,7 @@ export function useKeyboardMovementProvider<E extends HTMLElement>(
391
423
  ),
392
424
  startIndex: reversed ? -1 : currentFocusIndex.current,
393
425
  });
394
- updateFocusIndex(index, focusables);
426
+ updateFocusIndex({ index, force, focusables });
395
427
  },
396
428
  [getFocusableElementsFromRef, includeDisabled, searchable, updateFocusIndex]
397
429
  );
@@ -407,12 +439,15 @@ export function useKeyboardMovementProvider<E extends HTMLElement>(
407
439
  focusNext,
408
440
  focusPrevious,
409
441
  focusFromKey,
442
+ focusCurrent,
443
+ updateFocusIndex,
410
444
  includeDisabled,
411
445
  tabIndexBehavior,
412
446
  activeDescendantId,
413
447
  }),
414
448
  [
415
449
  activeDescendantId,
450
+ focusCurrent,
416
451
  focusFirst,
417
452
  focusFromKey,
418
453
  focusLast,
@@ -423,6 +458,7 @@ export function useKeyboardMovementProvider<E extends HTMLElement>(
423
458
  loopable,
424
459
  searchable,
425
460
  tabIndexBehavior,
461
+ updateFocusIndex,
426
462
  ]
427
463
  );
428
464
 
@@ -557,7 +593,7 @@ export function useKeyboardMovementProvider<E extends HTMLElement>(
557
593
  ): void => {
558
594
  event.preventDefault();
559
595
  event.stopPropagation();
560
- updateFocusIndex(index, focusables);
596
+ updateFocusIndex({ index, focusables });
561
597
  };
562
598
 
563
599
  extendKeyDown({
@@ -619,7 +655,13 @@ export function useKeyboardMovementProvider<E extends HTMLElement>(
619
655
  }
620
656
 
621
657
  if (trackTabKeys && key === "Tab") {
622
- currentFocusIndex.current += event.shiftKey ? -1 : 1;
658
+ currentFocusIndex.current = getNextFocusableIndex({
659
+ loopable,
660
+ increment: !event.shiftKey,
661
+ focusables: getFocusableElements(currentTarget, programmatic),
662
+ includeDisabled,
663
+ currentFocusIndex: currentFocusIndex.current,
664
+ });
623
665
  return;
624
666
  }
625
667
 
@@ -633,21 +675,18 @@ export function useKeyboardMovementProvider<E extends HTMLElement>(
633
675
  !increment &&
634
676
  decrementKeys.includes(key);
635
677
 
636
- if (jumpToFirst) {
678
+ if (jumpToFirst || jumpToLast || increment || decrement) {
637
679
  event.preventDefault();
638
680
  event.stopPropagation();
681
+ }
682
+
683
+ if (jumpToFirst) {
639
684
  focusFirst();
640
685
  } else if (jumpToLast) {
641
- event.preventDefault();
642
- event.stopPropagation();
643
686
  focusLast();
644
687
  } else if (increment) {
645
- event.preventDefault();
646
- event.stopPropagation();
647
688
  focusNext();
648
689
  } else if (decrement) {
649
- event.preventDefault();
650
- event.stopPropagation();
651
690
  focusPrevious();
652
691
  }
653
692
  },
@@ -23,8 +23,7 @@ const noop = (): void => {
23
23
  * @since 6.0.0
24
24
  */
25
25
  export interface CollapsibleNavGroupProps
26
- extends NavGroupProps,
27
- NavItemButtonRotatorProps {
26
+ extends NavGroupProps, NavItemButtonRotatorProps {
28
27
  liProps?: PropsWithRef<LiHTMLAttributes<HTMLLIElement>>;
29
28
  buttonProps?: PropsWithRef<ButtonProps>;
30
29
  collapseOptions?: Omit<
@@ -8,8 +8,7 @@ import { type NavItemClassNameOptions, navItem } from "./navItemStyles.js";
8
8
  * augmentation.
9
9
  */
10
10
  export interface NavItemProps
11
- extends LiHTMLAttributes<HTMLLIElement>,
12
- NavItemClassNameOptions {
11
+ extends LiHTMLAttributes<HTMLLIElement>, NavItemClassNameOptions {
13
12
  children: ReactNode;
14
13
  }
15
14
 
@@ -25,7 +25,8 @@ export interface NavItemButtonRotatorProps {
25
25
  * @since 6.0.0
26
26
  */
27
27
  export interface NavItemButtonProps
28
- extends Omit<ButtonProps, "children">,
28
+ extends
29
+ Omit<ButtonProps, "children">,
29
30
  NavItemButtonRotatorProps,
30
31
  NavItemContentProps {
31
32
  onClick: MouseEventHandler<HTMLButtonElement>;
@@ -25,7 +25,8 @@ import {
25
25
  * @since 6.0.0
26
26
  */
27
27
  export interface NavItemLinkProps
28
- extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "children">,
28
+ extends
29
+ Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "children">,
29
30
  NavItemContentProps,
30
31
  ComponentWithRippleProps {
31
32
  /** @defaultValue `"a"` */