@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
@@ -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"` */
@@ -8,8 +8,7 @@ import {
8
8
  * @internal
9
9
  * @since 6.0.0
10
10
  */
11
- export interface GetTableOfContentsHeadingsOptions
12
- extends Required<TableOfContentsHeadingsOptions> {
11
+ export interface GetTableOfContentsHeadingsOptions extends Required<TableOfContentsHeadingsOptions> {
13
12
  ssr: boolean;
14
13
  }
15
14
 
@@ -265,8 +265,7 @@ export interface TableOfContentsHeading extends HeadingReference {
265
265
 
266
266
  /** @since 6.0.0 */
267
267
  export interface TableOfContentsHeadingItem
268
- extends TableOfContentsHeading,
269
- HeadingReferenceWithChildren {
268
+ extends TableOfContentsHeading, HeadingReferenceWithChildren {
270
269
  items?: TableOfContentsHeadingItem[];
271
270
  }
272
271
 
@@ -23,7 +23,8 @@ import {
23
23
  * augmentation.
24
24
  */
25
25
  export interface OverlayProps
26
- extends HTMLAttributes<HTMLSpanElement>,
26
+ extends
27
+ HTMLAttributes<HTMLSpanElement>,
27
28
  BaseOverlayClassNameOptions,
28
29
  CSSTransitionComponentProps,
29
30
  TransitionActions {
@@ -31,13 +31,12 @@ export interface HorizontalFixConfig extends XCoordConfig {
31
31
  /**
32
32
  * @internal
33
33
  */
34
- export interface CreateHorizontalPositionOptions
35
- extends Required<
36
- Pick<
37
- FixedPositionOptions,
38
- "vwMargin" | "xMargin" | "width" | "disableSwapping"
39
- >
40
- > {
34
+ export interface CreateHorizontalPositionOptions extends Required<
35
+ Pick<
36
+ FixedPositionOptions,
37
+ "vwMargin" | "xMargin" | "width" | "disableSwapping"
38
+ >
39
+ > {
41
40
  x: HorizontalPosition;
42
41
  vw: number;
43
42
  elWidth: number;
@@ -205,11 +204,10 @@ export function createAnchoredRight(config: HorizontalFixConfig): XPosition {
205
204
  return { actualX, left };
206
205
  }
207
206
 
208
- export interface EqualWidthOptions
209
- extends Pick<
210
- CreateHorizontalPositionOptions,
211
- "x" | "elWidth" | "xMargin" | "vwMargin" | "containerRect" | "initialX"
212
- > {
207
+ export interface EqualWidthOptions extends Pick<
208
+ CreateHorizontalPositionOptions,
209
+ "x" | "elWidth" | "xMargin" | "vwMargin" | "containerRect" | "initialX"
210
+ > {
213
211
  screenRight: number;
214
212
  isMinWidth: boolean;
215
213
  }
@@ -27,17 +27,16 @@ export interface VerticalFixConfig extends YCoordConfig {
27
27
  }
28
28
 
29
29
  /** @internal */
30
- export interface CreateVerticalPositionOptions
31
- extends Required<
32
- Pick<
33
- FixedPositionOptions,
34
- | "yMargin"
35
- | "vhMargin"
36
- | "preventOverlap"
37
- | "disableSwapping"
38
- | "disableVHBounds"
39
- >
40
- > {
30
+ export interface CreateVerticalPositionOptions extends Required<
31
+ Pick<
32
+ FixedPositionOptions,
33
+ | "yMargin"
34
+ | "vhMargin"
35
+ | "preventOverlap"
36
+ | "disableSwapping"
37
+ | "disableVHBounds"
38
+ >
39
+ > {
41
40
  y: VerticalPosition;
42
41
  vh: number;
43
42
  initialY?: number;
@@ -42,8 +42,9 @@ export type FixedPositioningTransitionCallbacks = Pick<
42
42
  * transition.
43
43
  * @since 4.0.0
44
44
  */
45
- export interface FixedPositioningTransitionOptions<E extends HTMLElement>
46
- extends FixedPositioningTransitionCallbacks {
45
+ export interface FixedPositioningTransitionOptions<
46
+ E extends HTMLElement,
47
+ > extends FixedPositioningTransitionCallbacks {
47
48
  /** {@inheritDoc TransitionOptions.nodeRef} */
48
49
  nodeRef?: Ref<E>;
49
50
  }
@@ -94,7 +95,9 @@ export type TransitionScrollCallback<
94
95
  export interface FixedPositioningOptions<
95
96
  FixedToElement extends HTMLElement,
96
97
  FixedElement extends HTMLElement,
97
- > extends FixedPositioningTransitionOptions<FixedElement>,
98
+ >
99
+ extends
100
+ FixedPositioningTransitionOptions<FixedElement>,
98
101
  CalculateFixedPositionOptions {
99
102
  /**
100
103
  * An optional style that will be merged with the fixed positioning required
@@ -24,7 +24,8 @@ import { type ProgressProps } from "./types.js";
24
24
  * longer rotates while increasing value.
25
25
  */
26
26
  export interface CircularProgressProps
27
- extends Omit<HTMLAttributes<HTMLSpanElement>, "id">,
27
+ extends
28
+ Omit<HTMLAttributes<HTMLSpanElement>, "id">,
28
29
  ProgressProps,
29
30
  CircularProgressClassNameOptions {
30
31
  /**
@@ -21,7 +21,8 @@ import { type ProgressProps } from "./types.js";
21
21
  * module augmentation.
22
22
  */
23
23
  export interface LinearProgressProps
24
- extends Omit<HTMLAttributes<HTMLSpanElement>, "id" | "children">,
24
+ extends
25
+ Omit<HTMLAttributes<HTMLSpanElement>, "id" | "children">,
25
26
  BaseLinearProgressClassNameOptions,
26
27
  ProgressProps {
27
28
  /**
@@ -36,8 +36,7 @@ export interface BaseLinearProgressClassNameOptions {
36
36
  /**
37
37
  * @since 6.2.0
38
38
  */
39
- export interface LinearProgressClassNameOptions
40
- extends BaseLinearProgressClassNameOptions {
39
+ export interface LinearProgressClassNameOptions extends BaseLinearProgressClassNameOptions {
41
40
  /** @defaultValue `false` */
42
41
  indeterminate?: boolean;
43
42
  }
@@ -15,8 +15,7 @@ import {
15
15
  * {@link ResponsiveItemProps.responsive} prop.
16
16
  */
17
17
  export interface ResponsiveItemProps
18
- extends HTMLAttributes<HTMLSpanElement>,
19
- ResponsiveItemClassNameOptions {}
18
+ extends HTMLAttributes<HTMLSpanElement>, ResponsiveItemClassNameOptions {}
20
19
 
21
20
  /**
22
21
  * @example Image Example
@@ -12,7 +12,8 @@ import {
12
12
  * `ResponsiveItemOverlayProps`.
13
13
  */
14
14
  export interface ResponsiveItemOverlayProps
15
- extends HTMLAttributes<HTMLSpanElement>,
15
+ extends
16
+ HTMLAttributes<HTMLSpanElement>,
16
17
  ResponsiveItemOverlayClassNameOptions {}
17
18
 
18
19
  /**
@@ -62,8 +62,7 @@ export interface CaseInsensitiveStartsWithOptions {
62
62
  /**
63
63
  * @since 6.0.0
64
64
  */
65
- export interface IsCaseInsensitiveMatchOptions
66
- extends CaseInsensitiveStartsWithOptions {
65
+ export interface IsCaseInsensitiveMatchOptions extends CaseInsensitiveStartsWithOptions {
67
66
  /**
68
67
  * The current search query.
69
68
  */
@@ -94,8 +93,7 @@ export function isCaseInsensitiveMatch(
94
93
  * @since 6.0.0
95
94
  */
96
95
  export interface CaseInsensitiveOptions<T>
97
- extends BaseSearchOptions<T>,
98
- CaseInsensitiveStartsWithOptions {}
96
+ extends BaseSearchOptions<T>, CaseInsensitiveStartsWithOptions {}
99
97
 
100
98
  /**
101
99
  * @example String list
@@ -23,7 +23,8 @@ import {
23
23
  * module augmentation.
24
24
  */
25
25
  export interface SegmentedButtonProps
26
- extends ButtonHTMLAttributes<HTMLButtonElement>,
26
+ extends
27
+ ButtonHTMLAttributes<HTMLButtonElement>,
27
28
  BaseMaxWidthTransitionOptions,
28
29
  BaseSegmentedButtonClassNameOptions,
29
30
  ComponentWithRippleProps {
@@ -9,7 +9,8 @@ import {
9
9
  * @since 6.0.0
10
10
  */
11
11
  export interface SegmentedButtonContainerProps
12
- extends HTMLAttributes<HTMLDivElement>,
12
+ extends
13
+ HTMLAttributes<HTMLDivElement>,
13
14
  SegmentedButtonContainerClassNameOptions {
14
15
  children: ReactNode;
15
16
  }
@@ -42,8 +42,7 @@ export interface BaseSegmentedButtonClassNameOptions {
42
42
  * @since 6.0.0
43
43
  * @since 6.3.1 Extends BaseSegmentedButtonClassNameOptions
44
44
  */
45
- export interface SegmentedButtonClassNameOptions
46
- extends BaseSegmentedButtonClassNameOptions {
45
+ export interface SegmentedButtonClassNameOptions extends BaseSegmentedButtonClassNameOptions {
47
46
  /** @internal */
48
47
  pressedClassName?: string;
49
48
  }
@@ -21,8 +21,7 @@ export type SheetDialogProps = Omit<BaseDialogProps, "role" | "type" | "modal">;
21
21
  * and exports the `SheetDialogProps`.
22
22
  */
23
23
  export interface BaseSheetProps
24
- extends SheetDialogProps,
25
- BaseSheetClassNameOptions {
24
+ extends SheetDialogProps, BaseSheetClassNameOptions {
26
25
  /**
27
26
  * @defaultValue `"dialog"`
28
27
  */
@@ -27,7 +27,8 @@ import { type BaseToastClasNameOptions, toast } from "./toastStyles.js";
27
27
  * @since 6.0.0
28
28
  */
29
29
  export interface ConfigurableToastProps
30
- extends HTMLAttributes<HTMLDivElement>,
30
+ extends
31
+ HTMLAttributes<HTMLDivElement>,
31
32
  BaseToastClasNameOptions,
32
33
  TransitionCallbacks {
33
34
  /**
@@ -0,0 +1,98 @@
1
+ "use client";
2
+
3
+ import { type HTMLAttributes, forwardRef } from "react";
4
+
5
+ import { type LabelRequiredForA11y } from "../types.js";
6
+ import { defaultGetSpinButtonTextContent } from "./defaults.js";
7
+ import {
8
+ type SpinButtonOptions,
9
+ type SpinButtonUncontrolledValueOptions,
10
+ type SpinButtonValueOptions,
11
+ } from "./types.js";
12
+ import { useSpinButton } from "./useSpinButton.js";
13
+
14
+ /**
15
+ * @since 6.4.0
16
+ */
17
+ export interface SpinButtonProps
18
+ extends
19
+ Omit<HTMLAttributes<HTMLDivElement>, keyof SpinButtonOptions>,
20
+ Omit<SpinButtonOptions<HTMLDivElement>, "ref" | "children"> {}
21
+
22
+ /**
23
+ * The `SpinButton` component can be used as a simple wrapper around the
24
+ * {@link useSpinButton} hook if it should be rendered within a `<div>` and
25
+ * only the rendering behavior is required.
26
+ *
27
+ * @since 6.4.0
28
+ */
29
+ export const SpinButton = forwardRef<
30
+ HTMLDivElement,
31
+ LabelRequiredForA11y<SpinButtonProps> & SpinButtonValueOptions
32
+ >(function SpinButton(props, ref) {
33
+ const {
34
+ id,
35
+ min,
36
+ max,
37
+ minDigits,
38
+ maxDigits,
39
+ step,
40
+ form,
41
+ error,
42
+ disabled,
43
+ readOnly,
44
+ required,
45
+ fallback,
46
+ mappings,
47
+ value,
48
+ defaultValue,
49
+ onValueChange,
50
+ getValueText,
51
+ getTextContent = defaultGetSpinButtonTextContent,
52
+ placeholderChar,
53
+ defaultKeyboardValue,
54
+ ...remaining
55
+ } = props;
56
+
57
+ const valueProps = {
58
+ value,
59
+ defaultValue,
60
+ } as SpinButtonUncontrolledValueOptions<HTMLDivElement>;
61
+
62
+ const { value: currentValue, spinButtonProps } = useSpinButton({
63
+ id,
64
+ ref,
65
+ min,
66
+ max,
67
+ minDigits,
68
+ maxDigits,
69
+ step,
70
+ form,
71
+ fallback,
72
+ mappings,
73
+ error,
74
+ disabled,
75
+ readOnly,
76
+ required,
77
+ ...valueProps,
78
+ onValueChange,
79
+ getValueText,
80
+ getTextContent,
81
+ placeholderChar,
82
+ defaultKeyboardValue,
83
+ });
84
+
85
+ return (
86
+ <div {...remaining} {...spinButtonProps}>
87
+ {getTextContent({
88
+ min,
89
+ max,
90
+ minDigits,
91
+ maxDigits,
92
+ value: currentValue,
93
+ fallback,
94
+ placeholderChar,
95
+ })}
96
+ </div>
97
+ );
98
+ });
@@ -0,0 +1,32 @@
1
+ "use client";
2
+
3
+ import { createContext, useContext } from "react";
4
+
5
+ import { type KeyboardMovementContext } from "../movement/types.js";
6
+ import { DEFAULT_KEYBOARD_MOVEMENT_CONTEXT } from "../movement/useKeyboardMovementProvider.js";
7
+
8
+ /**
9
+ * @since 6.4.0
10
+ */
11
+ export type SpinButtonGroupContext = KeyboardMovementContext;
12
+
13
+ const context = createContext<SpinButtonGroupContext>(
14
+ DEFAULT_KEYBOARD_MOVEMENT_CONTEXT
15
+ );
16
+ context.displayName = "SpinButtonGroup";
17
+
18
+ /**
19
+ * This should be used along with the `useSpinButtonGroupProvider` to link
20
+ * `SpinButton` components together. The next `SpinButton` will be focused as
21
+ * an value is typed to completion.
22
+ *
23
+ * @since 6.4.0
24
+ */
25
+ export const { Provider: SpinButtonGroupProvider } = context;
26
+
27
+ /**
28
+ * @since 6.4.0
29
+ */
30
+ export function useSpinButtonGroup(): Readonly<SpinButtonGroupContext> {
31
+ return useContext(context);
32
+ }