@salt-ds/lab 1.0.0-alpha.67 → 1.0.0-alpha.69
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/CHANGELOG.md +179 -0
- package/css/salt-lab.css +24 -190
- package/dist-cjs/breadcrumbs/internal/BreadcrumbsContext.js.map +1 -1
- package/dist-cjs/button-bar/ButtonBar.js.map +1 -1
- package/dist-cjs/button-bar/OrderedButton.js.map +1 -1
- package/dist-cjs/button-bar/internal/useDescendant.js.map +1 -1
- package/dist-cjs/calendar/Calendar.js +23 -8
- package/dist-cjs/calendar/Calendar.js.map +1 -1
- package/dist-cjs/calendar/CalendarGrid.js +56 -80
- package/dist-cjs/calendar/CalendarGrid.js.map +1 -1
- package/dist-cjs/calendar/CalendarMonthHeader.css.js +6 -0
- package/dist-cjs/calendar/CalendarMonthHeader.css.js.map +1 -0
- package/dist-cjs/calendar/CalendarMonthHeader.js +48 -0
- package/dist-cjs/calendar/CalendarMonthHeader.js.map +1 -0
- package/dist-cjs/calendar/CalendarNavigation.js +30 -39
- package/dist-cjs/calendar/CalendarNavigation.js.map +1 -1
- package/dist-cjs/calendar/CalendarWeekHeader.js +2 -6
- package/dist-cjs/calendar/CalendarWeekHeader.js.map +1 -1
- package/dist-cjs/calendar/internal/CalendarContext.js +3 -1
- package/dist-cjs/calendar/internal/CalendarContext.js.map +1 -1
- package/dist-cjs/calendar/internal/CalendarDay.css.js +1 -1
- package/dist-cjs/calendar/internal/CalendarDay.js +88 -76
- package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -1
- package/dist-cjs/calendar/internal/CalendarMonth.js +13 -23
- package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -1
- package/dist-cjs/calendar/internal/useFocusManagement.js +5 -6
- package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -1
- package/dist-cjs/calendar/internal/utils.js +8 -12
- package/dist-cjs/calendar/internal/utils.js.map +1 -1
- package/dist-cjs/calendar/useCalendar.js +69 -109
- package/dist-cjs/calendar/useCalendar.js.map +1 -1
- package/dist-cjs/calendar/useCalendarDay.js +21 -18
- package/dist-cjs/calendar/useCalendarDay.js.map +1 -1
- package/dist-cjs/calendar/useCalendarSelection.js +146 -34
- package/dist-cjs/calendar/useCalendarSelection.js.map +1 -1
- package/dist-cjs/carousel/CarouselContext.js.map +1 -1
- package/dist-cjs/carousel/CarouselControls.js.map +1 -1
- package/dist-cjs/carousel/CarouselReducer.js.map +1 -1
- package/dist-cjs/carousel/CarouselSlide.js.map +1 -1
- package/dist-cjs/carousel/CarouselSlider.js.map +1 -1
- package/dist-cjs/cascading-menu/CascadingMenu.js.map +1 -1
- package/dist-cjs/cascading-menu/CascadingMenuItem.js.map +1 -1
- package/dist-cjs/cascading-menu/CascadingMenuList.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/keydownHandlers.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useClickAway.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useMouseHandlers.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useStateReducer.js.map +1 -1
- package/dist-cjs/cascading-menu/stateChangeTypes.js +0 -1
- package/dist-cjs/cascading-menu/stateChangeTypes.js.map +1 -1
- package/dist-cjs/color-chooser/Color.js.map +1 -1
- package/dist-cjs/color-chooser/ColorChooser.js.map +1 -1
- package/dist-cjs/color-chooser/ColorHelpers.js.map +1 -1
- package/dist-cjs/color-chooser/ColorPicker.js.map +1 -1
- package/dist-cjs/color-chooser/DictTabs.js.map +1 -1
- package/dist-cjs/color-chooser/HexInput.js.map +1 -1
- package/dist-cjs/color-chooser/Swatch.js.map +1 -1
- package/dist-cjs/color-chooser/Swatches.js.map +1 -1
- package/dist-cjs/color-chooser/SwatchesPicker.js.map +1 -1
- package/dist-cjs/combo-box/ComboBox.js +0 -2
- package/dist-cjs/combo-box/ComboBox.js.map +1 -1
- package/dist-cjs/combo-box/useCombobox.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js +0 -4
- package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js +0 -4
- package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/useComboBox.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/usePopperStatus.js.map +1 -1
- package/dist-cjs/common-hooks/calcPreferredHeight.js.map +1 -1
- package/dist-cjs/common-hooks/collectionProvider.js.map +1 -1
- package/dist-cjs/common-hooks/list-dom-utils.js.map +1 -1
- package/dist-cjs/common-hooks/selectionTypes.js.map +1 -1
- package/dist-cjs/common-hooks/useCollapsibleGroups.js.map +1 -1
- package/dist-cjs/common-hooks/useCollectionItems.js.map +1 -1
- package/dist-cjs/common-hooks/useImperativeScrollingAPI.js.map +1 -1
- package/dist-cjs/common-hooks/useKeyboardNavigation.js.map +1 -1
- package/dist-cjs/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
- package/dist-cjs/common-hooks/useSelection.js.map +1 -1
- package/dist-cjs/common-hooks/useTypeahead.js +1 -1
- package/dist-cjs/common-hooks/useTypeahead.js.map +1 -1
- package/dist-cjs/common-hooks/useViewportTracking.js.map +1 -1
- package/dist-cjs/common-hooks/utils/collection-item-utils.js.map +1 -1
- package/dist-cjs/contact-details/ContactPrimaryInfo.js.map +1 -1
- package/dist-cjs/contact-details/ContactSecondaryInfo.js.map +1 -1
- package/dist-cjs/contact-details/ContactTertiaryInfo.js.map +1 -1
- package/dist-cjs/contact-details/internal/ContactDetailsContext.js.map +1 -1
- package/dist-cjs/content-status/internal/StatusIndicator.js.map +1 -1
- package/dist-cjs/date-input/DateInputRange.js +61 -51
- package/dist-cjs/date-input/DateInputRange.js.map +1 -1
- package/dist-cjs/date-input/DateInputSingle.js +33 -18
- package/dist-cjs/date-input/DateInputSingle.js.map +1 -1
- package/dist-cjs/date-picker/DatePicker.js +9 -1
- package/dist-cjs/date-picker/DatePicker.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerActions.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerContext.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerHelperText.css.js +6 -0
- package/dist-cjs/date-picker/DatePickerHelperText.css.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerHelperText.js +36 -0
- package/dist-cjs/date-picker/DatePickerHelperText.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js +40 -16
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerPanel.css.js +1 -1
- package/dist-cjs/date-picker/DatePickerRangeGridPanel.js +247 -0
- package/dist-cjs/date-picker/DatePickerRangeGridPanel.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerRangeInput.js +38 -6
- package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerRangePanel.js +188 -32
- package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerSingleGridPanel.js +255 -0
- package/dist-cjs/date-picker/DatePickerSingleGridPanel.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerSingleInput.js +13 -5
- package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerSinglePanel.js +6 -105
- package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerTrigger.js.map +1 -1
- package/dist-cjs/date-picker/useDatePicker.js +71 -11
- package/dist-cjs/date-picker/useDatePicker.js.map +1 -1
- package/dist-cjs/date-picker/useFocusOut.js +43 -0
- package/dist-cjs/date-picker/useFocusOut.js.map +1 -0
- package/dist-cjs/date-picker/useKeyboard.js +4 -5
- package/dist-cjs/date-picker/useKeyboard.js.map +1 -1
- package/dist-cjs/deck-item/DeckItem.js.map +1 -1
- package/dist-cjs/deck-layout/DeckLayout.js.map +1 -1
- package/dist-cjs/dropdown/Dropdown.js +0 -1
- package/dist-cjs/dropdown/Dropdown.js.map +1 -1
- package/dist-cjs/dropdown/DropdownBase.js +0 -1
- package/dist-cjs/dropdown/DropdownBase.js.map +1 -1
- package/dist-cjs/dropdown/DropdownButton.js.map +1 -1
- package/dist-cjs/dropdown/useClickAway.js.map +1 -1
- package/dist-cjs/dropdown/useDropdown.js.map +1 -1
- package/dist-cjs/dropdown/useDropdownBase.js.map +1 -1
- package/dist-cjs/editable-label/EditableLabel.js.map +1 -1
- package/dist-cjs/form-field-legacy/FormFieldLegacy.js.map +1 -1
- package/dist-cjs/form-field-legacy/StatusIndicator.js.map +1 -1
- package/dist-cjs/formatted-input/FormattedInput.js.map +1 -1
- package/dist-cjs/index.js +8 -8
- package/dist-cjs/input-legacy/InputLegacy.js.map +1 -1
- package/dist-cjs/input-legacy/useCursorOnFocus.js.map +1 -1
- package/dist-cjs/list/Highlighter.js.map +1 -1
- package/dist-cjs/list/List.js.map +1 -1
- package/dist-cjs/list/ListItem.js.map +1 -1
- package/dist-cjs/list/VirtualizedList.js.map +1 -1
- package/dist-cjs/list/useList.js +0 -1
- package/dist-cjs/list/useList.js.map +1 -1
- package/dist-cjs/list/useListHeight.js.map +1 -1
- package/dist-cjs/list-deprecated/ListBase.js +1 -3
- package/dist-cjs/list-deprecated/ListBase.js.map +1 -1
- package/dist-cjs/list-deprecated/ListItem.js.map +1 -1
- package/dist-cjs/list-deprecated/ListItemBase.js.map +1 -1
- package/dist-cjs/list-deprecated/ListItemContext.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/DescendantContext.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/calcPreferredListHeight.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/useWidth.js.map +1 -1
- package/dist-cjs/list-deprecated/useList.js.map +1 -1
- package/dist-cjs/list-deprecated/useListItem.js.map +1 -1
- package/dist-cjs/list-deprecated/useTypeSelect.js.map +1 -1
- package/dist-cjs/list-next/ListItemNext.js.map +1 -1
- package/dist-cjs/list-next/ListNext.js.map +1 -1
- package/dist-cjs/list-next/ListNextContext.js.map +1 -1
- package/dist-cjs/list-next/useList.js.map +1 -1
- package/dist-cjs/localization-provider/LocalizationProvider.js +5 -2
- package/dist-cjs/localization-provider/LocalizationProvider.js.map +1 -1
- package/dist-cjs/menu-button/MenuButton.js.map +1 -1
- package/dist-cjs/metric/MetricContent.js.map +1 -1
- package/dist-cjs/number-input/NumberInput.js.map +1 -1
- package/dist-cjs/number-input/useNumberInput.js.map +1 -1
- package/dist-cjs/query-input/internal/CategoryListContext.js.map +1 -1
- package/dist-cjs/query-input/internal/CategoryListItem.js.map +1 -1
- package/dist-cjs/query-input/internal/usePopperStatus.js +2 -2
- package/dist-cjs/query-input/internal/usePopperStatus.js.map +1 -1
- package/dist-cjs/query-input/useQueryInput.js +0 -1
- package/dist-cjs/query-input/useQueryInput.js.map +1 -1
- package/dist-cjs/responsive/OverflowReducer.js +1 -3
- package/dist-cjs/responsive/OverflowReducer.js.map +1 -1
- package/dist-cjs/responsive/useDynamicCollapse.js.map +1 -1
- package/dist-cjs/responsive/useInstantCollapse.js.map +1 -1
- package/dist-cjs/responsive/useOverflow.js.map +1 -1
- package/dist-cjs/responsive/useOverflowCollectionItems.js.map +1 -1
- package/dist-cjs/responsive/useOverflowLayout.js +0 -3
- package/dist-cjs/responsive/useOverflowLayout.js.map +1 -1
- package/dist-cjs/responsive/useReclaimSpace.js.map +1 -1
- package/dist-cjs/responsive/useResizeObserver.js.map +1 -1
- package/dist-cjs/responsive/useWidth.js.map +1 -1
- package/dist-cjs/responsive/utils.js.map +1 -1
- package/dist-cjs/search-input/SearchInput.js.map +1 -1
- package/dist-cjs/tabs/Tab.js.map +1 -1
- package/dist-cjs/tabs/Tabs.js.map +1 -1
- package/dist-cjs/tabs/Tabstrip.js +0 -1
- package/dist-cjs/tabs/Tabstrip.js.map +1 -1
- package/dist-cjs/tabs/drag-drop/useDragDropNaturalMovement.js.map +1 -1
- package/dist-cjs/tabs/drag-drop/useDragSpacers.js.map +1 -1
- package/dist-cjs/tabs/useEditableItem.js.map +1 -1
- package/dist-cjs/tabs/useKeyboardNavigation.js.map +1 -1
- package/dist-cjs/tabs/useSelection.js.map +1 -1
- package/dist-cjs/tabs/useTabs.js.map +1 -1
- package/dist-cjs/tabs/useTabstrip.js.map +1 -1
- package/dist-cjs/tabs-next/TabListNext.js.map +1 -1
- package/dist-cjs/tabs-next/TabNext.js.map +1 -1
- package/dist-cjs/tabs-next/TabNextAction.js.map +1 -1
- package/dist-cjs/tabs-next/TabNextContext.js.map +1 -1
- package/dist-cjs/tabs-next/TabNextPanel.js.map +1 -1
- package/dist-cjs/tabs-next/TabNextTrigger.js.map +1 -1
- package/dist-cjs/tabs-next/TabOverflowList.js.map +1 -1
- package/dist-cjs/tabs-next/TabsNext.js.map +1 -1
- package/dist-cjs/tabs-next/TabsNextContext.js.map +1 -1
- package/dist-cjs/tabs-next/hooks/useCollection.js +2 -2
- package/dist-cjs/tabs-next/hooks/useCollection.js.map +1 -1
- package/dist-cjs/tabs-next/hooks/useFocusOutside.js.map +1 -1
- package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
- package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js.map +1 -1
- package/dist-cjs/tokenized-input/TokenizedInputBase.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/InputPill.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/getCursorPosition.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/useResizeObserver.js.map +1 -1
- package/dist-cjs/tokenized-input/useTokenizedInput.js.map +1 -1
- package/dist-cjs/tokenized-input-next/TokenizedInputNext.js.map +1 -1
- package/dist-cjs/tokenized-input-next/internal/InputPill.js.map +1 -1
- package/dist-cjs/tokenized-input-next/internal/useResizeObserver.js.map +1 -1
- package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js +1 -1
- package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js.map +1 -1
- package/dist-cjs/toolbar/Tooltray.js.map +1 -1
- package/dist-cjs/toolbar/internal/renderToolbarItems.js.map +1 -1
- package/dist-cjs/toolbar/internal/renderTrayTools.js.map +1 -1
- package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
- package/dist-cjs/toolbar/toolbar-field/useToolbarField.js.map +1 -1
- package/dist-cjs/tree/Tree.js +2 -6
- package/dist-cjs/tree/Tree.js.map +1 -1
- package/dist-cjs/tree/TreeNode.js.map +1 -1
- package/dist-cjs/tree/use-tree-keyboard-navigation.js.map +1 -1
- package/dist-cjs/tree/useTree.js.map +1 -1
- package/dist-cjs/utils/useClickOutside.js.map +1 -1
- package/dist-cjs/utils/useSlideSelection.js.map +1 -1
- package/dist-cjs/window/ElectronWindow.js.map +1 -1
- package/dist-es/breadcrumbs/internal/BreadcrumbsContext.js.map +1 -1
- package/dist-es/button-bar/ButtonBar.js.map +1 -1
- package/dist-es/button-bar/OrderedButton.js.map +1 -1
- package/dist-es/button-bar/internal/useDescendant.js.map +1 -1
- package/dist-es/calendar/Calendar.js +24 -9
- package/dist-es/calendar/Calendar.js.map +1 -1
- package/dist-es/calendar/CalendarGrid.js +59 -83
- package/dist-es/calendar/CalendarGrid.js.map +1 -1
- package/dist-es/calendar/CalendarMonthHeader.css.js +4 -0
- package/dist-es/calendar/CalendarMonthHeader.css.js.map +1 -0
- package/dist-es/calendar/CalendarMonthHeader.js +46 -0
- package/dist-es/calendar/CalendarMonthHeader.js.map +1 -0
- package/dist-es/calendar/CalendarNavigation.js +30 -39
- package/dist-es/calendar/CalendarNavigation.js.map +1 -1
- package/dist-es/calendar/CalendarWeekHeader.js +2 -6
- package/dist-es/calendar/CalendarWeekHeader.js.map +1 -1
- package/dist-es/calendar/internal/CalendarContext.js +3 -1
- package/dist-es/calendar/internal/CalendarContext.js.map +1 -1
- package/dist-es/calendar/internal/CalendarDay.css.js +1 -1
- package/dist-es/calendar/internal/CalendarDay.js +90 -78
- package/dist-es/calendar/internal/CalendarDay.js.map +1 -1
- package/dist-es/calendar/internal/CalendarMonth.js +13 -23
- package/dist-es/calendar/internal/CalendarMonth.js.map +1 -1
- package/dist-es/calendar/internal/useFocusManagement.js +5 -6
- package/dist-es/calendar/internal/useFocusManagement.js.map +1 -1
- package/dist-es/calendar/internal/utils.js +8 -12
- package/dist-es/calendar/internal/utils.js.map +1 -1
- package/dist-es/calendar/useCalendar.js +72 -112
- package/dist-es/calendar/useCalendar.js.map +1 -1
- package/dist-es/calendar/useCalendarDay.js +21 -18
- package/dist-es/calendar/useCalendarDay.js.map +1 -1
- package/dist-es/calendar/useCalendarSelection.js +146 -34
- package/dist-es/calendar/useCalendarSelection.js.map +1 -1
- package/dist-es/carousel/CarouselContext.js.map +1 -1
- package/dist-es/carousel/CarouselControls.js.map +1 -1
- package/dist-es/carousel/CarouselReducer.js.map +1 -1
- package/dist-es/carousel/CarouselSlide.js.map +1 -1
- package/dist-es/carousel/CarouselSlider.js.map +1 -1
- package/dist-es/cascading-menu/CascadingMenu.js.map +1 -1
- package/dist-es/cascading-menu/CascadingMenuItem.js.map +1 -1
- package/dist-es/cascading-menu/CascadingMenuList.js.map +1 -1
- package/dist-es/cascading-menu/internal/keydownHandlers.js.map +1 -1
- package/dist-es/cascading-menu/internal/useClickAway.js.map +1 -1
- package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
- package/dist-es/cascading-menu/internal/useMouseHandlers.js.map +1 -1
- package/dist-es/cascading-menu/internal/useStateReducer.js.map +1 -1
- package/dist-es/cascading-menu/stateChangeTypes.js +0 -1
- package/dist-es/cascading-menu/stateChangeTypes.js.map +1 -1
- package/dist-es/color-chooser/Color.js.map +1 -1
- package/dist-es/color-chooser/ColorChooser.js.map +1 -1
- package/dist-es/color-chooser/ColorHelpers.js.map +1 -1
- package/dist-es/color-chooser/ColorPicker.js.map +1 -1
- package/dist-es/color-chooser/DictTabs.js.map +1 -1
- package/dist-es/color-chooser/HexInput.js.map +1 -1
- package/dist-es/color-chooser/Swatch.js.map +1 -1
- package/dist-es/color-chooser/Swatches.js.map +1 -1
- package/dist-es/color-chooser/SwatchesPicker.js.map +1 -1
- package/dist-es/combo-box/ComboBox.js +0 -2
- package/dist-es/combo-box/ComboBox.js.map +1 -1
- package/dist-es/combo-box/useCombobox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js +1 -5
- package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js +1 -5
- package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/useComboBox.js +1 -1
- package/dist-es/combo-box-deprecated/internal/useComboBox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js +1 -1
- package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/usePopperStatus.js.map +1 -1
- package/dist-es/common-hooks/calcPreferredHeight.js.map +1 -1
- package/dist-es/common-hooks/collectionProvider.js +1 -1
- package/dist-es/common-hooks/collectionProvider.js.map +1 -1
- package/dist-es/common-hooks/list-dom-utils.js.map +1 -1
- package/dist-es/common-hooks/selectionTypes.js.map +1 -1
- package/dist-es/common-hooks/useCollapsibleGroups.js.map +1 -1
- package/dist-es/common-hooks/useCollectionItems.js +1 -1
- package/dist-es/common-hooks/useCollectionItems.js.map +1 -1
- package/dist-es/common-hooks/useImperativeScrollingAPI.js.map +1 -1
- package/dist-es/common-hooks/useKeyboardNavigation.js +1 -1
- package/dist-es/common-hooks/useKeyboardNavigation.js.map +1 -1
- package/dist-es/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
- package/dist-es/common-hooks/useSelection.js.map +1 -1
- package/dist-es/common-hooks/useTypeahead.js +1 -1
- package/dist-es/common-hooks/useTypeahead.js.map +1 -1
- package/dist-es/common-hooks/useViewportTracking.js.map +1 -1
- package/dist-es/common-hooks/utils/collection-item-utils.js.map +1 -1
- package/dist-es/contact-details/ContactPrimaryInfo.js.map +1 -1
- package/dist-es/contact-details/ContactSecondaryInfo.js.map +1 -1
- package/dist-es/contact-details/ContactTertiaryInfo.js.map +1 -1
- package/dist-es/contact-details/internal/ContactDetailsContext.js.map +1 -1
- package/dist-es/content-status/internal/StatusIndicator.js.map +1 -1
- package/dist-es/date-input/DateInputRange.js +61 -51
- package/dist-es/date-input/DateInputRange.js.map +1 -1
- package/dist-es/date-input/DateInputSingle.js +34 -19
- package/dist-es/date-input/DateInputSingle.js.map +1 -1
- package/dist-es/date-picker/DatePicker.js +9 -1
- package/dist-es/date-picker/DatePicker.js.map +1 -1
- package/dist-es/date-picker/DatePickerActions.js.map +1 -1
- package/dist-es/date-picker/DatePickerContext.js.map +1 -1
- package/dist-es/date-picker/DatePickerHelperText.css.js +4 -0
- package/dist-es/date-picker/DatePickerHelperText.css.js.map +1 -0
- package/dist-es/date-picker/DatePickerHelperText.js +34 -0
- package/dist-es/date-picker/DatePickerHelperText.js.map +1 -0
- package/dist-es/date-picker/DatePickerOverlay.js.map +1 -1
- package/dist-es/date-picker/DatePickerOverlayProvider.js +41 -17
- package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -1
- package/dist-es/date-picker/DatePickerPanel.css.js +1 -1
- package/dist-es/date-picker/DatePickerRangeGridPanel.js +245 -0
- package/dist-es/date-picker/DatePickerRangeGridPanel.js.map +1 -0
- package/dist-es/date-picker/DatePickerRangeInput.js +39 -7
- package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -1
- package/dist-es/date-picker/DatePickerRangePanel.js +190 -34
- package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -1
- package/dist-es/date-picker/DatePickerSingleGridPanel.js +253 -0
- package/dist-es/date-picker/DatePickerSingleGridPanel.js.map +1 -0
- package/dist-es/date-picker/DatePickerSingleInput.js +13 -5
- package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -1
- package/dist-es/date-picker/DatePickerSinglePanel.js +8 -107
- package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -1
- package/dist-es/date-picker/DatePickerTrigger.js.map +1 -1
- package/dist-es/date-picker/useDatePicker.js +71 -11
- package/dist-es/date-picker/useDatePicker.js.map +1 -1
- package/dist-es/date-picker/useFocusOut.js +41 -0
- package/dist-es/date-picker/useFocusOut.js.map +1 -0
- package/dist-es/date-picker/useKeyboard.js +4 -5
- package/dist-es/date-picker/useKeyboard.js.map +1 -1
- package/dist-es/deck-item/DeckItem.js.map +1 -1
- package/dist-es/deck-layout/DeckLayout.js.map +1 -1
- package/dist-es/dropdown/Dropdown.js +0 -1
- package/dist-es/dropdown/Dropdown.js.map +1 -1
- package/dist-es/dropdown/DropdownBase.js +1 -2
- package/dist-es/dropdown/DropdownBase.js.map +1 -1
- package/dist-es/dropdown/DropdownButton.js.map +1 -1
- package/dist-es/dropdown/useClickAway.js.map +1 -1
- package/dist-es/dropdown/useDropdown.js.map +1 -1
- package/dist-es/dropdown/useDropdownBase.js.map +1 -1
- package/dist-es/editable-label/EditableLabel.js.map +1 -1
- package/dist-es/form-field-legacy/FormFieldLegacy.js.map +1 -1
- package/dist-es/form-field-legacy/StatusIndicator.js +1 -1
- package/dist-es/form-field-legacy/StatusIndicator.js.map +1 -1
- package/dist-es/formatted-input/FormattedInput.js +1 -1
- package/dist-es/formatted-input/FormattedInput.js.map +1 -1
- package/dist-es/index.js +4 -4
- package/dist-es/input-legacy/InputLegacy.js.map +1 -1
- package/dist-es/input-legacy/useCursorOnFocus.js.map +1 -1
- package/dist-es/list/Highlighter.js.map +1 -1
- package/dist-es/list/List.js.map +1 -1
- package/dist-es/list/ListItem.js.map +1 -1
- package/dist-es/list/VirtualizedList.js.map +1 -1
- package/dist-es/list/useList.js +0 -1
- package/dist-es/list/useList.js.map +1 -1
- package/dist-es/list/useListHeight.js.map +1 -1
- package/dist-es/list-deprecated/ListBase.js +1 -3
- package/dist-es/list-deprecated/ListBase.js.map +1 -1
- package/dist-es/list-deprecated/ListItem.js.map +1 -1
- package/dist-es/list-deprecated/ListItemBase.js.map +1 -1
- package/dist-es/list-deprecated/ListItemContext.js.map +1 -1
- package/dist-es/list-deprecated/internal/DescendantContext.js.map +1 -1
- package/dist-es/list-deprecated/internal/calcPreferredListHeight.js.map +1 -1
- package/dist-es/list-deprecated/internal/useWidth.js.map +1 -1
- package/dist-es/list-deprecated/useList.js.map +1 -1
- package/dist-es/list-deprecated/useListItem.js.map +1 -1
- package/dist-es/list-deprecated/useTypeSelect.js.map +1 -1
- package/dist-es/list-next/ListItemNext.js.map +1 -1
- package/dist-es/list-next/ListNext.js.map +1 -1
- package/dist-es/list-next/ListNextContext.js.map +1 -1
- package/dist-es/list-next/useList.js.map +1 -1
- package/dist-es/localization-provider/LocalizationProvider.js +6 -3
- package/dist-es/localization-provider/LocalizationProvider.js.map +1 -1
- package/dist-es/menu-button/MenuButton.js.map +1 -1
- package/dist-es/metric/MetricContent.js +2 -2
- package/dist-es/metric/MetricContent.js.map +1 -1
- package/dist-es/number-input/NumberInput.js +1 -1
- package/dist-es/number-input/NumberInput.js.map +1 -1
- package/dist-es/number-input/useNumberInput.js.map +1 -1
- package/dist-es/query-input/internal/CategoryListContext.js.map +1 -1
- package/dist-es/query-input/internal/CategoryListItem.js.map +1 -1
- package/dist-es/query-input/internal/usePopperStatus.js +2 -2
- package/dist-es/query-input/internal/usePopperStatus.js.map +1 -1
- package/dist-es/query-input/useQueryInput.js +0 -1
- package/dist-es/query-input/useQueryInput.js.map +1 -1
- package/dist-es/responsive/OverflowReducer.js +1 -3
- package/dist-es/responsive/OverflowReducer.js.map +1 -1
- package/dist-es/responsive/useDynamicCollapse.js.map +1 -1
- package/dist-es/responsive/useInstantCollapse.js.map +1 -1
- package/dist-es/responsive/useOverflow.js +1 -1
- package/dist-es/responsive/useOverflow.js.map +1 -1
- package/dist-es/responsive/useOverflowCollectionItems.js.map +1 -1
- package/dist-es/responsive/useOverflowLayout.js +0 -3
- package/dist-es/responsive/useOverflowLayout.js.map +1 -1
- package/dist-es/responsive/useReclaimSpace.js.map +1 -1
- package/dist-es/responsive/useResizeObserver.js.map +1 -1
- package/dist-es/responsive/useWidth.js.map +1 -1
- package/dist-es/responsive/utils.js.map +1 -1
- package/dist-es/search-input/SearchInput.js.map +1 -1
- package/dist-es/tabs/Tab.js.map +1 -1
- package/dist-es/tabs/Tabs.js.map +1 -1
- package/dist-es/tabs/Tabstrip.js +0 -1
- package/dist-es/tabs/Tabstrip.js.map +1 -1
- package/dist-es/tabs/drag-drop/useDragDropNaturalMovement.js +1 -1
- package/dist-es/tabs/drag-drop/useDragDropNaturalMovement.js.map +1 -1
- package/dist-es/tabs/drag-drop/useDragSpacers.js.map +1 -1
- package/dist-es/tabs/useEditableItem.js.map +1 -1
- package/dist-es/tabs/useKeyboardNavigation.js +1 -1
- package/dist-es/tabs/useKeyboardNavigation.js.map +1 -1
- package/dist-es/tabs/useSelection.js.map +1 -1
- package/dist-es/tabs/useTabs.js.map +1 -1
- package/dist-es/tabs/useTabstrip.js.map +1 -1
- package/dist-es/tabs-next/TabListNext.js.map +1 -1
- package/dist-es/tabs-next/TabNext.js.map +1 -1
- package/dist-es/tabs-next/TabNextAction.js.map +1 -1
- package/dist-es/tabs-next/TabNextContext.js.map +1 -1
- package/dist-es/tabs-next/TabNextPanel.js.map +1 -1
- package/dist-es/tabs-next/TabNextTrigger.js.map +1 -1
- package/dist-es/tabs-next/TabOverflowList.js.map +1 -1
- package/dist-es/tabs-next/TabsNext.js.map +1 -1
- package/dist-es/tabs-next/TabsNextContext.js.map +1 -1
- package/dist-es/tabs-next/hooks/useCollection.js +2 -2
- package/dist-es/tabs-next/hooks/useCollection.js.map +1 -1
- package/dist-es/tabs-next/hooks/useFocusOutside.js.map +1 -1
- package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
- package/dist-es/tabs-next/hooks/useRestoreActiveTab.js.map +1 -1
- package/dist-es/tokenized-input/TokenizedInputBase.js.map +1 -1
- package/dist-es/tokenized-input/internal/InputPill.js.map +1 -1
- package/dist-es/tokenized-input/internal/getCursorPosition.js.map +1 -1
- package/dist-es/tokenized-input/internal/useResizeObserver.js.map +1 -1
- package/dist-es/tokenized-input/useTokenizedInput.js.map +1 -1
- package/dist-es/tokenized-input-next/TokenizedInputNext.js.map +1 -1
- package/dist-es/tokenized-input-next/internal/InputPill.js.map +1 -1
- package/dist-es/tokenized-input-next/internal/useResizeObserver.js.map +1 -1
- package/dist-es/tokenized-input-next/useTokenizedInputNext.js +1 -1
- package/dist-es/tokenized-input-next/useTokenizedInputNext.js.map +1 -1
- package/dist-es/toolbar/Tooltray.js.map +1 -1
- package/dist-es/toolbar/internal/renderToolbarItems.js.map +1 -1
- package/dist-es/toolbar/internal/renderTrayTools.js.map +1 -1
- package/dist-es/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
- package/dist-es/toolbar/toolbar-field/useToolbarField.js.map +1 -1
- package/dist-es/tree/Tree.js +2 -6
- package/dist-es/tree/Tree.js.map +1 -1
- package/dist-es/tree/TreeNode.js.map +1 -1
- package/dist-es/tree/use-tree-keyboard-navigation.js.map +1 -1
- package/dist-es/tree/useTree.js.map +1 -1
- package/dist-es/utils/useClickOutside.js.map +1 -1
- package/dist-es/utils/useSlideSelection.js.map +1 -1
- package/dist-es/window/ElectronWindow.js +1 -1
- package/dist-es/window/ElectronWindow.js.map +1 -1
- package/dist-types/calendar/Calendar.d.ts +22 -3
- package/dist-types/calendar/CalendarGrid.d.ts +19 -3
- package/dist-types/calendar/CalendarMonthHeader.d.ts +18 -0
- package/dist-types/calendar/CalendarNavigation.d.ts +9 -0
- package/dist-types/calendar/index.d.ts +1 -0
- package/dist-types/calendar/internal/CalendarDay.d.ts +25 -6
- package/dist-types/calendar/internal/CalendarMonth.d.ts +2 -6
- package/dist-types/calendar/internal/utils.d.ts +3 -7
- package/dist-types/calendar/useCalendar.d.ts +34 -30
- package/dist-types/calendar/useCalendarDay.d.ts +3 -2
- package/dist-types/calendar/useCalendarSelection.d.ts +60 -8
- package/dist-types/date-input/DateInputRange.d.ts +12 -8
- package/dist-types/date-input/DateInputSingle.d.ts +12 -8
- package/dist-types/date-picker/DatePicker.d.ts +14 -6
- package/dist-types/date-picker/DatePickerContext.d.ts +29 -1
- package/dist-types/date-picker/DatePickerHelperText.d.ts +4 -0
- package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +9 -2
- package/dist-types/date-picker/DatePickerRangeGridPanel.d.ts +17 -0
- package/dist-types/date-picker/DatePickerRangeInput.d.ts +1 -0
- package/dist-types/date-picker/DatePickerRangePanel.d.ts +24 -20
- package/dist-types/date-picker/DatePickerSingleGridPanel.d.ts +65 -0
- package/dist-types/date-picker/DatePickerSingleInput.d.ts +1 -0
- package/dist-types/date-picker/DatePickerSinglePanel.d.ts +6 -48
- package/dist-types/date-picker/index.d.ts +4 -1
- package/dist-types/date-picker/useDatePicker.d.ts +29 -9
- package/dist-types/date-picker/useFocusOut.d.ts +9 -0
- package/dist-types/date-picker/useKeyboard.d.ts +7 -1
- package/dist-types/index.d.ts +0 -1
- package/package.json +3 -4
- package/dist-cjs/calendar/CalendarGrid.css.js +0 -6
- package/dist-cjs/calendar/CalendarGrid.css.js.map +0 -1
- package/dist-cjs/combo-box-deprecated/internal/getAnnouncement.js +0 -8
- package/dist-cjs/combo-box-deprecated/internal/getAnnouncement.js.map +0 -1
- package/dist-cjs/splitter/SplitHandle.css.js +0 -6
- package/dist-cjs/splitter/SplitHandle.css.js.map +0 -1
- package/dist-cjs/splitter/SplitHandle.js +0 -60
- package/dist-cjs/splitter/SplitHandle.js.map +0 -1
- package/dist-cjs/splitter/SplitPanel.css.js +0 -6
- package/dist-cjs/splitter/SplitPanel.css.js.map +0 -1
- package/dist-cjs/splitter/SplitPanel.js +0 -37
- package/dist-cjs/splitter/SplitPanel.js.map +0 -1
- package/dist-cjs/splitter/Splitter.js +0 -31
- package/dist-cjs/splitter/Splitter.js.map +0 -1
- package/dist-cjs/splitter/utils.js +0 -18
- package/dist-cjs/splitter/utils.js.map +0 -1
- package/dist-es/calendar/CalendarGrid.css.js +0 -4
- package/dist-es/calendar/CalendarGrid.css.js.map +0 -1
- package/dist-es/combo-box-deprecated/internal/getAnnouncement.js +0 -6
- package/dist-es/combo-box-deprecated/internal/getAnnouncement.js.map +0 -1
- package/dist-es/splitter/SplitHandle.css.js +0 -4
- package/dist-es/splitter/SplitHandle.css.js.map +0 -1
- package/dist-es/splitter/SplitHandle.js +0 -58
- package/dist-es/splitter/SplitHandle.js.map +0 -1
- package/dist-es/splitter/SplitPanel.css.js +0 -4
- package/dist-es/splitter/SplitPanel.css.js.map +0 -1
- package/dist-es/splitter/SplitPanel.js +0 -35
- package/dist-es/splitter/SplitPanel.js.map +0 -1
- package/dist-es/splitter/Splitter.js +0 -27
- package/dist-es/splitter/Splitter.js.map +0 -1
- package/dist-es/splitter/utils.js +0 -15
- package/dist-es/splitter/utils.js.map +0 -1
- package/dist-types/splitter/SplitHandle.d.ts +0 -21
- package/dist-types/splitter/SplitPanel.d.ts +0 -10
- package/dist-types/splitter/Splitter.d.ts +0 -22
- package/dist-types/splitter/index.d.ts +0 -4
- package/dist-types/splitter/utils.d.ts +0 -4
|
@@ -5,6 +5,7 @@ import { useDatePickerOverlay } from './DatePickerOverlayProvider.js';
|
|
|
5
5
|
|
|
6
6
|
function useDatePicker(props, ref) {
|
|
7
7
|
const {
|
|
8
|
+
dateAdapter,
|
|
8
9
|
defaultDates: { minDate: defaultMinDate, maxDate: defaultMaxDate }
|
|
9
10
|
} = useLocalization();
|
|
10
11
|
const {
|
|
@@ -12,12 +13,16 @@ function useDatePicker(props, ref) {
|
|
|
12
13
|
disabled,
|
|
13
14
|
selectionVariant,
|
|
14
15
|
defaultSelectedDate,
|
|
16
|
+
isDayDisabled,
|
|
17
|
+
isDayHighlighted,
|
|
18
|
+
isDayUnselectable,
|
|
15
19
|
selectedDate: selectedDateProp,
|
|
16
20
|
onSelectionChange,
|
|
17
21
|
onApply,
|
|
18
22
|
minDate = defaultMinDate,
|
|
19
23
|
maxDate = defaultMaxDate,
|
|
20
|
-
onCancel
|
|
24
|
+
onCancel,
|
|
25
|
+
timezone
|
|
21
26
|
} = props;
|
|
22
27
|
const previousSelectedDate = useRef();
|
|
23
28
|
const datePickerRef = useRef(null);
|
|
@@ -59,24 +64,44 @@ function useDatePicker(props, ref) {
|
|
|
59
64
|
onApply == null ? void 0 : onApply(event, date);
|
|
60
65
|
}
|
|
61
66
|
},
|
|
62
|
-
[
|
|
67
|
+
[selectionVariant, setOpen, onApply]
|
|
68
|
+
);
|
|
69
|
+
const checkAndAddError = useCallback(
|
|
70
|
+
(date, checkFunction, errorType, details = {}) => {
|
|
71
|
+
const errorMessage = date ? checkFunction == null ? void 0 : checkFunction(date) : false;
|
|
72
|
+
if (errorMessage) {
|
|
73
|
+
details.errors = details.errors ?? [];
|
|
74
|
+
details.errors.push({
|
|
75
|
+
type: errorType,
|
|
76
|
+
message: errorMessage
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
[]
|
|
63
81
|
);
|
|
64
82
|
const selectSingle = useCallback(
|
|
65
83
|
(event, date, details) => {
|
|
84
|
+
var _a;
|
|
85
|
+
const canBeApplied = dateAdapter.isValid(date) && !((_a = details == null ? void 0 : details.errors) == null ? void 0 : _a.length);
|
|
66
86
|
setSelectedDate(date);
|
|
87
|
+
checkAndAddError(date, isDayDisabled, "disabled", details);
|
|
88
|
+
checkAndAddError(date, isDayUnselectable, "unselectable", details);
|
|
67
89
|
if (selectionVariant === "single") {
|
|
68
90
|
onSelectionChange == null ? void 0 : onSelectionChange(event, date, details);
|
|
69
91
|
}
|
|
70
|
-
if (!enableApply &&
|
|
92
|
+
if (!enableApply && canBeApplied) {
|
|
71
93
|
applySingle(event, date);
|
|
72
94
|
}
|
|
73
95
|
},
|
|
74
96
|
[
|
|
97
|
+
checkAndAddError,
|
|
98
|
+
dateAdapter,
|
|
75
99
|
applySingle,
|
|
100
|
+
isDayDisabled,
|
|
101
|
+
isDayUnselectable,
|
|
76
102
|
enableApply,
|
|
77
103
|
onSelectionChange,
|
|
78
|
-
selectionVariant
|
|
79
|
-
setSelectedDate
|
|
104
|
+
selectionVariant
|
|
80
105
|
]
|
|
81
106
|
);
|
|
82
107
|
const applyRange = useCallback(
|
|
@@ -87,24 +112,55 @@ function useDatePicker(props, ref) {
|
|
|
87
112
|
onApply == null ? void 0 : onApply(event, date);
|
|
88
113
|
}
|
|
89
114
|
},
|
|
90
|
-
[onApply,
|
|
115
|
+
[onApply, setOpen, selectionVariant]
|
|
91
116
|
);
|
|
92
117
|
const selectRange = useCallback(
|
|
93
118
|
(event, date, details) => {
|
|
119
|
+
var _a, _b, _c, _d;
|
|
94
120
|
setSelectedDate(date);
|
|
121
|
+
checkAndAddError(
|
|
122
|
+
date == null ? void 0 : date.startDate,
|
|
123
|
+
isDayDisabled,
|
|
124
|
+
"disabled",
|
|
125
|
+
details == null ? void 0 : details.startDate
|
|
126
|
+
);
|
|
127
|
+
checkAndAddError(
|
|
128
|
+
date == null ? void 0 : date.endDate,
|
|
129
|
+
isDayDisabled,
|
|
130
|
+
"disabled",
|
|
131
|
+
details == null ? void 0 : details.endDate
|
|
132
|
+
);
|
|
133
|
+
checkAndAddError(
|
|
134
|
+
date == null ? void 0 : date.startDate,
|
|
135
|
+
isDayUnselectable,
|
|
136
|
+
"unselectable",
|
|
137
|
+
details == null ? void 0 : details.startDate
|
|
138
|
+
);
|
|
139
|
+
checkAndAddError(
|
|
140
|
+
date == null ? void 0 : date.endDate,
|
|
141
|
+
isDayUnselectable,
|
|
142
|
+
"unselectable",
|
|
143
|
+
details == null ? void 0 : details.endDate
|
|
144
|
+
);
|
|
95
145
|
if (selectionVariant === "range") {
|
|
96
146
|
onSelectionChange == null ? void 0 : onSelectionChange(event, date, details);
|
|
97
147
|
}
|
|
98
|
-
|
|
148
|
+
const isAValidRange = dateAdapter.isValid(date == null ? void 0 : date.startDate) && dateAdapter.isValid(date == null ? void 0 : date.endDate);
|
|
149
|
+
const isValidSelection = !((_b = (_a = details == null ? void 0 : details.startDate) == null ? void 0 : _a.errors) == null ? void 0 : _b.length) && !((_d = (_c = details == null ? void 0 : details.endDate) == null ? void 0 : _c.errors) == null ? void 0 : _d.length);
|
|
150
|
+
const canBeApplied = isAValidRange && isValidSelection;
|
|
151
|
+
if (!enableApply && canBeApplied) {
|
|
99
152
|
applyRange(event, date);
|
|
100
153
|
}
|
|
101
154
|
},
|
|
102
155
|
[
|
|
156
|
+
checkAndAddError,
|
|
157
|
+
dateAdapter,
|
|
103
158
|
applyRange,
|
|
159
|
+
isDayDisabled,
|
|
160
|
+
isDayUnselectable,
|
|
104
161
|
enableApply,
|
|
105
162
|
onSelectionChange,
|
|
106
|
-
selectionVariant
|
|
107
|
-
setSelectedDate
|
|
163
|
+
selectionVariant
|
|
108
164
|
]
|
|
109
165
|
);
|
|
110
166
|
const cancel = useCallback(
|
|
@@ -113,7 +169,7 @@ function useDatePicker(props, ref) {
|
|
|
113
169
|
setOpen(false, event, "cancel");
|
|
114
170
|
onCancel == null ? void 0 : onCancel();
|
|
115
171
|
},
|
|
116
|
-
[
|
|
172
|
+
[setOpen, onCancel]
|
|
117
173
|
);
|
|
118
174
|
const returnValue = {
|
|
119
175
|
state: {
|
|
@@ -125,10 +181,14 @@ function useDatePicker(props, ref) {
|
|
|
125
181
|
readOnly: isReadOnly,
|
|
126
182
|
containerRef,
|
|
127
183
|
minDate,
|
|
128
|
-
maxDate
|
|
184
|
+
maxDate,
|
|
185
|
+
timezone
|
|
129
186
|
},
|
|
130
187
|
helpers: {
|
|
131
188
|
cancel,
|
|
189
|
+
isDayDisabled,
|
|
190
|
+
isDayHighlighted,
|
|
191
|
+
isDayUnselectable,
|
|
132
192
|
setEnableApply
|
|
133
193
|
}
|
|
134
194
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDatePicker.js","sources":["../src/date-picker/useDatePicker.ts"],"sourcesContent":["import { useControlled, useForkRef, useFormFieldProps } from \"@salt-ds/core\";\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport {\n type SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { DateRangeSelection, SingleDateSelection } from \"../calendar\";\nimport type {\n DateInputRangeDetails,\n DateInputSingleDetails,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport type {\n RangeDatePickerState,\n SingleDatePickerState,\n} from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\ninterface UseDatePickerBaseProps<TDate> {\n /** If `true`, the component is disabled. */\n disabled?: boolean;\n /** If `true`, the component is read-only. */\n readOnly?: boolean;\n /**\n * The minimum date for the range, default is 1900.\n */\n minDate?: TDate;\n /**\n * The maximum date for the range, default is 2100.\n */\n maxDate?: TDate;\n /**\n * Handler for when the date selection is cancelled.\n */\n onCancel?: () => void;\n}\n\n/**\n * Props for single date selection.\n *\n * @template TDate - The type of the date framework.\n */\nexport interface UseDatePickerSingleProps<TDate extends DateFrameworkType>\n extends UseDatePickerBaseProps<TDate> {\n /**\n * Single date selection.\n */\n selectionVariant: \"single\";\n /**\n * The selected date. The selected date will be controlled when this prop is provided.\n */\n selectedDate?: SingleDateSelection<TDate> | null;\n /**\n * The initial selected date, when the selected date is uncontrolled.\n */\n defaultSelectedDate?: SingleDateSelection<TDate> | null;\n /**\n * Handler called when the selected date changes.\n * @param event - The synthetic event.\n * @param date - The selected date or null.\n * @param details - The selected date details.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate> | null,\n details?: DateInputSingleDetails,\n ) => void;\n /**\n * Handler called when the selected date is confirmed/applied.\n * @param event - The synthetic event.\n * @param date - The selected date or null.\n */\n onApply?: (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate> | null,\n ) => void;\n}\n\n/**\n * Props for date range selection.\n *\n * @template TDate - The type of the date framework.\n */\nexport interface UseDatePickerRangeProps<TDate extends DateFrameworkType>\n extends UseDatePickerBaseProps<TDate> {\n /**\n * Date range selection.\n */\n selectionVariant: \"range\";\n /**\n * The selected date range. The selected date will be controlled when this prop is provided.\n */\n selectedDate?: DateRangeSelection<TDate> | null;\n /**\n * The initial selected date range, when the selected date is uncontrolled.\n */\n defaultSelectedDate?: DateRangeSelection<TDate> | null;\n /**\n * Handler called when the selected date range changes.\n * @param event - The synthetic event.\n * @param date - The selected date range or null.\n * @param details - The selected date range details.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details?: DateInputRangeDetails,\n ) => void;\n /**\n * Handler called when the selected date range is confirmed/applied.\n * @param event - The synthetic event.\n * @param date - The selected date range.\n */\n onApply?: (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n ) => void;\n}\n\n/**\n * Props for the useDatePicker hook.\n *\n * @template TDate - The type of the date framework.\n * @template SelectionVariant - The selection variant, either \"single\" or \"range\".\n */\nexport type UseDatePickerProps<\n TDate extends DateFrameworkType,\n SelectionVariant,\n> = SelectionVariant extends \"single\"\n ? UseDatePickerSingleProps<TDate>\n : SelectionVariant extends \"range\"\n ? UseDatePickerRangeProps<TDate>\n : never;\n\n/**\n * Custom hook for managing date picker state.\n *\n * @template TDate - The type of the date framework.\n * @template SelectionVariant - The selection variant, either \"single\" or \"range\".\n * @param props - The props for the date picker.\n * @param ref - The ref for the date picker container.\n * @returns The date picker state and helpers.\n */\nexport function useDatePicker<\n TDate extends DateFrameworkType,\n SelectionVariant extends \"single\" | \"range\",\n>(\n props: UseDatePickerProps<TDate, SelectionVariant>,\n ref: React.ForwardedRef<HTMLDivElement>,\n): SingleDatePickerState<TDate> | RangeDatePickerState<TDate> {\n const {\n defaultDates: { minDate: defaultMinDate, maxDate: defaultMaxDate },\n } = useLocalization<TDate>();\n const {\n readOnly = false,\n disabled,\n selectionVariant,\n defaultSelectedDate,\n selectedDate: selectedDateProp,\n onSelectionChange,\n onApply,\n minDate = defaultMinDate,\n maxDate = defaultMaxDate,\n onCancel,\n } = props;\n\n const previousSelectedDate = useRef<typeof selectedDateProp>();\n const datePickerRef = useRef<HTMLDivElement>(null);\n const containerRef = useForkRef(ref, datePickerRef);\n\n const {\n state: { open },\n helpers: { setOpen, setOnDismiss },\n } = useDatePickerOverlay();\n\n const [selectedDate, setSelectedDate] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"DatePicker\",\n state: \"selectedDate\",\n });\n\n const [enableApply, setEnableApply] = useState<boolean>(false);\n const [cancelled, setCancelled] = useState<boolean>(false);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousSelectedDate.current = selectedDate;\n if (enableApply) {\n setOnDismiss(cancel);\n }\n setCancelled(false);\n }\n }, [enableApply, open, setOnDismiss, setCancelled]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setSelectedDate(previousSelectedDate?.current);\n }\n }, [cancelled, setSelectedDate]);\n\n const { disabled: formFieldDisabled, readOnly: formFieldReadOnly } =\n useFormFieldProps();\n const isReadOnly = readOnly || formFieldReadOnly || false;\n const isDisabled = disabled || formFieldDisabled || false;\n\n const applySingle = useCallback(\n (event: SyntheticEvent, date: SingleDateSelection<TDate> | null): void => {\n setCancelled(false);\n setOpen(false, event.nativeEvent, \"apply\");\n if (selectionVariant === \"single\") {\n onApply?.(event, date);\n }\n },\n [setCancelled, setOpen, onApply],\n );\n\n const selectSingle = useCallback(\n (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate> | null,\n details: DateInputSingleDetails,\n ) => {\n setSelectedDate(date);\n if (selectionVariant === \"single\") {\n onSelectionChange?.(event, date, details);\n }\n if (!enableApply && date) {\n applySingle(event, date);\n }\n },\n [\n applySingle,\n enableApply,\n onSelectionChange,\n selectionVariant,\n setSelectedDate,\n ],\n );\n\n const applyRange = useCallback(\n (event: SyntheticEvent, date: DateRangeSelection<TDate> | null): void => {\n setCancelled(false);\n setOpen(false, event.nativeEvent, \"apply\");\n if (selectionVariant === \"range\") {\n onApply?.(event, date);\n }\n },\n [onApply, setCancelled, setOpen, selectionVariant],\n );\n\n const selectRange = useCallback(\n (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => {\n setSelectedDate(date);\n if (selectionVariant === \"range\") {\n onSelectionChange?.(event, date, details);\n }\n if (!enableApply && date?.startDate && date?.endDate) {\n applyRange(event, date);\n }\n },\n [\n applyRange,\n enableApply,\n onSelectionChange,\n selectionVariant,\n setSelectedDate,\n ],\n );\n\n const cancel = useCallback(\n (event?: Event) => {\n setCancelled(true);\n setOpen(false, event, \"cancel\");\n onCancel?.();\n },\n [setCancelled, setOpen, onCancel],\n );\n\n const returnValue = {\n state: {\n selectionVariant,\n selectedDate,\n cancelled,\n enableApply,\n disabled: isDisabled,\n readOnly: isReadOnly,\n containerRef,\n minDate,\n maxDate,\n },\n helpers: {\n cancel,\n setEnableApply,\n },\n };\n if (props.selectionVariant === \"range\") {\n return {\n ...returnValue,\n helpers: {\n ...returnValue.helpers,\n apply: applyRange,\n select: selectRange,\n },\n } as RangeDatePickerState<TDate>;\n }\n return {\n ...returnValue,\n helpers: {\n ...returnValue.helpers,\n apply: applySingle,\n select: selectSingle,\n },\n } as SingleDatePickerState<TDate>;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useDatePicker.js","sources":["../src/date-picker/useDatePicker.ts"],"sourcesContent":["import { useControlled, useForkRef, useFormFieldProps } from \"@salt-ds/core\";\nimport type { DateFrameworkType, Timezone } from \"@salt-ds/date-adapters\";\nimport {\n type SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { DateRangeSelection, SingleDateSelection } from \"../calendar\";\nimport type {\n DateInputRangeDetails,\n DateInputSingleDetails,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport type {\n RangeDatePickerState,\n SingleDatePickerState,\n} from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\ninterface UseDatePickerBaseProps<TDate> {\n /** If `true`, the component is disabled. */\n disabled?: boolean;\n /**\n * Function to determine if a day is disabled.\n * @param date - The date to check.\n * @returns A string reason if the day is disabled, otherwise `false` or `undefined`.\n */\n isDayDisabled?: (date: TDate) => string | false | undefined;\n /**\n * Function to determine if a day is highlighted.\n * @param date - The date to check.\n * @returns A string reason if the day is highlighted, otherwise `false` or `undefined`.\n */\n isDayHighlighted?: (date: TDate) => string | false | undefined;\n /**\n * Function to determine if a day is unselectable.\n * @param date - The date to check.\n * @returns A string reason if the day is unselectable, otherwise `false` or `undefined`.\n */\n isDayUnselectable?: (date: TDate) => string | false | undefined;\n /** If `true`, the component is read-only. */\n readOnly?: boolean;\n /**\n * The minimum date for the range, default is 1900.\n */\n minDate?: TDate;\n /**\n * The maximum date for the range, default is 2100.\n */\n maxDate?: TDate;\n /**\n * Handler for when the date selection is cancelled.\n */\n onCancel?: () => void;\n /**\n * Timezone, if un-defined will take the timezone from passed date (or defaultSelectedDate/selectedDate)\n * Can also be set to \"default\" to use the default timezone of the date library\n * Can also be set to \"system\" to take the timezone of the local system.\n */\n timezone?: Timezone;\n}\n\n/**\n * Props for single date selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseDatePickerSingleProps<TDate extends DateFrameworkType>\n extends UseDatePickerBaseProps<TDate> {\n /**\n * Single date selection.\n */\n selectionVariant: \"single\";\n /**\n * The selected date. The selected date will be controlled when this prop is provided.\n */\n selectedDate?: SingleDateSelection<TDate> | null;\n /**\n * The initial selected date, when the selected date is uncontrolled.\n */\n defaultSelectedDate?: SingleDateSelection<TDate> | null;\n /**\n * Handler called when the selected date changes.\n * @param event - The synthetic event.\n * @param date - The selected date or null.\n * @param details - The selected date details.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate> | null,\n details?: DateInputSingleDetails,\n ) => void;\n /**\n * Handler called when the selected date is confirmed/applied.\n * @param event - The synthetic event.\n * @param date - The selected date or null.\n */\n onApply?: (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate> | null,\n ) => void;\n}\n\n/**\n * Props for date range selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseDatePickerRangeProps<TDate extends DateFrameworkType>\n extends UseDatePickerBaseProps<TDate> {\n /**\n * Date range selection.\n */\n selectionVariant: \"range\";\n /**\n * The selected date range. The selected date will be controlled when this prop is provided.\n */\n selectedDate?: DateRangeSelection<TDate> | null;\n /**\n * The initial selected date range, when the selected date is uncontrolled.\n */\n defaultSelectedDate?: DateRangeSelection<TDate> | null;\n /**\n * Handler called when the selected date range changes.\n * @param event - The synthetic event.\n * @param date - The selected date range or null.\n * @param details - The selected date range details.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details?: DateInputRangeDetails,\n ) => void;\n /**\n * Handler called when the selected date range is confirmed/applied.\n * @param event - The synthetic event.\n * @param date - The selected date range.\n */\n onApply?: (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n ) => void;\n}\n\n/**\n * Props for the useDatePicker hook.\n * @template TDate - The type of the date object.\n * @template SelectionVariant - The selection variant, either \"single\" or \"range\".\n */\nexport type UseDatePickerProps<\n TDate extends DateFrameworkType,\n SelectionVariant,\n> = SelectionVariant extends \"single\"\n ? UseDatePickerSingleProps<TDate>\n : SelectionVariant extends \"range\"\n ? UseDatePickerRangeProps<TDate>\n : never;\n\n/**\n * Custom hook for managing date picker state.\n * @template TDate - The type of the date object.\n * @template SelectionVariant - The selection variant, either \"single\" or \"range\".\n * @param props - The props for the date picker.\n * @param ref - The ref for the date picker container.\n * @returns The date picker state and helpers.\n */\nexport function useDatePicker<\n TDate extends DateFrameworkType,\n SelectionVariant extends \"single\" | \"range\",\n>(\n props: UseDatePickerProps<TDate, SelectionVariant>,\n ref: React.ForwardedRef<HTMLDivElement>,\n): SingleDatePickerState<TDate> | RangeDatePickerState<TDate> {\n const {\n dateAdapter,\n defaultDates: { minDate: defaultMinDate, maxDate: defaultMaxDate },\n } = useLocalization<TDate>();\n const {\n readOnly = false,\n disabled,\n selectionVariant,\n defaultSelectedDate,\n isDayDisabled,\n isDayHighlighted,\n isDayUnselectable,\n selectedDate: selectedDateProp,\n onSelectionChange,\n onApply,\n minDate = defaultMinDate,\n maxDate = defaultMaxDate,\n onCancel,\n timezone,\n } = props;\n\n const previousSelectedDate = useRef<typeof selectedDateProp>();\n const datePickerRef = useRef<HTMLDivElement>(null);\n const containerRef = useForkRef(ref, datePickerRef);\n\n const {\n state: { open },\n helpers: { setOpen, setOnDismiss },\n } = useDatePickerOverlay();\n\n const [selectedDate, setSelectedDate] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"DatePicker\",\n state: \"selectedDate\",\n });\n\n const [enableApply, setEnableApply] = useState<boolean>(false);\n const [cancelled, setCancelled] = useState<boolean>(false);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousSelectedDate.current = selectedDate;\n if (enableApply) {\n setOnDismiss(cancel);\n }\n setCancelled(false);\n }\n }, [enableApply, open, setOnDismiss, setCancelled]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setSelectedDate(previousSelectedDate?.current);\n }\n }, [cancelled, setSelectedDate]);\n\n const { disabled: formFieldDisabled, readOnly: formFieldReadOnly } =\n useFormFieldProps();\n const isReadOnly = readOnly || formFieldReadOnly || false;\n const isDisabled = disabled || formFieldDisabled || false;\n\n const applySingle = useCallback(\n (event: SyntheticEvent, date: SingleDateSelection<TDate> | null): void => {\n setCancelled(false);\n setOpen(false, event.nativeEvent, \"apply\");\n if (selectionVariant === \"single\") {\n onApply?.(event, date);\n }\n },\n [selectionVariant, setOpen, onApply],\n );\n\n const checkAndAddError = useCallback(\n (\n date: TDate | null | undefined,\n checkFunction: ((date: TDate) => string | false | undefined) | undefined,\n errorType: string,\n details: {\n errors?: { type: string; message: string | false | undefined }[];\n } = {},\n ) => {\n const errorMessage = date ? checkFunction?.(date) : false;\n if (errorMessage) {\n details.errors = details.errors ?? [];\n details.errors.push({\n type: errorType,\n message: errorMessage,\n });\n }\n },\n [],\n );\n\n const selectSingle = useCallback(\n (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate> | null,\n details: DateInputSingleDetails,\n ) => {\n const canBeApplied =\n dateAdapter.isValid(date) && !details?.errors?.length;\n setSelectedDate(date);\n checkAndAddError(date, isDayDisabled, \"disabled\", details);\n checkAndAddError(date, isDayUnselectable, \"unselectable\", details);\n\n if (selectionVariant === \"single\") {\n onSelectionChange?.(event, date, details);\n }\n if (!enableApply && canBeApplied) {\n applySingle(event, date);\n }\n },\n [\n checkAndAddError,\n dateAdapter,\n applySingle,\n isDayDisabled,\n isDayUnselectable,\n enableApply,\n onSelectionChange,\n selectionVariant,\n ],\n );\n\n const applyRange = useCallback(\n (event: SyntheticEvent, date: DateRangeSelection<TDate> | null): void => {\n setCancelled(false);\n setOpen(false, event.nativeEvent, \"apply\");\n if (selectionVariant === \"range\") {\n onApply?.(event, date);\n }\n },\n [onApply, setOpen, selectionVariant],\n );\n\n const selectRange = useCallback(\n (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => {\n setSelectedDate(date);\n checkAndAddError(\n date?.startDate,\n isDayDisabled,\n \"disabled\",\n details?.startDate,\n );\n checkAndAddError(\n date?.endDate,\n isDayDisabled,\n \"disabled\",\n details?.endDate,\n );\n checkAndAddError(\n date?.startDate,\n isDayUnselectable,\n \"unselectable\",\n details?.startDate,\n );\n checkAndAddError(\n date?.endDate,\n isDayUnselectable,\n \"unselectable\",\n details?.endDate,\n );\n\n if (selectionVariant === \"range\") {\n onSelectionChange?.(event, date, details);\n }\n const isAValidRange =\n dateAdapter.isValid(date?.startDate) &&\n dateAdapter.isValid(date?.endDate);\n const isValidSelection =\n !details?.startDate?.errors?.length &&\n !details?.endDate?.errors?.length;\n const canBeApplied = isAValidRange && isValidSelection;\n if (!enableApply && canBeApplied) {\n applyRange(event, date);\n }\n },\n [\n checkAndAddError,\n dateAdapter,\n applyRange,\n isDayDisabled,\n isDayUnselectable,\n enableApply,\n onSelectionChange,\n selectionVariant,\n ],\n );\n\n const cancel = useCallback(\n (event?: Event) => {\n setCancelled(true);\n setOpen(false, event, \"cancel\");\n onCancel?.();\n },\n [setOpen, onCancel],\n );\n\n const returnValue = {\n state: {\n selectionVariant,\n selectedDate,\n cancelled,\n enableApply,\n disabled: isDisabled,\n readOnly: isReadOnly,\n containerRef,\n minDate,\n maxDate,\n timezone,\n },\n helpers: {\n cancel,\n isDayDisabled,\n isDayHighlighted,\n isDayUnselectable,\n setEnableApply,\n },\n };\n if (props.selectionVariant === \"range\") {\n return {\n ...returnValue,\n helpers: {\n ...returnValue.helpers,\n apply: applyRange,\n select: selectRange,\n },\n } as RangeDatePickerState<TDate>;\n }\n return {\n ...returnValue,\n helpers: {\n ...returnValue.helpers,\n apply: applySingle,\n select: selectSingle,\n },\n } as SingleDatePickerState<TDate>;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
function getTabbableElements(parent) {
|
|
4
|
+
const focusableSelectors = [
|
|
5
|
+
"button:not([disabled])",
|
|
6
|
+
"input:not([disabled])",
|
|
7
|
+
'[tabindex]:not([tabindex="-1"])'
|
|
8
|
+
];
|
|
9
|
+
const tabbableElements = parent.querySelectorAll(
|
|
10
|
+
focusableSelectors.join(",")
|
|
11
|
+
);
|
|
12
|
+
return Array.from(tabbableElements).filter(
|
|
13
|
+
(element) => !element.hasAttribute("disabled") && element.tabIndex >= 0
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
function useFocusOut(context, props) {
|
|
17
|
+
const { onOpenChange} = context;
|
|
18
|
+
const { enabled = true } = props;
|
|
19
|
+
const reference = useMemo(() => {
|
|
20
|
+
const referenceElement = context.elements.reference;
|
|
21
|
+
if (!referenceElement) {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
onKeyDown(event) {
|
|
26
|
+
if (event.key === "Tab") {
|
|
27
|
+
const tabbableElements = getTabbableElements(referenceElement);
|
|
28
|
+
const tabbedBeforeFirstElement = event.shiftKey && document.activeElement === tabbableElements[0];
|
|
29
|
+
const tabbedAfterLastElement = document.activeElement === tabbableElements[tabbableElements.length - 1];
|
|
30
|
+
if (tabbedBeforeFirstElement || tabbedAfterLastElement) {
|
|
31
|
+
onOpenChange(false, event.nativeEvent, "focus-out");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}, [onOpenChange, context.elements.reference]);
|
|
37
|
+
return useMemo(() => enabled ? { reference } : {}, [enabled, reference]);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { useFocusOut };
|
|
41
|
+
//# sourceMappingURL=useFocusOut.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusOut.js","sources":["../src/date-picker/useFocusOut.ts"],"sourcesContent":["import type { ElementProps, FloatingContext } from \"@floating-ui/react\";\nimport { useMemo } from \"react\";\n\nexport interface UseFocusOutProps {\n /**\n * Whether the hook is enabled\n * @default true\n */\n enabled?: boolean;\n}\n\nfunction getTabbableElements(parent: Element): HTMLElement[] {\n const focusableSelectors = [\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n ];\n const tabbableElements = parent.querySelectorAll<HTMLElement>(\n focusableSelectors.join(\",\"),\n );\n return Array.from(tabbableElements).filter(\n (element) => !element.hasAttribute(\"disabled\") && element.tabIndex >= 0,\n );\n}\n//\n// This hook is needed to close the overlay, when,\n// 1. the floating element is opened\n// 2. the user re-focuses into the reference element with the mouse\n// 3. the user tabs out of the reference element\n// Without this hook, the floating element can re-receive focus\nexport function useFocusOut(\n context: FloatingContext,\n props: UseFocusOutProps,\n): ElementProps {\n const { onOpenChange, open } = context;\n const { enabled = true } = props;\n\n const reference: ElementProps[\"reference\"] = useMemo<\n React.HTMLProps<Element>\n >(() => {\n const referenceElement = context.elements.reference as Element | undefined;\n\n if (!referenceElement) {\n return {};\n }\n\n return {\n onKeyDown(event: React.KeyboardEvent<Element>) {\n if (event.key === \"Tab\") {\n const tabbableElements = getTabbableElements(referenceElement);\n const tabbedBeforeFirstElement =\n event.shiftKey && document.activeElement === tabbableElements[0];\n const tabbedAfterLastElement =\n document.activeElement ===\n tabbableElements[tabbableElements.length - 1];\n if (tabbedBeforeFirstElement || tabbedAfterLastElement) {\n onOpenChange(false, event.nativeEvent, \"focus-out\");\n }\n }\n },\n };\n }, [onOpenChange, context.elements.reference]);\n\n return useMemo(() => (enabled ? { reference } : {}), [enabled, reference]);\n}\n"],"names":[],"mappings":";;AAWA,SAAS,oBAAoB,MAAgC,EAAA;AAC3D,EAAA,MAAM,kBAAqB,GAAA;AAAA,IACzB,wBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,mBAAmB,MAAO,CAAA,gBAAA;AAAA,IAC9B,kBAAA,CAAmB,KAAK,GAAG;AAAA,GAC7B;AACA,EAAO,OAAA,KAAA,CAAM,IAAK,CAAA,gBAAgB,CAAE,CAAA,MAAA;AAAA,IAClC,CAAC,YAAY,CAAC,OAAA,CAAQ,aAAa,UAAU,CAAA,IAAK,QAAQ,QAAY,IAAA;AAAA,GACxE;AACF;AAOgB,SAAA,WAAA,CACd,SACA,KACc,EAAA;AACd,EAAM,MAAA,EAAE,YAAmB,CAAI,GAAA,OAAA;AAC/B,EAAM,MAAA,EAAE,OAAU,GAAA,IAAA,EAAS,GAAA,KAAA;AAE3B,EAAM,MAAA,SAAA,GAAuC,QAE3C,MAAM;AACN,IAAM,MAAA,gBAAA,GAAmB,QAAQ,QAAS,CAAA,SAAA;AAE1C,IAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,MAAA,OAAO,EAAC;AAAA;AAGV,IAAO,OAAA;AAAA,MACL,UAAU,KAAqC,EAAA;AAC7C,QAAI,IAAA,KAAA,CAAM,QAAQ,KAAO,EAAA;AACvB,UAAM,MAAA,gBAAA,GAAmB,oBAAoB,gBAAgB,CAAA;AAC7D,UAAA,MAAM,2BACJ,KAAM,CAAA,QAAA,IAAY,QAAS,CAAA,aAAA,KAAkB,iBAAiB,CAAC,CAAA;AACjE,UAAA,MAAM,yBACJ,QAAS,CAAA,aAAA,KACT,gBAAiB,CAAA,gBAAA,CAAiB,SAAS,CAAC,CAAA;AAC9C,UAAA,IAAI,4BAA4B,sBAAwB,EAAA;AACtD,YAAa,YAAA,CAAA,KAAA,EAAO,KAAM,CAAA,WAAA,EAAa,WAAW,CAAA;AAAA;AACpD;AACF;AACF,KACF;AAAA,KACC,CAAC,YAAA,EAAc,OAAQ,CAAA,QAAA,CAAS,SAAS,CAAC,CAAA;AAE7C,EAAO,OAAA,OAAA,CAAQ,MAAO,OAAA,GAAU,EAAE,SAAA,EAAc,GAAA,EAAK,EAAA,CAAC,OAAS,EAAA,SAAS,CAAC,CAAA;AAC3E;;;;"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import { useMemo } from 'react';
|
|
2
2
|
|
|
3
|
-
function useKeyboard(
|
|
4
|
-
const {
|
|
5
|
-
const { enabled = true } = props;
|
|
3
|
+
function useKeyboard(_context, props) {
|
|
4
|
+
const { enabled = true, onArrowDown } = props;
|
|
6
5
|
const reference = useMemo(
|
|
7
6
|
() => ({
|
|
8
7
|
onKeyDown(event) {
|
|
9
8
|
if (event.key === "ArrowDown") {
|
|
10
9
|
event.preventDefault();
|
|
11
|
-
|
|
10
|
+
onArrowDown == null ? void 0 : onArrowDown(event);
|
|
12
11
|
}
|
|
13
12
|
}
|
|
14
13
|
}),
|
|
15
|
-
[
|
|
14
|
+
[onArrowDown]
|
|
16
15
|
);
|
|
17
16
|
return useMemo(() => enabled ? { reference } : {}, [enabled, reference]);
|
|
18
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeyboard.js","sources":["../src/date-picker/useKeyboard.ts"],"sourcesContent":["import type { ElementProps, FloatingContext } from \"@floating-ui/react\";\nimport { useMemo } from \"react\";\n\nexport interface UseKeyboardProps {\n /**\n * Whether the hook is enabled\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * Floating UI Interactions hook, that will open DatePicker on keydown\n * @param context\n * @param props\n */\nexport function useKeyboard(\n
|
|
1
|
+
{"version":3,"file":"useKeyboard.js","sources":["../src/date-picker/useKeyboard.ts"],"sourcesContent":["import type { ElementProps, FloatingContext } from \"@floating-ui/react\";\nimport { type KeyboardEvent, useMemo } from \"react\";\n\nexport interface UseKeyboardProps {\n /**\n * Whether the hook is enabled\n * @default true\n */\n enabled?: boolean;\n /**\n * Handler for when the arrow key down is pressed\n * @param event\n */\n onArrowDown?: (event: KeyboardEvent) => void;\n}\n\n/**\n * Floating UI Interactions hook, that will open DatePicker on keydown\n * @param context\n * @param props\n */\nexport function useKeyboard(\n _context: FloatingContext,\n props: UseKeyboardProps,\n): ElementProps {\n const { enabled = true, onArrowDown } = props;\n const reference = useMemo(\n () => ({\n onKeyDown(event: KeyboardEvent) {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n onArrowDown?.(event);\n }\n },\n }),\n [onArrowDown],\n );\n\n return useMemo(() => (enabled ? { reference } : {}), [enabled, reference]);\n}\n"],"names":[],"mappings":";;AAqBgB,SAAA,WAAA,CACd,UACA,KACc,EAAA;AACd,EAAA,MAAM,EAAE,OAAA,GAAU,IAAM,EAAA,WAAA,EAAgB,GAAA,KAAA;AACxC,EAAA,MAAM,SAAY,GAAA,OAAA;AAAA,IAChB,OAAO;AAAA,MACL,UAAU,KAAsB,EAAA;AAC9B,QAAI,IAAA,KAAA,CAAM,QAAQ,WAAa,EAAA;AAC7B,UAAA,KAAA,CAAM,cAAe,EAAA;AACrB,UAAc,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAA,KAAA,CAAA;AAAA;AAChB;AACF,KACF,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAO,OAAA,OAAA,CAAQ,MAAO,OAAA,GAAU,EAAE,SAAA,EAAc,GAAA,EAAK,EAAA,CAAC,OAAS,EAAA,SAAS,CAAC,CAAA;AAC3E;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeckItem.js","sources":["../src/deck-item/DeckItem.tsx"],"sourcesContent":["import { makePrefixer, useForkRef, useId } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { type HTMLAttributes, forwardRef, useMemo, useRef } from \"react\";\nimport type { LayoutAnimation } from \"../deck-layout\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport deckItemCss from \"./DeckItem.css\";\n\nconst withBaseName = makePrefixer(\"saltDeckItem\");\n\nexport interface DeckItemProps extends HTMLAttributes<HTMLDivElement> {\n activeIndex?: number;\n animation?: LayoutAnimation;\n index: number;\n role?: string;\n}\n\nexport const DeckItem = forwardRef<HTMLDivElement, DeckItemProps>(\n function DeckItem(\n {\n activeIndex = 0,\n animation,\n children,\n className,\n index,\n role = \"group\",\n id: idProp,\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-deck-item\",\n css: deckItemCss,\n window: targetWindow,\n });\n\n const sliderRef = useRef<HTMLDivElement | null>(null);\n\n const isCurrent = activeIndex === index;\n\n const position = useMemo(() => {\n return isCurrent ? \"current\" : activeIndex < index ? \"next\" : \"previous\";\n }, [activeIndex, index, isCurrent]);\n\n const classesIndex = animation && position === \"current\" ? 0 : 1;\n\n const getActiveClasses = [\n `${animation || \"fade\"}-in`, // in-right\n `${animation || \"fade\"}-out`, // out-left\n ];\n\n const id = useId(idProp);\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(`${animation ? animation : \"static\"}-${position}`),\n {\n [withBaseName(getActiveClasses[classesIndex])]:\n animation === \"fade\",\n },\n className,\n )}\n ref={useForkRef(ref, sliderRef)}\n role={role}\n tabIndex={isCurrent ? 0 : -1}\n id={id}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["DeckItem","deckItemCss"],"mappings":";;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA;AASzC,MAAM,QAAW,GAAA,UAAA;AAAA,EACtB,SAASA,SACP,CAAA;AAAA,IACE,WAAc,GAAA,CAAA;AAAA,IACd,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAO,GAAA,OAAA;AAAA,IACP,EAAI,EAAA,MAAA;AAAA,IACJ,GAAG;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAM,MAAA,SAAA,GAAY,OAA8B,IAAI,CAAA;AAEpD,IAAA,MAAM,YAAY,WAAgB,KAAA,KAAA;AAElC,IAAM,MAAA,QAAA,GAAW,QAAQ,MAAM;AAC7B,MAAA,OAAO,SAAY,GAAA,SAAA,GAAY,WAAc,GAAA,KAAA,GAAQ,MAAS,GAAA,UAAA;AAAA,KAC7D,EAAA,CAAC,WAAa,EAAA,KAAA,EAAO,SAAS,CAAC,CAAA;AAElC,IAAA,MAAM,YAAe,GAAA,SAAA,IAAa,QAAa,KAAA,SAAA,GAAY,CAAI,GAAA,CAAA;AAE/D,IAAA,MAAM,gBAAmB,GAAA;AAAA,MACvB,CAAA,EAAG,aAAa,MAAM,CAAA,GAAA,CAAA;AAAA;AAAA,MACtB,CAAA,EAAG,aAAa,MAAM,CAAA,IAAA;AAAA;AAAA,KACxB;AAEA,IAAM,MAAA,EAAA,GAAK,MAAM,MAAM,CAAA;AAEvB,IACE,uBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,IAAA;AAAA,UACT,YAAa,EAAA;AAAA,UACb,aAAa,CAAG,EAAA,SAAA,GAAY,YAAY,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAE,CAAA,CAAA;AAAA,UAC9D;AAAA,YACE,CAAC,YAAa,CAAA,gBAAA,CAAiB,YAAY,CAAC,CAAC,GAC3C,SAAc,KAAA;AAAA,WAClB;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA,EAAK,UAAW,CAAA,GAAA,EAAK,SAAS,CAAA;AAAA,QAC9B,IAAA;AAAA,QACA,QAAA,EAAU,YAAY,CAAI,GAAA,
|
|
1
|
+
{"version":3,"file":"DeckItem.js","sources":["../src/deck-item/DeckItem.tsx"],"sourcesContent":["import { makePrefixer, useForkRef, useId } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { type HTMLAttributes, forwardRef, useMemo, useRef } from \"react\";\nimport type { LayoutAnimation } from \"../deck-layout\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport deckItemCss from \"./DeckItem.css\";\n\nconst withBaseName = makePrefixer(\"saltDeckItem\");\n\nexport interface DeckItemProps extends HTMLAttributes<HTMLDivElement> {\n activeIndex?: number;\n animation?: LayoutAnimation;\n index: number;\n role?: string;\n}\n\nexport const DeckItem = forwardRef<HTMLDivElement, DeckItemProps>(\n function DeckItem(\n {\n activeIndex = 0,\n animation,\n children,\n className,\n index,\n role = \"group\",\n id: idProp,\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-deck-item\",\n css: deckItemCss,\n window: targetWindow,\n });\n\n const sliderRef = useRef<HTMLDivElement | null>(null);\n\n const isCurrent = activeIndex === index;\n\n const position = useMemo(() => {\n return isCurrent ? \"current\" : activeIndex < index ? \"next\" : \"previous\";\n }, [activeIndex, index, isCurrent]);\n\n const classesIndex = animation && position === \"current\" ? 0 : 1;\n\n const getActiveClasses = [\n `${animation || \"fade\"}-in`, // in-right\n `${animation || \"fade\"}-out`, // out-left\n ];\n\n const id = useId(idProp);\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(`${animation ? animation : \"static\"}-${position}`),\n {\n [withBaseName(getActiveClasses[classesIndex])]:\n animation === \"fade\",\n },\n className,\n )}\n ref={useForkRef(ref, sliderRef)}\n role={role}\n tabIndex={isCurrent ? 0 : -1}\n id={id}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["DeckItem","deckItemCss"],"mappings":";;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA;AASzC,MAAM,QAAW,GAAA,UAAA;AAAA,EACtB,SAASA,SACP,CAAA;AAAA,IACE,WAAc,GAAA,CAAA;AAAA,IACd,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAO,GAAA,OAAA;AAAA,IACP,EAAI,EAAA,MAAA;AAAA,IACJ,GAAG;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,gBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAM,MAAA,SAAA,GAAY,OAA8B,IAAI,CAAA;AAEpD,IAAA,MAAM,YAAY,WAAgB,KAAA,KAAA;AAElC,IAAM,MAAA,QAAA,GAAW,QAAQ,MAAM;AAC7B,MAAA,OAAO,SAAY,GAAA,SAAA,GAAY,WAAc,GAAA,KAAA,GAAQ,MAAS,GAAA,UAAA;AAAA,KAC7D,EAAA,CAAC,WAAa,EAAA,KAAA,EAAO,SAAS,CAAC,CAAA;AAElC,IAAA,MAAM,YAAe,GAAA,SAAA,IAAa,QAAa,KAAA,SAAA,GAAY,CAAI,GAAA,CAAA;AAE/D,IAAA,MAAM,gBAAmB,GAAA;AAAA,MACvB,CAAA,EAAG,aAAa,MAAM,CAAA,GAAA,CAAA;AAAA;AAAA,MACtB,CAAA,EAAG,aAAa,MAAM,CAAA,IAAA;AAAA;AAAA,KACxB;AAEA,IAAM,MAAA,EAAA,GAAK,MAAM,MAAM,CAAA;AAEvB,IACE,uBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,IAAA;AAAA,UACT,YAAa,EAAA;AAAA,UACb,aAAa,CAAG,EAAA,SAAA,GAAY,YAAY,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAE,CAAA,CAAA;AAAA,UAC9D;AAAA,YACE,CAAC,YAAa,CAAA,gBAAA,CAAiB,YAAY,CAAC,CAAC,GAC3C,SAAc,KAAA;AAAA,WAClB;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA,EAAK,UAAW,CAAA,GAAA,EAAK,SAAS,CAAA;AAAA,QAC9B,IAAA;AAAA,QACA,QAAA,EAAU,YAAY,CAAI,GAAA,EAAA;AAAA,QAC1B,EAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA;AAGN;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeckLayout.js","sources":["../src/deck-layout/DeckLayout.tsx"],"sourcesContent":["import { makePrefixer, useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport {\n type CSSProperties,\n Children,\n type HTMLAttributes,\n forwardRef,\n useCallback,\n useState,\n} from \"react\";\nimport { DeckItem, type DeckItemProps } from \"../deck-item\";\nimport { useWidth } from \"../responsive\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\n\nimport deckLayoutCss from \"./DeckLayout.css\";\n\nexport type LayoutAnimation = \"slide\" | \"fade\";\nexport type LayoutAnimationDirection = \"horizontal\" | \"vertical\";\nexport type LayoutAnimationTransition = \"increase\" | \"decrease\";\n\nexport interface DeckLayoutProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The initial item to render.\n **/\n activeIndex?: number;\n /**\n * The animation when the slides are shown.\n **/\n animation?: LayoutAnimation;\n /**\n * The direction in which items will transition.\n **/\n direction?: LayoutAnimationDirection;\n /**\n * Props to be passed to the DeckItem component.\n */\n deckItemProps?: Partial<DeckItemProps>;\n}\n\nconst withBaseName = makePrefixer(\"saltDeckLayout\");\n\nexport const DeckLayout = forwardRef<HTMLDivElement, DeckLayoutProps>(\n function DeckLayout(\n {\n activeIndex = 0,\n animation,\n className,\n children,\n direction = \"horizontal\",\n style,\n deckItemProps,\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-deck-layout\",\n css: deckLayoutCss,\n window: targetWindow,\n });\n\n const [deckItemRef, deckItemWidth] = useWidth<HTMLDivElement>(true);\n\n const [deckItemHeight, setDeckItemHeight] = useState<number>(0);\n\n const handleResize = useCallback(function handleResize(\n contentRect: DOMRect,\n ) {\n setDeckItemHeight(contentRect.height);\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n if (!deckItemRef.current) {\n return undefined;\n }\n\n handleResize(deckItemRef.current.getBoundingClientRect());\n\n const observer = new ResizeObserver(\n ([{ contentRect }]: ResizeObserverEntry[]) => {\n handleResize(contentRect);\n },\n );\n observer.observe(deckItemRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, [deckItemRef, handleResize]);\n\n const deckLayoutStyles = {\n ...style,\n \"--deckLayout-width\": `${deckItemWidth}px`,\n \"--deckLayout-height\": `${deckItemHeight}px`,\n };\n\n const innerStyles = {\n \"--deckLayout-transform-value\": `-${activeIndex * 100}%`,\n } as CSSProperties;\n\n return (\n <div\n className={clsx(withBaseName(), className)}\n style={deckLayoutStyles}\n ref={ref}\n {...rest}\n >\n <div\n className={clsx(\n {\n [withBaseName(\"animate\")]: animation,\n },\n {\n [withBaseName(`${animation || \"slide\"}-${direction}`)]: animation,\n },\n )}\n style={innerStyles}\n >\n {Children.map(children, (child, index) => {\n return (\n <DeckItem\n ref={deckItemRef}\n index={index}\n activeIndex={activeIndex}\n animation={animation}\n {...deckItemProps}\n >\n {child}\n </DeckItem>\n );\n })}\n </div>\n </div>\n );\n },\n);\n"],"names":["DeckLayout","deckLayoutCss","handleResize"],"mappings":";;;;;;;;;;;AAyCA,MAAM,YAAA,GAAe,aAAa,gBAAgB,CAAA;AAE3C,MAAM,UAAa,GAAA,UAAA;AAAA,EACxB,SAASA,WACP,CAAA;AAAA,IACE,WAAc,GAAA,CAAA;AAAA,IACd,SAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAY,GAAA,YAAA;AAAA,IACZ,KAAA;AAAA,IACA,aAAA;AAAA,IACA,GAAG;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,kBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAA,MAAM,CAAC,WAAA,EAAa,aAAa,CAAA,GAAI,SAAyB,IAAI,CAAA;AAElE,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAiB,CAAC,CAAA;AAE9D,IAAA,MAAM,YAAe,GAAA,WAAA,CAAY,SAASC,aAAAA,CACxC,WACA,EAAA;AACA,MAAA,iBAAA,CAAkB,YAAY,MAAM,CAAA;AAAA,KACtC,EAAG,EAAE,CAAA;AAEL,IAAA,yBAAA,CAA0B,MAAM;AAC9B,MAAI,IAAA,CAAC,YAAY,OAAS,EAAA;AACxB,QAAO,OAAA,
|
|
1
|
+
{"version":3,"file":"DeckLayout.js","sources":["../src/deck-layout/DeckLayout.tsx"],"sourcesContent":["import { makePrefixer, useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport {\n type CSSProperties,\n Children,\n type HTMLAttributes,\n forwardRef,\n useCallback,\n useState,\n} from \"react\";\nimport { DeckItem, type DeckItemProps } from \"../deck-item\";\nimport { useWidth } from \"../responsive\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\n\nimport deckLayoutCss from \"./DeckLayout.css\";\n\nexport type LayoutAnimation = \"slide\" | \"fade\";\nexport type LayoutAnimationDirection = \"horizontal\" | \"vertical\";\nexport type LayoutAnimationTransition = \"increase\" | \"decrease\";\n\nexport interface DeckLayoutProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The initial item to render.\n **/\n activeIndex?: number;\n /**\n * The animation when the slides are shown.\n **/\n animation?: LayoutAnimation;\n /**\n * The direction in which items will transition.\n **/\n direction?: LayoutAnimationDirection;\n /**\n * Props to be passed to the DeckItem component.\n */\n deckItemProps?: Partial<DeckItemProps>;\n}\n\nconst withBaseName = makePrefixer(\"saltDeckLayout\");\n\nexport const DeckLayout = forwardRef<HTMLDivElement, DeckLayoutProps>(\n function DeckLayout(\n {\n activeIndex = 0,\n animation,\n className,\n children,\n direction = \"horizontal\",\n style,\n deckItemProps,\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-deck-layout\",\n css: deckLayoutCss,\n window: targetWindow,\n });\n\n const [deckItemRef, deckItemWidth] = useWidth<HTMLDivElement>(true);\n\n const [deckItemHeight, setDeckItemHeight] = useState<number>(0);\n\n const handleResize = useCallback(function handleResize(\n contentRect: DOMRect,\n ) {\n setDeckItemHeight(contentRect.height);\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n if (!deckItemRef.current) {\n return undefined;\n }\n\n handleResize(deckItemRef.current.getBoundingClientRect());\n\n const observer = new ResizeObserver(\n ([{ contentRect }]: ResizeObserverEntry[]) => {\n handleResize(contentRect);\n },\n );\n observer.observe(deckItemRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, [deckItemRef, handleResize]);\n\n const deckLayoutStyles = {\n ...style,\n \"--deckLayout-width\": `${deckItemWidth}px`,\n \"--deckLayout-height\": `${deckItemHeight}px`,\n };\n\n const innerStyles = {\n \"--deckLayout-transform-value\": `-${activeIndex * 100}%`,\n } as CSSProperties;\n\n return (\n <div\n className={clsx(withBaseName(), className)}\n style={deckLayoutStyles}\n ref={ref}\n {...rest}\n >\n <div\n className={clsx(\n {\n [withBaseName(\"animate\")]: animation,\n },\n {\n [withBaseName(`${animation || \"slide\"}-${direction}`)]: animation,\n },\n )}\n style={innerStyles}\n >\n {Children.map(children, (child, index) => {\n return (\n <DeckItem\n ref={deckItemRef}\n index={index}\n activeIndex={activeIndex}\n animation={animation}\n {...deckItemProps}\n >\n {child}\n </DeckItem>\n );\n })}\n </div>\n </div>\n );\n },\n);\n"],"names":["DeckLayout","deckLayoutCss","handleResize"],"mappings":"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"}
|
|
@@ -58,7 +58,6 @@ const Dropdown = forwardRef(function Dropdown2({
|
|
|
58
58
|
highlightedIndex: ListProps == null ? void 0 : ListProps.highlightedIndex,
|
|
59
59
|
isOpen: isOpenProp,
|
|
60
60
|
itemToString: itemToString$1,
|
|
61
|
-
label: "Dropdown",
|
|
62
61
|
onHighlight: ListProps == null ? void 0 : ListProps.onHighlight,
|
|
63
62
|
onOpenChange,
|
|
64
63
|
onSelectionChange,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sources":["../src/dropdown/Dropdown.tsx"],"sourcesContent":["import { useForkRef, useIdMemo as useId } from \"@salt-ds/core\";\nimport {\n type ForwardedRef,\n type ReactElement,\n cloneElement,\n forwardRef,\n useCallback,\n useRef,\n} from \"react\";\n\nimport {\n type CollectionItem,\n CollectionProvider,\n type SelectionProps,\n type SelectionStrategy,\n type SingleSelectionStrategy,\n itemToString as defaultItemToString,\n useCollectionItems,\n} from \"../common-hooks\";\nimport { List } from \"../list/List\";\nimport type { ListProps } from \"../list/listTypes\";\nimport { forwardCallbackProps } from \"../utils\";\nimport { DropdownBase, type MaybeChildProps } from \"./DropdownBase\";\nimport { DropdownButton } from \"./DropdownButton\";\nimport type { DropdownBaseProps } from \"./dropdownTypes\";\nimport { useDropdown } from \"./useDropdown\";\n\nexport interface DropdownProps<\n Item = string,\n Selection extends SelectionStrategy = \"default\",\n> extends DropdownBaseProps,\n Pick<\n ListProps<Item, Selection>,\n \"ListItem\" | \"itemToString\" | \"source\" | \"width\"\n >,\n SelectionProps<Item, Selection> {\n ListProps?: Omit<\n ListProps<Item, Selection>,\n \"ListItem\" | \"itemToString\" | \"source\"\n >;\n}\n\nexport const Dropdown = forwardRef(function Dropdown<\n Item = string,\n Selection extends SelectionStrategy = \"default\",\n>(\n {\n \"aria-label\": ariaLabel,\n children,\n defaultIsOpen,\n defaultSelected,\n id: idProp,\n isOpen: isOpenProp,\n itemToString = defaultItemToString,\n onOpenChange,\n onSelectionChange,\n onSelect,\n selected: selectedProp,\n selectionStrategy,\n source,\n triggerComponent,\n ListItem,\n ListProps,\n width = 180,\n ...props\n }: DropdownProps<Item, Selection>,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const id = useId(idProp);\n const rootRef = useRef<HTMLDivElement>(null);\n const forkedRef = useForkRef<HTMLDivElement>(rootRef, forwardedRef);\n\n const collectionHook = useCollectionItems<Item>({\n id,\n source,\n children,\n options: {\n itemToString,\n },\n });\n\n const {\n highlightedIndex,\n triggerLabel,\n listHandlers,\n listControlProps,\n selected,\n ...dropdownListHook\n } = useDropdown<Item, Selection>({\n collectionHook,\n defaultHighlightedIndex: ListProps?.defaultHighlightedIndex,\n defaultIsOpen,\n defaultSelected: collectionHook.itemToCollectionItem<\n Selection,\n typeof defaultSelected\n >(defaultSelected),\n highlightedIndex: ListProps?.highlightedIndex,\n isOpen: isOpenProp,\n itemToString,\n label: \"Dropdown\",\n onHighlight: ListProps?.onHighlight,\n onOpenChange,\n onSelectionChange,\n onSelect,\n selected: collectionHook.itemToCollectionItem<\n Selection,\n typeof selectedProp\n >(selectedProp),\n selectionStrategy,\n });\n\n const collectionItemsToItem = useCallback(\n (\n itemOrItems?: CollectionItem<Item> | null | CollectionItem<Item>[],\n ):\n | undefined\n | (Selection extends SingleSelectionStrategy ? Item | null : Item[]) => {\n type returnType = Selection extends SingleSelectionStrategy\n ? Item | null\n : Item[];\n if (Array.isArray(itemOrItems)) {\n return itemOrItems.map((i) => i.value) as returnType;\n }\n if (itemOrItems) {\n return itemOrItems.value as returnType;\n }\n },\n [],\n );\n\n const getTriggerComponent = () => {\n const ariaProps = {\n \"aria-activedescendant\": dropdownListHook.isOpen\n ? listControlProps?.[\"aria-activedescendant\"]\n : undefined,\n \"aria-label\": ariaLabel,\n };\n if (triggerComponent) {\n const ownProps = triggerComponent.props as MaybeChildProps;\n return cloneElement(\n triggerComponent,\n forwardCallbackProps(ownProps, {\n ...(dropdownListHook.isOpen ? listControlProps : {}),\n ...ariaProps,\n }),\n );\n }\n return (\n <DropdownButton\n label={triggerLabel}\n {...(dropdownListHook.isOpen ? listControlProps : {})}\n {...ariaProps}\n />\n );\n };\n\n return (\n <CollectionProvider<Item> collectionHook={collectionHook}>\n <DropdownBase\n {...props}\n id={id}\n isOpen={dropdownListHook.isOpen}\n onOpenChange={dropdownListHook.onOpenChange}\n ref={forkedRef}\n width={width}\n >\n {getTriggerComponent()}\n <List<Item, Selection>\n ListItem={ListItem}\n itemToString={itemToString}\n {...ListProps}\n highlightedIndex={highlightedIndex}\n listHandlers={listHandlers}\n onSelectionChange={onSelectionChange}\n onSelect={onSelect}\n selected={collectionItemsToItem(selected)}\n selectionStrategy={selectionStrategy}\n data-testid=\"dropdown-list\"\n />\n </DropdownBase>\n </CollectionProvider>\n );\n}) as <Item, Selection extends SelectionStrategy = \"default\">(\n props: DropdownProps<Item, Selection> & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<DropdownProps<Item, Selection>>;\n"],"names":["Dropdown","itemToString","defaultItemToString","useId"],"mappings":";;;;;;;;;;;;;;AA0Ca,MAAA,QAAA,GAAW,UAAW,CAAA,SAASA,SAI1C,CAAA;AAAA,EACE,YAAc,EAAA,SAAA;AAAA,EACd,QAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,EAAI,EAAA,MAAA;AAAA,EACJ,MAAQ,EAAA,UAAA;AAAA,gBACRC,cAAe,GAAAC,YAAA;AAAA,EACf,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAU,EAAA,YAAA;AAAA,EACV,iBAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAQ,GAAA,GAAA;AAAA,EACR,GAAG;AACL,CAAA,EACA,YACA,EAAA;AACA,EAAM,MAAA,EAAA,GAAKC,UAAM,MAAM,CAAA;AACvB,EAAM,MAAA,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAM,MAAA,SAAA,GAAY,UAA2B,CAAA,OAAA,EAAS,YAAY,CAAA;AAElE,EAAA,MAAM,iBAAiB,kBAAyB,CAAA;AAAA,IAC9C,EAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAS,EAAA;AAAA,oBACPF;AAAA;AACF,GACD,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,MACD,WAA6B,CAAA;AAAA,IAC/B,cAAA;AAAA,IACA,yBAAyB,SAAW,IAAA,IAAA,GAAA,
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../src/dropdown/Dropdown.tsx"],"sourcesContent":["import { useForkRef, useIdMemo as useId } from \"@salt-ds/core\";\nimport {\n type ForwardedRef,\n type ReactElement,\n cloneElement,\n forwardRef,\n useCallback,\n useRef,\n} from \"react\";\n\nimport {\n type CollectionItem,\n CollectionProvider,\n type SelectionProps,\n type SelectionStrategy,\n type SingleSelectionStrategy,\n itemToString as defaultItemToString,\n useCollectionItems,\n} from \"../common-hooks\";\nimport { List } from \"../list/List\";\nimport type { ListProps } from \"../list/listTypes\";\nimport { forwardCallbackProps } from \"../utils\";\nimport { DropdownBase, type MaybeChildProps } from \"./DropdownBase\";\nimport { DropdownButton } from \"./DropdownButton\";\nimport type { DropdownBaseProps } from \"./dropdownTypes\";\nimport { useDropdown } from \"./useDropdown\";\n\nexport interface DropdownProps<\n Item = string,\n Selection extends SelectionStrategy = \"default\",\n> extends DropdownBaseProps,\n Pick<\n ListProps<Item, Selection>,\n \"ListItem\" | \"itemToString\" | \"source\" | \"width\"\n >,\n SelectionProps<Item, Selection> {\n ListProps?: Omit<\n ListProps<Item, Selection>,\n \"ListItem\" | \"itemToString\" | \"source\"\n >;\n}\n\nexport const Dropdown = forwardRef(function Dropdown<\n Item = string,\n Selection extends SelectionStrategy = \"default\",\n>(\n {\n \"aria-label\": ariaLabel,\n children,\n defaultIsOpen,\n defaultSelected,\n id: idProp,\n isOpen: isOpenProp,\n itemToString = defaultItemToString,\n onOpenChange,\n onSelectionChange,\n onSelect,\n selected: selectedProp,\n selectionStrategy,\n source,\n triggerComponent,\n ListItem,\n ListProps,\n width = 180,\n ...props\n }: DropdownProps<Item, Selection>,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const id = useId(idProp);\n const rootRef = useRef<HTMLDivElement>(null);\n const forkedRef = useForkRef<HTMLDivElement>(rootRef, forwardedRef);\n\n const collectionHook = useCollectionItems<Item>({\n id,\n source,\n children,\n options: {\n itemToString,\n },\n });\n\n const {\n highlightedIndex,\n triggerLabel,\n listHandlers,\n listControlProps,\n selected,\n ...dropdownListHook\n } = useDropdown<Item, Selection>({\n collectionHook,\n defaultHighlightedIndex: ListProps?.defaultHighlightedIndex,\n defaultIsOpen,\n defaultSelected: collectionHook.itemToCollectionItem<\n Selection,\n typeof defaultSelected\n >(defaultSelected),\n highlightedIndex: ListProps?.highlightedIndex,\n isOpen: isOpenProp,\n itemToString,\n label: \"Dropdown\",\n onHighlight: ListProps?.onHighlight,\n onOpenChange,\n onSelectionChange,\n onSelect,\n selected: collectionHook.itemToCollectionItem<\n Selection,\n typeof selectedProp\n >(selectedProp),\n selectionStrategy,\n });\n\n const collectionItemsToItem = useCallback(\n (\n itemOrItems?: CollectionItem<Item> | null | CollectionItem<Item>[],\n ):\n | undefined\n | (Selection extends SingleSelectionStrategy ? Item | null : Item[]) => {\n type returnType = Selection extends SingleSelectionStrategy\n ? Item | null\n : Item[];\n if (Array.isArray(itemOrItems)) {\n return itemOrItems.map((i) => i.value) as returnType;\n }\n if (itemOrItems) {\n return itemOrItems.value as returnType;\n }\n },\n [],\n );\n\n const getTriggerComponent = () => {\n const ariaProps = {\n \"aria-activedescendant\": dropdownListHook.isOpen\n ? listControlProps?.[\"aria-activedescendant\"]\n : undefined,\n \"aria-label\": ariaLabel,\n };\n if (triggerComponent) {\n const ownProps = triggerComponent.props as MaybeChildProps;\n return cloneElement(\n triggerComponent,\n forwardCallbackProps(ownProps, {\n ...(dropdownListHook.isOpen ? listControlProps : {}),\n ...ariaProps,\n }),\n );\n }\n return (\n <DropdownButton\n label={triggerLabel}\n {...(dropdownListHook.isOpen ? listControlProps : {})}\n {...ariaProps}\n />\n );\n };\n\n return (\n <CollectionProvider<Item> collectionHook={collectionHook}>\n <DropdownBase\n {...props}\n id={id}\n isOpen={dropdownListHook.isOpen}\n onOpenChange={dropdownListHook.onOpenChange}\n ref={forkedRef}\n width={width}\n >\n {getTriggerComponent()}\n <List<Item, Selection>\n ListItem={ListItem}\n itemToString={itemToString}\n {...ListProps}\n highlightedIndex={highlightedIndex}\n listHandlers={listHandlers}\n onSelectionChange={onSelectionChange}\n onSelect={onSelect}\n selected={collectionItemsToItem(selected)}\n selectionStrategy={selectionStrategy}\n data-testid=\"dropdown-list\"\n />\n </DropdownBase>\n </CollectionProvider>\n );\n}) as <Item, Selection extends SelectionStrategy = \"default\">(\n props: DropdownProps<Item, Selection> & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<DropdownProps<Item, Selection>>;\n"],"names":["Dropdown","itemToString","defaultItemToString","useId"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { flip, shift,
|
|
2
|
+
import { flip, shift, size, limitShift } from '@floating-ui/react';
|
|
3
3
|
import { makePrefixer, useIdMemo, useFloatingUI, useForkRef } from '@salt-ds/core';
|
|
4
4
|
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
5
5
|
import { clsx } from 'clsx';
|
|
@@ -60,7 +60,6 @@ const DropdownBase = forwardRef(
|
|
|
60
60
|
onOpenChange,
|
|
61
61
|
onKeyDown,
|
|
62
62
|
openOnFocus,
|
|
63
|
-
popupComponent,
|
|
64
63
|
popupWidth,
|
|
65
64
|
rootRef,
|
|
66
65
|
width
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownBase.js","sources":["../src/dropdown/DropdownBase.tsx"],"sourcesContent":["import { flip, limitShift, shift, size } from \"@floating-ui/react\";\nimport {\n makePrefixer,\n useFloatingUI,\n useForkRef,\n useIdMemo as useId,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { clsx } from \"clsx\";\nimport { Children, cloneElement, forwardRef, useRef, useState } from \"react\";\nimport { Portal } from \"../portal\";\nimport { forwardCallbackProps } from \"../utils\";\nimport { isDesktop, useWindow as usePortalWindow } from \"../window\";\nimport type { DropdownBaseProps } from \"./dropdownTypes\";\nimport { useDropdownBase } from \"./useDropdownBase\";\n\nimport { useWindow } from \"@salt-ds/window\";\n\nimport dropdownCss from \"./Dropdown.css\";\n// Any component may be passed as our trigger or popup component.\n// Define the common props that we will act on, if present,\n// so we can type them.\nexport type MaybeChildProps = {\n className?: string;\n id?: string;\n role?: string;\n width: number | string;\n};\n\nconst withBaseName = makePrefixer(\"saltDropdownBase\");\n\nexport const DropdownBase = forwardRef<HTMLDivElement, DropdownBaseProps>(\n function Dropdown(\n {\n \"aria-labelledby\": ariaLabelledByProp,\n children,\n className: classNameProp,\n container,\n defaultIsOpen,\n disabled,\n disablePortal,\n fullWidth,\n id: idProp,\n isOpen: isOpenProp,\n onKeyDown,\n onOpenChange,\n openOnFocus,\n placement = \"bottom-start\",\n popupWidth,\n width,\n ...htmlAttributes\n },\n forwardedRef,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-dropdown\",\n css: dropdownCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const className = clsx(withBaseName(), classNameProp, {\n [withBaseName(\"fullWidth\")]: fullWidth,\n [withBaseName(\"disabled\")]: disabled,\n });\n const [trigger, popupComponent] = Children.toArray(\n children,\n ) as JSX.Element[];\n const id = useId(idProp);\n const Window = usePortalWindow();\n\n const { componentProps, popperRef, isOpen, triggerProps } = useDropdownBase(\n {\n ariaLabelledBy: ariaLabelledByProp,\n defaultIsOpen,\n disabled,\n fullWidth,\n id,\n isOpen: isOpenProp,\n onOpenChange,\n onKeyDown,\n openOnFocus,\n popupComponent,\n popupWidth,\n rootRef,\n width,\n },\n );\n const [maxPopupHeight, setMaxPopupHeight] = useState<number | undefined>(\n undefined,\n );\n\n const middleware = isDesktop\n ? []\n : [\n flip({\n fallbackPlacements: [\"bottom-start\", \"top-start\"],\n }),\n shift({ limiter: limitShift() }),\n size({\n apply({ availableHeight }) {\n setMaxPopupHeight(availableHeight);\n },\n }),\n ];\n\n const { reference, floating, x, y, strategy } = useFloatingUI({\n placement,\n middleware,\n });\n\n const handlePopperListAdapterRef = useForkRef<HTMLDivElement>(\n reference,\n forwardedRef,\n );\n const handleRootRef = useForkRef(rootRef, handlePopperListAdapterRef);\n const handleFloatingRef = useForkRef<HTMLDivElement>(floating, popperRef);\n // TODO maybe we should pass style, with maxHeight, to the popupComponent\n\n const getTriggerComponent = () => {\n const {\n id: defaultId,\n role: defaultRole,\n ...restTriggerProps\n } = triggerProps;\n\n const {\n id = defaultId,\n role = defaultRole,\n ...ownProps\n } = trigger.props as MaybeChildProps;\n\n return cloneElement(\n trigger,\n forwardCallbackProps(ownProps, {\n ...restTriggerProps,\n id,\n role,\n }),\n );\n };\n\n const getPopupComponent = () => {\n const { id: defaultId, width, ...restComponentProps } = componentProps;\n const {\n className,\n id = defaultId,\n width: ownWidth,\n ...ownProps\n } = popupComponent.props as MaybeChildProps;\n return cloneElement(popupComponent, {\n ...ownProps,\n ...restComponentProps,\n className: clsx(className, withBaseName(\"popup-component\")),\n id,\n width: ownWidth ?? width,\n });\n };\n\n return (\n <div\n {...htmlAttributes}\n className={className}\n data-testid=\"dropdown\"\n id={idProp}\n ref={handleRootRef}\n >\n {getTriggerComponent()}\n {isOpen && (\n <Portal disablePortal={disablePortal} container={container}>\n <Window\n className={clsx(withBaseName(\"popup\"), classNameProp)}\n id={`${id}-popup`}\n style={{\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n maxHeight: maxPopupHeight,\n }}\n ref={handleFloatingRef}\n >\n {getPopupComponent()}\n </Window>\n </Portal>\n )}\n </div>\n );\n },\n);\n"],"names":["dropdownCss","useId","usePortalWindow","id","width","className"],"mappings":";;;;;;;;;;;;;;AA6BA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA;AAE7C,MAAM,YAAe,GAAA,UAAA;AAAA,EAC1B,SAAS,QACP,CAAA;AAAA,IACE,iBAAmB,EAAA,kBAAA;AAAA,IACnB,QAAA;AAAA,IACA,SAAW,EAAA,aAAA;AAAA,IACX,SAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,EAAI,EAAA,MAAA;AAAA,IACJ,MAAQ,EAAA,UAAA;AAAA,IACR,SAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAY,GAAA,cAAA;AAAA,IACZ,UAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAG;AAAA,KAEL,YACA,EAAA;AACA,IAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,eAAA;AAAA,MACR,GAAK,EAAAA,QAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAM,MAAA,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,YAAa,EAAA,EAAG,aAAe,EAAA;AAAA,MACpD,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG,SAAA;AAAA,MAC7B,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG;AAAA,KAC7B,CAAA;AACD,IAAA,MAAM,CAAC,OAAA,EAAS,cAAc,CAAA,GAAI,QAAS,CAAA,OAAA;AAAA,MACzC;AAAA,KACF;AACA,IAAM,MAAA,EAAA,GAAKC,UAAM,MAAM,CAAA;AACvB,IAAA,MAAM,SAASC,WAAgB,EAAA;AAE/B,IAAA,MAAM,EAAE,cAAA,EAAgB,SAAW,EAAA,MAAA,EAAQ,cAAiB,GAAA,eAAA;AAAA,MAC1D;AAAA,QACE,cAAgB,EAAA,kBAAA;AAAA,QAChB,aAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,EAAA;AAAA,QACA,MAAQ,EAAA,UAAA;AAAA,QACR,YAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"DropdownBase.js","sources":["../src/dropdown/DropdownBase.tsx"],"sourcesContent":["import { flip, limitShift, shift, size } from \"@floating-ui/react\";\nimport {\n makePrefixer,\n useFloatingUI,\n useForkRef,\n useIdMemo as useId,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { clsx } from \"clsx\";\nimport { Children, cloneElement, forwardRef, useRef, useState } from \"react\";\nimport { Portal } from \"../portal\";\nimport { forwardCallbackProps } from \"../utils\";\nimport { isDesktop, useWindow as usePortalWindow } from \"../window\";\nimport type { DropdownBaseProps } from \"./dropdownTypes\";\nimport { useDropdownBase } from \"./useDropdownBase\";\n\nimport { useWindow } from \"@salt-ds/window\";\n\nimport dropdownCss from \"./Dropdown.css\";\n// Any component may be passed as our trigger or popup component.\n// Define the common props that we will act on, if present,\n// so we can type them.\nexport type MaybeChildProps = {\n className?: string;\n id?: string;\n role?: string;\n width: number | string;\n};\n\nconst withBaseName = makePrefixer(\"saltDropdownBase\");\n\nexport const DropdownBase = forwardRef<HTMLDivElement, DropdownBaseProps>(\n function Dropdown(\n {\n \"aria-labelledby\": ariaLabelledByProp,\n children,\n className: classNameProp,\n container,\n defaultIsOpen,\n disabled,\n disablePortal,\n fullWidth,\n id: idProp,\n isOpen: isOpenProp,\n onKeyDown,\n onOpenChange,\n openOnFocus,\n placement = \"bottom-start\",\n popupWidth,\n width,\n ...htmlAttributes\n },\n forwardedRef,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-dropdown\",\n css: dropdownCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const className = clsx(withBaseName(), classNameProp, {\n [withBaseName(\"fullWidth\")]: fullWidth,\n [withBaseName(\"disabled\")]: disabled,\n });\n const [trigger, popupComponent] = Children.toArray(\n children,\n ) as JSX.Element[];\n const id = useId(idProp);\n const Window = usePortalWindow();\n\n const { componentProps, popperRef, isOpen, triggerProps } = useDropdownBase(\n {\n ariaLabelledBy: ariaLabelledByProp,\n defaultIsOpen,\n disabled,\n fullWidth,\n id,\n isOpen: isOpenProp,\n onOpenChange,\n onKeyDown,\n openOnFocus,\n popupComponent,\n popupWidth,\n rootRef,\n width,\n },\n );\n const [maxPopupHeight, setMaxPopupHeight] = useState<number | undefined>(\n undefined,\n );\n\n const middleware = isDesktop\n ? []\n : [\n flip({\n fallbackPlacements: [\"bottom-start\", \"top-start\"],\n }),\n shift({ limiter: limitShift() }),\n size({\n apply({ availableHeight }) {\n setMaxPopupHeight(availableHeight);\n },\n }),\n ];\n\n const { reference, floating, x, y, strategy } = useFloatingUI({\n placement,\n middleware,\n });\n\n const handlePopperListAdapterRef = useForkRef<HTMLDivElement>(\n reference,\n forwardedRef,\n );\n const handleRootRef = useForkRef(rootRef, handlePopperListAdapterRef);\n const handleFloatingRef = useForkRef<HTMLDivElement>(floating, popperRef);\n // TODO maybe we should pass style, with maxHeight, to the popupComponent\n\n const getTriggerComponent = () => {\n const {\n id: defaultId,\n role: defaultRole,\n ...restTriggerProps\n } = triggerProps;\n\n const {\n id = defaultId,\n role = defaultRole,\n ...ownProps\n } = trigger.props as MaybeChildProps;\n\n return cloneElement(\n trigger,\n forwardCallbackProps(ownProps, {\n ...restTriggerProps,\n id,\n role,\n }),\n );\n };\n\n const getPopupComponent = () => {\n const { id: defaultId, width, ...restComponentProps } = componentProps;\n const {\n className,\n id = defaultId,\n width: ownWidth,\n ...ownProps\n } = popupComponent.props as MaybeChildProps;\n return cloneElement(popupComponent, {\n ...ownProps,\n ...restComponentProps,\n className: clsx(className, withBaseName(\"popup-component\")),\n id,\n width: ownWidth ?? width,\n });\n };\n\n return (\n <div\n {...htmlAttributes}\n className={className}\n data-testid=\"dropdown\"\n id={idProp}\n ref={handleRootRef}\n >\n {getTriggerComponent()}\n {isOpen && (\n <Portal disablePortal={disablePortal} container={container}>\n <Window\n className={clsx(withBaseName(\"popup\"), classNameProp)}\n id={`${id}-popup`}\n style={{\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n maxHeight: maxPopupHeight,\n }}\n ref={handleFloatingRef}\n >\n {getPopupComponent()}\n </Window>\n </Portal>\n )}\n </div>\n );\n },\n);\n"],"names":["dropdownCss","useId","usePortalWindow","id","width","className"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownButton.js","sources":["../src/dropdown/DropdownButton.tsx"],"sourcesContent":["import { Button, type ButtonProps, makePrefixer, useIcon } from \"@salt-ds/core\";\nimport { DEFAULT_ICON_SIZE, type IconProps } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport {\n type AriaAttributes,\n type ComponentType,\n type ForwardedRef,\n forwardRef,\n} from \"react\";\nimport { useFormFieldLegacyProps } from \"../form-field-context-legacy\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport dropdownButtonCss from \"./DropdownButton.css\";\n\nexport interface DropdownButtonProps extends ButtonProps {\n /**\n * Replace the default Icon component\n */\n IconComponent?: ComponentType<any>;\n /**\n * Whether the dropdown button should hide role='option' via 'aria-hidden'\n */\n ariaHideOptionRole?: boolean;\n /**\n * If, `true`, the Dropdown button will occupy the full width of it's container\n */\n fullWidth?: boolean;\n /**\n * Sets the size of the down arrow icon. If this is not specified, a default size based on density is used.\n */\n iconSize?: IconProps[\"size\"];\n /**\n * Is the dropdown list open\n */\n isOpen?: boolean;\n /**\n * Label for the dropdown button\n */\n label?: string;\n /**\n * Id for the label. This is needed for ARIA attributes.\n */\n labelId?: string;\n /**\n * When the dropdown is collapsed this value is set as aria-posinset on the span containing the selected value\n * **/\n posInSet?: number;\n /**\n * When the dropdown is collapsed this value is set as aria-setsize on the span containing the selected value\n * **/\n setSize?: number;\n /**\n *\n * **/\n labelAriaAttributes?: Pick<\n AriaAttributes,\n \"aria-posinset\" | \"aria-setsize\" | \"aria-selected\"\n >;\n}\n\nconst withBaseName = makePrefixer(\"saltDropdownButton\");\n\nexport const DropdownButton = forwardRef(function DropdownButton(\n {\n IconComponent,\n ariaHideOptionRole,\n className,\n disabled,\n iconSize = DEFAULT_ICON_SIZE,\n isOpen,\n label,\n labelId,\n fullWidth,\n posInSet,\n setSize,\n labelAriaAttributes,\n ...rest\n }: DropdownButtonProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-dropdown-button\",\n css: dropdownButtonCss,\n window: targetWindow,\n });\n const { ExpandIcon } = useIcon();\n const Icon = IconComponent === undefined ? ExpandIcon : IconComponent;\n const { inFormField } = useFormFieldLegacyProps();\n // FIXME: use polymorphic button\n // We don't want the 'button' tag to be shown in the DOM to trigger some accessibility testing\n // tool's false alarm on role of 'listbox'\n return (\n <Button\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"fullwidth\")]: fullWidth,\n [withBaseName(\"formField\")]: inFormField,\n },\n className,\n )}\n data-testid=\"dropdown-button\"\n disabled={disabled}\n variant=\"secondary\"\n {...rest}\n ref={ref}\n >\n <div className={withBaseName(\"content\")}>\n <span\n // 'hidden' so that screen reader won't be confused the additional 'option' which is just a label\n aria-hidden={ariaHideOptionRole ? \"true\" : undefined}\n {...labelAriaAttributes}\n className={withBaseName(\"buttonLabel\")}\n id={labelId}\n // biome-ignore lint/a11y/useAriaPropsForRole: 'option' role here is to suppress accessibility testing tool warning about 'listbox' missing children role\n role=\"option\"\n >\n {label}\n </span>\n <Icon\n className={withBaseName(\"icon\")}\n size={iconSize}\n aria-label={null}\n aria-hidden=\"true\"\n />\n </div>\n </Button>\n );\n});\n"],"names":["DropdownButton","dropdownButtonCss"],"mappings":";;;;;;;;;;;AA8DA,MAAM,YAAA,GAAe,aAAa,oBAAoB,CAAA;AAEzC,MAAA,cAAA,GAAiB,UAAW,CAAA,SAASA,eAChD,CAAA;AAAA,EACE,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAW,GAAA,iBAAA;AAAA,EACX,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,mBAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,sBAAA;AAAA,IACR,GAAK,EAAAC,QAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AACD,EAAM,MAAA,EAAE,UAAW,EAAA,GAAI,OAAQ,EAAA;AAC/B,EAAM,MAAA,IAAA,GAAO,aAAkB,KAAA,
|
|
1
|
+
{"version":3,"file":"DropdownButton.js","sources":["../src/dropdown/DropdownButton.tsx"],"sourcesContent":["import { Button, type ButtonProps, makePrefixer, useIcon } from \"@salt-ds/core\";\nimport { DEFAULT_ICON_SIZE, type IconProps } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport {\n type AriaAttributes,\n type ComponentType,\n type ForwardedRef,\n forwardRef,\n} from \"react\";\nimport { useFormFieldLegacyProps } from \"../form-field-context-legacy\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport dropdownButtonCss from \"./DropdownButton.css\";\n\nexport interface DropdownButtonProps extends ButtonProps {\n /**\n * Replace the default Icon component\n */\n IconComponent?: ComponentType<any>;\n /**\n * Whether the dropdown button should hide role='option' via 'aria-hidden'\n */\n ariaHideOptionRole?: boolean;\n /**\n * If, `true`, the Dropdown button will occupy the full width of it's container\n */\n fullWidth?: boolean;\n /**\n * Sets the size of the down arrow icon. If this is not specified, a default size based on density is used.\n */\n iconSize?: IconProps[\"size\"];\n /**\n * Is the dropdown list open\n */\n isOpen?: boolean;\n /**\n * Label for the dropdown button\n */\n label?: string;\n /**\n * Id for the label. This is needed for ARIA attributes.\n */\n labelId?: string;\n /**\n * When the dropdown is collapsed this value is set as aria-posinset on the span containing the selected value\n * **/\n posInSet?: number;\n /**\n * When the dropdown is collapsed this value is set as aria-setsize on the span containing the selected value\n * **/\n setSize?: number;\n /**\n *\n * **/\n labelAriaAttributes?: Pick<\n AriaAttributes,\n \"aria-posinset\" | \"aria-setsize\" | \"aria-selected\"\n >;\n}\n\nconst withBaseName = makePrefixer(\"saltDropdownButton\");\n\nexport const DropdownButton = forwardRef(function DropdownButton(\n {\n IconComponent,\n ariaHideOptionRole,\n className,\n disabled,\n iconSize = DEFAULT_ICON_SIZE,\n isOpen,\n label,\n labelId,\n fullWidth,\n posInSet,\n setSize,\n labelAriaAttributes,\n ...rest\n }: DropdownButtonProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-dropdown-button\",\n css: dropdownButtonCss,\n window: targetWindow,\n });\n const { ExpandIcon } = useIcon();\n const Icon = IconComponent === undefined ? ExpandIcon : IconComponent;\n const { inFormField } = useFormFieldLegacyProps();\n // FIXME: use polymorphic button\n // We don't want the 'button' tag to be shown in the DOM to trigger some accessibility testing\n // tool's false alarm on role of 'listbox'\n return (\n <Button\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"fullwidth\")]: fullWidth,\n [withBaseName(\"formField\")]: inFormField,\n },\n className,\n )}\n data-testid=\"dropdown-button\"\n disabled={disabled}\n variant=\"secondary\"\n {...rest}\n ref={ref}\n >\n <div className={withBaseName(\"content\")}>\n <span\n // 'hidden' so that screen reader won't be confused the additional 'option' which is just a label\n aria-hidden={ariaHideOptionRole ? \"true\" : undefined}\n {...labelAriaAttributes}\n className={withBaseName(\"buttonLabel\")}\n id={labelId}\n // biome-ignore lint/a11y/useAriaPropsForRole: 'option' role here is to suppress accessibility testing tool warning about 'listbox' missing children role\n role=\"option\"\n >\n {label}\n </span>\n <Icon\n className={withBaseName(\"icon\")}\n size={iconSize}\n aria-label={null}\n aria-hidden=\"true\"\n />\n </div>\n </Button>\n );\n});\n"],"names":["DropdownButton","dropdownButtonCss"],"mappings":";;;;;;;;;;;AA8DA,MAAM,YAAA,GAAe,aAAa,oBAAoB,CAAA;AAEzC,MAAA,cAAA,GAAiB,UAAW,CAAA,SAASA,eAChD,CAAA;AAAA,EACE,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAW,GAAA,iBAAA;AAAA,EACX,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,mBAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,sBAAA;AAAA,IACR,GAAK,EAAAC,QAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AACD,EAAM,MAAA,EAAE,UAAW,EAAA,GAAI,OAAQ,EAAA;AAC/B,EAAM,MAAA,IAAA,GAAO,aAAkB,KAAA,MAAA,GAAY,UAAa,GAAA,aAAA;AACxD,EAAM,MAAA,EAAE,WAAY,EAAA,GAAI,uBAAwB,EAAA;AAIhD,EACE,uBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,IAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb;AAAA,UACE,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG,SAAA;AAAA,UAC7B,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG;AAAA,SAC/B;AAAA,QACA;AAAA,OACF;AAAA,MACA,aAAY,EAAA,iBAAA;AAAA,MACZ,QAAA;AAAA,MACA,OAAQ,EAAA,WAAA;AAAA,MACP,GAAG,IAAA;AAAA,MACJ,GAAA;AAAA,MAEA,QAAC,kBAAA,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,YAAA,CAAa,SAAS,CACpC,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAEC,aAAA,EAAa,qBAAqB,MAAS,GAAA,MAAA;AAAA,YAC1C,GAAG,mBAAA;AAAA,YACJ,SAAA,EAAW,aAAa,aAAa,CAAA;AAAA,YACrC,EAAI,EAAA,OAAA;AAAA,YAEJ,IAAK,EAAA,QAAA;AAAA,YAEJ,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACA,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,YAC9B,IAAM,EAAA,QAAA;AAAA,YACN,YAAY,EAAA,IAAA;AAAA,YACZ,aAAY,EAAA;AAAA;AAAA;AACd,OACF,EAAA;AAAA;AAAA,GACF;AAEJ,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useClickAway.js","sources":["../src/dropdown/useClickAway.ts"],"sourcesContent":["import { type RefObject, useEffect } from \"react\";\n\nexport type ClickawayHook = (props: {\n popperRef: RefObject<HTMLElement>;\n rootRef: RefObject<HTMLElement>;\n isOpen: boolean;\n onClose: () => void;\n}) => void;\n\ntype MouseEventHandler = (e: MouseEvent) => void;\ntype KeyboardEventHandler = (e: KeyboardEvent) => void;\n\nconst NO_HANDLERS: [MouseEventHandler?, KeyboardEventHandler?] = [];\n\nexport const useClickAway: ClickawayHook = ({\n popperRef,\n rootRef,\n isOpen,\n onClose,\n}) => {\n useEffect(() => {\n const [clickHandler, escapeKeyHandler] = isOpen\n ? [\n (evt: MouseEvent) => {\n const targetElement = evt.target as HTMLElement;\n if (\n !popperRef.current?.contains(targetElement) &&\n !rootRef.current?.contains(targetElement)\n ) {\n onClose();\n }\n },\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n },\n ]\n : NO_HANDLERS;\n\n if (clickHandler && escapeKeyHandler) {\n document.body.addEventListener(\"mousedown\", clickHandler, true);\n document.body.addEventListener(\"keydown\", escapeKeyHandler, true);\n }\n\n return () => {\n if (clickHandler && escapeKeyHandler) {\n document.body.removeEventListener(\"mousedown\", clickHandler, true);\n document.body.removeEventListener(\"keydown\", escapeKeyHandler, true);\n }\n };\n }, [isOpen, onClose, popperRef, rootRef]);\n};\n"],"names":[],"mappings":";;AAYA,MAAM,cAA2D,EAAC;AAE3D,MAAM,eAA8B,CAAC;AAAA,EAC1C,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAM,KAAA;AACJ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,CAAC,YAAA,EAAc,gBAAgB,CAAA,GAAI,MACrC,GAAA;AAAA,MACE,CAAC,GAAoB,KAAA;AAvB/B,QAAA,IAAA,EAAA,EAAA,EAAA;AAwBY,QAAA,MAAM,gBAAgB,GAAI,CAAA,MAAA;AAC1B,QACE,IAAA,EAAA,CAAC,EAAU,GAAA,SAAA,CAAA,OAAA,KAAV,IAAmB,GAAA,
|
|
1
|
+
{"version":3,"file":"useClickAway.js","sources":["../src/dropdown/useClickAway.ts"],"sourcesContent":["import { type RefObject, useEffect } from \"react\";\n\nexport type ClickawayHook = (props: {\n popperRef: RefObject<HTMLElement>;\n rootRef: RefObject<HTMLElement>;\n isOpen: boolean;\n onClose: () => void;\n}) => void;\n\ntype MouseEventHandler = (e: MouseEvent) => void;\ntype KeyboardEventHandler = (e: KeyboardEvent) => void;\n\nconst NO_HANDLERS: [MouseEventHandler?, KeyboardEventHandler?] = [];\n\nexport const useClickAway: ClickawayHook = ({\n popperRef,\n rootRef,\n isOpen,\n onClose,\n}) => {\n useEffect(() => {\n const [clickHandler, escapeKeyHandler] = isOpen\n ? [\n (evt: MouseEvent) => {\n const targetElement = evt.target as HTMLElement;\n if (\n !popperRef.current?.contains(targetElement) &&\n !rootRef.current?.contains(targetElement)\n ) {\n onClose();\n }\n },\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n },\n ]\n : NO_HANDLERS;\n\n if (clickHandler && escapeKeyHandler) {\n document.body.addEventListener(\"mousedown\", clickHandler, true);\n document.body.addEventListener(\"keydown\", escapeKeyHandler, true);\n }\n\n return () => {\n if (clickHandler && escapeKeyHandler) {\n document.body.removeEventListener(\"mousedown\", clickHandler, true);\n document.body.removeEventListener(\"keydown\", escapeKeyHandler, true);\n }\n };\n }, [isOpen, onClose, popperRef, rootRef]);\n};\n"],"names":[],"mappings":";;AAYA,MAAM,cAA2D,EAAC;AAE3D,MAAM,eAA8B,CAAC;AAAA,EAC1C,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAM,KAAA;AACJ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,CAAC,YAAA,EAAc,gBAAgB,CAAA,GAAI,MACrC,GAAA;AAAA,MACE,CAAC,GAAoB,KAAA;AAvB/B,QAAA,IAAA,EAAA,EAAA,EAAA;AAwBY,QAAA,MAAM,gBAAgB,GAAI,CAAA,MAAA;AAC1B,QACE,IAAA,EAAA,CAAC,EAAU,GAAA,SAAA,CAAA,OAAA,KAAV,IAAmB,GAAA,MAAA,GAAA,EAAA,CAAA,QAAA,CAAS,aAC7B,CAAA,CAAA,IAAA,EAAA,CAAC,EAAQ,GAAA,OAAA,CAAA,OAAA,KAAR,IAAiB,GAAA,MAAA,GAAA,EAAA,CAAA,QAAA,CAAS,aAC3B,CAAA,CAAA,EAAA;AACA,UAAQ,OAAA,EAAA;AAAA;AACV,OACF;AAAA,MACA,CAAC,CAAqB,KAAA;AACpB,QAAI,IAAA,CAAA,CAAE,QAAQ,QAAU,EAAA;AACtB,UAAQ,OAAA,EAAA;AAAA;AACV;AACF,KAEF,GAAA,WAAA;AAEJ,IAAA,IAAI,gBAAgB,gBAAkB,EAAA;AACpC,MAAA,QAAA,CAAS,IAAK,CAAA,gBAAA,CAAiB,WAAa,EAAA,YAAA,EAAc,IAAI,CAAA;AAC9D,MAAA,QAAA,CAAS,IAAK,CAAA,gBAAA,CAAiB,SAAW,EAAA,gBAAA,EAAkB,IAAI,CAAA;AAAA;AAGlE,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,gBAAgB,gBAAkB,EAAA;AACpC,QAAA,QAAA,CAAS,IAAK,CAAA,mBAAA,CAAoB,WAAa,EAAA,YAAA,EAAc,IAAI,CAAA;AACjE,QAAA,QAAA,CAAS,IAAK,CAAA,mBAAA,CAAoB,SAAW,EAAA,gBAAA,EAAkB,IAAI,CAAA;AAAA;AACrE,KACF;AAAA,KACC,CAAC,MAAA,EAAQ,OAAS,EAAA,SAAA,EAAW,OAAO,CAAC,CAAA;AAC1C;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDropdown.js","sources":["../src/dropdown/useDropdown.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport { useCallback, useMemo } from \"react\";\nimport {\n type CollectionItem,\n type SelectHandler,\n type SelectionChangeHandler,\n type SelectionStrategy,\n itemToString as defaultItemToString,\n} from \"../common-hooks\";\nimport { type ListHookProps, type ListHookResult, useList } from \"../list\";\nimport type { DropdownHookProps, DropdownHookResult } from \"./dropdownTypes\";\n\nconst NULL_REF = { current: null };\n\nexport interface DropdownListHookProps<Item, Strategy extends SelectionStrategy>\n extends Partial<Omit<DropdownHookProps, \"onKeyDown\">>,\n Omit<ListHookProps<Item, Strategy>, \"containerRef\"> {\n itemToString?: (item: Item) => string;\n}\n\nexport interface DropdownListHookResult<\n Item,\n Selection extends SelectionStrategy,\n> extends Partial<ListHookResult<Item, Selection>>,\n Partial<DropdownHookResult> {\n onOpenChange: any;\n triggerLabel?: string;\n}\n\nexport const useDropdown = <\n Item,\n Selection extends SelectionStrategy = \"default\",\n>({\n collectionHook,\n defaultHighlightedIndex: defaultHighlightedIndexProp,\n defaultIsOpen,\n defaultSelected,\n highlightedIndex: highlightedIndexProp,\n isOpen: isOpenProp,\n itemToString = defaultItemToString,\n onHighlight,\n onOpenChange,\n onSelectionChange,\n onSelect,\n selected,\n selectionStrategy,\n}: DropdownListHookProps<Item, Selection>): DropdownListHookResult<\n Item,\n Selection\n> => {\n const isMultiSelect =\n selectionStrategy === \"multiple\" || selectionStrategy === \"extended\";\n\n const [isOpen, setIsOpen] = useControlled<boolean>({\n controlled: isOpenProp,\n default: defaultIsOpen ?? false,\n name: \"useDropdownList\",\n });\n\n const handleSelectionChange = useCallback<\n SelectionChangeHandler<Item, Selection>\n >(\n (evt, selected) => {\n if (!isMultiSelect) {\n setIsOpen(false);\n onOpenChange?.(false);\n }\n onSelectionChange?.(evt, selected);\n },\n [isMultiSelect, onOpenChange, onSelectionChange],\n );\n\n const handleSelect = useCallback<SelectHandler<Item>>(\n (evt, selected) => {\n if (!isMultiSelect) {\n setIsOpen(false);\n onOpenChange?.(false);\n }\n onSelect?.(evt, selected);\n },\n [isMultiSelect, onOpenChange, onSelect],\n );\n\n const listHook = useList<Item, Selection>({\n collectionHook,\n defaultHighlightedIndex:\n (defaultHighlightedIndexProp ?? highlightedIndexProp === undefined)\n ? 0\n : undefined,\n defaultSelected,\n label: \"useDropDownList\",\n onSelectionChange: handleSelectionChange,\n onSelect: handleSelect,\n containerRef: NULL_REF,\n highlightedIndex: highlightedIndexProp,\n onHighlight,\n selected,\n selectionStrategy,\n tabToSelect: !isMultiSelect,\n });\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n setIsOpen(open);\n onOpenChange?.(open);\n },\n [onOpenChange],\n );\n\n const triggerLabel = useMemo(() => {\n if (isMultiSelect && Array.isArray(listHook.selected)) {\n const selectedItems = listHook.selected as CollectionItem<Item>[];\n if (selectedItems.length === 0) {\n return undefined;\n }\n if (selectedItems.length === 1) {\n const { value } = selectedItems[0];\n return value === null ? undefined : itemToString(value);\n }\n return `${selectedItems.length} items selected`;\n }\n const selectedItem = listHook.selected as CollectionItem<Item>;\n return selectedItem == null || selectedItem.value === null\n ? undefined\n : itemToString(selectedItem.value);\n }, [isMultiSelect, itemToString, listHook.selected]);\n\n return {\n isOpen,\n onOpenChange: handleOpenChange,\n triggerLabel,\n ...listHook,\n };\n};\n"],"names":["itemToString","defaultItemToString","selected"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,QAAA,GAAW,EAAE,OAAA,EAAS,IAAK,EAAA;AAiB1B,MAAM,cAAc,CAGzB;AAAA,EACA,cAAA;AAAA,EACA,uBAAyB,EAAA,2BAAA;AAAA,EACzB,aAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAkB,EAAA,oBAAA;AAAA,EAClB,MAAQ,EAAA,UAAA;AAAA,gBACRA,cAAe,GAAAC,YAAA;AAAA,EACf,WAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAGK,KAAA;AACH,EAAM,MAAA,aAAA,GACJ,iBAAsB,KAAA,UAAA,IAAc,iBAAsB,KAAA,UAAA;AAE5D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,aAAuB,CAAA;AAAA,IACjD,UAAY,EAAA,UAAA;AAAA,IACZ,SAAS,aAAiB,IAAA,KAAA;AAAA,IAC1B,IAAM,EAAA;AAAA,GACP,CAAA;AAED,EAAA,MAAM,qBAAwB,GAAA,WAAA;AAAA,IAG5B,CAAC,KAAKC,SAAa,KAAA;AACjB,MAAA,IAAI,CAAC,aAAe,EAAA;AAClB,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAe,YAAA,IAAA,IAAA,GAAA,
|
|
1
|
+
{"version":3,"file":"useDropdown.js","sources":["../src/dropdown/useDropdown.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport { useCallback, useMemo } from \"react\";\nimport {\n type CollectionItem,\n type SelectHandler,\n type SelectionChangeHandler,\n type SelectionStrategy,\n itemToString as defaultItemToString,\n} from \"../common-hooks\";\nimport { type ListHookProps, type ListHookResult, useList } from \"../list\";\nimport type { DropdownHookProps, DropdownHookResult } from \"./dropdownTypes\";\n\nconst NULL_REF = { current: null };\n\nexport interface DropdownListHookProps<Item, Strategy extends SelectionStrategy>\n extends Partial<Omit<DropdownHookProps, \"onKeyDown\">>,\n Omit<ListHookProps<Item, Strategy>, \"containerRef\"> {\n itemToString?: (item: Item) => string;\n}\n\nexport interface DropdownListHookResult<\n Item,\n Selection extends SelectionStrategy,\n> extends Partial<ListHookResult<Item, Selection>>,\n Partial<DropdownHookResult> {\n onOpenChange: any;\n triggerLabel?: string;\n}\n\nexport const useDropdown = <\n Item,\n Selection extends SelectionStrategy = \"default\",\n>({\n collectionHook,\n defaultHighlightedIndex: defaultHighlightedIndexProp,\n defaultIsOpen,\n defaultSelected,\n highlightedIndex: highlightedIndexProp,\n isOpen: isOpenProp,\n itemToString = defaultItemToString,\n onHighlight,\n onOpenChange,\n onSelectionChange,\n onSelect,\n selected,\n selectionStrategy,\n}: DropdownListHookProps<Item, Selection>): DropdownListHookResult<\n Item,\n Selection\n> => {\n const isMultiSelect =\n selectionStrategy === \"multiple\" || selectionStrategy === \"extended\";\n\n const [isOpen, setIsOpen] = useControlled<boolean>({\n controlled: isOpenProp,\n default: defaultIsOpen ?? false,\n name: \"useDropdownList\",\n });\n\n const handleSelectionChange = useCallback<\n SelectionChangeHandler<Item, Selection>\n >(\n (evt, selected) => {\n if (!isMultiSelect) {\n setIsOpen(false);\n onOpenChange?.(false);\n }\n onSelectionChange?.(evt, selected);\n },\n [isMultiSelect, onOpenChange, onSelectionChange],\n );\n\n const handleSelect = useCallback<SelectHandler<Item>>(\n (evt, selected) => {\n if (!isMultiSelect) {\n setIsOpen(false);\n onOpenChange?.(false);\n }\n onSelect?.(evt, selected);\n },\n [isMultiSelect, onOpenChange, onSelect],\n );\n\n const listHook = useList<Item, Selection>({\n collectionHook,\n defaultHighlightedIndex:\n (defaultHighlightedIndexProp ?? highlightedIndexProp === undefined)\n ? 0\n : undefined,\n defaultSelected,\n label: \"useDropDownList\",\n onSelectionChange: handleSelectionChange,\n onSelect: handleSelect,\n containerRef: NULL_REF,\n highlightedIndex: highlightedIndexProp,\n onHighlight,\n selected,\n selectionStrategy,\n tabToSelect: !isMultiSelect,\n });\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n setIsOpen(open);\n onOpenChange?.(open);\n },\n [onOpenChange],\n );\n\n const triggerLabel = useMemo(() => {\n if (isMultiSelect && Array.isArray(listHook.selected)) {\n const selectedItems = listHook.selected as CollectionItem<Item>[];\n if (selectedItems.length === 0) {\n return undefined;\n }\n if (selectedItems.length === 1) {\n const { value } = selectedItems[0];\n return value === null ? undefined : itemToString(value);\n }\n return `${selectedItems.length} items selected`;\n }\n const selectedItem = listHook.selected as CollectionItem<Item>;\n return selectedItem == null || selectedItem.value === null\n ? undefined\n : itemToString(selectedItem.value);\n }, [isMultiSelect, itemToString, listHook.selected]);\n\n return {\n isOpen,\n onOpenChange: handleOpenChange,\n triggerLabel,\n ...listHook,\n };\n};\n"],"names":["itemToString","defaultItemToString","selected"],"mappings":"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"}
|