@react-md/core 6.3.4 → 6.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CoreProviders.d.ts +1 -0
- package/dist/CoreProviders.js.map +1 -1
- package/dist/_a11y.scss +3 -1
- package/dist/_base.scss +3 -0
- package/dist/_box-shadows.scss +20 -12
- package/dist/_core.scss +2 -1
- package/dist/_utils.scss +32 -10
- package/dist/app-bar/AppBar.js.map +1 -1
- package/dist/app-bar/AppBarTitle.js.map +1 -1
- package/dist/app-bar/_app-bar.scss +3 -3
- package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -1
- package/dist/autocomplete/_autocomplete.scss +20 -16
- 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/avatar/_avatar.scss +2 -1
- package/dist/button/Button.js.map +1 -1
- package/dist/button/FloatingActionButton.js.map +1 -1
- package/dist/button/_button.scss +9 -5
- 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/card/_card.scss +6 -6
- package/dist/chip/Chip.js.map +1 -1
- package/dist/chip/_chip.scss +6 -6
- 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/dialog/_dialog.scss +6 -6
- package/dist/divider/Divider.js.map +1 -1
- package/dist/divider/_divider.scss +6 -2
- 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.d.ts +24 -0
- package/dist/form/Select.js +14 -3
- package/dist/form/Select.js.map +1 -1
- package/dist/form/SelectedOption.d.ts +1 -2
- package/dist/form/SelectedOption.js +2 -2
- package/dist/form/SelectedOption.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/_input-toggle.scss +6 -5
- package/dist/form/_label.scss +2 -2
- package/dist/form/_legend.scss +77 -0
- package/dist/form/_slider.scss +7 -5
- package/dist/form/_switch.scss +7 -5
- package/dist/form/_text-field.scss +52 -15
- package/dist/form/defaultGetSelectedOptionChildren.d.ts +1 -0
- 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/getSelectedOptionChildren.d.ts +1 -0
- 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.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/_interaction.scss +5 -3
- 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/snackbar/_snackbar.scss +3 -3
- 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/_tabs.scss +5 -6
- 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/theme/_a11y.scss +3 -1
- package/dist/theme/_theme.scss +16 -12
- 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 +65 -19
- 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/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 +55 -3
- package/src/form/SelectedOption.tsx +2 -4
- 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 +8 -3
- 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,260 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useRef, useState } from "react";
|
|
3
|
+
import { tryToSubmitRelatedForm } from "../form/utils.js";
|
|
4
|
+
import { useEnsuredId } from "../useEnsuredId.js";
|
|
5
|
+
import { useEnsuredRef } from "../useEnsuredRef.js";
|
|
6
|
+
import { useEnsuredState } from "../useEnsuredState.js";
|
|
7
|
+
import { useIsomorphicLayoutEffect } from "../useIsomorphicLayoutEffect.js";
|
|
8
|
+
import { withinRange } from "../utils/withinRange.js";
|
|
9
|
+
import { useSpinButtonGroup } from "./SpinButtonGroupProvider.js";
|
|
10
|
+
import { defaultGetSpinButtonTextContent, defaultSpinButtonGetValueText } from "./defaults.js";
|
|
11
|
+
import { deselectNode } from "./utils/deselectNode.js";
|
|
12
|
+
import { resolveInputEvent } from "./utils/resolveInputEvent.js";
|
|
13
|
+
import { selectNode } from "./utils/selectNode.js";
|
|
14
|
+
/**
|
|
15
|
+
* @since 6.4.0
|
|
16
|
+
*/ const noop = ()=>{
|
|
17
|
+
// do nothing
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @since 6.4.0
|
|
21
|
+
*/ export function useSpinButton(options) {
|
|
22
|
+
const { id: propId, ref: propRef, min, max, step = 1, minDigits, maxDigits, form, readOnly, disabled, required, error, onBlur = noop, onFocus = noop, onInput = noop, onClick = noop, onKeyDown = noop, fallback, mappings, value: propValue, onValueChange = noop, defaultValue = null, getValueText = defaultSpinButtonGetValueText, getTextContent = defaultGetSpinButtonTextContent, placeholderChar, defaultKeyboardValue } = options;
|
|
23
|
+
const id = useEnsuredId(propId, "spinbutton");
|
|
24
|
+
// trigger a noop setValue when `value` and `onValueChange` are provided
|
|
25
|
+
// since `onValueChange is always called with `setValue
|
|
26
|
+
let propSetValue;
|
|
27
|
+
if (typeof propValue !== "undefined" && options.onValueChange) {
|
|
28
|
+
propSetValue = noop;
|
|
29
|
+
}
|
|
30
|
+
const [value, setValue] = useEnsuredState({
|
|
31
|
+
value: propValue,
|
|
32
|
+
setValue: propSetValue,
|
|
33
|
+
defaultValue
|
|
34
|
+
});
|
|
35
|
+
const focused = useRef(false);
|
|
36
|
+
const typedCount = useRef(0);
|
|
37
|
+
const prevText = useRef("");
|
|
38
|
+
const [nodeRef, nodeRefCallback] = useEnsuredRef(propRef);
|
|
39
|
+
const { focusNext } = useSpinButtonGroup();
|
|
40
|
+
const [keyboardValue] = useState(defaultKeyboardValue);
|
|
41
|
+
// NOTE: I might be able to get rid of this since I don't remember why it was
|
|
42
|
+
// added maybe for controlled fields? I'll have to see when I get to the
|
|
43
|
+
// date/time components again
|
|
44
|
+
useIsomorphicLayoutEffect(()=>{
|
|
45
|
+
const node = nodeRef.current;
|
|
46
|
+
if (!focused.current || !node) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
prevText.current = node.textContent || "";
|
|
50
|
+
selectNode(node);
|
|
51
|
+
}, [
|
|
52
|
+
nodeRef,
|
|
53
|
+
value
|
|
54
|
+
]);
|
|
55
|
+
const updateValue = useCallback((options)=>{
|
|
56
|
+
setValue(options.value);
|
|
57
|
+
onValueChange(options);
|
|
58
|
+
if (options.reason === "typed-to-completion") {
|
|
59
|
+
focusNext();
|
|
60
|
+
}
|
|
61
|
+
}, [
|
|
62
|
+
focusNext,
|
|
63
|
+
onValueChange,
|
|
64
|
+
setValue
|
|
65
|
+
]);
|
|
66
|
+
const increment = useCallback((event)=>{
|
|
67
|
+
let nextValue = value ?? keyboardValue ?? min ?? max ?? 0;
|
|
68
|
+
nextValue = withinRange({
|
|
69
|
+
min,
|
|
70
|
+
max,
|
|
71
|
+
value: nextValue + step
|
|
72
|
+
});
|
|
73
|
+
// this actually means both min and max are a number
|
|
74
|
+
if (nextValue === value && typeof min === "number") {
|
|
75
|
+
nextValue = min;
|
|
76
|
+
}
|
|
77
|
+
updateValue({
|
|
78
|
+
event,
|
|
79
|
+
reason: "change",
|
|
80
|
+
value: nextValue
|
|
81
|
+
});
|
|
82
|
+
}, [
|
|
83
|
+
keyboardValue,
|
|
84
|
+
max,
|
|
85
|
+
min,
|
|
86
|
+
step,
|
|
87
|
+
updateValue,
|
|
88
|
+
value
|
|
89
|
+
]);
|
|
90
|
+
const decrement = useCallback((event)=>{
|
|
91
|
+
let nextValue = value ?? keyboardValue ?? max ?? min ?? 0;
|
|
92
|
+
nextValue = withinRange({
|
|
93
|
+
min,
|
|
94
|
+
max,
|
|
95
|
+
value: nextValue - step
|
|
96
|
+
});
|
|
97
|
+
// this actually means both min and max are a number
|
|
98
|
+
if (nextValue === value && typeof max === "number") {
|
|
99
|
+
nextValue = max;
|
|
100
|
+
}
|
|
101
|
+
updateValue({
|
|
102
|
+
event,
|
|
103
|
+
reason: "change",
|
|
104
|
+
value: nextValue
|
|
105
|
+
});
|
|
106
|
+
}, [
|
|
107
|
+
keyboardValue,
|
|
108
|
+
max,
|
|
109
|
+
min,
|
|
110
|
+
step,
|
|
111
|
+
updateValue,
|
|
112
|
+
value
|
|
113
|
+
]);
|
|
114
|
+
return {
|
|
115
|
+
value,
|
|
116
|
+
setValue,
|
|
117
|
+
spinButtonRef: nodeRef,
|
|
118
|
+
spinButtonProps: {
|
|
119
|
+
"aria-readonly": readOnly || undefined,
|
|
120
|
+
"aria-disabled": disabled || undefined,
|
|
121
|
+
"aria-invalid": error || undefined,
|
|
122
|
+
"aria-required": required || undefined,
|
|
123
|
+
"aria-valuemin": min,
|
|
124
|
+
"aria-valuemax": max,
|
|
125
|
+
"aria-valuenow": value === null ? undefined : value,
|
|
126
|
+
"aria-valuetext": getValueText(value),
|
|
127
|
+
id,
|
|
128
|
+
ref: nodeRefCallback,
|
|
129
|
+
role: "spinbutton",
|
|
130
|
+
autoCapitalize: "none",
|
|
131
|
+
autoCorrect: "off",
|
|
132
|
+
spellCheck: false,
|
|
133
|
+
inputMode: "numeric",
|
|
134
|
+
contentEditable: !disabled || undefined,
|
|
135
|
+
suppressContentEditableWarning: true,
|
|
136
|
+
tabIndex: disabled ? undefined : 0,
|
|
137
|
+
onBlur: (event)=>{
|
|
138
|
+
onBlur(event);
|
|
139
|
+
focused.current = false;
|
|
140
|
+
deselectNode(event.currentTarget);
|
|
141
|
+
},
|
|
142
|
+
onFocus: (event)=>{
|
|
143
|
+
onFocus(event);
|
|
144
|
+
if (disabled) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
focused.current = true;
|
|
148
|
+
typedCount.current = 0;
|
|
149
|
+
selectNode(event.currentTarget);
|
|
150
|
+
},
|
|
151
|
+
onKeyDown: (event)=>{
|
|
152
|
+
onKeyDown(event);
|
|
153
|
+
if (disabled || readOnly && event.key !== "Enter") {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const setValue = (nextValue)=>updateValue({
|
|
157
|
+
value: nextValue,
|
|
158
|
+
event,
|
|
159
|
+
reason: "change"
|
|
160
|
+
});
|
|
161
|
+
let stop = false;
|
|
162
|
+
switch(event.key){
|
|
163
|
+
case "ArrowRight":
|
|
164
|
+
case "ArrowLeft":
|
|
165
|
+
// `event.stopPropagation()` should not be called here since the
|
|
166
|
+
// parent `useSpinButtonGroup` keyboard event handler should
|
|
167
|
+
// still be called to handle advancing to the next spinbutton in
|
|
168
|
+
// the group. Only the default cursor movement needs to be disabled
|
|
169
|
+
// instead.
|
|
170
|
+
event.preventDefault();
|
|
171
|
+
break;
|
|
172
|
+
case "ArrowUp":
|
|
173
|
+
stop = true;
|
|
174
|
+
increment(event);
|
|
175
|
+
break;
|
|
176
|
+
case "ArrowDown":
|
|
177
|
+
stop = true;
|
|
178
|
+
decrement(event);
|
|
179
|
+
break;
|
|
180
|
+
case "Home":
|
|
181
|
+
stop = true;
|
|
182
|
+
if (typeof min === "number") {
|
|
183
|
+
setValue(min);
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
case "End":
|
|
187
|
+
stop = true;
|
|
188
|
+
if (typeof max === "number") {
|
|
189
|
+
setValue(max);
|
|
190
|
+
}
|
|
191
|
+
break;
|
|
192
|
+
case "Enter":
|
|
193
|
+
stop = true;
|
|
194
|
+
tryToSubmitRelatedForm(event, form);
|
|
195
|
+
}
|
|
196
|
+
if (stop) {
|
|
197
|
+
event.preventDefault();
|
|
198
|
+
event.stopPropagation();
|
|
199
|
+
typedCount.current = 0;
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
onClick: (event)=>{
|
|
203
|
+
onClick(event);
|
|
204
|
+
event.preventDefault();
|
|
205
|
+
if (disabled) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
focused.current = true;
|
|
209
|
+
typedCount.current = 0;
|
|
210
|
+
selectNode(event.currentTarget);
|
|
211
|
+
},
|
|
212
|
+
onInput: (event)=>{
|
|
213
|
+
onInput(event);
|
|
214
|
+
const node = event.currentTarget;
|
|
215
|
+
// if the input event is fired while readOnly or disabled, ignore it
|
|
216
|
+
// and set it back to the previous state
|
|
217
|
+
if (readOnly || disabled) {
|
|
218
|
+
node.textContent = prevText.current;
|
|
219
|
+
selectNode(node);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const { reason, nextValue } = resolveInputEvent({
|
|
223
|
+
min,
|
|
224
|
+
max,
|
|
225
|
+
text: node.textContent || "",
|
|
226
|
+
mappings,
|
|
227
|
+
maxDigits,
|
|
228
|
+
prevText: prevText.current,
|
|
229
|
+
prevValue: value,
|
|
230
|
+
typedCount: typedCount.current
|
|
231
|
+
});
|
|
232
|
+
if (reason === "change" || reason === "cleared" || reason === "typed-to-completion") {
|
|
233
|
+
typedCount.current = 0;
|
|
234
|
+
} else if (reason !== "ignored") {
|
|
235
|
+
typedCount.current++;
|
|
236
|
+
}
|
|
237
|
+
node.textContent = getTextContent({
|
|
238
|
+
min,
|
|
239
|
+
max,
|
|
240
|
+
minDigits,
|
|
241
|
+
maxDigits,
|
|
242
|
+
value: nextValue,
|
|
243
|
+
fallback,
|
|
244
|
+
placeholderChar
|
|
245
|
+
});
|
|
246
|
+
prevText.current = node.textContent;
|
|
247
|
+
selectNode(node);
|
|
248
|
+
if (reason !== "ignored" && reason !== "placeholder-digit") {
|
|
249
|
+
updateValue({
|
|
250
|
+
event,
|
|
251
|
+
value: nextValue,
|
|
252
|
+
reason
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
//# sourceMappingURL=useSpinButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/spinbutton/useSpinButton.ts"],"sourcesContent":["\"use client\";\n\nimport { type Dispatch, useCallback, useRef, useState } from \"react\";\n\nimport { tryToSubmitRelatedForm } from \"../form/utils.js\";\nimport { useEnsuredId } from \"../useEnsuredId.js\";\nimport { useEnsuredRef } from \"../useEnsuredRef.js\";\nimport { useEnsuredState } from \"../useEnsuredState.js\";\nimport { useIsomorphicLayoutEffect } from \"../useIsomorphicLayoutEffect.js\";\nimport { withinRange } from \"../utils/withinRange.js\";\nimport { useSpinButtonGroup } from \"./SpinButtonGroupProvider.js\";\nimport {\n defaultGetSpinButtonTextContent,\n defaultSpinButtonGetValueText,\n} from \"./defaults.js\";\nimport {\n type SpinButtonChangeEvent,\n type SpinButtonChangeEventOptions,\n type SpinButtonImplementation,\n type SpinButtonOptions,\n type SpinButtonValue,\n} from \"./types.js\";\nimport { deselectNode } from \"./utils/deselectNode.js\";\nimport { resolveInputEvent } from \"./utils/resolveInputEvent.js\";\nimport { selectNode } from \"./utils/selectNode.js\";\n\n/**\n * @since 6.4.0\n */\nconst noop = (): void => {\n // do nothing\n};\n\n/**\n * @since 6.4.0\n */\nexport function useSpinButton<E extends HTMLElement = HTMLDivElement>(\n options: SpinButtonOptions<E>\n): SpinButtonImplementation<E> {\n const {\n id: propId,\n ref: propRef,\n min,\n max,\n step = 1,\n minDigits,\n maxDigits,\n form,\n readOnly,\n disabled,\n required,\n error,\n onBlur = noop,\n onFocus = noop,\n onInput = noop,\n onClick = noop,\n onKeyDown = noop,\n fallback,\n mappings,\n value: propValue,\n onValueChange = noop,\n defaultValue = null,\n getValueText = defaultSpinButtonGetValueText,\n getTextContent = defaultGetSpinButtonTextContent,\n placeholderChar,\n defaultKeyboardValue,\n } = options;\n const id = useEnsuredId(propId, \"spinbutton\");\n\n // trigger a noop setValue when `value` and `onValueChange` are provided\n // since `onValueChange is always called with `setValue\n let propSetValue: Dispatch<SpinButtonValue> | undefined;\n if (typeof propValue !== \"undefined\" && options.onValueChange) {\n propSetValue = noop;\n }\n\n const [value, setValue] = useEnsuredState({\n value: propValue,\n setValue: propSetValue,\n defaultValue,\n });\n\n const focused = useRef(false);\n const typedCount = useRef(0);\n const prevText = useRef(\"\");\n const [nodeRef, nodeRefCallback] = useEnsuredRef(propRef);\n const { focusNext } = useSpinButtonGroup();\n const [keyboardValue] = useState(defaultKeyboardValue);\n\n // NOTE: I might be able to get rid of this since I don't remember why it was\n // added maybe for controlled fields? I'll have to see when I get to the\n // date/time components again\n useIsomorphicLayoutEffect(() => {\n const node = nodeRef.current;\n if (!focused.current || !node) {\n return;\n }\n\n prevText.current = node.textContent || \"\";\n selectNode(node);\n }, [nodeRef, value]);\n\n const updateValue = useCallback(\n (options: SpinButtonChangeEventOptions<E>) => {\n setValue(options.value);\n onValueChange(options);\n if (options.reason === \"typed-to-completion\") {\n focusNext();\n }\n },\n [focusNext, onValueChange, setValue]\n );\n const increment = useCallback(\n (event: SpinButtonChangeEvent<E>) => {\n let nextValue: SpinButtonValue =\n value ?? keyboardValue ?? min ?? max ?? 0;\n nextValue = withinRange({ min, max, value: nextValue + step });\n\n // this actually means both min and max are a number\n if (nextValue === value && typeof min === \"number\") {\n nextValue = min;\n }\n\n updateValue({\n event,\n reason: \"change\",\n value: nextValue,\n });\n },\n [keyboardValue, max, min, step, updateValue, value]\n );\n const decrement = useCallback(\n (event: SpinButtonChangeEvent<E>) => {\n let nextValue: SpinButtonValue =\n value ?? keyboardValue ?? max ?? min ?? 0;\n nextValue = withinRange({ min, max, value: nextValue - step });\n\n // this actually means both min and max are a number\n if (nextValue === value && typeof max === \"number\") {\n nextValue = max;\n }\n\n updateValue({\n event,\n reason: \"change\",\n value: nextValue,\n });\n },\n [keyboardValue, max, min, step, updateValue, value]\n );\n\n return {\n value,\n setValue,\n spinButtonRef: nodeRef,\n spinButtonProps: {\n \"aria-readonly\": readOnly || undefined,\n \"aria-disabled\": disabled || undefined,\n \"aria-invalid\": error || undefined,\n \"aria-required\": required || undefined,\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n \"aria-valuenow\": value === null ? undefined : value,\n \"aria-valuetext\": getValueText(value),\n id,\n ref: nodeRefCallback,\n role: \"spinbutton\",\n autoCapitalize: \"none\",\n autoCorrect: \"off\",\n spellCheck: false,\n inputMode: \"numeric\",\n contentEditable: !disabled || undefined,\n suppressContentEditableWarning: true,\n tabIndex: disabled ? undefined : 0,\n onBlur: (event) => {\n onBlur(event);\n\n focused.current = false;\n deselectNode(event.currentTarget);\n },\n onFocus: (event) => {\n onFocus(event);\n\n if (disabled) {\n return;\n }\n\n focused.current = true;\n typedCount.current = 0;\n selectNode(event.currentTarget);\n },\n onKeyDown: (event) => {\n onKeyDown(event);\n\n if (disabled || (readOnly && event.key !== \"Enter\")) {\n return;\n }\n\n const setValue = (nextValue: number): void =>\n updateValue({ value: nextValue, event, reason: \"change\" });\n\n let stop = false;\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowLeft\":\n // `event.stopPropagation()` should not be called here since the\n // parent `useSpinButtonGroup` keyboard event handler should\n // still be called to handle advancing to the next spinbutton in\n // the group. Only the default cursor movement needs to be disabled\n // instead.\n event.preventDefault();\n break;\n case \"ArrowUp\":\n stop = true;\n increment(event);\n break;\n case \"ArrowDown\":\n stop = true;\n decrement(event);\n break;\n case \"Home\":\n stop = true;\n if (typeof min === \"number\") {\n setValue(min);\n }\n break;\n case \"End\":\n stop = true;\n if (typeof max === \"number\") {\n setValue(max);\n }\n break;\n case \"Enter\":\n stop = true;\n tryToSubmitRelatedForm(event, form);\n }\n\n if (stop) {\n event.preventDefault();\n event.stopPropagation();\n typedCount.current = 0;\n }\n },\n onClick: (event) => {\n onClick(event);\n\n event.preventDefault();\n if (disabled) {\n return;\n }\n\n focused.current = true;\n typedCount.current = 0;\n selectNode(event.currentTarget);\n },\n onInput: (event) => {\n onInput(event);\n\n const node = event.currentTarget;\n // if the input event is fired while readOnly or disabled, ignore it\n // and set it back to the previous state\n if (readOnly || disabled) {\n node.textContent = prevText.current;\n selectNode(node);\n return;\n }\n\n const { reason, nextValue } = resolveInputEvent({\n min,\n max,\n text: node.textContent || \"\",\n mappings,\n maxDigits,\n prevText: prevText.current,\n prevValue: value,\n typedCount: typedCount.current,\n });\n\n if (\n reason === \"change\" ||\n reason === \"cleared\" ||\n reason === \"typed-to-completion\"\n ) {\n typedCount.current = 0;\n } else if (reason !== \"ignored\") {\n typedCount.current++;\n }\n\n node.textContent = getTextContent({\n min,\n max,\n minDigits,\n maxDigits,\n value: nextValue,\n fallback,\n placeholderChar,\n });\n prevText.current = node.textContent;\n selectNode(node);\n\n if (reason !== \"ignored\" && reason !== \"placeholder-digit\") {\n updateValue({\n event,\n value: nextValue,\n reason,\n });\n }\n },\n },\n };\n}\n"],"names":["useCallback","useRef","useState","tryToSubmitRelatedForm","useEnsuredId","useEnsuredRef","useEnsuredState","useIsomorphicLayoutEffect","withinRange","useSpinButtonGroup","defaultGetSpinButtonTextContent","defaultSpinButtonGetValueText","deselectNode","resolveInputEvent","selectNode","noop","useSpinButton","options","id","propId","ref","propRef","min","max","step","minDigits","maxDigits","form","readOnly","disabled","required","error","onBlur","onFocus","onInput","onClick","onKeyDown","fallback","mappings","value","propValue","onValueChange","defaultValue","getValueText","getTextContent","placeholderChar","defaultKeyboardValue","propSetValue","setValue","focused","typedCount","prevText","nodeRef","nodeRefCallback","focusNext","keyboardValue","node","current","textContent","updateValue","reason","increment","event","nextValue","decrement","spinButtonRef","spinButtonProps","undefined","role","autoCapitalize","autoCorrect","spellCheck","inputMode","contentEditable","suppressContentEditableWarning","tabIndex","currentTarget","key","stop","preventDefault","stopPropagation","text","prevValue"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type KeyboardMovementProps, type KeyboardMovementProviderImplementation, type SimpleKeyboardMovementWrapperOptions } from "../movement/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @since 6.4.0
|
|
4
|
+
*/
|
|
5
|
+
export interface SpinButtonGroupProviderOptions<E extends HTMLElement = HTMLElement> extends SimpleKeyboardMovementWrapperOptions<E> {
|
|
6
|
+
/**
|
|
7
|
+
* Set this to `true` to update the container's `onClick` handler to move
|
|
8
|
+
* focus to the first spinbutton that does not have a value or the first
|
|
9
|
+
* spinbutton in the group so that focus is always moved to the spin buttons.
|
|
10
|
+
*
|
|
11
|
+
* @defaultValue `false`
|
|
12
|
+
*/
|
|
13
|
+
forceFocusWithin?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ProvidedSpinButtonGroupProps<E extends HTMLElement = HTMLElement> extends KeyboardMovementProps<E> {
|
|
16
|
+
role: "group";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* @since 6.4.0
|
|
20
|
+
*/
|
|
21
|
+
export interface SpinButtonGroupProviderImplementation<E extends HTMLElement = HTMLElement> extends KeyboardMovementProviderImplementation<E> {
|
|
22
|
+
movementProps: Readonly<ProvidedSpinButtonGroupProps<E>>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @since 6.4.0
|
|
26
|
+
*/
|
|
27
|
+
export declare function useSpinButtonGroupProvider<E extends HTMLElement = HTMLElement>(options?: SpinButtonGroupProviderOptions<E>): SpinButtonGroupProviderImplementation<E>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP, DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP } from "../movement/constants.js";
|
|
3
|
+
import { useKeyboardMovementProvider } from "../movement/useKeyboardMovementProvider.js";
|
|
4
|
+
import { useDir } from "../typography/WritingDirectionProvider.js";
|
|
5
|
+
const SPINBUTTON_ROLE = '[role="spinbutton"]';
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
* @since 6.4.0
|
|
9
|
+
*/ const getSpinButtonsOnly = (container)=>[
|
|
10
|
+
...container.querySelectorAll(SPINBUTTON_ROLE)
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* @since 6.4.0
|
|
14
|
+
*/ export function useSpinButtonGroupProvider(options = {}) {
|
|
15
|
+
const { disabled, forceFocusWithin } = options;
|
|
16
|
+
const isRTL = useDir().dir === "rtl";
|
|
17
|
+
const movementKeys = isRTL ? DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP : DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP;
|
|
18
|
+
const { movementProps, ...remaining } = useKeyboardMovementProvider({
|
|
19
|
+
...options,
|
|
20
|
+
...movementKeys,
|
|
21
|
+
loopable: false,
|
|
22
|
+
trackTabKeys: true,
|
|
23
|
+
getFocusableElements: getSpinButtonsOnly
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
...remaining,
|
|
27
|
+
movementProps: {
|
|
28
|
+
...movementProps,
|
|
29
|
+
role: "group",
|
|
30
|
+
onClick: (event)=>{
|
|
31
|
+
movementProps.onClick(event);
|
|
32
|
+
const { target, currentTarget } = event;
|
|
33
|
+
if (disabled || !forceFocusWithin || !(target instanceof HTMLElement) || target.closest(SPINBUTTON_ROLE)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const buttons = [
|
|
37
|
+
...currentTarget.querySelectorAll(SPINBUTTON_ROLE)
|
|
38
|
+
];
|
|
39
|
+
const i = buttons.findIndex((button)=>!button.ariaValueNow);
|
|
40
|
+
remaining.movementContext.updateFocusIndex({
|
|
41
|
+
index: Math.max(0, i),
|
|
42
|
+
force: true
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=useSpinButtonGroupProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/spinbutton/useSpinButtonGroupProvider.ts"],"sourcesContent":["\"use client\";\n\nimport {\n DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP,\n DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP,\n} from \"../movement/constants.js\";\nimport {\n type KeyboardMovementProps,\n type KeyboardMovementProviderImplementation,\n type SimpleKeyboardMovementWrapperOptions,\n} from \"../movement/types.js\";\nimport { useKeyboardMovementProvider } from \"../movement/useKeyboardMovementProvider.js\";\nimport { useDir } from \"../typography/WritingDirectionProvider.js\";\n\nconst SPINBUTTON_ROLE = '[role=\"spinbutton\"]';\n\n/**\n * @internal\n * @since 6.4.0\n */\nconst getSpinButtonsOnly = (container: HTMLElement): readonly HTMLElement[] => [\n ...container.querySelectorAll<HTMLElement>(SPINBUTTON_ROLE),\n];\n\n/**\n * @since 6.4.0\n */\nexport interface SpinButtonGroupProviderOptions<\n E extends HTMLElement = HTMLElement,\n> extends SimpleKeyboardMovementWrapperOptions<E> {\n /**\n * Set this to `true` to update the container's `onClick` handler to move\n * focus to the first spinbutton that does not have a value or the first\n * spinbutton in the group so that focus is always moved to the spin buttons.\n *\n * @defaultValue `false`\n */\n forceFocusWithin?: boolean;\n}\n\nexport interface ProvidedSpinButtonGroupProps<\n E extends HTMLElement = HTMLElement,\n> extends KeyboardMovementProps<E> {\n role: \"group\";\n}\n\n/**\n * @since 6.4.0\n */\nexport interface SpinButtonGroupProviderImplementation<\n E extends HTMLElement = HTMLElement,\n> extends KeyboardMovementProviderImplementation<E> {\n movementProps: Readonly<ProvidedSpinButtonGroupProps<E>>;\n}\n\n/**\n * @since 6.4.0\n */\nexport function useSpinButtonGroupProvider<E extends HTMLElement = HTMLElement>(\n options: SpinButtonGroupProviderOptions<E> = {}\n): SpinButtonGroupProviderImplementation<E> {\n const { disabled, forceFocusWithin } = options;\n\n const isRTL = useDir().dir === \"rtl\";\n const movementKeys = isRTL\n ? DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP\n : DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP;\n\n const { movementProps, ...remaining } = useKeyboardMovementProvider({\n ...options,\n ...movementKeys,\n loopable: false,\n trackTabKeys: true,\n getFocusableElements: getSpinButtonsOnly,\n });\n\n return {\n ...remaining,\n movementProps: {\n ...movementProps,\n role: \"group\",\n onClick: (event) => {\n movementProps.onClick(event);\n\n const { target, currentTarget } = event;\n if (\n disabled ||\n !forceFocusWithin ||\n !(target instanceof HTMLElement) ||\n target.closest(SPINBUTTON_ROLE)\n ) {\n return;\n }\n\n const buttons = [...currentTarget.querySelectorAll(SPINBUTTON_ROLE)];\n const i = buttons.findIndex((button) => !button.ariaValueNow);\n remaining.movementContext.updateFocusIndex({\n index: Math.max(0, i),\n force: true,\n });\n },\n },\n };\n}\n"],"names":["DEFAULT_LTR_KEYBOARD_MOVEMENT_WITHOUT_JUMP","DEFAULT_RTL_KEYBOARD_MOVEMENT_WITHOUT_JUMP","useKeyboardMovementProvider","useDir","SPINBUTTON_ROLE","getSpinButtonsOnly","container","querySelectorAll","useSpinButtonGroupProvider","options","disabled","forceFocusWithin","isRTL","dir","movementKeys","movementProps","remaining","loopable","trackTabKeys","getFocusableElements","role","onClick","event","target","currentTarget","HTMLElement","closest","buttons","i","findIndex","button","ariaValueNow","movementContext","updateFocusIndex","index","Math","max","force"],"mappings":"AAAA;AAEA,SACEA,0CAA0C,EAC1CC,0CAA0C,QACrC,2BAA2B;AAMlC,SAASC,2BAA2B,QAAQ,6CAA6C;AACzF,SAASC,MAAM,QAAQ,4CAA4C;AAEnE,MAAMC,kBAAkB;AAExB;;;CAGC,GACD,MAAMC,qBAAqB,CAACC,YAAmD;WAC1EA,UAAUC,gBAAgB,CAAcH;KAC5C;AAiCD;;CAEC,GACD,OAAO,SAASI,2BACdC,UAA6C,CAAC,CAAC;IAE/C,MAAM,EAAEC,QAAQ,EAAEC,gBAAgB,EAAE,GAAGF;IAEvC,MAAMG,QAAQT,SAASU,GAAG,KAAK;IAC/B,MAAMC,eAAeF,QACjBX,6CACAD;IAEJ,MAAM,EAAEe,aAAa,EAAE,GAAGC,WAAW,GAAGd,4BAA4B;QAClE,GAAGO,OAAO;QACV,GAAGK,YAAY;QACfG,UAAU;QACVC,cAAc;QACdC,sBAAsBd;IACxB;IAEA,OAAO;QACL,GAAGW,SAAS;QACZD,eAAe;YACb,GAAGA,aAAa;YAChBK,MAAM;YACNC,SAAS,CAACC;gBACRP,cAAcM,OAAO,CAACC;gBAEtB,MAAM,EAAEC,MAAM,EAAEC,aAAa,EAAE,GAAGF;gBAClC,IACEZ,YACA,CAACC,oBACD,CAAEY,CAAAA,kBAAkBE,WAAU,KAC9BF,OAAOG,OAAO,CAACtB,kBACf;oBACA;gBACF;gBAEA,MAAMuB,UAAU;uBAAIH,cAAcjB,gBAAgB,CAACH;iBAAiB;gBACpE,MAAMwB,IAAID,QAAQE,SAAS,CAAC,CAACC,SAAW,CAACA,OAAOC,YAAY;gBAC5Df,UAAUgB,eAAe,CAACC,gBAAgB,CAAC;oBACzCC,OAAOC,KAAKC,GAAG,CAAC,GAAGR;oBACnBS,OAAO;gBACT;YACF;QACF;IACF;AACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 6.4.0
|
|
3
|
+
* @internal
|
|
4
|
+
*/ export function deselectNode(node) {
|
|
5
|
+
const selection = window.getSelection();
|
|
6
|
+
if (!selection) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
for(let i = 0; i < selection.rangeCount; i++){
|
|
10
|
+
const range = selection.getRangeAt(i);
|
|
11
|
+
if (range.startContainer.contains(node)) {
|
|
12
|
+
selection.removeRange(range);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=deselectNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/spinbutton/utils/deselectNode.ts"],"sourcesContent":["/**\n * @since 6.4.0\n * @internal\n */\nexport function deselectNode(node: Node): void {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n for (let i = 0; i < selection.rangeCount; i++) {\n const range = selection.getRangeAt(i);\n if (range.startContainer.contains(node)) {\n selection.removeRange(range);\n }\n }\n}\n"],"names":["deselectNode","node","selection","window","getSelection","i","rangeCount","range","getRangeAt","startContainer","contains","removeRange"],"mappings":"AAAA;;;CAGC,GACD,OAAO,SAASA,aAAaC,IAAU;IACrC,MAAMC,YAAYC,OAAOC,YAAY;IACrC,IAAI,CAACF,WAAW;QACd;IACF;IAEA,IAAK,IAAIG,IAAI,GAAGA,IAAIH,UAAUI,UAAU,EAAED,IAAK;QAC7C,MAAME,QAAQL,UAAUM,UAAU,CAACH;QACnC,IAAIE,MAAME,cAAc,CAACC,QAAQ,CAACT,OAAO;YACvCC,UAAUS,WAAW,CAACJ;QACxB;IACF;AACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type MinMaxRange } from "../../types.js";
|
|
2
|
+
import { type SpinButtonChangeReason, type SpinButtonCharacterValueMap, type SpinButtonValue } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* @since 6.4.0
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
interface ResolveInputEventOptions extends Partial<MinMaxRange> {
|
|
8
|
+
text: string;
|
|
9
|
+
mappings?: SpinButtonCharacterValueMap;
|
|
10
|
+
minDigits?: number;
|
|
11
|
+
maxDigits?: number;
|
|
12
|
+
prevText: string;
|
|
13
|
+
prevValue: SpinButtonValue;
|
|
14
|
+
typedCount: number;
|
|
15
|
+
}
|
|
16
|
+
type SpinButtonResolvedInputReason = SpinButtonChangeReason | "ignored" | "placeholder-digit";
|
|
17
|
+
/**
|
|
18
|
+
* @since 6.4.0
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
interface ResolveInputEvent {
|
|
22
|
+
reason: SpinButtonResolvedInputReason;
|
|
23
|
+
nextValue: SpinButtonValue;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* @since 6.4.0
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveInputEvent(options: ResolveInputEventOptions): ResolveInputEvent;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { getNumberOfDigits } from "../../utils/getNumberOfDigits.js";
|
|
2
|
+
/**
|
|
3
|
+
* @since 6.4.0
|
|
4
|
+
* @internal
|
|
5
|
+
*/ export function resolveInputEvent(options) {
|
|
6
|
+
const { min, max, minDigits = getNumberOfDigits(min), maxDigits = getNumberOfDigits(max), text, mappings, typedCount, prevValue } = options;
|
|
7
|
+
let { prevText } = options;
|
|
8
|
+
if (typedCount === 0) {
|
|
9
|
+
prevText = "";
|
|
10
|
+
}
|
|
11
|
+
if (!text) {
|
|
12
|
+
return {
|
|
13
|
+
reason: "cleared",
|
|
14
|
+
nextValue: null
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (mappings) {
|
|
18
|
+
const nextValue = mappings[text] ?? prevValue;
|
|
19
|
+
let reason = "ignored";
|
|
20
|
+
if (typeof mappings[text] === "number") {
|
|
21
|
+
reason = "typed-to-completion";
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
reason,
|
|
25
|
+
nextValue
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (/[^0-9]/.test(text)) {
|
|
29
|
+
return {
|
|
30
|
+
reason: "ignored",
|
|
31
|
+
nextValue: prevValue
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
let reason = "type";
|
|
35
|
+
let nextValue = parseInt(prevText + text, 10);
|
|
36
|
+
if (typeof minDigits === "number" && typedCount + 1 < minDigits) {
|
|
37
|
+
reason = "placeholder-digit";
|
|
38
|
+
}
|
|
39
|
+
if (typeof max === "number" && nextValue > max) {
|
|
40
|
+
nextValue = prevValue;
|
|
41
|
+
}
|
|
42
|
+
if (typeof nextValue === "number" && // if typing a new value surpasses the number of digits allowed
|
|
43
|
+
(typeof maxDigits === "number" && typedCount + 1 >= maxDigits || // typing a new value would exceed the max value
|
|
44
|
+
typeof max === "number" && nextValue * 10 > max)) {
|
|
45
|
+
reason = "typed-to-completion";
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
reason,
|
|
49
|
+
nextValue
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=resolveInputEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/spinbutton/utils/resolveInputEvent.ts"],"sourcesContent":["import { type MinMaxRange } from \"../../types.js\";\nimport { getNumberOfDigits } from \"../../utils/getNumberOfDigits.js\";\nimport {\n type SpinButtonChangeReason,\n type SpinButtonCharacterValueMap,\n type SpinButtonValue,\n} from \"../types.js\";\n\n/**\n * @since 6.4.0\n * @internal\n */\ninterface ResolveInputEventOptions extends Partial<MinMaxRange> {\n text: string;\n mappings?: SpinButtonCharacterValueMap;\n minDigits?: number;\n maxDigits?: number;\n prevText: string;\n prevValue: SpinButtonValue;\n typedCount: number;\n}\n\ntype SpinButtonResolvedInputReason =\n | SpinButtonChangeReason\n | \"ignored\"\n | \"placeholder-digit\";\n\n/**\n * @since 6.4.0\n * @internal\n */\ninterface ResolveInputEvent {\n reason: SpinButtonResolvedInputReason;\n nextValue: SpinButtonValue;\n}\n\n/**\n * @since 6.4.0\n * @internal\n */\nexport function resolveInputEvent(\n options: ResolveInputEventOptions\n): ResolveInputEvent {\n const {\n min,\n max,\n minDigits = getNumberOfDigits(min),\n maxDigits = getNumberOfDigits(max),\n text,\n mappings,\n typedCount,\n prevValue,\n } = options;\n\n let { prevText } = options;\n if (typedCount === 0) {\n prevText = \"\";\n }\n\n if (!text) {\n return {\n reason: \"cleared\",\n nextValue: null,\n };\n }\n\n if (mappings) {\n const nextValue = mappings[text] ?? prevValue;\n\n let reason: SpinButtonResolvedInputReason = \"ignored\";\n if (typeof mappings[text] === \"number\") {\n reason = \"typed-to-completion\";\n }\n\n return {\n reason,\n nextValue,\n };\n }\n\n if (/[^0-9]/.test(text)) {\n return {\n reason: \"ignored\",\n nextValue: prevValue,\n };\n }\n\n let reason: SpinButtonResolvedInputReason = \"type\";\n let nextValue: SpinButtonValue = parseInt(prevText + text, 10);\n if (typeof minDigits === \"number\" && typedCount + 1 < minDigits) {\n reason = \"placeholder-digit\";\n }\n\n if (typeof max === \"number\" && nextValue > max) {\n nextValue = prevValue;\n }\n\n if (\n typeof nextValue === \"number\" &&\n // if typing a new value surpasses the number of digits allowed\n ((typeof maxDigits === \"number\" && typedCount + 1 >= maxDigits) ||\n // typing a new value would exceed the max value\n (typeof max === \"number\" && nextValue * 10 > max))\n ) {\n reason = \"typed-to-completion\";\n }\n\n return {\n reason,\n nextValue,\n };\n}\n"],"names":["getNumberOfDigits","resolveInputEvent","options","min","max","minDigits","maxDigits","text","mappings","typedCount","prevValue","prevText","reason","nextValue","test","parseInt"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,mCAAmC;AAmCrE;;;CAGC,GACD,OAAO,SAASC,kBACdC,OAAiC;IAEjC,MAAM,EACJC,GAAG,EACHC,GAAG,EACHC,YAAYL,kBAAkBG,IAAI,EAClCG,YAAYN,kBAAkBI,IAAI,EAClCG,IAAI,EACJC,QAAQ,EACRC,UAAU,EACVC,SAAS,EACV,GAAGR;IAEJ,IAAI,EAAES,QAAQ,EAAE,GAAGT;IACnB,IAAIO,eAAe,GAAG;QACpBE,WAAW;IACb;IAEA,IAAI,CAACJ,MAAM;QACT,OAAO;YACLK,QAAQ;YACRC,WAAW;QACb;IACF;IAEA,IAAIL,UAAU;QACZ,MAAMK,YAAYL,QAAQ,CAACD,KAAK,IAAIG;QAEpC,IAAIE,SAAwC;QAC5C,IAAI,OAAOJ,QAAQ,CAACD,KAAK,KAAK,UAAU;YACtCK,SAAS;QACX;QAEA,OAAO;YACLA;YACAC;QACF;IACF;IAEA,IAAI,SAASC,IAAI,CAACP,OAAO;QACvB,OAAO;YACLK,QAAQ;YACRC,WAAWH;QACb;IACF;IAEA,IAAIE,SAAwC;IAC5C,IAAIC,YAA6BE,SAASJ,WAAWJ,MAAM;IAC3D,IAAI,OAAOF,cAAc,YAAYI,aAAa,IAAIJ,WAAW;QAC/DO,SAAS;IACX;IAEA,IAAI,OAAOR,QAAQ,YAAYS,YAAYT,KAAK;QAC9CS,YAAYH;IACd;IAEA,IACE,OAAOG,cAAc,YACrB,+DAA+D;IAC9D,CAAA,AAAC,OAAOP,cAAc,YAAYG,aAAa,KAAKH,aACnD,gDAAgD;IAC/C,OAAOF,QAAQ,YAAYS,YAAY,KAAKT,GAAG,GAClD;QACAQ,SAAS;IACX;IAEA,OAAO;QACLA;QACAC;IACF;AACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 6.4.0
|
|
3
|
+
* @internal
|
|
4
|
+
*/ export function selectNode(node) {
|
|
5
|
+
const selection = window.getSelection();
|
|
6
|
+
if (!selection) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const range = document.createRange();
|
|
10
|
+
range.selectNodeContents(node);
|
|
11
|
+
selection.removeAllRanges();
|
|
12
|
+
selection.addRange(range);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=selectNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/spinbutton/utils/selectNode.ts"],"sourcesContent":["/**\n * @since 6.4.0\n * @internal\n */\nexport function selectNode(node: Node): void {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n"],"names":["selectNode","node","selection","window","getSelection","range","document","createRange","selectNodeContents","removeAllRanges","addRange"],"mappings":"AAAA;;;CAGC,GACD,OAAO,SAASA,WAAWC,IAAU;IACnC,MAAMC,YAAYC,OAAOC,YAAY;IACrC,IAAI,CAACF,WAAW;QACd;IACF;IAEA,MAAMG,QAAQC,SAASC,WAAW;IAClCF,MAAMG,kBAAkB,CAACP;IACzBC,UAAUO,eAAe;IACzBP,UAAUQ,QAAQ,CAACL;AACrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/table/StickyTableSection.tsx"],"sourcesContent":["\"use client\";\n\nimport { type HTMLAttributes, forwardRef } from \"react\";\n\nimport { TableConfigProvider } from \"./TableConfigurationProvider.js\";\nimport { tableFooter } from \"./tableFooterStyles.js\";\nimport { tableHeader } from \"./tableHeaderStyles.js\";\nimport {\n type TableSectionConfiguration,\n type TableStickySectionConfiguration,\n} from \"./types.js\";\nimport { useStickyTableSection } from \"./useStickyTableSection.js\";\nimport { useTableSectionConfig } from \"./useTableSectionConfig.js\";\n\n/** @since 6.0.0 */\nexport interface StickyTableSectionProps\n extends
|
|
1
|
+
{"version":3,"sources":["../../src/table/StickyTableSection.tsx"],"sourcesContent":["\"use client\";\n\nimport { type HTMLAttributes, forwardRef } from \"react\";\n\nimport { TableConfigProvider } from \"./TableConfigurationProvider.js\";\nimport { tableFooter } from \"./tableFooterStyles.js\";\nimport { tableHeader } from \"./tableHeaderStyles.js\";\nimport {\n type TableSectionConfiguration,\n type TableStickySectionConfiguration,\n} from \"./types.js\";\nimport { useStickyTableSection } from \"./useStickyTableSection.js\";\nimport { useTableSectionConfig } from \"./useTableSectionConfig.js\";\n\n/** @since 6.0.0 */\nexport interface StickyTableSectionProps\n extends\n HTMLAttributes<HTMLTableSectionElement>,\n TableStickySectionConfiguration,\n TableSectionConfiguration {\n type: \"header\" | \"footer\";\n\n /**\n * An optional className to use when the sticky section is covering other rows\n * (`active`). When this is defined, the default\n * `rmd-thead--sticky-active`/`rmd-tfoot--sticky-active` will no longer be\n * applied.\n */\n stickyActiveClassName?: string;\n}\n\n/**\n * **Client Component**\n *\n * This component is used to render a sticky `<thead>`/`<tfoot>` that\n * dynamically applies styles whenever the `<thead>`/`<tfoot>` are covering\n * content in the table.\n *\n * @see {@link https://react-md.dev/components/table | Table Demos}\n * @see {@link https://react-md.dev/components/table#sticky-tables | Sticky Table Demos}\n * @since 6.0.0\n */\nexport const StickyTableSection = forwardRef<\n HTMLTableSectionElement,\n StickyTableSectionProps\n>(function StickyTableSection(props, ref) {\n const {\n type,\n className,\n hoverable,\n lineWrap,\n children,\n stickyOptions,\n isStickyActive,\n disableStickyStyles = false,\n stickyActiveClassName,\n ...remaining\n } = props;\n\n const isHeader = type === \"header\";\n const Section = isHeader ? \"thead\" : \"tfoot\";\n const styles = isHeader ? tableHeader : tableFooter;\n const { tbody, sectionRef, stickyActive } = useStickyTableSection({\n ref,\n type,\n stickyOptions,\n isStickyActive,\n disableStickyStyles,\n stickyActiveClassName,\n });\n const config = useTableSectionConfig({\n type,\n lineWrap,\n hoverable,\n });\n\n return (\n <TableConfigProvider value={config}>\n {!isHeader && tbody}\n <Section\n {...remaining}\n ref={sectionRef}\n className={styles({\n className,\n dense: config.dense,\n sticky: true,\n stickyActive,\n stickyActiveClassName,\n })}\n >\n {children}\n </Section>\n {isHeader && tbody}\n </TableConfigProvider>\n );\n});\n"],"names":["forwardRef","TableConfigProvider","tableFooter","tableHeader","useStickyTableSection","useTableSectionConfig","StickyTableSection","props","ref","type","className","hoverable","lineWrap","children","stickyOptions","isStickyActive","disableStickyStyles","stickyActiveClassName","remaining","isHeader","Section","styles","tbody","sectionRef","stickyActive","config","value","dense","sticky"],"mappings":"AAAA;;AAEA,SAA8BA,UAAU,QAAQ,QAAQ;AAExD,SAASC,mBAAmB,QAAQ,kCAAkC;AACtE,SAASC,WAAW,QAAQ,yBAAyB;AACrD,SAASC,WAAW,QAAQ,yBAAyB;AAKrD,SAASC,qBAAqB,QAAQ,6BAA6B;AACnE,SAASC,qBAAqB,QAAQ,6BAA6B;AAmBnE;;;;;;;;;;CAUC,GACD,OAAO,MAAMC,mCAAqBN,WAGhC,SAASM,mBAAmBC,KAAK,EAAEC,GAAG;IACtC,MAAM,EACJC,IAAI,EACJC,SAAS,EACTC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACRC,aAAa,EACbC,cAAc,EACdC,sBAAsB,KAAK,EAC3BC,qBAAqB,EACrB,GAAGC,WACJ,GAAGX;IAEJ,MAAMY,WAAWV,SAAS;IAC1B,MAAMW,UAAUD,WAAW,UAAU;IACrC,MAAME,SAASF,WAAWhB,cAAcD;IACxC,MAAM,EAAEoB,KAAK,EAAEC,UAAU,EAAEC,YAAY,EAAE,GAAGpB,sBAAsB;QAChEI;QACAC;QACAK;QACAC;QACAC;QACAC;IACF;IACA,MAAMQ,SAASpB,sBAAsB;QACnCI;QACAG;QACAD;IACF;IAEA,qBACE,MAACV;QAAoByB,OAAOD;;YACzB,CAACN,YAAYG;0BACd,KAACF;gBACE,GAAGF,SAAS;gBACbV,KAAKe;gBACLb,WAAWW,OAAO;oBAChBX;oBACAiB,OAAOF,OAAOE,KAAK;oBACnBC,QAAQ;oBACRJ;oBACAP;gBACF;0BAECJ;;YAEFM,YAAYG;;;AAGnB,GAAG"}
|
package/dist/table/Table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/table/Table.tsx"],"sourcesContent":["\"use client\";\n\nimport { type TableHTMLAttributes, forwardRef, useMemo } from \"react\";\n\nimport { TableConfigProvider } from \"./TableConfigurationProvider.js\";\nimport { table } from \"./tableStyles.js\";\nimport { type TableConfigContext, type TableConfiguration } from \"./types.js\";\n\ndeclare module \"react\" {\n interface CSSProperties {\n \"--rmd-table-background-color\"?: string;\n \"--rmd-table-border-size\"?: string | number;\n \"--rmd-table-border-color\"?: string;\n \"--rmd-table-header-background-color\"?: string;\n \"--rmd-table-cell-color\"?: string;\n \"--rmd-table-cell-height\"?: string | number;\n \"--rmd-table-cell-horizontal-padding\"?: string | number;\n \"--rmd-table-cell-vertical-padding\"?: string | number;\n \"--rmd-table-header-cell-height\"?: string | number;\n \"--rmd-table-hover-color\"?: string;\n \"--rmd-table-selected-color\"?: string;\n \"--rmd-table-sticky-cell\"?: string | number;\n \"--rmd-table-sticky-header\"?: string | number;\n \"--rmd-table-sticky-footer\"?: string | number;\n \"--rmd-table-sticky-background-color\"?: string;\n }\n}\n\nexport interface TableProps\n extends TableHTMLAttributes<HTMLTableElement
|
|
1
|
+
{"version":3,"sources":["../../src/table/Table.tsx"],"sourcesContent":["\"use client\";\n\nimport { type TableHTMLAttributes, forwardRef, useMemo } from \"react\";\n\nimport { TableConfigProvider } from \"./TableConfigurationProvider.js\";\nimport { table } from \"./tableStyles.js\";\nimport { type TableConfigContext, type TableConfiguration } from \"./types.js\";\n\ndeclare module \"react\" {\n interface CSSProperties {\n \"--rmd-table-background-color\"?: string;\n \"--rmd-table-border-size\"?: string | number;\n \"--rmd-table-border-color\"?: string;\n \"--rmd-table-header-background-color\"?: string;\n \"--rmd-table-cell-color\"?: string;\n \"--rmd-table-cell-height\"?: string | number;\n \"--rmd-table-cell-horizontal-padding\"?: string | number;\n \"--rmd-table-cell-vertical-padding\"?: string | number;\n \"--rmd-table-header-cell-height\"?: string | number;\n \"--rmd-table-hover-color\"?: string;\n \"--rmd-table-selected-color\"?: string;\n \"--rmd-table-sticky-cell\"?: string | number;\n \"--rmd-table-sticky-header\"?: string | number;\n \"--rmd-table-sticky-footer\"?: string | number;\n \"--rmd-table-sticky-background-color\"?: string;\n }\n}\n\nexport interface TableProps\n extends TableHTMLAttributes<HTMLTableElement>, TableConfiguration {}\n\n/**\n * **Client Component**\n *\n * @example Responsive Example\n * ```tsx\n * import { Table } from \"@react-md/core/table/Table\";\n * import { TableBody } from \"@react-md/core/table/TableBody\";\n * import { TableCell } from \"@react-md/core/table/TableCell\";\n * import { TableContainer } from \"@react-md/core/table/TableContainer\";\n * import { TableHeader } from \"@react-md/core/table/TableHeader\";\n * import { TableRow } from \"@react-md/core/table/TableRow\";\n * import type { ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * return (\n * <TableContainer>\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableCell>Header 1</TableCell>\n * <TableCell>Header 2</TableCell>\n * <TableCell>Header 3</TableCell>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>Row 1 Cell 1</TableCell>\n * <TableCell>Row 1 Cell 2</TableCell>\n * <TableCell>Row 1 Cell 3</TableCell>\n * </TableRow>\n * <TableRow>\n * <TableCell>Row 2 Cell 1</TableCell>\n * <TableCell>Row 2 Cell 2</TableCell>\n * <TableCell>Row 2 Cell 3</TableCell>\n * </TableRow>\n * <TableRow>\n * <TableCell>Row 3 Cell 1</TableCell>\n * <TableCell>Row 3 Cell 2</TableCell>\n * <TableCell>Row 3 Cell 3</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * </TableContainer>\n * );\n * }\n * ```\n *\n * @see {@link https://react-md.dev/components/table | Table Demos}\n */\nexport const Table = forwardRef<HTMLTableElement, TableProps>(\n function Table(props, ref) {\n const {\n className,\n children,\n dense = false,\n hAlign = \"left\",\n vAlign = \"middle\",\n lineWrap = false,\n fullWidth = false,\n disableHover = false,\n disableBorders = false,\n ...remaining\n } = props;\n\n const configuration = useMemo<TableConfigContext>(\n () => ({\n dense,\n header: false,\n hAlign,\n vAlign,\n lineWrap,\n disableHover,\n disableBorders,\n }),\n [dense, hAlign, vAlign, lineWrap, disableHover, disableBorders]\n );\n\n return (\n <TableConfigProvider value={configuration}>\n <table\n {...remaining}\n ref={ref}\n className={table({ dense, fullWidth, className })}\n >\n {children}\n </table>\n </TableConfigProvider>\n );\n }\n);\n"],"names":["forwardRef","useMemo","TableConfigProvider","table","Table","props","ref","className","children","dense","hAlign","vAlign","lineWrap","fullWidth","disableHover","disableBorders","remaining","configuration","header","value"],"mappings":"AAAA;;AAEA,SAAmCA,UAAU,EAAEC,OAAO,QAAQ,QAAQ;AAEtE,SAASC,mBAAmB,QAAQ,kCAAkC;AACtE,SAASC,KAAK,QAAQ,mBAAmB;AA0BzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDC,GACD,OAAO,MAAMC,sBAAQJ,WACnB,SAASI,MAAMC,KAAK,EAAEC,GAAG;IACvB,MAAM,EACJC,SAAS,EACTC,QAAQ,EACRC,QAAQ,KAAK,EACbC,SAAS,MAAM,EACfC,SAAS,QAAQ,EACjBC,WAAW,KAAK,EAChBC,YAAY,KAAK,EACjBC,eAAe,KAAK,EACpBC,iBAAiB,KAAK,EACtB,GAAGC,WACJ,GAAGX;IAEJ,MAAMY,gBAAgBhB,QACpB,IAAO,CAAA;YACLQ;YACAS,QAAQ;YACRR;YACAC;YACAC;YACAE;YACAC;QACF,CAAA,GACA;QAACN;QAAOC;QAAQC;QAAQC;QAAUE;QAAcC;KAAe;IAGjE,qBACE,KAACb;QAAoBiB,OAAOF;kBAC1B,cAAA,KAACd;YACE,GAAGa,SAAS;YACbV,KAAKA;YACLC,WAAWJ,MAAM;gBAAEM;gBAAOI;gBAAWN;YAAU;sBAE9CC;;;AAIT,GACA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/table/TableBody.tsx"],"sourcesContent":["\"use client\";\n\nimport { cnb } from \"cnbuilder\";\nimport { type HTMLAttributes, forwardRef, useMemo } from \"react\";\n\nimport {\n TableConfigProvider,\n useTableConfig,\n} from \"./TableConfigurationProvider.js\";\nimport { type TableConfig, type TableConfigContext } from \"./types.js\";\n\nexport interface TableBodyProps\n extends
|
|
1
|
+
{"version":3,"sources":["../../src/table/TableBody.tsx"],"sourcesContent":["\"use client\";\n\nimport { cnb } from \"cnbuilder\";\nimport { type HTMLAttributes, forwardRef, useMemo } from \"react\";\n\nimport {\n TableConfigProvider,\n useTableConfig,\n} from \"./TableConfigurationProvider.js\";\nimport { type TableConfig, type TableConfigContext } from \"./types.js\";\n\nexport interface TableBodyProps\n extends\n HTMLAttributes<HTMLTableSectionElement>,\n Omit<TableConfig, \"header\"> {}\n\n/**\n * **Client Component**\n *\n * Creates a `<tbody>` element that also allows for overriding all the child\n * `TableCell` components with additional styling behavior.\n *\n * @see {@link https://react-md.dev/components/table | Table Demos}\n */\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(\n function TableBody(props, ref) {\n const {\n className,\n children,\n hAlign: propHAlign,\n vAlign: propVAlign,\n lineWrap: propLineWrap,\n disableHover: propDisableHover,\n disableBorders: propDisableBorders,\n ...remaining\n } = props;\n\n // update the table configuration with the custom overrides for the `<thead>`\n const { dense, hAlign, vAlign, lineWrap, disableHover, disableBorders } =\n useTableConfig({\n hAlign: propHAlign,\n vAlign: propVAlign,\n lineWrap: propLineWrap,\n disableHover: propDisableHover,\n disableBorders: propDisableBorders,\n });\n\n const configuration = useMemo<TableConfigContext>(\n () => ({\n header: false,\n dense,\n hAlign,\n vAlign,\n lineWrap,\n disableBorders,\n disableHover,\n }),\n [dense, hAlign, vAlign, lineWrap, disableBorders, disableHover]\n );\n\n return (\n <TableConfigProvider value={configuration}>\n <tbody {...remaining} ref={ref} className={cnb(\"rmd-tbody\", className)}>\n {children}\n </tbody>\n </TableConfigProvider>\n );\n }\n);\n"],"names":["cnb","forwardRef","useMemo","TableConfigProvider","useTableConfig","TableBody","props","ref","className","children","hAlign","propHAlign","vAlign","propVAlign","lineWrap","propLineWrap","disableHover","propDisableHover","disableBorders","propDisableBorders","remaining","dense","configuration","header","value","tbody"],"mappings":"AAAA;;AAEA,SAASA,GAAG,QAAQ,YAAY;AAChC,SAA8BC,UAAU,EAAEC,OAAO,QAAQ,QAAQ;AAEjE,SACEC,mBAAmB,EACnBC,cAAc,QACT,kCAAkC;AAQzC;;;;;;;CAOC,GACD,OAAO,MAAMC,0BAAYJ,WACvB,SAASI,UAAUC,KAAK,EAAEC,GAAG;IAC3B,MAAM,EACJC,SAAS,EACTC,QAAQ,EACRC,QAAQC,UAAU,EAClBC,QAAQC,UAAU,EAClBC,UAAUC,YAAY,EACtBC,cAAcC,gBAAgB,EAC9BC,gBAAgBC,kBAAkB,EAClC,GAAGC,WACJ,GAAGd;IAEJ,6EAA6E;IAC7E,MAAM,EAAEe,KAAK,EAAEX,MAAM,EAAEE,MAAM,EAAEE,QAAQ,EAAEE,YAAY,EAAEE,cAAc,EAAE,GACrEd,eAAe;QACbM,QAAQC;QACRC,QAAQC;QACRC,UAAUC;QACVC,cAAcC;QACdC,gBAAgBC;IAClB;IAEF,MAAMG,gBAAgBpB,QACpB,IAAO,CAAA;YACLqB,QAAQ;YACRF;YACAX;YACAE;YACAE;YACAI;YACAF;QACF,CAAA,GACA;QAACK;QAAOX;QAAQE;QAAQE;QAAUI;QAAgBF;KAAa;IAGjE,qBACE,KAACb;QAAoBqB,OAAOF;kBAC1B,cAAA,KAACG;YAAO,GAAGL,SAAS;YAAEb,KAAKA;YAAKC,WAAWR,IAAI,aAAaQ;sBACzDC;;;AAIT,GACA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/table/TableCellContent.tsx"],"sourcesContent":["import { cnb } from \"cnbuilder\";\nimport { type ButtonHTMLAttributes, type ReactNode, forwardRef } from \"react\";\n\nimport { ButtonUnstyled } from \"../button/ButtonUnstyled.js\";\nimport { IconRotator, type IconRotatorProps } from \"../icon/IconRotator.js\";\nimport { bem } from \"../utils/bem.js\";\nimport { type SortOrder, type TableCellHorizontalAlignment } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport type TableCellContentsIconRotatorProps = Omit<\n IconRotatorProps,\n \"children\" | \"rotated\"\n>;\n\n/**\n * @since 6.0.0 Extends the `ButtonHTMLAttributes` so the extra props\n * can be passed to the `ButtonUnstyled`\n * @internal\n */\nexport interface TableCellContentProps
|
|
1
|
+
{"version":3,"sources":["../../src/table/TableCellContent.tsx"],"sourcesContent":["import { cnb } from \"cnbuilder\";\nimport { type ButtonHTMLAttributes, type ReactNode, forwardRef } from \"react\";\n\nimport { ButtonUnstyled } from \"../button/ButtonUnstyled.js\";\nimport { IconRotator, type IconRotatorProps } from \"../icon/IconRotator.js\";\nimport { bem } from \"../utils/bem.js\";\nimport { type SortOrder, type TableCellHorizontalAlignment } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport type TableCellContentsIconRotatorProps = Omit<\n IconRotatorProps,\n \"children\" | \"rotated\"\n>;\n\n/**\n * @since 6.0.0 Extends the `ButtonHTMLAttributes` so the extra props\n * can be passed to the `ButtonUnstyled`\n * @internal\n */\nexport interface TableCellContentProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * The current sort order for this cell. Setting this to `null` will prevent\n * the button from being rendered.\n */\n sortOrder?: SortOrder;\n\n /**\n * This should normally be the `getIcon(\"sort\")`\n */\n icon?: ReactNode;\n\n /** @defaultValue `false` */\n iconAfter?: boolean;\n\n /**\n * Boolean if the icon should be rotated.\n */\n rotated?: boolean;\n\n /**\n * Any additional props to pass to the `IconRotator`.\n */\n iconRotatorProps?: TableCellContentsIconRotatorProps;\n\n /**\n * @since 4.0.3\n * @see {@link TableCellHorizontalAlignment}\n */\n hAlign?: TableCellHorizontalAlignment;\n}\n\nconst styles = bem(\"rmd-table-cell\");\n\n/**\n * This is mostly an internal component since it is automatically used within\n * the `TableCell` component but this will conditionally wrap the `children`\n * within an `UnstyledButton` to make a clickable cell. This is really to help\n * with sort behavior within headers.\n *\n * @internal\n */\nexport const TableCellContent = forwardRef<\n HTMLButtonElement,\n TableCellContentProps\n>(function TableCellContent(props, ref) {\n const {\n icon: propIcon,\n style,\n className,\n sortOrder,\n children,\n rotated: propRotated,\n hAlign = \"left\",\n iconAfter,\n iconRotatorProps,\n ...remaining\n } = props;\n if (!sortOrder || propIcon === null) {\n return <>{children}</>;\n }\n\n let icon: ReactNode = null;\n if (sortOrder !== \"none\") {\n const rotated = propRotated ?? sortOrder === \"descending\";\n\n icon = (\n <IconRotator {...iconRotatorProps} rotated={rotated}>\n {propIcon}\n </IconRotator>\n );\n }\n\n return (\n <ButtonUnstyled\n {...remaining}\n ref={ref}\n style={style}\n className={cnb(\n styles(\"content\", {\n [hAlign]: hAlign !== \"left\",\n }),\n className\n )}\n >\n {!iconAfter && icon}\n {children}\n {iconAfter && icon}\n </ButtonUnstyled>\n );\n});\n"],"names":["cnb","forwardRef","ButtonUnstyled","IconRotator","bem","styles","TableCellContent","props","ref","icon","propIcon","style","className","sortOrder","children","rotated","propRotated","hAlign","iconAfter","iconRotatorProps","remaining"],"mappings":";AAAA,SAASA,GAAG,QAAQ,YAAY;AAChC,SAAoDC,UAAU,QAAQ,QAAQ;AAE9E,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,WAAW,QAA+B,yBAAyB;AAC5E,SAASC,GAAG,QAAQ,kBAAkB;AAgDtC,MAAMC,SAASD,IAAI;AAEnB;;;;;;;CAOC,GACD,OAAO,MAAME,iCAAmBL,WAG9B,SAASK,iBAAiBC,KAAK,EAAEC,GAAG;IACpC,MAAM,EACJC,MAAMC,QAAQ,EACdC,KAAK,EACLC,SAAS,EACTC,SAAS,EACTC,QAAQ,EACRC,SAASC,WAAW,EACpBC,SAAS,MAAM,EACfC,SAAS,EACTC,gBAAgB,EAChB,GAAGC,WACJ,GAAGb;IACJ,IAAI,CAACM,aAAaH,aAAa,MAAM;QACnC,qBAAO;sBAAGI;;IACZ;IAEA,IAAIL,OAAkB;IACtB,IAAII,cAAc,QAAQ;QACxB,MAAME,UAAUC,eAAeH,cAAc;QAE7CJ,qBACE,KAACN;YAAa,GAAGgB,gBAAgB;YAAEJ,SAASA;sBACzCL;;IAGP;IAEA,qBACE,MAACR;QACE,GAAGkB,SAAS;QACbZ,KAAKA;QACLG,OAAOA;QACPC,WAAWZ,IACTK,OAAO,WAAW;YAChB,CAACY,OAAO,EAAEA,WAAW;QACvB,IACAL;;YAGD,CAACM,aAAaT;YACdK;YACAI,aAAaT;;;AAGpB,GAAG"}
|