@react-md/core 6.3.4 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CoreProviders.d.ts +1 -0
- package/dist/CoreProviders.js.map +1 -1
- package/dist/_base.scss +3 -0
- package/dist/_core.scss +1 -0
- package/dist/_utils.scss +15 -7
- package/dist/app-bar/AppBar.js.map +1 -1
- package/dist/app-bar/AppBarTitle.js.map +1 -1
- package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -1
- package/dist/autocomplete/types.js.map +1 -1
- package/dist/autocomplete/utils.js.map +1 -1
- package/dist/avatar/Avatar.js.map +1 -1
- package/dist/button/Button.js.map +1 -1
- package/dist/button/FloatingActionButton.js.map +1 -1
- package/dist/card/Card.js.map +1 -1
- package/dist/card/CardContent.js.map +1 -1
- package/dist/card/ClickableCard.js.map +1 -1
- package/dist/chip/Chip.js.map +1 -1
- package/dist/datetime/NativeDateField.js.map +1 -1
- package/dist/datetime/NativeTimeField.js.map +1 -1
- package/dist/datetime/useDateField.js.map +1 -1
- package/dist/datetime/useTimeField.js.map +1 -1
- package/dist/dialog/Dialog.js.map +1 -1
- package/dist/dialog/DialogContainer.js.map +1 -1
- package/dist/dialog/DialogContent.js.map +1 -1
- package/dist/dialog/DialogFooter.js.map +1 -1
- package/dist/divider/Divider.js.map +1 -1
- package/dist/draggable/useDraggable.js.map +1 -1
- package/dist/draggable/utils.js.map +1 -1
- package/dist/expansion-panel/ExpansionPanelHeader.js.map +1 -1
- package/dist/files/FileInput.js.map +1 -1
- package/dist/files/useFileUpload.js.map +1 -1
- package/dist/files/validation.js.map +1 -1
- package/dist/focus/useFocusContainer.js.map +1 -1
- package/dist/form/Fieldset.d.ts +19 -0
- package/dist/form/Fieldset.js +22 -2
- package/dist/form/Fieldset.js.map +1 -1
- package/dist/form/FormMessageContainer.js.map +1 -1
- package/dist/form/FormMessageCounter.js.map +1 -1
- package/dist/form/InputToggle.js.map +1 -1
- package/dist/form/Legend.d.ts +27 -5
- package/dist/form/Legend.js +39 -6
- package/dist/form/Legend.js.map +1 -1
- package/dist/form/Listbox.js.map +1 -1
- package/dist/form/ListboxProvider.js.map +1 -1
- package/dist/form/NativeSelect.js.map +1 -1
- package/dist/form/Password.js.map +1 -1
- package/dist/form/ResizingTextAreaWrapper.js.map +1 -1
- package/dist/form/Select.js.map +1 -1
- package/dist/form/Slider.js.map +1 -1
- package/dist/form/SliderContainer.js.map +1 -1
- package/dist/form/SliderThumb.js.map +1 -1
- package/dist/form/SliderTrack.js.map +1 -1
- package/dist/form/SliderValueMarks.js.map +1 -1
- package/dist/form/Switch.js.map +1 -1
- package/dist/form/TextArea.js.map +1 -1
- package/dist/form/TextField.js.map +1 -1
- package/dist/form/TextFieldContainer.js.map +1 -1
- package/dist/form/_fieldset.scss +7 -0
- package/dist/form/_legend.scss +68 -0
- package/dist/form/_text-field.scss +39 -4
- package/dist/form/fieldsetStyles.d.ts +6 -1
- package/dist/form/fieldsetStyles.js +3 -2
- package/dist/form/fieldsetStyles.js.map +1 -1
- package/dist/form/inputToggleStyles.js.map +1 -1
- package/dist/form/labelStyles.d.ts +1 -1
- package/dist/form/labelStyles.js +1 -1
- package/dist/form/labelStyles.js.map +1 -1
- package/dist/form/legendStyles.d.ts +83 -0
- package/dist/form/legendStyles.js +25 -0
- package/dist/form/legendStyles.js.map +1 -0
- package/dist/form/selectUtils.js.map +1 -1
- package/dist/form/textFieldContainerStyles.js.map +1 -1
- package/dist/form/types.d.ts +28 -6
- package/dist/form/types.js.map +1 -1
- package/dist/form/useCheckboxGroup.js.map +1 -1
- package/dist/form/useCombobox.js.map +1 -1
- package/dist/form/useNumberField.js +16 -19
- package/dist/form/useNumberField.js.map +1 -1
- package/dist/form/useRangeSlider.js.map +1 -1
- package/dist/form/useSlider.js.map +1 -1
- package/dist/form/useTextField.js.map +1 -1
- package/dist/hoverMode/useHoverMode.js.map +1 -1
- package/dist/icon/FontIcon.js.map +1 -1
- package/dist/icon/IconRotator.js.map +1 -1
- package/dist/icon/MaterialIcon.js.map +1 -1
- package/dist/icon/MaterialSymbol.js.map +1 -1
- package/dist/icon/SVGIcon.js.map +1 -1
- package/dist/icon/config.d.ts +0 -1
- package/dist/icon/config.js +10 -7
- package/dist/icon/config.js.map +1 -1
- package/dist/icon/materialConfig.js.map +1 -1
- package/dist/icon/styles.js.map +1 -1
- package/dist/interaction/UserInteractionModeProvider.js +6 -4
- package/dist/interaction/UserInteractionModeProvider.js.map +1 -1
- package/dist/interaction/types.js.map +1 -1
- package/dist/interaction/useElementInteraction.js.map +1 -1
- package/dist/layout/LayoutAppBar.d.ts +6 -6
- package/dist/layout/LayoutAppBar.js +6 -6
- package/dist/layout/LayoutAppBar.js.map +1 -1
- package/dist/layout/LayoutNav.js.map +1 -1
- package/dist/layout/LayoutWindowSplitter.js.map +1 -1
- package/dist/layout/Main.js.map +1 -1
- package/dist/layout/useExpandableLayout.js +43 -0
- package/dist/layout/useExpandableLayout.js.map +1 -1
- package/dist/layout/useHorizontalLayoutTransition.js.map +1 -1
- package/dist/layout/useLayoutTree.js.map +1 -1
- package/dist/layout/useLayoutWindowSplitter.js.map +1 -1
- package/dist/layout/useResizableLayout.js.map +1 -1
- package/dist/link/Link.js.map +1 -1
- package/dist/link/SkipToMainContent.js +19 -21
- package/dist/link/SkipToMainContent.js.map +1 -1
- package/dist/list/List.js.map +1 -1
- package/dist/list/ListItem.js.map +1 -1
- package/dist/list/ListItemAddon.js.map +1 -1
- package/dist/list/ListItemLink.js.map +1 -1
- package/dist/list/ListSubheader.js.map +1 -1
- package/dist/list/getListItemHeight.js.map +1 -1
- package/dist/list/listItemStyles.js.map +1 -1
- package/dist/list/types.js.map +1 -1
- package/dist/media-queries/AppSizeProvider.d.ts +2 -0
- package/dist/media-queries/AppSizeProvider.js +3 -2
- package/dist/media-queries/AppSizeProvider.js.map +1 -1
- package/dist/media-queries/appSize.d.ts +3 -0
- package/dist/media-queries/appSize.js +3 -1
- package/dist/media-queries/appSize.js.map +1 -1
- package/dist/media-queries/config.d.ts +11 -0
- package/dist/media-queries/config.js +26 -0
- package/dist/media-queries/config.js.map +1 -0
- package/dist/menu/DropdownMenu.js.map +1 -1
- package/dist/menu/Menu.js.map +1 -1
- package/dist/menu/MenuItemButton.js.map +1 -1
- package/dist/menu/MenuItemFileInput.js.map +1 -1
- package/dist/menu/MenuItemInputToggle.js.map +1 -1
- package/dist/menu/MenuItemSeparator.js.map +1 -1
- package/dist/menu/MenuVisibilityProvider.js.map +1 -1
- package/dist/menu/MenuWidget.js.map +1 -1
- package/dist/menu/useContextMenu.js.map +1 -1
- package/dist/movement/types.d.ts +28 -3
- package/dist/movement/types.js.map +1 -1
- package/dist/movement/useKeyboardMovementProvider.js +96 -47
- package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
- package/dist/navigation/CollapsibleNavGroup.js.map +1 -1
- package/dist/navigation/NavItem.js.map +1 -1
- package/dist/navigation/NavItemButton.js.map +1 -1
- package/dist/navigation/NavItemLink.js.map +1 -1
- package/dist/navigation/getTableOfContentsHeadings.js.map +1 -1
- package/dist/navigation/types.js.map +1 -1
- package/dist/overlay/Overlay.js.map +1 -1
- package/dist/positioning/createHorizontalPosition.js.map +1 -1
- package/dist/positioning/createVerticalPosition.js.map +1 -1
- package/dist/positioning/useFixedPositioning.js.map +1 -1
- package/dist/progress/CircularProgress.js.map +1 -1
- package/dist/progress/LinearProgress.js.map +1 -1
- package/dist/progress/linearProgressStyles.js.map +1 -1
- package/dist/responsive-item/ResponsiveItem.js.map +1 -1
- package/dist/responsive-item/ResponsiveItemOverlay.js.map +1 -1
- package/dist/searching/caseInsensitive.js.map +1 -1
- package/dist/segmented-button/SegmentedButton.js.map +1 -1
- package/dist/segmented-button/SegmentedButtonContainer.js.map +1 -1
- package/dist/segmented-button/segmentedButtonStyles.js.map +1 -1
- package/dist/sheet/Sheet.js.map +1 -1
- package/dist/snackbar/Toast.js.map +1 -1
- package/dist/spinbutton/SpinButton.d.ts +16 -0
- package/dist/spinbutton/SpinButton.js +55 -0
- package/dist/spinbutton/SpinButton.js.map +1 -0
- package/dist/spinbutton/SpinButtonGroupProvider.d.ts +17 -0
- package/dist/spinbutton/SpinButtonGroupProvider.js +19 -0
- package/dist/spinbutton/SpinButtonGroupProvider.js.map +1 -0
- package/dist/spinbutton/defaults.d.ts +9 -0
- package/dist/spinbutton/defaults.js +25 -0
- package/dist/spinbutton/defaults.js.map +1 -0
- package/dist/spinbutton/types.d.ts +324 -0
- package/dist/spinbutton/types.js +5 -0
- package/dist/spinbutton/types.js.map +1 -0
- package/dist/spinbutton/useSpinButton.d.ts +5 -0
- package/dist/spinbutton/useSpinButton.js +260 -0
- package/dist/spinbutton/useSpinButton.js.map +1 -0
- package/dist/spinbutton/useSpinButtonGroupProvider.d.ts +27 -0
- package/dist/spinbutton/useSpinButtonGroupProvider.js +49 -0
- package/dist/spinbutton/useSpinButtonGroupProvider.js.map +1 -0
- package/dist/spinbutton/utils/deselectNode.d.ts +5 -0
- package/dist/spinbutton/utils/deselectNode.js +17 -0
- package/dist/spinbutton/utils/deselectNode.js.map +1 -0
- package/dist/spinbutton/utils/resolveInputEvent.d.ts +30 -0
- package/dist/spinbutton/utils/resolveInputEvent.js +53 -0
- package/dist/spinbutton/utils/resolveInputEvent.js.map +1 -0
- package/dist/spinbutton/utils/selectNode.d.ts +5 -0
- package/dist/spinbutton/utils/selectNode.js +15 -0
- package/dist/spinbutton/utils/selectNode.js.map +1 -0
- package/dist/table/StickyTableSection.js.map +1 -1
- package/dist/table/Table.js.map +1 -1
- package/dist/table/TableBody.js.map +1 -1
- package/dist/table/TableCellContent.js.map +1 -1
- package/dist/table/TableCheckbox.js.map +1 -1
- package/dist/table/TableFooter.js.map +1 -1
- package/dist/table/TableHeader.js.map +1 -1
- package/dist/table/TableRadio.js.map +1 -1
- package/dist/table/TableRow.js.map +1 -1
- package/dist/table/useStickyTableSection.js.map +1 -1
- package/dist/tabs/SimpleTabPanel.js.map +1 -1
- package/dist/tabs/SimpleTabPanels.js.map +1 -1
- package/dist/tabs/Tab.js.map +1 -1
- package/dist/tabs/TabList.js.map +1 -1
- package/dist/tabs/TabListScrollButton.js.map +1 -1
- package/dist/tabs/useMaxTabPanelHeight.js.map +1 -1
- package/dist/test-utils/data-testid.js.map +1 -1
- package/dist/test-utils/mocks/match-media.js +5 -5
- package/dist/test-utils/mocks/match-media.js.map +1 -1
- package/dist/test-utils/vitest/timers.d.ts +1 -1
- package/dist/test-utils/vitest/timers.js +1 -1
- package/dist/test-utils/vitest/timers.js.map +1 -1
- package/dist/tooltip/Tooltip.js.map +1 -1
- package/dist/tooltip/TooltipHoverModeProvider.js.map +1 -1
- package/dist/tooltip/useTooltip.js.map +1 -1
- package/dist/transition/CSSTransition.js.map +1 -1
- package/dist/transition/Collapse.js.map +1 -1
- package/dist/transition/CrossFade.js.map +1 -1
- package/dist/transition/ScaleTransition.js.map +1 -1
- package/dist/transition/SkeletonPlaceholder.js.map +1 -1
- package/dist/transition/Slide.js.map +1 -1
- package/dist/transition/SlideContainer.js.map +1 -1
- package/dist/transition/types.js.map +1 -1
- package/dist/transition/useCollapseTransition.js.map +1 -1
- package/dist/transition/useCrossFadeTransition.js.map +1 -1
- package/dist/transition/useMaxWidthTransition.js.map +1 -1
- package/dist/transition/useScaleTransition.js.map +1 -1
- package/dist/transition/useSkeletonPlaceholder.js.map +1 -1
- package/dist/tree/Tree.js.map +1 -1
- package/dist/tree/TreeItem.js.map +1 -1
- package/dist/tree/TreeProvider.js.map +1 -1
- package/dist/tree/styles.js.map +1 -1
- package/dist/tree/types.js.map +1 -1
- package/dist/tree/useTreeMovement.js.map +1 -1
- package/dist/typography/HighlightTextMark.js.map +1 -1
- package/dist/typography/Mark.js.map +1 -1
- package/dist/typography/TextContainer.js.map +1 -1
- package/dist/typography/Typography.js.map +1 -1
- package/dist/typography/_typography.scss +0 -1
- package/dist/useElementSize.js.map +1 -1
- package/dist/useIntersectionObserver.js.map +1 -1
- package/dist/useMutationObserver.js.map +1 -1
- package/dist/useWindowSize.js.map +1 -1
- package/dist/utils/getNumberOfDigits.d.ts +7 -0
- package/dist/utils/getNumberOfDigits.js +11 -0
- package/dist/utils/getNumberOfDigits.js.map +1 -0
- package/dist/utils/nearest.js +2 -1
- package/dist/utils/nearest.js.map +1 -1
- package/dist/utils/useDevEffect.d.ts +7 -0
- package/dist/utils/useDevEffect.js +8 -0
- package/dist/utils/useDevEffect.js.map +1 -0
- package/dist/window-splitter/WindowSplitter.js +3 -2
- package/dist/window-splitter/WindowSplitter.js.map +1 -1
- package/dist/window-splitter/_window-splitter.scss +60 -12
- package/dist/window-splitter/styles.d.ts +9 -0
- package/dist/window-splitter/styles.js +3 -2
- package/dist/window-splitter/styles.js.map +1 -1
- package/dist/window-splitter/useWindowSplitter.js.map +1 -1
- package/package.json +37 -29
- 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 +2 -1
- package/src/form/Slider.tsx +2 -1
- package/src/form/SliderContainer.tsx +1 -2
- package/src/form/SliderThumb.tsx +6 -3
- package/src/form/SliderTrack.tsx +2 -1
- package/src/form/SliderValueMarks.tsx +1 -2
- package/src/form/Switch.tsx +2 -1
- package/src/form/TextArea.tsx +1 -2
- package/src/form/TextField.tsx +2 -1
- package/src/form/TextFieldContainer.tsx +1 -2
- package/src/form/fieldsetStyles.ts +18 -3
- package/src/form/inputToggleStyles.ts +4 -2
- package/src/form/labelStyles.ts +1 -1
- package/src/form/legendStyles.ts +132 -0
- package/src/form/selectUtils.ts +3 -2
- package/src/form/textFieldContainerStyles.ts +1 -2
- package/src/form/types.ts +35 -17
- package/src/form/useCheckboxGroup.ts +3 -2
- package/src/form/useCombobox.ts +8 -3
- package/src/form/useNumberField.ts +36 -35
- package/src/form/useRangeSlider.ts +1 -2
- package/src/form/useSlider.ts +1 -2
- package/src/form/useTextField.ts +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"}
|