@react-md/core 6.3.3 → 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.
- package/dist/CoreProviders.d.ts +1 -0
- package/dist/CoreProviders.js.map +1 -1
- package/dist/_base.scss +3 -0
- package/dist/_core.scss +1 -0
- package/dist/_utils.scss +15 -7
- package/dist/app-bar/AppBar.js.map +1 -1
- package/dist/app-bar/AppBarTitle.js.map +1 -1
- package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -1
- package/dist/autocomplete/types.js.map +1 -1
- package/dist/autocomplete/utils.js.map +1 -1
- package/dist/avatar/Avatar.js.map +1 -1
- package/dist/box/_box.scss +20 -1
- package/dist/box/styles.d.ts +39 -0
- package/dist/box/styles.js +39 -0
- package/dist/box/styles.js.map +1 -1
- package/dist/button/Button.js.map +1 -1
- package/dist/button/FloatingActionButton.js.map +1 -1
- package/dist/card/Card.js.map +1 -1
- package/dist/card/CardContent.js.map +1 -1
- package/dist/card/ClickableCard.js.map +1 -1
- package/dist/chip/Chip.js.map +1 -1
- package/dist/datetime/NativeDateField.js.map +1 -1
- package/dist/datetime/NativeTimeField.js.map +1 -1
- package/dist/datetime/useDateField.js.map +1 -1
- package/dist/datetime/useTimeField.js.map +1 -1
- package/dist/dialog/Dialog.js.map +1 -1
- package/dist/dialog/DialogContainer.js.map +1 -1
- package/dist/dialog/DialogContent.js.map +1 -1
- package/dist/dialog/DialogFooter.js.map +1 -1
- package/dist/divider/Divider.js.map +1 -1
- package/dist/draggable/useDraggable.js.map +1 -1
- package/dist/draggable/utils.js.map +1 -1
- package/dist/expansion-panel/ExpansionPanelHeader.js.map +1 -1
- package/dist/files/FileInput.js.map +1 -1
- package/dist/files/useFileUpload.js.map +1 -1
- package/dist/files/validation.js.map +1 -1
- package/dist/focus/useFocusContainer.js.map +1 -1
- package/dist/form/Fieldset.d.ts +19 -0
- package/dist/form/Fieldset.js +22 -2
- package/dist/form/Fieldset.js.map +1 -1
- package/dist/form/FormMessageContainer.js.map +1 -1
- package/dist/form/FormMessageCounter.js.map +1 -1
- package/dist/form/InputToggle.js.map +1 -1
- package/dist/form/Legend.d.ts +27 -5
- package/dist/form/Legend.js +39 -6
- package/dist/form/Legend.js.map +1 -1
- package/dist/form/Listbox.js.map +1 -1
- package/dist/form/ListboxProvider.js.map +1 -1
- package/dist/form/NativeSelect.js.map +1 -1
- package/dist/form/Password.js.map +1 -1
- package/dist/form/ResizingTextAreaWrapper.js.map +1 -1
- package/dist/form/Select.js.map +1 -1
- package/dist/form/Slider.js.map +1 -1
- package/dist/form/SliderContainer.js.map +1 -1
- package/dist/form/SliderThumb.js.map +1 -1
- package/dist/form/SliderTrack.js.map +1 -1
- package/dist/form/SliderValueMarks.js.map +1 -1
- package/dist/form/Switch.js.map +1 -1
- package/dist/form/TextArea.js.map +1 -1
- package/dist/form/TextField.js.map +1 -1
- package/dist/form/TextFieldContainer.js.map +1 -1
- package/dist/form/_fieldset.scss +7 -0
- package/dist/form/_legend.scss +68 -0
- package/dist/form/_text-field.scss +39 -4
- package/dist/form/fieldsetStyles.d.ts +6 -1
- package/dist/form/fieldsetStyles.js +3 -2
- package/dist/form/fieldsetStyles.js.map +1 -1
- package/dist/form/inputToggleStyles.js.map +1 -1
- package/dist/form/labelStyles.d.ts +1 -1
- package/dist/form/labelStyles.js +1 -1
- package/dist/form/labelStyles.js.map +1 -1
- package/dist/form/legendStyles.d.ts +83 -0
- package/dist/form/legendStyles.js +25 -0
- package/dist/form/legendStyles.js.map +1 -0
- package/dist/form/selectUtils.js.map +1 -1
- package/dist/form/textFieldContainerStyles.js.map +1 -1
- package/dist/form/types.d.ts +28 -6
- package/dist/form/types.js.map +1 -1
- package/dist/form/useCheckboxGroup.js.map +1 -1
- package/dist/form/useCombobox.js.map +1 -1
- package/dist/form/useNumberField.js +16 -19
- package/dist/form/useNumberField.js.map +1 -1
- package/dist/form/useRangeSlider.js.map +1 -1
- package/dist/form/useSlider.js.map +1 -1
- package/dist/form/useTextField.d.ts +1 -1
- package/dist/form/useTextField.js.map +1 -1
- package/dist/hoverMode/useHoverMode.js.map +1 -1
- package/dist/icon/FontIcon.js.map +1 -1
- package/dist/icon/IconRotator.js.map +1 -1
- package/dist/icon/MaterialIcon.js.map +1 -1
- package/dist/icon/MaterialSymbol.js.map +1 -1
- package/dist/icon/SVGIcon.js.map +1 -1
- package/dist/icon/config.d.ts +0 -1
- package/dist/icon/config.js +10 -7
- package/dist/icon/config.js.map +1 -1
- package/dist/icon/materialConfig.js.map +1 -1
- package/dist/icon/styles.js.map +1 -1
- package/dist/interaction/UserInteractionModeProvider.js +6 -4
- package/dist/interaction/UserInteractionModeProvider.js.map +1 -1
- package/dist/interaction/types.js.map +1 -1
- package/dist/interaction/useElementInteraction.js.map +1 -1
- package/dist/layout/LayoutAppBar.d.ts +6 -6
- package/dist/layout/LayoutAppBar.js +6 -6
- package/dist/layout/LayoutAppBar.js.map +1 -1
- package/dist/layout/LayoutNav.js.map +1 -1
- package/dist/layout/LayoutWindowSplitter.js.map +1 -1
- package/dist/layout/Main.js.map +1 -1
- package/dist/layout/useExpandableLayout.js +43 -0
- package/dist/layout/useExpandableLayout.js.map +1 -1
- package/dist/layout/useHorizontalLayoutTransition.js.map +1 -1
- package/dist/layout/useLayoutTree.js.map +1 -1
- package/dist/layout/useLayoutWindowSplitter.js.map +1 -1
- package/dist/layout/useResizableLayout.js.map +1 -1
- package/dist/link/Link.js.map +1 -1
- package/dist/link/SkipToMainContent.js +19 -21
- package/dist/link/SkipToMainContent.js.map +1 -1
- package/dist/list/List.js.map +1 -1
- package/dist/list/ListItem.js.map +1 -1
- package/dist/list/ListItemAddon.js.map +1 -1
- package/dist/list/ListItemLink.js.map +1 -1
- package/dist/list/ListSubheader.js.map +1 -1
- package/dist/list/getListItemHeight.js.map +1 -1
- package/dist/list/listItemStyles.js.map +1 -1
- package/dist/list/types.js.map +1 -1
- package/dist/media-queries/AppSizeProvider.d.ts +2 -0
- package/dist/media-queries/AppSizeProvider.js +3 -2
- package/dist/media-queries/AppSizeProvider.js.map +1 -1
- package/dist/media-queries/appSize.d.ts +3 -0
- package/dist/media-queries/appSize.js +3 -1
- package/dist/media-queries/appSize.js.map +1 -1
- package/dist/media-queries/config.d.ts +11 -0
- package/dist/media-queries/config.js +26 -0
- package/dist/media-queries/config.js.map +1 -0
- package/dist/menu/DropdownMenu.js.map +1 -1
- package/dist/menu/Menu.js.map +1 -1
- package/dist/menu/MenuItemButton.js.map +1 -1
- package/dist/menu/MenuItemFileInput.js.map +1 -1
- package/dist/menu/MenuItemInputToggle.js.map +1 -1
- package/dist/menu/MenuItemSeparator.js.map +1 -1
- package/dist/menu/MenuVisibilityProvider.js.map +1 -1
- package/dist/menu/MenuWidget.js.map +1 -1
- package/dist/menu/useContextMenu.js.map +1 -1
- package/dist/movement/types.d.ts +28 -3
- package/dist/movement/types.js.map +1 -1
- package/dist/movement/useKeyboardMovementProvider.js +96 -47
- package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
- package/dist/navigation/CollapsibleNavGroup.js.map +1 -1
- package/dist/navigation/NavItem.js.map +1 -1
- package/dist/navigation/NavItemButton.js.map +1 -1
- package/dist/navigation/NavItemLink.js.map +1 -1
- package/dist/navigation/getTableOfContentsHeadings.js.map +1 -1
- package/dist/navigation/types.js.map +1 -1
- package/dist/overlay/Overlay.js.map +1 -1
- package/dist/positioning/createHorizontalPosition.js.map +1 -1
- package/dist/positioning/createVerticalPosition.js.map +1 -1
- package/dist/positioning/useFixedPositioning.js.map +1 -1
- package/dist/progress/CircularProgress.js.map +1 -1
- package/dist/progress/LinearProgress.js.map +1 -1
- package/dist/progress/linearProgressStyles.js.map +1 -1
- package/dist/responsive-item/ResponsiveItem.js.map +1 -1
- package/dist/responsive-item/ResponsiveItemOverlay.js.map +1 -1
- package/dist/searching/caseInsensitive.js.map +1 -1
- package/dist/segmented-button/SegmentedButton.js.map +1 -1
- package/dist/segmented-button/SegmentedButtonContainer.js.map +1 -1
- package/dist/segmented-button/segmentedButtonStyles.js.map +1 -1
- package/dist/sheet/Sheet.js.map +1 -1
- package/dist/snackbar/Toast.js.map +1 -1
- package/dist/spinbutton/SpinButton.d.ts +16 -0
- package/dist/spinbutton/SpinButton.js +55 -0
- package/dist/spinbutton/SpinButton.js.map +1 -0
- package/dist/spinbutton/SpinButtonGroupProvider.d.ts +17 -0
- package/dist/spinbutton/SpinButtonGroupProvider.js +19 -0
- package/dist/spinbutton/SpinButtonGroupProvider.js.map +1 -0
- package/dist/spinbutton/defaults.d.ts +9 -0
- package/dist/spinbutton/defaults.js +25 -0
- package/dist/spinbutton/defaults.js.map +1 -0
- package/dist/spinbutton/types.d.ts +324 -0
- package/dist/spinbutton/types.js +5 -0
- package/dist/spinbutton/types.js.map +1 -0
- package/dist/spinbutton/useSpinButton.d.ts +5 -0
- package/dist/spinbutton/useSpinButton.js +260 -0
- package/dist/spinbutton/useSpinButton.js.map +1 -0
- package/dist/spinbutton/useSpinButtonGroupProvider.d.ts +27 -0
- package/dist/spinbutton/useSpinButtonGroupProvider.js +49 -0
- package/dist/spinbutton/useSpinButtonGroupProvider.js.map +1 -0
- package/dist/spinbutton/utils/deselectNode.d.ts +5 -0
- package/dist/spinbutton/utils/deselectNode.js +17 -0
- package/dist/spinbutton/utils/deselectNode.js.map +1 -0
- package/dist/spinbutton/utils/resolveInputEvent.d.ts +30 -0
- package/dist/spinbutton/utils/resolveInputEvent.js +53 -0
- package/dist/spinbutton/utils/resolveInputEvent.js.map +1 -0
- package/dist/spinbutton/utils/selectNode.d.ts +5 -0
- package/dist/spinbutton/utils/selectNode.js +15 -0
- package/dist/spinbutton/utils/selectNode.js.map +1 -0
- package/dist/table/StickyTableSection.js.map +1 -1
- package/dist/table/Table.js.map +1 -1
- package/dist/table/TableBody.js.map +1 -1
- package/dist/table/TableCellContent.js.map +1 -1
- package/dist/table/TableCheckbox.js.map +1 -1
- package/dist/table/TableFooter.js.map +1 -1
- package/dist/table/TableHeader.js.map +1 -1
- package/dist/table/TableRadio.js.map +1 -1
- package/dist/table/TableRow.js.map +1 -1
- package/dist/table/useStickyTableSection.js.map +1 -1
- package/dist/tabs/SimpleTabPanel.js.map +1 -1
- package/dist/tabs/SimpleTabPanels.js.map +1 -1
- package/dist/tabs/Tab.js.map +1 -1
- package/dist/tabs/TabList.js.map +1 -1
- package/dist/tabs/TabListScrollButton.js.map +1 -1
- package/dist/tabs/useMaxTabPanelHeight.js.map +1 -1
- package/dist/test-utils/data-testid.js.map +1 -1
- package/dist/test-utils/mocks/match-media.js +5 -5
- package/dist/test-utils/mocks/match-media.js.map +1 -1
- package/dist/test-utils/vitest/timers.d.ts +1 -1
- package/dist/test-utils/vitest/timers.js +1 -1
- package/dist/test-utils/vitest/timers.js.map +1 -1
- package/dist/tooltip/Tooltip.js.map +1 -1
- package/dist/tooltip/TooltipHoverModeProvider.js.map +1 -1
- package/dist/tooltip/useTooltip.js.map +1 -1
- package/dist/transition/CSSTransition.js.map +1 -1
- package/dist/transition/Collapse.js.map +1 -1
- package/dist/transition/CrossFade.js.map +1 -1
- package/dist/transition/ScaleTransition.js.map +1 -1
- package/dist/transition/SkeletonPlaceholder.js.map +1 -1
- package/dist/transition/Slide.js.map +1 -1
- package/dist/transition/SlideContainer.js.map +1 -1
- package/dist/transition/types.js.map +1 -1
- package/dist/transition/useCollapseTransition.js.map +1 -1
- package/dist/transition/useCrossFadeTransition.js.map +1 -1
- package/dist/transition/useMaxWidthTransition.js.map +1 -1
- package/dist/transition/useScaleTransition.js.map +1 -1
- package/dist/transition/useSkeletonPlaceholder.js.map +1 -1
- package/dist/tree/Tree.js.map +1 -1
- package/dist/tree/TreeItem.js.map +1 -1
- package/dist/tree/TreeProvider.js.map +1 -1
- package/dist/tree/styles.js.map +1 -1
- package/dist/tree/types.js.map +1 -1
- package/dist/tree/useTreeMovement.js.map +1 -1
- package/dist/typography/HighlightTextMark.js.map +1 -1
- package/dist/typography/Mark.js.map +1 -1
- package/dist/typography/TextContainer.js.map +1 -1
- package/dist/typography/Typography.js.map +1 -1
- package/dist/typography/_typography.scss +0 -1
- package/dist/useElementSize.js.map +1 -1
- package/dist/useIntersectionObserver.js.map +1 -1
- package/dist/useMutationObserver.js.map +1 -1
- package/dist/useWindowSize.js.map +1 -1
- package/dist/utils/getNumberOfDigits.d.ts +7 -0
- package/dist/utils/getNumberOfDigits.js +11 -0
- package/dist/utils/getNumberOfDigits.js.map +1 -0
- package/dist/utils/nearest.js +2 -1
- package/dist/utils/nearest.js.map +1 -1
- package/dist/utils/useDevEffect.d.ts +7 -0
- package/dist/utils/useDevEffect.js +8 -0
- package/dist/utils/useDevEffect.js.map +1 -0
- package/dist/window-splitter/WindowSplitter.js +3 -2
- package/dist/window-splitter/WindowSplitter.js.map +1 -1
- package/dist/window-splitter/_window-splitter.scss +60 -12
- package/dist/window-splitter/styles.d.ts +9 -0
- package/dist/window-splitter/styles.js +3 -2
- package/dist/window-splitter/styles.js.map +1 -1
- package/dist/window-splitter/useWindowSplitter.js.map +1 -1
- package/package.json +38 -30
- package/src/CoreProviders.tsx +1 -0
- package/src/app-bar/AppBar.tsx +1 -2
- package/src/app-bar/AppBarTitle.tsx +1 -2
- package/src/autocomplete/AutocompleteListboxChildren.tsx +3 -1
- package/src/autocomplete/types.ts +24 -19
- package/src/autocomplete/utils.ts +9 -6
- package/src/avatar/Avatar.tsx +2 -1
- package/src/box/styles.ts +39 -0
- package/src/button/Button.tsx +2 -1
- package/src/button/FloatingActionButton.tsx +2 -1
- package/src/card/Card.tsx +2 -1
- package/src/card/CardContent.tsx +1 -2
- package/src/card/ClickableCard.tsx +1 -2
- package/src/chip/Chip.tsx +2 -1
- package/src/datetime/NativeDateField.tsx +2 -1
- package/src/datetime/NativeTimeField.tsx +2 -1
- package/src/datetime/useDateField.ts +13 -8
- package/src/datetime/useTimeField.ts +13 -8
- package/src/dialog/Dialog.tsx +2 -1
- package/src/dialog/DialogContainer.tsx +1 -2
- package/src/dialog/DialogContent.tsx +1 -2
- package/src/dialog/DialogFooter.tsx +1 -2
- package/src/divider/Divider.tsx +1 -2
- package/src/draggable/useDraggable.ts +4 -4
- package/src/draggable/utils.ts +4 -2
- package/src/expansion-panel/ExpansionPanelHeader.tsx +1 -2
- package/src/files/FileInput.tsx +2 -1
- package/src/files/useFileUpload.ts +6 -6
- package/src/files/validation.ts +1 -2
- package/src/focus/useFocusContainer.ts +4 -4
- package/src/form/Fieldset.tsx +25 -3
- package/src/form/FormMessageContainer.tsx +1 -2
- package/src/form/FormMessageCounter.tsx +1 -2
- package/src/form/InputToggle.tsx +3 -3
- package/src/form/Legend.tsx +55 -10
- package/src/form/Listbox.tsx +1 -2
- package/src/form/ListboxProvider.ts +3 -2
- package/src/form/NativeSelect.tsx +2 -1
- package/src/form/Password.tsx +4 -2
- package/src/form/ResizingTextAreaWrapper.tsx +1 -2
- package/src/form/Select.tsx +2 -1
- package/src/form/Slider.tsx +2 -1
- package/src/form/SliderContainer.tsx +1 -2
- package/src/form/SliderThumb.tsx +6 -3
- package/src/form/SliderTrack.tsx +2 -1
- package/src/form/SliderValueMarks.tsx +1 -2
- package/src/form/Switch.tsx +2 -1
- package/src/form/TextArea.tsx +1 -2
- package/src/form/TextField.tsx +2 -1
- package/src/form/TextFieldContainer.tsx +1 -2
- package/src/form/fieldsetStyles.ts +18 -3
- package/src/form/inputToggleStyles.ts +4 -2
- package/src/form/labelStyles.ts +1 -1
- package/src/form/legendStyles.ts +132 -0
- package/src/form/selectUtils.ts +3 -2
- package/src/form/textFieldContainerStyles.ts +1 -2
- package/src/form/types.ts +35 -17
- package/src/form/useCheckboxGroup.ts +3 -2
- package/src/form/useCombobox.ts +8 -3
- package/src/form/useNumberField.ts +36 -35
- package/src/form/useRangeSlider.ts +1 -2
- package/src/form/useSlider.ts +1 -2
- package/src/form/useTextField.ts +9 -4
- package/src/hoverMode/useHoverMode.ts +4 -8
- package/src/icon/FontIcon.tsx +1 -2
- package/src/icon/IconRotator.tsx +1 -2
- package/src/icon/MaterialIcon.tsx +2 -1
- package/src/icon/MaterialSymbol.tsx +2 -1
- package/src/icon/SVGIcon.tsx +1 -2
- package/src/icon/config.tsx +10 -7
- package/src/icon/materialConfig.ts +1 -2
- package/src/icon/styles.ts +1 -2
- package/src/interaction/UserInteractionModeProvider.tsx +9 -4
- package/src/interaction/types.ts +1 -2
- package/src/interaction/useElementInteraction.tsx +3 -2
- package/src/layout/LayoutAppBar.tsx +6 -6
- package/src/layout/LayoutNav.tsx +2 -1
- package/src/layout/LayoutWindowSplitter.tsx +2 -1
- package/src/layout/Main.tsx +1 -2
- package/src/layout/useExpandableLayout.ts +63 -5
- package/src/layout/useHorizontalLayoutTransition.ts +1 -2
- package/src/layout/useLayoutTree.ts +2 -2
- package/src/layout/useLayoutWindowSplitter.ts +6 -6
- package/src/layout/useResizableLayout.ts +3 -6
- package/src/link/Link.tsx +1 -2
- package/src/link/SkipToMainContent.tsx +20 -23
- package/src/list/List.tsx +1 -2
- package/src/list/ListItem.tsx +2 -1
- package/src/list/ListItemAddon.tsx +2 -1
- package/src/list/ListItemLink.tsx +2 -1
- package/src/list/ListSubheader.tsx +1 -2
- package/src/list/getListItemHeight.ts +8 -9
- package/src/list/listItemStyles.ts +1 -2
- package/src/list/types.ts +1 -2
- package/src/media-queries/AppSizeProvider.tsx +8 -10
- package/src/media-queries/appSize.ts +3 -0
- package/src/media-queries/config.ts +41 -0
- package/src/menu/DropdownMenu.tsx +4 -5
- package/src/menu/Menu.tsx +2 -1
- package/src/menu/MenuItemButton.tsx +1 -2
- package/src/menu/MenuItemFileInput.tsx +2 -1
- package/src/menu/MenuItemInputToggle.tsx +3 -3
- package/src/menu/MenuItemSeparator.tsx +2 -1
- package/src/menu/MenuVisibilityProvider.tsx +4 -2
- package/src/menu/MenuWidget.tsx +1 -2
- package/src/menu/useContextMenu.ts +4 -2
- package/src/movement/types.ts +52 -13
- package/src/movement/useKeyboardMovementProvider.ts +77 -38
- package/src/navigation/CollapsibleNavGroup.tsx +1 -2
- package/src/navigation/NavItem.tsx +1 -2
- package/src/navigation/NavItemButton.tsx +2 -1
- package/src/navigation/NavItemLink.tsx +2 -1
- package/src/navigation/getTableOfContentsHeadings.ts +1 -2
- package/src/navigation/types.ts +1 -2
- package/src/overlay/Overlay.tsx +2 -1
- package/src/positioning/createHorizontalPosition.ts +10 -12
- package/src/positioning/createVerticalPosition.ts +10 -11
- package/src/positioning/useFixedPositioning.ts +6 -3
- package/src/progress/CircularProgress.tsx +2 -1
- package/src/progress/LinearProgress.tsx +2 -1
- package/src/progress/linearProgressStyles.ts +1 -2
- package/src/responsive-item/ResponsiveItem.tsx +1 -2
- package/src/responsive-item/ResponsiveItemOverlay.tsx +2 -1
- package/src/searching/caseInsensitive.ts +2 -4
- package/src/segmented-button/SegmentedButton.tsx +2 -1
- package/src/segmented-button/SegmentedButtonContainer.tsx +2 -1
- package/src/segmented-button/segmentedButtonStyles.ts +1 -2
- package/src/sheet/Sheet.tsx +1 -2
- package/src/snackbar/Toast.tsx +2 -1
- package/src/spinbutton/SpinButton.tsx +98 -0
- package/src/spinbutton/SpinButtonGroupProvider.tsx +32 -0
- package/src/spinbutton/defaults.ts +45 -0
- package/src/spinbutton/types.ts +413 -0
- package/src/spinbutton/useSpinButton.ts +311 -0
- package/src/spinbutton/useSpinButtonGroupProvider.ts +104 -0
- package/src/spinbutton/utils/deselectNode.ts +17 -0
- package/src/spinbutton/utils/resolveInputEvent.ts +112 -0
- package/src/spinbutton/utils/selectNode.ts +15 -0
- package/src/table/StickyTableSection.tsx +2 -1
- package/src/table/Table.tsx +1 -2
- package/src/table/TableBody.tsx +2 -1
- package/src/table/TableCellContent.tsx +1 -2
- package/src/table/TableCheckbox.tsx +1 -2
- package/src/table/TableFooter.tsx +1 -2
- package/src/table/TableHeader.tsx +1 -2
- package/src/table/TableRadio.tsx +1 -2
- package/src/table/TableRow.tsx +1 -2
- package/src/table/useStickyTableSection.tsx +1 -2
- package/src/tabs/SimpleTabPanel.tsx +2 -1
- package/src/tabs/SimpleTabPanels.tsx +2 -1
- package/src/tabs/Tab.tsx +3 -6
- package/src/tabs/TabList.tsx +2 -1
- package/src/tabs/TabListScrollButton.tsx +1 -2
- package/src/tabs/useMaxTabPanelHeight.ts +7 -4
- package/src/test-utils/data-testid.ts +1 -2
- package/src/test-utils/mocks/match-media.ts +5 -10
- package/src/test-utils/vitest/timers.ts +1 -1
- package/src/tooltip/Tooltip.tsx +2 -1
- package/src/tooltip/TooltipHoverModeProvider.tsx +1 -2
- package/src/tooltip/useTooltip.ts +9 -5
- package/src/transition/CSSTransition.tsx +2 -1
- package/src/transition/Collapse.tsx +4 -2
- package/src/transition/CrossFade.tsx +2 -1
- package/src/transition/ScaleTransition.tsx +2 -1
- package/src/transition/SkeletonPlaceholder.tsx +1 -2
- package/src/transition/Slide.tsx +2 -1
- package/src/transition/SlideContainer.tsx +1 -2
- package/src/transition/types.ts +15 -16
- package/src/transition/useCollapseTransition.ts +6 -5
- package/src/transition/useCrossFadeTransition.ts +3 -2
- package/src/transition/useMaxWidthTransition.ts +1 -2
- package/src/transition/useScaleTransition.ts +3 -2
- package/src/transition/useSkeletonPlaceholder.ts +1 -2
- package/src/tree/Tree.tsx +2 -1
- package/src/tree/TreeItem.tsx +2 -1
- package/src/tree/TreeProvider.tsx +4 -4
- package/src/tree/styles.ts +1 -2
- package/src/tree/types.ts +1 -2
- package/src/tree/useTreeMovement.ts +1 -2
- package/src/typography/HighlightTextMark.tsx +1 -2
- package/src/typography/Mark.tsx +1 -2
- package/src/typography/TextContainer.tsx +1 -2
- package/src/typography/Typography.tsx +1 -2
- package/src/useElementSize.ts +7 -4
- package/src/useIntersectionObserver.ts +3 -2
- package/src/useMutationObserver.ts +3 -2
- package/src/useWindowSize.ts +4 -2
- package/src/utils/getNumberOfDigits.ts +18 -0
- package/src/utils/nearest.ts +2 -1
- package/src/utils/useDevEffect.ts +9 -0
- package/src/window-splitter/WindowSplitter.tsx +5 -2
- package/src/window-splitter/styles.ts +13 -2
- package/src/window-splitter/useWindowSplitter.ts +3 -1
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { type Dispatch, useCallback, useRef, useState } from "react";
|
|
4
|
+
|
|
5
|
+
import { tryToSubmitRelatedForm } from "../form/utils.js";
|
|
6
|
+
import { useEnsuredId } from "../useEnsuredId.js";
|
|
7
|
+
import { useEnsuredRef } from "../useEnsuredRef.js";
|
|
8
|
+
import { useEnsuredState } from "../useEnsuredState.js";
|
|
9
|
+
import { useIsomorphicLayoutEffect } from "../useIsomorphicLayoutEffect.js";
|
|
10
|
+
import { withinRange } from "../utils/withinRange.js";
|
|
11
|
+
import { useSpinButtonGroup } from "./SpinButtonGroupProvider.js";
|
|
12
|
+
import {
|
|
13
|
+
defaultGetSpinButtonTextContent,
|
|
14
|
+
defaultSpinButtonGetValueText,
|
|
15
|
+
} from "./defaults.js";
|
|
16
|
+
import {
|
|
17
|
+
type SpinButtonChangeEvent,
|
|
18
|
+
type SpinButtonChangeEventOptions,
|
|
19
|
+
type SpinButtonImplementation,
|
|
20
|
+
type SpinButtonOptions,
|
|
21
|
+
type SpinButtonValue,
|
|
22
|
+
} from "./types.js";
|
|
23
|
+
import { deselectNode } from "./utils/deselectNode.js";
|
|
24
|
+
import { resolveInputEvent } from "./utils/resolveInputEvent.js";
|
|
25
|
+
import { selectNode } from "./utils/selectNode.js";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @since 6.4.0
|
|
29
|
+
*/
|
|
30
|
+
const noop = (): void => {
|
|
31
|
+
// do nothing
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @since 6.4.0
|
|
36
|
+
*/
|
|
37
|
+
export function useSpinButton<E extends HTMLElement = HTMLDivElement>(
|
|
38
|
+
options: SpinButtonOptions<E>
|
|
39
|
+
): SpinButtonImplementation<E> {
|
|
40
|
+
const {
|
|
41
|
+
id: propId,
|
|
42
|
+
ref: propRef,
|
|
43
|
+
min,
|
|
44
|
+
max,
|
|
45
|
+
step = 1,
|
|
46
|
+
minDigits,
|
|
47
|
+
maxDigits,
|
|
48
|
+
form,
|
|
49
|
+
readOnly,
|
|
50
|
+
disabled,
|
|
51
|
+
required,
|
|
52
|
+
error,
|
|
53
|
+
onBlur = noop,
|
|
54
|
+
onFocus = noop,
|
|
55
|
+
onInput = noop,
|
|
56
|
+
onClick = noop,
|
|
57
|
+
onKeyDown = noop,
|
|
58
|
+
fallback,
|
|
59
|
+
mappings,
|
|
60
|
+
value: propValue,
|
|
61
|
+
onValueChange = noop,
|
|
62
|
+
defaultValue = null,
|
|
63
|
+
getValueText = defaultSpinButtonGetValueText,
|
|
64
|
+
getTextContent = defaultGetSpinButtonTextContent,
|
|
65
|
+
placeholderChar,
|
|
66
|
+
defaultKeyboardValue,
|
|
67
|
+
} = options;
|
|
68
|
+
const id = useEnsuredId(propId, "spinbutton");
|
|
69
|
+
|
|
70
|
+
// trigger a noop setValue when `value` and `onValueChange` are provided
|
|
71
|
+
// since `onValueChange is always called with `setValue
|
|
72
|
+
let propSetValue: Dispatch<SpinButtonValue> | undefined;
|
|
73
|
+
if (typeof propValue !== "undefined" && options.onValueChange) {
|
|
74
|
+
propSetValue = noop;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const [value, setValue] = useEnsuredState({
|
|
78
|
+
value: propValue,
|
|
79
|
+
setValue: propSetValue,
|
|
80
|
+
defaultValue,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const focused = useRef(false);
|
|
84
|
+
const typedCount = useRef(0);
|
|
85
|
+
const prevText = useRef("");
|
|
86
|
+
const [nodeRef, nodeRefCallback] = useEnsuredRef(propRef);
|
|
87
|
+
const { focusNext } = useSpinButtonGroup();
|
|
88
|
+
const [keyboardValue] = useState(defaultKeyboardValue);
|
|
89
|
+
|
|
90
|
+
// NOTE: I might be able to get rid of this since I don't remember why it was
|
|
91
|
+
// added maybe for controlled fields? I'll have to see when I get to the
|
|
92
|
+
// date/time components again
|
|
93
|
+
useIsomorphicLayoutEffect(() => {
|
|
94
|
+
const node = nodeRef.current;
|
|
95
|
+
if (!focused.current || !node) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
prevText.current = node.textContent || "";
|
|
100
|
+
selectNode(node);
|
|
101
|
+
}, [nodeRef, value]);
|
|
102
|
+
|
|
103
|
+
const updateValue = useCallback(
|
|
104
|
+
(options: SpinButtonChangeEventOptions<E>) => {
|
|
105
|
+
setValue(options.value);
|
|
106
|
+
onValueChange(options);
|
|
107
|
+
if (options.reason === "typed-to-completion") {
|
|
108
|
+
focusNext();
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
[focusNext, onValueChange, setValue]
|
|
112
|
+
);
|
|
113
|
+
const increment = useCallback(
|
|
114
|
+
(event: SpinButtonChangeEvent<E>) => {
|
|
115
|
+
let nextValue: SpinButtonValue =
|
|
116
|
+
value ?? keyboardValue ?? min ?? max ?? 0;
|
|
117
|
+
nextValue = withinRange({ min, max, value: nextValue + step });
|
|
118
|
+
|
|
119
|
+
// this actually means both min and max are a number
|
|
120
|
+
if (nextValue === value && typeof min === "number") {
|
|
121
|
+
nextValue = min;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
updateValue({
|
|
125
|
+
event,
|
|
126
|
+
reason: "change",
|
|
127
|
+
value: nextValue,
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
[keyboardValue, max, min, step, updateValue, value]
|
|
131
|
+
);
|
|
132
|
+
const decrement = useCallback(
|
|
133
|
+
(event: SpinButtonChangeEvent<E>) => {
|
|
134
|
+
let nextValue: SpinButtonValue =
|
|
135
|
+
value ?? keyboardValue ?? max ?? min ?? 0;
|
|
136
|
+
nextValue = withinRange({ min, max, value: nextValue - step });
|
|
137
|
+
|
|
138
|
+
// this actually means both min and max are a number
|
|
139
|
+
if (nextValue === value && typeof max === "number") {
|
|
140
|
+
nextValue = max;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
updateValue({
|
|
144
|
+
event,
|
|
145
|
+
reason: "change",
|
|
146
|
+
value: nextValue,
|
|
147
|
+
});
|
|
148
|
+
},
|
|
149
|
+
[keyboardValue, max, min, step, updateValue, value]
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
value,
|
|
154
|
+
setValue,
|
|
155
|
+
spinButtonRef: nodeRef,
|
|
156
|
+
spinButtonProps: {
|
|
157
|
+
"aria-readonly": readOnly || undefined,
|
|
158
|
+
"aria-disabled": disabled || undefined,
|
|
159
|
+
"aria-invalid": error || undefined,
|
|
160
|
+
"aria-required": required || undefined,
|
|
161
|
+
"aria-valuemin": min,
|
|
162
|
+
"aria-valuemax": max,
|
|
163
|
+
"aria-valuenow": value === null ? undefined : value,
|
|
164
|
+
"aria-valuetext": getValueText(value),
|
|
165
|
+
id,
|
|
166
|
+
ref: nodeRefCallback,
|
|
167
|
+
role: "spinbutton",
|
|
168
|
+
autoCapitalize: "none",
|
|
169
|
+
autoCorrect: "off",
|
|
170
|
+
spellCheck: false,
|
|
171
|
+
inputMode: "numeric",
|
|
172
|
+
contentEditable: !disabled || undefined,
|
|
173
|
+
suppressContentEditableWarning: true,
|
|
174
|
+
tabIndex: disabled ? undefined : 0,
|
|
175
|
+
onBlur: (event) => {
|
|
176
|
+
onBlur(event);
|
|
177
|
+
|
|
178
|
+
focused.current = false;
|
|
179
|
+
deselectNode(event.currentTarget);
|
|
180
|
+
},
|
|
181
|
+
onFocus: (event) => {
|
|
182
|
+
onFocus(event);
|
|
183
|
+
|
|
184
|
+
if (disabled) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
focused.current = true;
|
|
189
|
+
typedCount.current = 0;
|
|
190
|
+
selectNode(event.currentTarget);
|
|
191
|
+
},
|
|
192
|
+
onKeyDown: (event) => {
|
|
193
|
+
onKeyDown(event);
|
|
194
|
+
|
|
195
|
+
if (disabled || (readOnly && event.key !== "Enter")) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const setValue = (nextValue: number): void =>
|
|
200
|
+
updateValue({ value: nextValue, event, reason: "change" });
|
|
201
|
+
|
|
202
|
+
let stop = false;
|
|
203
|
+
switch (event.key) {
|
|
204
|
+
case "ArrowRight":
|
|
205
|
+
case "ArrowLeft":
|
|
206
|
+
// `event.stopPropagation()` should not be called here since the
|
|
207
|
+
// parent `useSpinButtonGroup` keyboard event handler should
|
|
208
|
+
// still be called to handle advancing to the next spinbutton in
|
|
209
|
+
// the group. Only the default cursor movement needs to be disabled
|
|
210
|
+
// instead.
|
|
211
|
+
event.preventDefault();
|
|
212
|
+
break;
|
|
213
|
+
case "ArrowUp":
|
|
214
|
+
stop = true;
|
|
215
|
+
increment(event);
|
|
216
|
+
break;
|
|
217
|
+
case "ArrowDown":
|
|
218
|
+
stop = true;
|
|
219
|
+
decrement(event);
|
|
220
|
+
break;
|
|
221
|
+
case "Home":
|
|
222
|
+
stop = true;
|
|
223
|
+
if (typeof min === "number") {
|
|
224
|
+
setValue(min);
|
|
225
|
+
}
|
|
226
|
+
break;
|
|
227
|
+
case "End":
|
|
228
|
+
stop = true;
|
|
229
|
+
if (typeof max === "number") {
|
|
230
|
+
setValue(max);
|
|
231
|
+
}
|
|
232
|
+
break;
|
|
233
|
+
case "Enter":
|
|
234
|
+
stop = true;
|
|
235
|
+
tryToSubmitRelatedForm(event, form);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (stop) {
|
|
239
|
+
event.preventDefault();
|
|
240
|
+
event.stopPropagation();
|
|
241
|
+
typedCount.current = 0;
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
onClick: (event) => {
|
|
245
|
+
onClick(event);
|
|
246
|
+
|
|
247
|
+
event.preventDefault();
|
|
248
|
+
if (disabled) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
focused.current = true;
|
|
253
|
+
typedCount.current = 0;
|
|
254
|
+
selectNode(event.currentTarget);
|
|
255
|
+
},
|
|
256
|
+
onInput: (event) => {
|
|
257
|
+
onInput(event);
|
|
258
|
+
|
|
259
|
+
const node = event.currentTarget;
|
|
260
|
+
// if the input event is fired while readOnly or disabled, ignore it
|
|
261
|
+
// and set it back to the previous state
|
|
262
|
+
if (readOnly || disabled) {
|
|
263
|
+
node.textContent = prevText.current;
|
|
264
|
+
selectNode(node);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const { reason, nextValue } = resolveInputEvent({
|
|
269
|
+
min,
|
|
270
|
+
max,
|
|
271
|
+
text: node.textContent || "",
|
|
272
|
+
mappings,
|
|
273
|
+
maxDigits,
|
|
274
|
+
prevText: prevText.current,
|
|
275
|
+
prevValue: value,
|
|
276
|
+
typedCount: typedCount.current,
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
if (
|
|
280
|
+
reason === "change" ||
|
|
281
|
+
reason === "cleared" ||
|
|
282
|
+
reason === "typed-to-completion"
|
|
283
|
+
) {
|
|
284
|
+
typedCount.current = 0;
|
|
285
|
+
} else if (reason !== "ignored") {
|
|
286
|
+
typedCount.current++;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
node.textContent = getTextContent({
|
|
290
|
+
min,
|
|
291
|
+
max,
|
|
292
|
+
minDigits,
|
|
293
|
+
maxDigits,
|
|
294
|
+
value: nextValue,
|
|
295
|
+
fallback,
|
|
296
|
+
placeholderChar,
|
|
297
|
+
});
|
|
298
|
+
prevText.current = node.textContent;
|
|
299
|
+
selectNode(node);
|
|
300
|
+
|
|
301
|
+
if (reason !== "ignored" && reason !== "placeholder-digit") {
|
|
302
|
+
updateValue({
|
|
303
|
+
event,
|
|
304
|
+
value: nextValue,
|
|
305
|
+
reason,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP,
|
|
5
|
+
DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP,
|
|
6
|
+
} from "../movement/constants.js";
|
|
7
|
+
import {
|
|
8
|
+
type KeyboardMovementProps,
|
|
9
|
+
type KeyboardMovementProviderImplementation,
|
|
10
|
+
type SimpleKeyboardMovementWrapperOptions,
|
|
11
|
+
} from "../movement/types.js";
|
|
12
|
+
import { useKeyboardMovementProvider } from "../movement/useKeyboardMovementProvider.js";
|
|
13
|
+
import { useDir } from "../typography/WritingDirectionProvider.js";
|
|
14
|
+
|
|
15
|
+
const SPINBUTTON_ROLE = '[role="spinbutton"]';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @internal
|
|
19
|
+
* @since 6.4.0
|
|
20
|
+
*/
|
|
21
|
+
const getSpinButtonsOnly = (container: HTMLElement): readonly HTMLElement[] => [
|
|
22
|
+
...container.querySelectorAll<HTMLElement>(SPINBUTTON_ROLE),
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @since 6.4.0
|
|
27
|
+
*/
|
|
28
|
+
export interface SpinButtonGroupProviderOptions<
|
|
29
|
+
E extends HTMLElement = HTMLElement,
|
|
30
|
+
> extends SimpleKeyboardMovementWrapperOptions<E> {
|
|
31
|
+
/**
|
|
32
|
+
* Set this to `true` to update the container's `onClick` handler to move
|
|
33
|
+
* focus to the first spinbutton that does not have a value or the first
|
|
34
|
+
* spinbutton in the group so that focus is always moved to the spin buttons.
|
|
35
|
+
*
|
|
36
|
+
* @defaultValue `false`
|
|
37
|
+
*/
|
|
38
|
+
forceFocusWithin?: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ProvidedSpinButtonGroupProps<
|
|
42
|
+
E extends HTMLElement = HTMLElement,
|
|
43
|
+
> extends KeyboardMovementProps<E> {
|
|
44
|
+
role: "group";
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @since 6.4.0
|
|
49
|
+
*/
|
|
50
|
+
export interface SpinButtonGroupProviderImplementation<
|
|
51
|
+
E extends HTMLElement = HTMLElement,
|
|
52
|
+
> extends KeyboardMovementProviderImplementation<E> {
|
|
53
|
+
movementProps: Readonly<ProvidedSpinButtonGroupProps<E>>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @since 6.4.0
|
|
58
|
+
*/
|
|
59
|
+
export function useSpinButtonGroupProvider<E extends HTMLElement = HTMLElement>(
|
|
60
|
+
options: SpinButtonGroupProviderOptions<E> = {}
|
|
61
|
+
): SpinButtonGroupProviderImplementation<E> {
|
|
62
|
+
const { disabled, forceFocusWithin } = options;
|
|
63
|
+
|
|
64
|
+
const isRTL = useDir().dir === "rtl";
|
|
65
|
+
const movementKeys = isRTL
|
|
66
|
+
? DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP
|
|
67
|
+
: DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP;
|
|
68
|
+
|
|
69
|
+
const { movementProps, ...remaining } = useKeyboardMovementProvider({
|
|
70
|
+
...options,
|
|
71
|
+
...movementKeys,
|
|
72
|
+
loopable: false,
|
|
73
|
+
trackTabKeys: true,
|
|
74
|
+
getFocusableElements: getSpinButtonsOnly,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
...remaining,
|
|
79
|
+
movementProps: {
|
|
80
|
+
...movementProps,
|
|
81
|
+
role: "group",
|
|
82
|
+
onClick: (event) => {
|
|
83
|
+
movementProps.onClick(event);
|
|
84
|
+
|
|
85
|
+
const { target, currentTarget } = event;
|
|
86
|
+
if (
|
|
87
|
+
disabled ||
|
|
88
|
+
!forceFocusWithin ||
|
|
89
|
+
!(target instanceof HTMLElement) ||
|
|
90
|
+
target.closest(SPINBUTTON_ROLE)
|
|
91
|
+
) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const buttons = [...currentTarget.querySelectorAll(SPINBUTTON_ROLE)];
|
|
96
|
+
const i = buttons.findIndex((button) => !button.ariaValueNow);
|
|
97
|
+
remaining.movementContext.updateFocusIndex({
|
|
98
|
+
index: Math.max(0, i),
|
|
99
|
+
force: true,
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 6.4.0
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export function deselectNode(node: Node): void {
|
|
6
|
+
const selection = window.getSelection();
|
|
7
|
+
if (!selection) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
for (let i = 0; i < selection.rangeCount; i++) {
|
|
12
|
+
const range = selection.getRangeAt(i);
|
|
13
|
+
if (range.startContainer.contains(node)) {
|
|
14
|
+
selection.removeRange(range);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { type MinMaxRange } from "../../types.js";
|
|
2
|
+
import { getNumberOfDigits } from "../../utils/getNumberOfDigits.js";
|
|
3
|
+
import {
|
|
4
|
+
type SpinButtonChangeReason,
|
|
5
|
+
type SpinButtonCharacterValueMap,
|
|
6
|
+
type SpinButtonValue,
|
|
7
|
+
} from "../types.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @since 6.4.0
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
interface ResolveInputEventOptions extends Partial<MinMaxRange> {
|
|
14
|
+
text: string;
|
|
15
|
+
mappings?: SpinButtonCharacterValueMap;
|
|
16
|
+
minDigits?: number;
|
|
17
|
+
maxDigits?: number;
|
|
18
|
+
prevText: string;
|
|
19
|
+
prevValue: SpinButtonValue;
|
|
20
|
+
typedCount: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type SpinButtonResolvedInputReason =
|
|
24
|
+
| SpinButtonChangeReason
|
|
25
|
+
| "ignored"
|
|
26
|
+
| "placeholder-digit";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @since 6.4.0
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
interface ResolveInputEvent {
|
|
33
|
+
reason: SpinButtonResolvedInputReason;
|
|
34
|
+
nextValue: SpinButtonValue;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @since 6.4.0
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
export function resolveInputEvent(
|
|
42
|
+
options: ResolveInputEventOptions
|
|
43
|
+
): ResolveInputEvent {
|
|
44
|
+
const {
|
|
45
|
+
min,
|
|
46
|
+
max,
|
|
47
|
+
minDigits = getNumberOfDigits(min),
|
|
48
|
+
maxDigits = getNumberOfDigits(max),
|
|
49
|
+
text,
|
|
50
|
+
mappings,
|
|
51
|
+
typedCount,
|
|
52
|
+
prevValue,
|
|
53
|
+
} = options;
|
|
54
|
+
|
|
55
|
+
let { prevText } = options;
|
|
56
|
+
if (typedCount === 0) {
|
|
57
|
+
prevText = "";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (!text) {
|
|
61
|
+
return {
|
|
62
|
+
reason: "cleared",
|
|
63
|
+
nextValue: null,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (mappings) {
|
|
68
|
+
const nextValue = mappings[text] ?? prevValue;
|
|
69
|
+
|
|
70
|
+
let reason: SpinButtonResolvedInputReason = "ignored";
|
|
71
|
+
if (typeof mappings[text] === "number") {
|
|
72
|
+
reason = "typed-to-completion";
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
reason,
|
|
77
|
+
nextValue,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (/[^0-9]/.test(text)) {
|
|
82
|
+
return {
|
|
83
|
+
reason: "ignored",
|
|
84
|
+
nextValue: prevValue,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
let reason: SpinButtonResolvedInputReason = "type";
|
|
89
|
+
let nextValue: SpinButtonValue = parseInt(prevText + text, 10);
|
|
90
|
+
if (typeof minDigits === "number" && typedCount + 1 < minDigits) {
|
|
91
|
+
reason = "placeholder-digit";
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (typeof max === "number" && nextValue > max) {
|
|
95
|
+
nextValue = prevValue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (
|
|
99
|
+
typeof nextValue === "number" &&
|
|
100
|
+
// if typing a new value surpasses the number of digits allowed
|
|
101
|
+
((typeof maxDigits === "number" && typedCount + 1 >= maxDigits) ||
|
|
102
|
+
// typing a new value would exceed the max value
|
|
103
|
+
(typeof max === "number" && nextValue * 10 > max))
|
|
104
|
+
) {
|
|
105
|
+
reason = "typed-to-completion";
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
reason,
|
|
110
|
+
nextValue,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 6.4.0
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export function selectNode(node: Node): void {
|
|
6
|
+
const selection = window.getSelection();
|
|
7
|
+
if (!selection) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const range = document.createRange();
|
|
12
|
+
range.selectNodeContents(node);
|
|
13
|
+
selection.removeAllRanges();
|
|
14
|
+
selection.addRange(range);
|
|
15
|
+
}
|
|
@@ -14,7 +14,8 @@ import { useTableSectionConfig } from "./useTableSectionConfig.js";
|
|
|
14
14
|
|
|
15
15
|
/** @since 6.0.0 */
|
|
16
16
|
export interface StickyTableSectionProps
|
|
17
|
-
extends
|
|
17
|
+
extends
|
|
18
|
+
HTMLAttributes<HTMLTableSectionElement>,
|
|
18
19
|
TableStickySectionConfiguration,
|
|
19
20
|
TableSectionConfiguration {
|
|
20
21
|
type: "header" | "footer";
|
package/src/table/Table.tsx
CHANGED
package/src/table/TableBody.tsx
CHANGED
|
@@ -10,7 +10,8 @@ import {
|
|
|
10
10
|
import { type TableConfig, type TableConfigContext } from "./types.js";
|
|
11
11
|
|
|
12
12
|
export interface TableBodyProps
|
|
13
|
-
extends
|
|
13
|
+
extends
|
|
14
|
+
HTMLAttributes<HTMLTableSectionElement>,
|
|
14
15
|
Omit<TableConfig, "header"> {}
|
|
15
16
|
|
|
16
17
|
/**
|
|
@@ -19,8 +19,7 @@ export type TableCellContentsIconRotatorProps = Omit<
|
|
|
19
19
|
* can be passed to the `ButtonUnstyled`
|
|
20
20
|
* @internal
|
|
21
21
|
*/
|
|
22
|
-
export interface TableCellContentProps
|
|
23
|
-
extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
22
|
+
export interface TableCellContentProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
24
23
|
/**
|
|
25
24
|
* The current sort order for this cell. Setting this to `null` will prevent
|
|
26
25
|
* the button from being rendered.
|
|
@@ -48,8 +48,7 @@ export type TableCheckboxSupportedCheckboxProps = Pick<
|
|
|
48
48
|
* `"Toggle Row Selection"` to `"Select Row"`.
|
|
49
49
|
*/
|
|
50
50
|
export interface TableCheckboxProps
|
|
51
|
-
extends TableCheckboxTdHTMLAttributes,
|
|
52
|
-
TableCheckboxSupportedCheckboxProps {
|
|
51
|
+
extends TableCheckboxTdHTMLAttributes, TableCheckboxSupportedCheckboxProps {
|
|
53
52
|
/**
|
|
54
53
|
* @defaultValue `!props["aria-labelledby"] ? "Select Row" : undefined`
|
|
55
54
|
*/
|
|
@@ -8,8 +8,7 @@ import { type TableSectionConfiguration } from "./types.js";
|
|
|
8
8
|
import { useTableSectionConfig } from "./useTableSectionConfig.js";
|
|
9
9
|
|
|
10
10
|
export interface TableFooterProps
|
|
11
|
-
extends HTMLAttributes<HTMLTableSectionElement>,
|
|
12
|
-
TableSectionConfiguration {
|
|
11
|
+
extends HTMLAttributes<HTMLTableSectionElement>, TableSectionConfiguration {
|
|
13
12
|
/**
|
|
14
13
|
* NOTE: It is recommended to use the `StickyTableSection` component instead
|
|
15
14
|
* of enabling this prop since it supports dynamically adding styles while the
|
|
@@ -8,8 +8,7 @@ import { type TableSectionConfiguration } from "./types.js";
|
|
|
8
8
|
import { useTableSectionConfig } from "./useTableSectionConfig.js";
|
|
9
9
|
|
|
10
10
|
export interface TableHeaderProps
|
|
11
|
-
extends HTMLAttributes<HTMLTableSectionElement>,
|
|
12
|
-
TableSectionConfiguration {
|
|
11
|
+
extends HTMLAttributes<HTMLTableSectionElement>, TableSectionConfiguration {
|
|
13
12
|
/**
|
|
14
13
|
* NOTE: It is recommended to use the `StickyTableSection` component instead
|
|
15
14
|
* of enabling this prop since it supports dynamically adding styles while the
|
package/src/table/TableRadio.tsx
CHANGED
|
@@ -43,8 +43,7 @@ export type TableRadioSupportedRadioProps = Pick<
|
|
|
43
43
|
* @since 6.0.0
|
|
44
44
|
*/
|
|
45
45
|
export interface TableRadioProps
|
|
46
|
-
extends TableRadioTdHTMLAttributes,
|
|
47
|
-
TableRadioSupportedRadioProps {
|
|
46
|
+
extends TableRadioTdHTMLAttributes, TableRadioSupportedRadioProps {
|
|
48
47
|
/**
|
|
49
48
|
* @defaultValue `!props["aria-labelledby"] ? "Select Row" : undefined`
|
|
50
49
|
*/
|
package/src/table/TableRow.tsx
CHANGED
|
@@ -7,8 +7,7 @@ import { tableRow } from "./tableRowStyles.js";
|
|
|
7
7
|
import { type TableRowConfiguration } from "./types.js";
|
|
8
8
|
|
|
9
9
|
export interface TableRowProps
|
|
10
|
-
extends HTMLAttributes<HTMLTableRowElement>,
|
|
11
|
-
TableRowConfiguration {
|
|
10
|
+
extends HTMLAttributes<HTMLTableRowElement>, TableRowConfiguration {
|
|
12
11
|
/**
|
|
13
12
|
* Boolean if the current row has been selected and should apply the selected
|
|
14
13
|
* background-color.
|
|
@@ -44,8 +44,7 @@ export const isTableFooterStickyActive: IsStickyTableSectionActive = (
|
|
|
44
44
|
};
|
|
45
45
|
|
|
46
46
|
/** @since 6.0.0 */
|
|
47
|
-
export interface TableStickySectionOptions
|
|
48
|
-
extends TableStickySectionConfiguration {
|
|
47
|
+
export interface TableStickySectionOptions extends TableStickySectionConfiguration {
|
|
49
48
|
ref?: Ref<HTMLTableSectionElement>;
|
|
50
49
|
type: "header" | "footer";
|
|
51
50
|
}
|
|
@@ -8,7 +8,8 @@ import { type ProvidedTabPanelProps } from "./useTabs.js";
|
|
|
8
8
|
* @since 6.0.0
|
|
9
9
|
*/
|
|
10
10
|
export interface SimpleTabPanelProps
|
|
11
|
-
extends
|
|
11
|
+
extends
|
|
12
|
+
Omit<HTMLAttributes<HTMLDivElement>, keyof ProvidedTabPanelProps>,
|
|
12
13
|
ProvidedTabPanelProps {
|
|
13
14
|
children: ReactNode;
|
|
14
15
|
}
|
|
@@ -6,7 +6,8 @@ import { type ProvidedTabPanelsProps } from "./useTabs.js";
|
|
|
6
6
|
* @since 6.0.0
|
|
7
7
|
*/
|
|
8
8
|
export interface SimpleTabPanelsProps
|
|
9
|
-
extends
|
|
9
|
+
extends
|
|
10
|
+
HTMLAttributes<HTMLDivElement>,
|
|
10
11
|
Omit<ProvidedTabPanelsProps<HTMLDivElement>, "ref"> {
|
|
11
12
|
children: ReactNode;
|
|
12
13
|
}
|