@mui/material 9.0.0-beta.0 → 9.0.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/Accordion/Accordion.d.mts +4 -4
- package/Accordion/Accordion.d.ts +4 -4
- package/AccordionActions/AccordionActions.d.mts +2 -2
- package/AccordionActions/AccordionActions.d.ts +2 -2
- package/AccordionDetails/AccordionDetails.d.mts +2 -2
- package/AccordionDetails/AccordionDetails.d.ts +2 -2
- package/AccordionSummary/AccordionSummary.d.mts +3 -3
- package/AccordionSummary/AccordionSummary.d.ts +3 -3
- package/AccordionSummary/AccordionSummary.js +1 -0
- package/AccordionSummary/AccordionSummary.mjs +1 -0
- package/Alert/Alert.d.mts +3 -3
- package/Alert/Alert.d.ts +3 -3
- package/AlertTitle/AlertTitle.d.mts +3 -3
- package/AlertTitle/AlertTitle.d.ts +3 -3
- package/AppBar/AppBar.d.mts +3 -3
- package/AppBar/AppBar.d.ts +3 -3
- package/Autocomplete/Autocomplete.d.mts +2 -2
- package/Autocomplete/Autocomplete.d.ts +2 -2
- package/Avatar/Avatar.d.mts +2 -2
- package/Avatar/Avatar.d.ts +2 -2
- package/AvatarGroup/AvatarGroup.d.mts +2 -2
- package/AvatarGroup/AvatarGroup.d.ts +2 -2
- package/Backdrop/Backdrop.d.mts +4 -4
- package/Backdrop/Backdrop.d.ts +4 -4
- package/Badge/Badge.d.mts +3 -3
- package/Badge/Badge.d.ts +3 -3
- package/BottomNavigation/BottomNavigation.d.mts +2 -2
- package/BottomNavigation/BottomNavigation.d.ts +2 -2
- package/BottomNavigationAction/BottomNavigationAction.d.mts +3 -3
- package/BottomNavigationAction/BottomNavigationAction.d.ts +3 -3
- package/BottomNavigationAction/BottomNavigationAction.js +1 -0
- package/BottomNavigationAction/BottomNavigationAction.mjs +1 -0
- package/Box/Box.d.mts +3 -3
- package/Box/Box.d.ts +3 -3
- package/Breadcrumbs/BreadcrumbCollapsed.js +5 -1
- package/Breadcrumbs/BreadcrumbCollapsed.mjs +5 -1
- package/Breadcrumbs/Breadcrumbs.d.mts +3 -3
- package/Breadcrumbs/Breadcrumbs.d.ts +3 -3
- package/Button/Button.d.mts +6 -6
- package/Button/Button.d.ts +6 -6
- package/Button/Button.js +1 -0
- package/Button/Button.mjs +1 -0
- package/ButtonBase/ButtonBase.d.mts +7 -2
- package/ButtonBase/ButtonBase.d.ts +7 -2
- package/ButtonBase/ButtonBase.js +84 -85
- package/ButtonBase/ButtonBase.mjs +84 -85
- package/ButtonBase/useButtonBase.d.mts +91 -0
- package/ButtonBase/useButtonBase.d.ts +91 -0
- package/ButtonBase/useButtonBase.js +174 -0
- package/ButtonBase/useButtonBase.mjs +167 -0
- package/ButtonGroup/ButtonGroup.d.mts +2 -2
- package/ButtonGroup/ButtonGroup.d.ts +2 -2
- package/CHANGELOG.md +76 -0
- package/Card/Card.d.mts +3 -3
- package/Card/Card.d.ts +3 -3
- package/CardActionArea/CardActionArea.d.mts +3 -3
- package/CardActionArea/CardActionArea.d.ts +3 -3
- package/CardActionArea/CardActionArea.js +1 -0
- package/CardActionArea/CardActionArea.mjs +1 -0
- package/CardActions/CardActions.d.mts +2 -2
- package/CardActions/CardActions.d.ts +2 -2
- package/CardContent/CardContent.d.mts +2 -2
- package/CardContent/CardContent.d.ts +2 -2
- package/CardHeader/CardHeader.d.mts +2 -2
- package/CardHeader/CardHeader.d.ts +2 -2
- package/CardMedia/CardMedia.d.mts +2 -2
- package/CardMedia/CardMedia.d.ts +2 -2
- package/Checkbox/Checkbox.d.mts +4 -4
- package/Checkbox/Checkbox.d.ts +4 -4
- package/Chip/Chip.d.mts +9 -2
- package/Chip/Chip.d.ts +9 -2
- package/Chip/Chip.js +18 -1
- package/Chip/Chip.mjs +18 -1
- package/CircularProgress/CircularProgress.d.mts +2 -2
- package/CircularProgress/CircularProgress.d.ts +2 -2
- package/ClickAwayListener/ClickAwayListener.d.mts +3 -3
- package/ClickAwayListener/ClickAwayListener.d.ts +3 -3
- package/ClickAwayListener/ClickAwayListener.js +3 -3
- package/ClickAwayListener/ClickAwayListener.mjs +3 -3
- package/Collapse/Collapse.d.mts +5 -5
- package/Collapse/Collapse.d.ts +5 -5
- package/Collapse/Collapse.js +6 -18
- package/Collapse/Collapse.mjs +7 -19
- package/Container/Container.d.mts +2 -2
- package/Container/Container.d.ts +2 -2
- package/CssBaseline/CssBaseline.d.mts +2 -2
- package/CssBaseline/CssBaseline.d.ts +2 -2
- package/Dialog/Dialog.d.mts +11 -4
- package/Dialog/Dialog.d.ts +11 -4
- package/Dialog/Dialog.js +9 -1
- package/Dialog/Dialog.mjs +9 -1
- package/DialogActions/DialogActions.d.mts +2 -2
- package/DialogActions/DialogActions.d.ts +2 -2
- package/DialogContent/DialogContent.d.mts +2 -2
- package/DialogContent/DialogContent.d.ts +2 -2
- package/DialogContentText/DialogContentText.d.mts +3 -3
- package/DialogContentText/DialogContentText.d.ts +3 -3
- package/DialogTitle/DialogTitle.d.mts +3 -3
- package/DialogTitle/DialogTitle.d.ts +3 -3
- package/Divider/Divider.d.mts +4 -4
- package/Divider/Divider.d.ts +4 -4
- package/Divider/Divider.js +0 -8
- package/Divider/Divider.mjs +0 -8
- package/Drawer/Drawer.d.mts +4 -4
- package/Drawer/Drawer.d.ts +4 -4
- package/Drawer/Drawer.js +1 -4
- package/Drawer/Drawer.mjs +1 -4
- package/Fab/Fab.d.mts +3 -3
- package/Fab/Fab.d.ts +3 -3
- package/Fab/Fab.js +1 -0
- package/Fab/Fab.mjs +1 -0
- package/Fade/Fade.d.mts +3 -3
- package/Fade/Fade.d.ts +3 -3
- package/Fade/Fade.js +28 -32
- package/Fade/Fade.mjs +29 -33
- package/FilledInput/FilledInput.d.mts +3 -3
- package/FilledInput/FilledInput.d.ts +3 -3
- package/FilledInput/FilledInput.js +1 -1
- package/FilledInput/FilledInput.mjs +1 -1
- package/FormControl/FormControl.d.mts +7 -7
- package/FormControl/FormControl.d.ts +7 -7
- package/FormControlLabel/FormControlLabel.d.mts +4 -4
- package/FormControlLabel/FormControlLabel.d.ts +4 -4
- package/FormGroup/FormGroup.d.mts +3 -3
- package/FormGroup/FormGroup.d.ts +3 -3
- package/FormHelperText/FormHelperText.d.mts +3 -3
- package/FormHelperText/FormHelperText.d.ts +3 -3
- package/FormLabel/FormLabel.d.mts +5 -5
- package/FormLabel/FormLabel.d.ts +5 -5
- package/GlobalStyles/GlobalStyles.d.mts +2 -2
- package/GlobalStyles/GlobalStyles.d.ts +2 -2
- package/Grid/Grid.d.mts +10 -5
- package/Grid/Grid.d.ts +10 -5
- package/Grid/Grid.js +10 -5
- package/Grid/Grid.mjs +10 -5
- package/Grid/gridClasses.js +1 -1
- package/Grid/gridClasses.mjs +1 -1
- package/Grow/Grow.d.mts +5 -5
- package/Grow/Grow.d.ts +5 -5
- package/Grow/Grow.js +30 -38
- package/Grow/Grow.mjs +31 -39
- package/Icon/Icon.d.mts +3 -3
- package/Icon/Icon.d.ts +3 -3
- package/IconButton/IconButton.d.mts +5 -5
- package/IconButton/IconButton.d.ts +5 -5
- package/IconButton/IconButton.js +1 -0
- package/IconButton/IconButton.mjs +1 -0
- package/ImageList/ImageList.d.mts +2 -2
- package/ImageList/ImageList.d.ts +2 -2
- package/ImageListItem/ImageListItem.d.mts +2 -2
- package/ImageListItem/ImageListItem.d.ts +2 -2
- package/ImageListItemBar/ImageListItemBar.d.mts +2 -2
- package/ImageListItemBar/ImageListItemBar.d.ts +2 -2
- package/InitColorSchemeScript/InitColorSchemeScript.d.mts +2 -2
- package/InitColorSchemeScript/InitColorSchemeScript.d.ts +2 -2
- package/InitColorSchemeScript/InitColorSchemeScript.js +2 -2
- package/InitColorSchemeScript/InitColorSchemeScript.mjs +2 -2
- package/Input/Input.d.mts +3 -3
- package/Input/Input.d.ts +3 -3
- package/Input/Input.js +1 -1
- package/Input/Input.mjs +1 -1
- package/InputAdornment/InputAdornment.d.mts +2 -2
- package/InputAdornment/InputAdornment.d.ts +2 -2
- package/InputAdornment/inputAdornmentClasses.d.mts +2 -2
- package/InputAdornment/inputAdornmentClasses.d.ts +2 -2
- package/InputBase/InputBase.d.mts +2 -2
- package/InputBase/InputBase.d.ts +2 -2
- package/InputLabel/InputLabel.d.mts +4 -4
- package/InputLabel/InputLabel.d.ts +4 -4
- package/LinearProgress/LinearProgress.d.mts +2 -2
- package/LinearProgress/LinearProgress.d.ts +2 -2
- package/Link/Link.d.mts +4 -4
- package/Link/Link.d.ts +4 -4
- package/List/List.d.mts +4 -4
- package/List/List.d.ts +4 -4
- package/ListItem/ListItem.d.mts +3 -3
- package/ListItem/ListItem.d.ts +3 -3
- package/ListItem/ListItem.js +1 -2
- package/ListItem/ListItem.mjs +1 -2
- package/ListItemAvatar/ListItemAvatar.d.mts +2 -2
- package/ListItemAvatar/ListItemAvatar.d.ts +2 -2
- package/ListItemButton/ListItemButton.d.mts +4 -4
- package/ListItemButton/ListItemButton.d.ts +4 -4
- package/ListItemButton/ListItemButton.js +1 -0
- package/ListItemButton/ListItemButton.mjs +1 -0
- package/ListItemIcon/ListItemIcon.d.mts +3 -3
- package/ListItemIcon/ListItemIcon.d.ts +3 -3
- package/ListItemIcon/ListItemIcon.js +1 -1
- package/ListItemIcon/ListItemIcon.mjs +1 -1
- package/ListItemSecondaryAction/ListItemSecondaryAction.d.mts +2 -2
- package/ListItemSecondaryAction/ListItemSecondaryAction.d.ts +2 -2
- package/ListItemText/ListItemText.d.mts +3 -3
- package/ListItemText/ListItemText.d.ts +3 -3
- package/ListSubheader/ListSubheader.d.mts +3 -3
- package/ListSubheader/ListSubheader.d.ts +3 -3
- package/ListSubheader/ListSubheader.js +0 -3
- package/ListSubheader/ListSubheader.mjs +0 -3
- package/Menu/Menu.d.mts +5 -5
- package/Menu/Menu.d.ts +5 -5
- package/Menu/Menu.js +15 -32
- package/Menu/Menu.mjs +15 -32
- package/MenuItem/MenuItem.d.mts +3 -3
- package/MenuItem/MenuItem.d.ts +3 -3
- package/MenuItem/MenuItem.js +36 -26
- package/MenuItem/MenuItem.mjs +34 -26
- package/MenuList/MenuList.d.mts +4 -4
- package/MenuList/MenuList.d.ts +4 -4
- package/MenuList/MenuList.js +136 -101
- package/MenuList/MenuList.mjs +135 -100
- package/MenuList/MenuListContext.d.mts +11 -0
- package/MenuList/MenuListContext.d.ts +11 -0
- package/MenuList/MenuListContext.js +25 -0
- package/MenuList/MenuListContext.mjs +19 -0
- package/MobileStepper/MobileStepper.d.mts +3 -3
- package/MobileStepper/MobileStepper.d.ts +3 -3
- package/Modal/Modal.d.mts +7 -7
- package/Modal/Modal.d.ts +7 -7
- package/NativeSelect/NativeSelect.d.mts +3 -3
- package/NativeSelect/NativeSelect.d.ts +3 -3
- package/NoSsr/NoSsr.d.mts +2 -2
- package/NoSsr/NoSsr.d.ts +2 -2
- package/NoSsr/NoSsr.js +2 -2
- package/NoSsr/NoSsr.mjs +2 -2
- package/OutlinedInput/OutlinedInput.d.mts +4 -4
- package/OutlinedInput/OutlinedInput.d.ts +4 -4
- package/Pagination/Pagination.d.mts +2 -2
- package/Pagination/Pagination.d.ts +2 -2
- package/PaginationItem/PaginationItem.d.mts +8 -3
- package/PaginationItem/PaginationItem.d.ts +8 -3
- package/PaginationItem/PaginationItem.js +6 -0
- package/PaginationItem/PaginationItem.mjs +6 -0
- package/Paper/Paper.d.mts +4 -4
- package/Paper/Paper.d.ts +4 -4
- package/PigmentContainer/PigmentContainer.d.mts +2 -2
- package/PigmentContainer/PigmentContainer.d.ts +2 -2
- package/PigmentContainer/PigmentContainer.js +2 -2
- package/PigmentContainer/PigmentContainer.mjs +2 -2
- package/PigmentGrid/PigmentGrid.d.mts +3 -3
- package/PigmentGrid/PigmentGrid.d.ts +3 -3
- package/PigmentGrid/PigmentGrid.js +3 -3
- package/PigmentGrid/PigmentGrid.mjs +3 -3
- package/PigmentStack/PigmentStack.d.mts +2 -2
- package/PigmentStack/PigmentStack.d.ts +2 -2
- package/PigmentStack/PigmentStack.js +2 -2
- package/PigmentStack/PigmentStack.mjs +2 -2
- package/Popover/Popover.d.mts +5 -5
- package/Popover/Popover.d.ts +5 -5
- package/Popover/Popover.js +19 -7
- package/Popover/Popover.mjs +18 -6
- package/Popper/Popper.d.mts +4 -4
- package/Popper/Popper.d.ts +4 -4
- package/Popper/Popper.js +4 -4
- package/Popper/Popper.mjs +4 -4
- package/Portal/Portal.d.mts +2 -2
- package/Portal/Portal.d.ts +2 -2
- package/Portal/Portal.js +2 -2
- package/Portal/Portal.mjs +2 -2
- package/README.md +3 -3
- package/Radio/Radio.d.mts +3 -3
- package/Radio/Radio.d.ts +3 -3
- package/RadioGroup/RadioGroup.d.mts +3 -3
- package/RadioGroup/RadioGroup.d.ts +3 -3
- package/Rating/Rating.d.mts +2 -2
- package/Rating/Rating.d.ts +2 -2
- package/ScopedCssBaseline/ScopedCssBaseline.d.mts +2 -2
- package/ScopedCssBaseline/ScopedCssBaseline.d.ts +2 -2
- package/Select/Select.d.mts +3 -3
- package/Select/Select.d.ts +3 -3
- package/Skeleton/Skeleton.d.mts +2 -2
- package/Skeleton/Skeleton.d.ts +2 -2
- package/Slide/Slide.d.mts +4 -4
- package/Slide/Slide.d.ts +4 -4
- package/Slide/Slide.js +43 -42
- package/Slide/Slide.mjs +44 -44
- package/Slider/Slider.d.mts +4 -4
- package/Slider/Slider.d.ts +4 -4
- package/Slider/Slider.js +1 -1
- package/Slider/Slider.mjs +1 -1
- package/Slider/useSlider.d.mts +1 -1
- package/Slider/useSlider.d.ts +1 -1
- package/Slider/useSlider.js +235 -209
- package/Slider/useSlider.mjs +235 -209
- package/Slider/useSlider.types.d.mts +2 -2
- package/Slider/useSlider.types.d.ts +2 -2
- package/Snackbar/Snackbar.d.mts +3 -3
- package/Snackbar/Snackbar.d.ts +3 -3
- package/SnackbarContent/SnackbarContent.d.mts +3 -3
- package/SnackbarContent/SnackbarContent.d.ts +3 -3
- package/SpeedDial/SpeedDial.d.mts +3 -3
- package/SpeedDial/SpeedDial.d.ts +3 -3
- package/SpeedDialAction/SpeedDialAction.d.mts +3 -3
- package/SpeedDialAction/SpeedDialAction.d.ts +3 -3
- package/SpeedDialIcon/SpeedDialIcon.d.mts +2 -2
- package/SpeedDialIcon/SpeedDialIcon.d.ts +2 -2
- package/Stack/Stack.d.mts +2 -2
- package/Stack/Stack.d.ts +2 -2
- package/Step/Step.d.mts +2 -2
- package/Step/Step.d.ts +2 -2
- package/StepButton/StepButton.d.mts +3 -3
- package/StepButton/StepButton.d.ts +3 -3
- package/StepButton/StepButton.js +44 -14
- package/StepButton/StepButton.mjs +44 -14
- package/StepConnector/StepConnector.d.mts +2 -2
- package/StepConnector/StepConnector.d.ts +2 -2
- package/StepConnector/StepConnector.js +1 -2
- package/StepConnector/StepConnector.mjs +1 -2
- package/StepContent/StepContent.d.mts +3 -3
- package/StepContent/StepContent.d.ts +3 -3
- package/StepIcon/StepIcon.d.mts +3 -3
- package/StepIcon/StepIcon.d.ts +3 -3
- package/StepLabel/StepLabel.d.mts +2 -2
- package/StepLabel/StepLabel.d.ts +2 -2
- package/Stepper/Stepper.d.mts +2 -2
- package/Stepper/Stepper.d.ts +2 -2
- package/Stepper/Stepper.js +54 -22
- package/Stepper/Stepper.mjs +54 -22
- package/Stepper/StepperContext.d.mts +0 -5
- package/Stepper/StepperContext.d.ts +0 -5
- package/Stepper/StepperContext.js +1 -2
- package/Stepper/StepperContext.mjs +0 -1
- package/SvgIcon/SvgIcon.d.mts +3 -3
- package/SvgIcon/SvgIcon.d.ts +3 -3
- package/SwipeableDrawer/SwipeableDrawer.d.mts +3 -3
- package/SwipeableDrawer/SwipeableDrawer.d.ts +3 -3
- package/SwipeableDrawer/SwipeableDrawer.js +0 -3
- package/SwipeableDrawer/SwipeableDrawer.mjs +0 -3
- package/Switch/Switch.d.mts +4 -4
- package/Switch/Switch.d.ts +4 -4
- package/Switch/Switch.js +4 -0
- package/Switch/Switch.mjs +4 -0
- package/Tab/Tab.d.mts +3 -3
- package/Tab/Tab.d.ts +3 -3
- package/Tab/Tab.js +17 -1
- package/Tab/Tab.mjs +17 -1
- package/TabScrollButton/TabScrollButton.d.mts +3 -3
- package/TabScrollButton/TabScrollButton.d.ts +3 -3
- package/TabScrollButton/TabScrollButton.js +6 -2
- package/TabScrollButton/TabScrollButton.mjs +6 -2
- package/Table/Table.d.mts +2 -2
- package/Table/Table.d.ts +2 -2
- package/TableBody/TableBody.d.mts +2 -2
- package/TableBody/TableBody.d.ts +2 -2
- package/TableCell/TableCell.d.mts +2 -2
- package/TableCell/TableCell.d.ts +2 -2
- package/TableContainer/TableContainer.d.mts +2 -2
- package/TableContainer/TableContainer.d.ts +2 -2
- package/TableFooter/TableFooter.d.mts +2 -2
- package/TableFooter/TableFooter.d.ts +2 -2
- package/TableHead/TableHead.d.mts +2 -2
- package/TableHead/TableHead.d.ts +2 -2
- package/TablePagination/TablePagination.d.mts +4 -4
- package/TablePagination/TablePagination.d.ts +4 -4
- package/TablePaginationActions/TablePaginationActions.d.mts +2 -2
- package/TablePaginationActions/TablePaginationActions.d.ts +2 -2
- package/TableRow/TableRow.d.mts +2 -2
- package/TableRow/TableRow.d.ts +2 -2
- package/TableSortLabel/TableSortLabel.d.mts +3 -3
- package/TableSortLabel/TableSortLabel.d.ts +3 -3
- package/TableSortLabel/TableSortLabel.js +5 -3
- package/TableSortLabel/TableSortLabel.mjs +5 -3
- package/Tabs/Tabs.d.mts +2 -2
- package/Tabs/Tabs.d.ts +2 -2
- package/Tabs/Tabs.js +30 -21
- package/Tabs/Tabs.mjs +29 -20
- package/TextField/TextField.d.mts +10 -10
- package/TextField/TextField.d.ts +10 -10
- package/TextareaAutosize/TextareaAutosize.d.mts +2 -2
- package/TextareaAutosize/TextareaAutosize.d.ts +2 -2
- package/TextareaAutosize/TextareaAutosize.js +2 -2
- package/TextareaAutosize/TextareaAutosize.mjs +2 -2
- package/ToggleButton/ToggleButton.d.mts +3 -3
- package/ToggleButton/ToggleButton.d.ts +3 -3
- package/ToggleButton/ToggleButton.js +1 -0
- package/ToggleButton/ToggleButton.mjs +1 -0
- package/ToggleButtonGroup/ToggleButtonGroup.d.mts +2 -2
- package/ToggleButtonGroup/ToggleButtonGroup.d.ts +2 -2
- package/Toolbar/Toolbar.d.mts +2 -2
- package/Toolbar/Toolbar.d.ts +2 -2
- package/Tooltip/Tooltip.d.mts +3 -3
- package/Tooltip/Tooltip.d.ts +3 -3
- package/Typography/Typography.d.mts +4 -4
- package/Typography/Typography.d.ts +4 -4
- package/Zoom/Zoom.d.mts +3 -3
- package/Zoom/Zoom.d.ts +3 -3
- package/Zoom/Zoom.js +24 -30
- package/Zoom/Zoom.mjs +25 -31
- package/index.js +1 -1
- package/index.mjs +1 -1
- package/internal/SwitchBase.d.mts +2 -2
- package/internal/SwitchBase.d.ts +2 -2
- package/internal/SwitchBase.js +5 -1
- package/internal/SwitchBase.mjs +5 -1
- package/locale/psAF.js +1 -1
- package/locale/psAF.mjs +1 -1
- package/package.json +51 -51
- package/styles/createThemeNoVars.js +1 -1
- package/styles/createThemeNoVars.mjs +1 -1
- package/styles/createThemeWithVars.js +9 -9
- package/styles/createThemeWithVars.mjs +9 -9
- package/transitions/utils.d.mts +7 -0
- package/transitions/utils.d.ts +7 -0
- package/transitions/utils.js +27 -0
- package/transitions/utils.mjs +25 -0
- package/useAutocomplete/useAutocomplete.js +8 -0
- package/useAutocomplete/useAutocomplete.mjs +8 -0
- package/utils/focusWithVisible.js +24 -0
- package/utils/focusWithVisible.mjs +19 -0
- package/utils/index.d.mts +0 -1
- package/utils/index.d.ts +0 -1
- package/utils/index.js +0 -7
- package/utils/index.mjs +0 -1
- package/utils/useFocusableWhenDisabled.d.mts +30 -0
- package/utils/useFocusableWhenDisabled.d.ts +30 -0
- package/utils/useFocusableWhenDisabled.js +47 -0
- package/utils/useFocusableWhenDisabled.mjs +41 -0
- package/utils/useRovingTabIndex.d.mts +1 -2
- package/utils/useRovingTabIndex.d.ts +1 -2
- package/utils/useRovingTabIndex.js +25 -4
- package/utils/useRovingTabIndex.mjs +1 -2
- package/version/index.js +2 -2
- package/version/index.mjs +2 -2
package/Slider/useSlider.js
CHANGED
|
@@ -20,35 +20,45 @@ var _visuallyHidden = _interopRequireDefault(require("@mui/utils/visuallyHidden"
|
|
|
20
20
|
var _clamp = _interopRequireDefault(require("@mui/utils/clamp"));
|
|
21
21
|
var _extractEventHandlers = _interopRequireDefault(require("@mui/utils/extractEventHandlers"));
|
|
22
22
|
var _areArraysEqual = _interopRequireDefault(require("../utils/areArraysEqual"));
|
|
23
|
+
var _getActiveElement = _interopRequireDefault(require("../utils/getActiveElement"));
|
|
23
24
|
const INTENTIONAL_DRAG_COUNT_THRESHOLD = 2;
|
|
25
|
+
const EMPTY_MARKS = [];
|
|
26
|
+
const EMPTY_OBJ = {};
|
|
24
27
|
function getNewValue(currentValue, step, direction, min, max) {
|
|
25
28
|
return direction === 1 ? Math.min(currentValue + step, max) : Math.max(currentValue - step, min);
|
|
26
29
|
}
|
|
27
30
|
function asc(a, b) {
|
|
28
31
|
return a - b;
|
|
29
32
|
}
|
|
30
|
-
function findClosest(values, currentValue) {
|
|
31
|
-
const {
|
|
32
|
-
index: closestIndex
|
|
33
|
-
} = values.reduce((acc, value, index) => {
|
|
33
|
+
function findClosest(values, currentValue, preferredIndex = -1) {
|
|
34
|
+
const closestValue = values.reduce((acc, value, index) => {
|
|
34
35
|
const distance = Math.abs(currentValue - value);
|
|
35
|
-
if (acc
|
|
36
|
+
if (acc == null || distance <= acc.distance) {
|
|
36
37
|
return {
|
|
37
38
|
distance,
|
|
38
39
|
index
|
|
39
40
|
};
|
|
40
41
|
}
|
|
41
42
|
return acc;
|
|
42
|
-
}, null) ??
|
|
43
|
+
}, null) ?? EMPTY_OBJ;
|
|
44
|
+
const {
|
|
45
|
+
index: closestIndex
|
|
46
|
+
} = closestValue;
|
|
47
|
+
if (closestIndex == null) {
|
|
48
|
+
return closestIndex;
|
|
49
|
+
}
|
|
50
|
+
if (preferredIndex >= 0 && values[preferredIndex] === values[closestIndex]) {
|
|
51
|
+
return preferredIndex;
|
|
52
|
+
}
|
|
43
53
|
return closestIndex;
|
|
44
54
|
}
|
|
45
|
-
function trackFinger(event,
|
|
55
|
+
function trackFinger(event, touchIdRef) {
|
|
46
56
|
// The event is TouchEvent
|
|
47
|
-
if (
|
|
57
|
+
if (touchIdRef.current != null && event.changedTouches) {
|
|
48
58
|
const touchEvent = event;
|
|
49
59
|
for (let i = 0; i < touchEvent.changedTouches.length; i += 1) {
|
|
50
60
|
const touch = touchEvent.changedTouches[i];
|
|
51
|
-
if (touch.identifier ===
|
|
61
|
+
if (touch.identifier === touchIdRef.current) {
|
|
52
62
|
return {
|
|
53
63
|
x: touch.clientX,
|
|
54
64
|
y: touch.clientY
|
|
@@ -58,7 +68,7 @@ function trackFinger(event, touchId) {
|
|
|
58
68
|
return false;
|
|
59
69
|
}
|
|
60
70
|
|
|
61
|
-
// The event is MouseEvent
|
|
71
|
+
// The event is PointerEvent or MouseEvent
|
|
62
72
|
return {
|
|
63
73
|
x: event.clientX,
|
|
64
74
|
y: event.clientY
|
|
@@ -85,26 +95,18 @@ function roundValueToStep(value, step, min) {
|
|
|
85
95
|
const nearest = Math.round((value - min) / step) * step + min;
|
|
86
96
|
return Number(nearest.toFixed(getDecimalPrecision(step)));
|
|
87
97
|
}
|
|
88
|
-
function setValueIndex({
|
|
89
|
-
values,
|
|
90
|
-
newValue,
|
|
91
|
-
index
|
|
92
|
-
}) {
|
|
98
|
+
function setValueIndex(values, newValue, index) {
|
|
93
99
|
const output = values.slice();
|
|
94
100
|
output[index] = newValue;
|
|
95
101
|
return output.sort(asc);
|
|
96
102
|
}
|
|
97
|
-
function focusThumb({
|
|
98
|
-
sliderRef,
|
|
99
|
-
activeIndex,
|
|
100
|
-
setActive,
|
|
101
|
-
focusVisible
|
|
102
|
-
}) {
|
|
103
|
+
function focusThumb(sliderRef, activeIndex, setActive, focusVisible) {
|
|
103
104
|
const doc = (0, _ownerDocument.default)(sliderRef.current);
|
|
104
|
-
|
|
105
|
+
const activeElement = (0, _getActiveElement.default)(doc);
|
|
106
|
+
if (!sliderRef.current?.contains(activeElement) || Number(activeElement?.getAttribute('data-index')) !== activeIndex) {
|
|
105
107
|
const input = sliderRef.current?.querySelector(`[type="range"][data-index="${activeIndex}"]`);
|
|
106
108
|
if (input != null) {
|
|
107
|
-
if (focusVisible
|
|
109
|
+
if (focusVisible == null) {
|
|
108
110
|
input.focus({
|
|
109
111
|
preventScroll: true
|
|
110
112
|
});
|
|
@@ -113,7 +115,7 @@ function focusThumb({
|
|
|
113
115
|
preventScroll: true,
|
|
114
116
|
// Prevent pointer-driven focus rings in browsers that support this option.
|
|
115
117
|
// Chrome 144+ supports `focusVisible` in `HTMLElement.focus()` options.
|
|
116
|
-
// @ts-
|
|
118
|
+
// @ts-expect-error `focusVisible` is not yet in TypeScript's lib.dom FocusOptions.
|
|
117
119
|
focusVisible
|
|
118
120
|
});
|
|
119
121
|
}
|
|
@@ -159,29 +161,7 @@ const axisProps = {
|
|
|
159
161
|
}
|
|
160
162
|
};
|
|
161
163
|
const Identity = x => x;
|
|
162
|
-
|
|
163
|
-
// TODO: remove support for Safari < 13.
|
|
164
|
-
// https://caniuse.com/#search=touch-action
|
|
165
|
-
//
|
|
166
|
-
// Safari, on iOS, supports touch action since v13.
|
|
167
|
-
// Over 80% of the iOS phones are compatible
|
|
168
|
-
// in August 2020.
|
|
169
|
-
// Utilizing the CSS.supports method to check if touch-action is supported.
|
|
170
|
-
// Since CSS.supports is supported on all but Edge@12 and IE and touch-action
|
|
171
|
-
// is supported on both Edge@12 and IE if CSS.supports is not available that means that
|
|
172
|
-
// touch-action will be supported
|
|
173
164
|
exports.Identity = Identity;
|
|
174
|
-
let cachedSupportsTouchActionNone;
|
|
175
|
-
function doesSupportTouchActionNone() {
|
|
176
|
-
if (cachedSupportsTouchActionNone === undefined) {
|
|
177
|
-
if (typeof CSS !== 'undefined' && typeof CSS.supports === 'function') {
|
|
178
|
-
cachedSupportsTouchActionNone = CSS.supports('touch-action', 'none');
|
|
179
|
-
} else {
|
|
180
|
-
cachedSupportsTouchActionNone = true;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return cachedSupportsTouchActionNone;
|
|
184
|
-
}
|
|
185
165
|
function useSlider(parameters) {
|
|
186
166
|
const {
|
|
187
167
|
'aria-labelledby': ariaLabelledby,
|
|
@@ -203,35 +183,42 @@ function useSlider(parameters) {
|
|
|
203
183
|
tabIndex,
|
|
204
184
|
value: valueProp
|
|
205
185
|
} = parameters;
|
|
206
|
-
const
|
|
207
|
-
const
|
|
186
|
+
const touchIdRef = React.useRef(undefined);
|
|
187
|
+
const focusFrameRef = React.useRef(null);
|
|
208
188
|
// We can't use the :active browser pseudo-classes.
|
|
209
189
|
// - The active state isn't triggered when clicking on the rail.
|
|
210
190
|
// - The active state isn't transferred when inversing a range slider.
|
|
211
191
|
const [active, setActive] = React.useState(-1);
|
|
212
192
|
const [open, setOpen] = React.useState(-1);
|
|
213
193
|
const [dragging, setDragging] = React.useState(false);
|
|
214
|
-
const
|
|
194
|
+
const moveCountRef = React.useRef(0);
|
|
195
|
+
// Ref (not state) because setActive() always accompanies updates, providing the re-render.
|
|
196
|
+
const lastUsedThumbIndexRef = React.useRef(-1);
|
|
197
|
+
// Prevents duplicate listener registration when both pointer and touch events fire
|
|
198
|
+
// for the same physical touch interaction.
|
|
199
|
+
const pointerDownHandledRef = React.useRef(false);
|
|
200
|
+
// Tracks which pointer owns the current drag session, so stray pointerup/pointermove
|
|
201
|
+
// events from a second pointer don't interfere.
|
|
202
|
+
const activePointerIdRef = React.useRef(-1);
|
|
215
203
|
const cancelFocusFrame = (0, _useEventCallback.default)(() => {
|
|
216
|
-
if (
|
|
217
|
-
cancelAnimationFrame(
|
|
218
|
-
|
|
204
|
+
if (focusFrameRef.current != null) {
|
|
205
|
+
cancelAnimationFrame(focusFrameRef.current);
|
|
206
|
+
focusFrameRef.current = null;
|
|
219
207
|
}
|
|
220
208
|
});
|
|
221
|
-
//
|
|
222
|
-
const
|
|
209
|
+
// lastChangedValueRef is updated whenever onChange is triggered.
|
|
210
|
+
const lastChangedValueRef = React.useRef(null);
|
|
223
211
|
const [valueDerived, setValueState] = (0, _useControlled.default)({
|
|
224
212
|
controlled: valueProp,
|
|
225
213
|
default: defaultValue ?? min,
|
|
226
214
|
name: 'Slider'
|
|
227
215
|
});
|
|
228
|
-
const handleChange =
|
|
216
|
+
const handleChange = (0, _useEventCallback.default)((event, value, thumbIndex) => {
|
|
229
217
|
// Redefine target to allow name and value to be read.
|
|
230
218
|
// This allows seamless integration with the most popular form libraries.
|
|
231
219
|
// https://github.com/mui/material-ui/issues/13485#issuecomment-676048492
|
|
232
220
|
// Clone the event to not override `target` of the original event.
|
|
233
|
-
const nativeEvent = event.nativeEvent
|
|
234
|
-
// @ts-ignore The nativeEvent is function, not object
|
|
221
|
+
const nativeEvent = 'nativeEvent' in event ? event.nativeEvent : event;
|
|
235
222
|
const clonedEvent = new nativeEvent.constructor(nativeEvent.type, nativeEvent);
|
|
236
223
|
Object.defineProperty(clonedEvent, 'target', {
|
|
237
224
|
writable: true,
|
|
@@ -240,16 +227,43 @@ function useSlider(parameters) {
|
|
|
240
227
|
name
|
|
241
228
|
}
|
|
242
229
|
});
|
|
243
|
-
|
|
244
|
-
onChange(clonedEvent, value, thumbIndex);
|
|
230
|
+
lastChangedValueRef.current = value;
|
|
231
|
+
onChange?.(clonedEvent, value, thumbIndex);
|
|
245
232
|
});
|
|
246
233
|
const range = Array.isArray(valueDerived);
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
234
|
+
const values = React.useMemo(() => {
|
|
235
|
+
if (typeof valueDerived === 'number') {
|
|
236
|
+
return [(0, _clamp.default)(valueDerived, min, max)];
|
|
237
|
+
}
|
|
238
|
+
if (valueDerived == null) {
|
|
239
|
+
return [min];
|
|
240
|
+
}
|
|
241
|
+
const sortedValues = valueDerived.slice().sort(asc);
|
|
242
|
+
for (let i = 0; i < sortedValues.length; i += 1) {
|
|
243
|
+
const value = sortedValues[i];
|
|
244
|
+
sortedValues[i] = value == null ? min : (0, _clamp.default)(value, min, max);
|
|
245
|
+
}
|
|
246
|
+
return sortedValues;
|
|
247
|
+
}, [valueDerived, min, max]);
|
|
248
|
+
const marks = React.useMemo(() => {
|
|
249
|
+
if (marksProp === true && step != null) {
|
|
250
|
+
const generatedMarks = new Array(Math.floor((max - min) / step) + 1);
|
|
251
|
+
for (let i = 0; i < generatedMarks.length; i += 1) {
|
|
252
|
+
generatedMarks[i] = {
|
|
253
|
+
value: min + step * i
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
return generatedMarks;
|
|
257
|
+
}
|
|
258
|
+
return Array.isArray(marksProp) ? marksProp : EMPTY_MARKS;
|
|
259
|
+
}, [marksProp, step, min, max]);
|
|
260
|
+
const marksValues = React.useMemo(() => {
|
|
261
|
+
const markValues = new Array(marks.length);
|
|
262
|
+
for (let i = 0; i < marks.length; i += 1) {
|
|
263
|
+
markValues[i] = marks[i].value;
|
|
264
|
+
}
|
|
265
|
+
return markValues;
|
|
266
|
+
}, [marks]);
|
|
253
267
|
const [focusedThumbIndex, setFocusedThumbIndex] = React.useState(-1);
|
|
254
268
|
const sliderRef = React.useRef(null);
|
|
255
269
|
const handleRef = (0, _useForkRef.default)(ref, sliderRef);
|
|
@@ -290,29 +304,22 @@ function useSlider(parameters) {
|
|
|
290
304
|
newValue = (0, _clamp.default)(newValue, values[index - 1] || -Infinity, values[index + 1] || Infinity);
|
|
291
305
|
}
|
|
292
306
|
const previousValue = newValue;
|
|
293
|
-
newValue = setValueIndex(
|
|
294
|
-
values,
|
|
295
|
-
newValue,
|
|
296
|
-
index
|
|
297
|
-
});
|
|
307
|
+
newValue = setValueIndex(values, newValue, index);
|
|
298
308
|
let activeIndex = index;
|
|
299
309
|
|
|
300
310
|
// Potentially swap the index if needed.
|
|
301
311
|
if (!disableSwap) {
|
|
302
312
|
activeIndex = newValue.indexOf(previousValue);
|
|
303
313
|
}
|
|
304
|
-
focusThumb(
|
|
305
|
-
sliderRef,
|
|
306
|
-
activeIndex
|
|
307
|
-
});
|
|
314
|
+
focusThumb(sliderRef, activeIndex);
|
|
308
315
|
}
|
|
309
316
|
setValueState(newValue);
|
|
310
317
|
setFocusedThumbIndex(index);
|
|
311
|
-
if (
|
|
318
|
+
if (onChange && !areValuesEqual(newValue, valueDerived)) {
|
|
312
319
|
handleChange(event, newValue, index);
|
|
313
320
|
}
|
|
314
321
|
if (onChangeCommitted) {
|
|
315
|
-
onChangeCommitted(event,
|
|
322
|
+
onChangeCommitted(event, lastChangedValueRef.current ?? newValue);
|
|
316
323
|
}
|
|
317
324
|
};
|
|
318
325
|
const createHandleHiddenInputKeyDown = otherHandlers => event => {
|
|
@@ -380,12 +387,14 @@ function useSlider(parameters) {
|
|
|
380
387
|
otherHandlers?.onKeyDown?.(event);
|
|
381
388
|
};
|
|
382
389
|
(0, _useEnhancedEffect.default)(() => {
|
|
383
|
-
|
|
390
|
+
const activeElement = (0, _getActiveElement.default)((0, _ownerDocument.default)(sliderRef.current));
|
|
391
|
+
if (disabled && sliderRef.current?.contains(activeElement)) {
|
|
384
392
|
// This is necessary because Firefox and Safari will keep focus
|
|
385
393
|
// on a disabled element:
|
|
386
394
|
// https://codesandbox.io/p/sandbox/mui-pr-22247-forked-h151h?file=/src/App.js
|
|
387
|
-
|
|
388
|
-
|
|
395
|
+
if (activeElement != null && 'blur' in activeElement) {
|
|
396
|
+
activeElement.blur();
|
|
397
|
+
}
|
|
389
398
|
}
|
|
390
399
|
}, [disabled]);
|
|
391
400
|
if (disabled && active !== -1) {
|
|
@@ -396,22 +405,27 @@ function useSlider(parameters) {
|
|
|
396
405
|
}
|
|
397
406
|
const createHandleHiddenInputChange = otherHandlers => event => {
|
|
398
407
|
otherHandlers.onChange?.(event);
|
|
399
|
-
//
|
|
400
|
-
|
|
401
|
-
changeValue(event, event.target.valueAsNumber);
|
|
408
|
+
// Handles value changes reported through the hidden range input.
|
|
409
|
+
changeValue(event, event.currentTarget.valueAsNumber);
|
|
402
410
|
};
|
|
403
|
-
const
|
|
411
|
+
const previousIndexRef = React.useRef(undefined);
|
|
404
412
|
let axis = orientation;
|
|
405
413
|
if (isRtl && orientation === 'horizontal') {
|
|
406
414
|
axis += '-reverse';
|
|
407
415
|
}
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
416
|
+
|
|
417
|
+
// Converts finger coordinates to a slider value and determines the active thumb.
|
|
418
|
+
// For range sliders, reads `previousIndexRef.current` to decide which thumb is active:
|
|
419
|
+
// -1 = initial press → find closest thumb
|
|
420
|
+
// ≥0 = drag in progress → keep same thumb
|
|
421
|
+
// Callers must reset `previousIndexRef.current = -1` before calling on a new interaction.
|
|
422
|
+
const getValueAtFinger = finger => {
|
|
412
423
|
const {
|
|
413
424
|
current: slider
|
|
414
425
|
} = sliderRef;
|
|
426
|
+
if (!slider) {
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
415
429
|
const {
|
|
416
430
|
width,
|
|
417
431
|
height,
|
|
@@ -438,27 +452,20 @@ function useSlider(parameters) {
|
|
|
438
452
|
newValue = (0, _clamp.default)(newValue, min, max);
|
|
439
453
|
let activeIndex = 0;
|
|
440
454
|
if (range) {
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
} else {
|
|
444
|
-
activeIndex = previousIndex.current;
|
|
445
|
-
}
|
|
455
|
+
const isDragging = previousIndexRef.current !== -1;
|
|
456
|
+
activeIndex = isDragging ? previousIndexRef.current : findClosest(values, newValue, lastUsedThumbIndexRef.current);
|
|
446
457
|
|
|
447
458
|
// Bound the new value to the thumb's neighbours.
|
|
448
459
|
if (disableSwap) {
|
|
449
460
|
newValue = (0, _clamp.default)(newValue, values[activeIndex - 1] || -Infinity, values[activeIndex + 1] || Infinity);
|
|
450
461
|
}
|
|
451
462
|
const previousValue = newValue;
|
|
452
|
-
newValue = setValueIndex(
|
|
453
|
-
values,
|
|
454
|
-
newValue,
|
|
455
|
-
index: activeIndex
|
|
456
|
-
});
|
|
463
|
+
newValue = setValueIndex(values, newValue, activeIndex);
|
|
457
464
|
|
|
458
465
|
// Potentially swap the index if needed.
|
|
459
|
-
if (!(disableSwap &&
|
|
466
|
+
if (!(disableSwap && isDragging)) {
|
|
460
467
|
activeIndex = newValue.indexOf(previousValue);
|
|
461
|
-
|
|
468
|
+
previousIndexRef.current = activeIndex;
|
|
462
469
|
}
|
|
463
470
|
}
|
|
464
471
|
return {
|
|
@@ -467,60 +474,61 @@ function useSlider(parameters) {
|
|
|
467
474
|
};
|
|
468
475
|
};
|
|
469
476
|
const handleTouchMove = (0, _useEventCallback.default)(nativeEvent => {
|
|
470
|
-
|
|
477
|
+
// Ignore pointer events from a different pointer than the one that started the drag.
|
|
478
|
+
if ('pointerId' in nativeEvent && nativeEvent.pointerId !== activePointerIdRef.current) {
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
const finger = trackFinger(nativeEvent, touchIdRef);
|
|
471
482
|
if (!finger) {
|
|
472
483
|
return;
|
|
473
484
|
}
|
|
474
|
-
|
|
485
|
+
moveCountRef.current += 1;
|
|
475
486
|
|
|
476
|
-
// Cancel move in case some other element consumed a
|
|
477
|
-
|
|
478
|
-
if (nativeEvent.type === 'mousemove' && nativeEvent.buttons === 0) {
|
|
487
|
+
// Cancel move in case some other element consumed a pointerup event and it was not fired.
|
|
488
|
+
if (nativeEvent.type === 'pointermove' && nativeEvent.buttons === 0) {
|
|
479
489
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
480
490
|
handleTouchEnd(nativeEvent);
|
|
481
491
|
return;
|
|
482
492
|
}
|
|
483
|
-
const
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
sliderRef,
|
|
492
|
-
activeIndex,
|
|
493
|
-
setActive,
|
|
494
|
-
focusVisible: false
|
|
495
|
-
});
|
|
496
|
-
setValueState(newValue);
|
|
497
|
-
if (!dragging && moveCount.current > INTENTIONAL_DRAG_COUNT_THRESHOLD) {
|
|
493
|
+
const newFingerValue = getValueAtFinger(finger);
|
|
494
|
+
if (!newFingerValue) {
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
focusThumb(sliderRef, newFingerValue.activeIndex, setActive, false);
|
|
498
|
+
lastUsedThumbIndexRef.current = newFingerValue.activeIndex;
|
|
499
|
+
setValueState(newFingerValue.newValue);
|
|
500
|
+
if (!dragging && moveCountRef.current > INTENTIONAL_DRAG_COUNT_THRESHOLD) {
|
|
498
501
|
setDragging(true);
|
|
499
502
|
}
|
|
500
|
-
if (
|
|
501
|
-
handleChange(nativeEvent, newValue, activeIndex);
|
|
503
|
+
if (onChange && !areValuesEqual(newFingerValue.newValue, valueDerived)) {
|
|
504
|
+
handleChange(nativeEvent, newFingerValue.newValue, newFingerValue.activeIndex);
|
|
502
505
|
}
|
|
503
506
|
});
|
|
504
507
|
const handleTouchEnd = (0, _useEventCallback.default)(nativeEvent => {
|
|
505
|
-
|
|
508
|
+
// Ignore pointer events from a different pointer than the one that started the drag.
|
|
509
|
+
if ('pointerId' in nativeEvent && nativeEvent.pointerId !== activePointerIdRef.current) {
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
const finger = trackFinger(nativeEvent, touchIdRef);
|
|
506
513
|
setDragging(false);
|
|
507
514
|
if (!finger) {
|
|
508
515
|
return;
|
|
509
516
|
}
|
|
510
|
-
const
|
|
511
|
-
newValue
|
|
512
|
-
} = getFingerNewValue({
|
|
513
|
-
finger,
|
|
514
|
-
move: true
|
|
515
|
-
});
|
|
517
|
+
const newFingerValue = getValueAtFinger(finger);
|
|
516
518
|
setActive(-1);
|
|
517
519
|
if (nativeEvent.type === 'touchend') {
|
|
518
520
|
setOpen(-1);
|
|
519
521
|
}
|
|
520
|
-
if (onChangeCommitted) {
|
|
521
|
-
onChangeCommitted(nativeEvent,
|
|
522
|
+
if (newFingerValue && onChangeCommitted) {
|
|
523
|
+
onChangeCommitted(nativeEvent, lastChangedValueRef.current ?? newFingerValue.newValue);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Release pointer capture if applicable
|
|
527
|
+
if ('pointerType' in nativeEvent && sliderRef.current?.hasPointerCapture(nativeEvent.pointerId)) {
|
|
528
|
+
sliderRef.current.releasePointerCapture(nativeEvent.pointerId);
|
|
522
529
|
}
|
|
523
|
-
|
|
530
|
+
touchIdRef.current = undefined;
|
|
531
|
+
activePointerIdRef.current = -1;
|
|
524
532
|
|
|
525
533
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
526
534
|
stopListening();
|
|
@@ -529,35 +537,36 @@ function useSlider(parameters) {
|
|
|
529
537
|
if (disabled) {
|
|
530
538
|
return;
|
|
531
539
|
}
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
540
|
+
|
|
541
|
+
// If the pointer path already handled this interaction,
|
|
542
|
+
// only record the touch identifier and skip duplicate listener registration.
|
|
543
|
+
if (pointerDownHandledRef.current) {
|
|
544
|
+
pointerDownHandledRef.current = false;
|
|
545
|
+
const touch = nativeEvent.changedTouches[0];
|
|
546
|
+
if (touch != null) {
|
|
547
|
+
touchIdRef.current = touch.identifier;
|
|
548
|
+
}
|
|
549
|
+
return;
|
|
535
550
|
}
|
|
536
551
|
const touch = nativeEvent.changedTouches[0];
|
|
537
552
|
if (touch != null) {
|
|
538
553
|
// A number that uniquely identifies the current finger in the touch session.
|
|
539
|
-
|
|
554
|
+
touchIdRef.current = touch.identifier;
|
|
540
555
|
}
|
|
541
|
-
const finger = trackFinger(nativeEvent,
|
|
556
|
+
const finger = trackFinger(nativeEvent, touchIdRef);
|
|
542
557
|
if (finger !== false) {
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
setActive,
|
|
553
|
-
focusVisible: false
|
|
554
|
-
});
|
|
555
|
-
setValueState(newValue);
|
|
556
|
-
if (handleChange && !areValuesEqual(newValue, valueDerived)) {
|
|
557
|
-
handleChange(nativeEvent, newValue, activeIndex);
|
|
558
|
+
previousIndexRef.current = -1;
|
|
559
|
+
const newFingerValue = getValueAtFinger(finger);
|
|
560
|
+
if (newFingerValue) {
|
|
561
|
+
focusThumb(sliderRef, newFingerValue.activeIndex, setActive, false);
|
|
562
|
+
lastUsedThumbIndexRef.current = newFingerValue.activeIndex;
|
|
563
|
+
setValueState(newFingerValue.newValue);
|
|
564
|
+
if (onChange && !areValuesEqual(newFingerValue.newValue, valueDerived)) {
|
|
565
|
+
handleChange(nativeEvent, newFingerValue.newValue, newFingerValue.activeIndex);
|
|
566
|
+
}
|
|
558
567
|
}
|
|
559
568
|
}
|
|
560
|
-
|
|
569
|
+
moveCountRef.current = 0;
|
|
561
570
|
const doc = (0, _ownerDocument.default)(sliderRef.current);
|
|
562
571
|
doc.addEventListener('touchmove', handleTouchMove, {
|
|
563
572
|
passive: true
|
|
@@ -568,17 +577,18 @@ function useSlider(parameters) {
|
|
|
568
577
|
});
|
|
569
578
|
const stopListening = React.useCallback(() => {
|
|
570
579
|
const doc = (0, _ownerDocument.default)(sliderRef.current);
|
|
571
|
-
doc.removeEventListener('
|
|
572
|
-
doc.removeEventListener('
|
|
580
|
+
doc.removeEventListener('pointermove', handleTouchMove);
|
|
581
|
+
doc.removeEventListener('pointerup', handleTouchEnd);
|
|
573
582
|
doc.removeEventListener('touchmove', handleTouchMove);
|
|
574
583
|
doc.removeEventListener('touchend', handleTouchEnd);
|
|
575
584
|
}, [handleTouchEnd, handleTouchMove]);
|
|
576
585
|
React.useEffect(() => {
|
|
577
|
-
const
|
|
578
|
-
|
|
579
|
-
|
|
586
|
+
const slider = sliderRef.current;
|
|
587
|
+
if (!slider) {
|
|
588
|
+
return undefined;
|
|
589
|
+
}
|
|
580
590
|
slider.addEventListener('touchstart', handleTouchStart, {
|
|
581
|
-
passive:
|
|
591
|
+
passive: true
|
|
582
592
|
});
|
|
583
593
|
return () => {
|
|
584
594
|
slider.removeEventListener('touchstart', handleTouchStart);
|
|
@@ -592,62 +602,67 @@ function useSlider(parameters) {
|
|
|
592
602
|
cancelFocusFrame();
|
|
593
603
|
}
|
|
594
604
|
}, [disabled, stopListening, cancelFocusFrame]);
|
|
595
|
-
const
|
|
596
|
-
otherHandlers.
|
|
597
|
-
if (disabled) {
|
|
598
|
-
return;
|
|
599
|
-
}
|
|
600
|
-
if (event.defaultPrevented) {
|
|
601
|
-
return;
|
|
602
|
-
}
|
|
605
|
+
const createHandlePointerDown = otherHandlers => event => {
|
|
606
|
+
otherHandlers.onPointerDown?.(event);
|
|
603
607
|
|
|
604
|
-
//
|
|
605
|
-
|
|
608
|
+
// On touch devices, the browser fires both pointerdown and touchstart for the
|
|
609
|
+
// same physical touch. Mark this BEFORE early returns so handleTouchStart always
|
|
610
|
+
// knows the pointer path saw this interaction — even if it was prevented or disabled.
|
|
611
|
+
if (event.pointerType === 'touch') {
|
|
612
|
+
pointerDownHandledRef.current = true;
|
|
613
|
+
}
|
|
614
|
+
if (disabled || event.defaultPrevented || event.button !== 0) {
|
|
606
615
|
return;
|
|
607
616
|
}
|
|
608
|
-
const finger = trackFinger(event,
|
|
617
|
+
const finger = trackFinger(event, touchIdRef);
|
|
609
618
|
if (finger !== false) {
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
focusFrame.current = null;
|
|
626
|
-
focusThumb({
|
|
627
|
-
sliderRef,
|
|
628
|
-
activeIndex,
|
|
629
|
-
focusVisible: false
|
|
619
|
+
previousIndexRef.current = -1;
|
|
620
|
+
const newFingerValue = getValueAtFinger(finger);
|
|
621
|
+
if (newFingerValue) {
|
|
622
|
+
const thumbInput = sliderRef.current?.querySelector(`input[type="range"][data-index="${newFingerValue.activeIndex}"]`);
|
|
623
|
+
const doc = (0, _ownerDocument.default)(sliderRef.current);
|
|
624
|
+
const pressedOnFocusedThumb = thumbInput != null && thumbInput === (0, _getActiveElement.default)(doc);
|
|
625
|
+
setActive(newFingerValue.activeIndex);
|
|
626
|
+
lastUsedThumbIndexRef.current = newFingerValue.activeIndex;
|
|
627
|
+
if (pressedOnFocusedThumb) {
|
|
628
|
+
event.preventDefault();
|
|
629
|
+
} else {
|
|
630
|
+
cancelFocusFrame();
|
|
631
|
+
focusFrameRef.current = requestAnimationFrame(() => {
|
|
632
|
+
focusFrameRef.current = null;
|
|
633
|
+
focusThumb(sliderRef, newFingerValue.activeIndex, undefined, false);
|
|
630
634
|
});
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
635
|
+
}
|
|
636
|
+
setValueState(newFingerValue.newValue);
|
|
637
|
+
if (onChange && !areValuesEqual(newFingerValue.newValue, valueDerived)) {
|
|
638
|
+
handleChange(event, newFingerValue.newValue, newFingerValue.activeIndex);
|
|
639
|
+
}
|
|
636
640
|
}
|
|
637
641
|
}
|
|
638
|
-
|
|
642
|
+
moveCountRef.current = 0;
|
|
643
|
+
activePointerIdRef.current = event.pointerId;
|
|
639
644
|
const doc = (0, _ownerDocument.default)(sliderRef.current);
|
|
640
|
-
|
|
645
|
+
|
|
646
|
+
// Use pointer capture for reliable drag tracking
|
|
647
|
+
try {
|
|
648
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
649
|
+
} catch {
|
|
650
|
+
// setPointerCapture can throw if the pointerId is invalid (e.g. synthetic
|
|
651
|
+
// events in tests, or the pointer was already released). The slider still
|
|
652
|
+
// works via document-level listeners; pointer capture is a progressive
|
|
653
|
+
// enhancement for reliable drag tracking.
|
|
654
|
+
}
|
|
655
|
+
doc.addEventListener('pointermove', handleTouchMove, {
|
|
641
656
|
passive: true
|
|
642
657
|
});
|
|
643
|
-
doc.addEventListener('
|
|
658
|
+
doc.addEventListener('pointerup', handleTouchEnd);
|
|
644
659
|
};
|
|
645
660
|
const trackOffset = valueToPercent(range ? values[0] : min, min, max);
|
|
646
661
|
const trackLeap = valueToPercent(values[values.length - 1], min, max) - trackOffset;
|
|
647
|
-
const getRootProps = (externalProps =
|
|
662
|
+
const getRootProps = (externalProps = EMPTY_OBJ) => {
|
|
648
663
|
const externalHandlers = (0, _extractEventHandlers.default)(externalProps);
|
|
649
664
|
const ownEventHandlers = {
|
|
650
|
-
|
|
665
|
+
onPointerDown: createHandlePointerDown(externalHandlers)
|
|
651
666
|
};
|
|
652
667
|
const mergedEventHandlers = {
|
|
653
668
|
...externalHandlers,
|
|
@@ -668,11 +683,11 @@ function useSlider(parameters) {
|
|
|
668
683
|
otherHandlers.onMouseLeave?.(event);
|
|
669
684
|
setOpen(-1);
|
|
670
685
|
};
|
|
671
|
-
const getThumbProps = (externalProps =
|
|
686
|
+
const getThumbProps = (externalProps = EMPTY_OBJ) => {
|
|
672
687
|
const externalHandlers = (0, _extractEventHandlers.default)(externalProps);
|
|
673
688
|
const ownEventHandlers = {
|
|
674
|
-
onMouseOver: createHandleMouseOver(externalHandlers
|
|
675
|
-
onMouseLeave: createHandleMouseLeave(externalHandlers
|
|
689
|
+
onMouseOver: createHandleMouseOver(externalHandlers),
|
|
690
|
+
onMouseLeave: createHandleMouseLeave(externalHandlers)
|
|
676
691
|
};
|
|
677
692
|
return {
|
|
678
693
|
...externalProps,
|
|
@@ -681,22 +696,33 @@ function useSlider(parameters) {
|
|
|
681
696
|
};
|
|
682
697
|
};
|
|
683
698
|
const getThumbStyle = index => {
|
|
699
|
+
let zIndex;
|
|
700
|
+
if (range) {
|
|
701
|
+
if (active === index) {
|
|
702
|
+
zIndex = 2;
|
|
703
|
+
} else if (lastUsedThumbIndexRef.current === index) {
|
|
704
|
+
zIndex = 1;
|
|
705
|
+
}
|
|
706
|
+
} else if (active === index) {
|
|
707
|
+
zIndex = 1;
|
|
708
|
+
}
|
|
684
709
|
return {
|
|
685
710
|
// So the non active thumb doesn't show its label on hover.
|
|
686
|
-
pointerEvents: active !== -1 && active !== index ? 'none' : undefined
|
|
711
|
+
pointerEvents: active !== -1 && active !== index ? 'none' : undefined,
|
|
712
|
+
zIndex
|
|
687
713
|
};
|
|
688
714
|
};
|
|
689
715
|
let cssWritingMode;
|
|
690
716
|
if (orientation === 'vertical') {
|
|
691
717
|
cssWritingMode = isRtl ? 'vertical-rl' : 'vertical-lr';
|
|
692
718
|
}
|
|
693
|
-
const getHiddenInputProps = (externalProps =
|
|
719
|
+
const getHiddenInputProps = (externalProps = EMPTY_OBJ) => {
|
|
694
720
|
const externalHandlers = (0, _extractEventHandlers.default)(externalProps);
|
|
695
721
|
const ownEventHandlers = {
|
|
696
|
-
onChange: createHandleHiddenInputChange(externalHandlers
|
|
697
|
-
onFocus: createHandleHiddenInputFocus(externalHandlers
|
|
698
|
-
onBlur: createHandleHiddenInputBlur(externalHandlers
|
|
699
|
-
onKeyDown: createHandleHiddenInputKeyDown(externalHandlers
|
|
722
|
+
onChange: createHandleHiddenInputChange(externalHandlers),
|
|
723
|
+
onFocus: createHandleHiddenInputFocus(externalHandlers),
|
|
724
|
+
onBlur: createHandleHiddenInputBlur(externalHandlers),
|
|
725
|
+
onKeyDown: createHandleHiddenInputKeyDown(externalHandlers)
|
|
700
726
|
};
|
|
701
727
|
const mergedEventHandlers = {
|
|
702
728
|
...externalHandlers,
|
|
@@ -735,7 +761,7 @@ function useSlider(parameters) {
|
|
|
735
761
|
getHiddenInputProps,
|
|
736
762
|
getRootProps,
|
|
737
763
|
getThumbProps,
|
|
738
|
-
marks
|
|
764
|
+
marks,
|
|
739
765
|
open,
|
|
740
766
|
range,
|
|
741
767
|
rootRef: handleRef,
|