@salt-ds/lab 1.0.0-alpha.76 → 1.0.0-alpha.78
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 +52 -0
- package/css/salt-lab.css +274 -79
- package/dist-cjs/app-header/AppHeader.js.map +1 -1
- package/dist-cjs/breadcrumbs/Breadcrumb.js.map +1 -1
- package/dist-cjs/breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist-cjs/breadcrumbs/internal/BreadcrumbsCollapsed.js.map +1 -1
- package/dist-cjs/breadcrumbs/internal/BreadcrumbsContext.js.map +1 -1
- package/dist-cjs/breadcrumbs/internal/BreadcrumbsSeparator.js.map +1 -1
- package/dist-cjs/breadcrumbs/internal/useFocusMenuRemount.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/ButtonBarContext.js.map +1 -1
- package/dist-cjs/button-bar/internal/DescendantContext.js.map +1 -1
- package/dist-cjs/button-bar/internal/useDescendant.js.map +1 -1
- package/dist-cjs/button-bar/internal/useDescendants.js.map +1 -1
- package/dist-cjs/calendar/Calendar.css.js +1 -1
- package/dist-cjs/calendar/Calendar.js +11 -2
- package/dist-cjs/calendar/Calendar.js.map +1 -1
- package/dist-cjs/calendar/CalendarGrid.js +38 -36
- package/dist-cjs/calendar/CalendarGrid.js.map +1 -1
- package/dist-cjs/calendar/CalendarMonthHeader.js +1 -1
- package/dist-cjs/calendar/CalendarMonthHeader.js.map +1 -1
- package/dist-cjs/calendar/CalendarNavigation.css.js +1 -1
- package/dist-cjs/calendar/CalendarNavigation.js +20 -13
- package/dist-cjs/calendar/CalendarNavigation.js.map +1 -1
- package/dist-cjs/calendar/CalendarWeekHeader.css.js +1 -1
- package/dist-cjs/calendar/CalendarWeekHeader.js +1 -1
- package/dist-cjs/calendar/CalendarWeekHeader.js.map +1 -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 +26 -36
- package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -1
- package/dist-cjs/calendar/internal/CalendarMonth.css.js +1 -1
- package/dist-cjs/calendar/internal/CalendarMonth.js +30 -9
- package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -1
- package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -1
- package/dist-cjs/calendar/internal/utils.js.map +1 -1
- package/dist-cjs/calendar/useCalendar.js +7 -9
- package/dist-cjs/calendar/useCalendar.js.map +1 -1
- package/dist-cjs/calendar/useCalendarDay.js +7 -11
- package/dist-cjs/calendar/useCalendarDay.js.map +1 -1
- package/dist-cjs/calendar/useCalendarSelection.js +144 -76
- package/dist-cjs/calendar/useCalendarSelection.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/CascadingMenuAction.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/keydownHandlers.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/menuPositioning.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/stateUtils.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/useMountedRef.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useMouseHandlers.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useRefsManager.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useStateReducer.js.map +1 -1
- package/dist-cjs/cascading-menu/stateChangeTypes.js.map +1 -1
- package/dist-cjs/color-chooser/AlphaInputField.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/GetColorPalettes.js.map +1 -1
- package/dist-cjs/color-chooser/HexInput.js.map +1 -1
- package/dist-cjs/color-chooser/RGBAInput.js.map +1 -1
- package/dist-cjs/color-chooser/RGBAInputField.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/color-chooser/color-utils.js.map +1 -1
- package/dist-cjs/color-chooser/colorMap.js.map +1 -1
- package/dist-cjs/color-chooser/createTabsMapping.js.map +1 -1
- 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/ComboBoxDeprecated.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/filterHelpers.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
- 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/itemToString.js.map +1 -1
- package/dist-cjs/common-hooks/keyUtils.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/useAutoSizer.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.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/common-hooks/utils/filter-utils.js.map +1 -1
- package/dist-cjs/common-hooks/utils/isSelected.js.map +1 -1
- package/dist-cjs/contact-details/ContactAction.js.map +1 -1
- package/dist-cjs/contact-details/ContactActions.js.map +1 -1
- package/dist-cjs/contact-details/ContactAvatar.js.map +1 -1
- package/dist-cjs/contact-details/ContactDetails.js.map +1 -1
- package/dist-cjs/contact-details/ContactFavoriteToggle.js.map +1 -1
- package/dist-cjs/contact-details/ContactMetadata.js.map +1 -1
- package/dist-cjs/contact-details/ContactMetadataItem.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/MailLinkComponent.js.map +1 -1
- package/dist-cjs/contact-details/internal/ContactDetailsContext.js.map +1 -1
- package/dist-cjs/contact-details/internal/FavoriteToggle.js.map +1 -1
- package/dist-cjs/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
- package/dist-cjs/contact-details/internal/StarIcon.js.map +1 -1
- package/dist-cjs/contact-details/internal/StarIconContainer.js.map +1 -1
- package/dist-cjs/contact-details/internal/useComponentSize.js.map +1 -1
- package/dist-cjs/content-status/ContentStatus.js.map +1 -1
- package/dist-cjs/content-status/internal/StatusIndicator.js.map +1 -1
- package/dist-cjs/date-input/DateInputRange.js +3 -2
- package/dist-cjs/date-input/DateInputRange.js.map +1 -1
- package/dist-cjs/date-input/DateInputSingle.js +5 -2
- package/dist-cjs/date-input/DateInputSingle.js.map +1 -1
- package/dist-cjs/date-picker/DatePicker.js +0 -2
- package/dist-cjs/date-picker/DatePicker.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerActions.js +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.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerRangeGridPanel.js +2 -3
- package/dist-cjs/date-picker/DatePickerRangeGridPanel.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerRangeInput.js +22 -8
- package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerRangePanel.js +2 -4
- package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerSingleGridPanel.js +2 -4
- package/dist-cjs/date-picker/DatePickerSingleGridPanel.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerSingleInput.js +12 -7
- package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -1
- 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 +0 -17
- package/dist-cjs/date-picker/useDatePicker.js.map +1 -1
- package/dist-cjs/date-picker/useFocusOut.js.map +1 -1
- 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.map +1 -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-context-legacy/FormFieldLegacyContext.js.map +1 -1
- package/dist-cjs/form-field-context-legacy/useFormFieldLegacyProps.js.map +1 -1
- package/dist-cjs/form-field-legacy/FormActivationIndicator.js.map +1 -1
- package/dist-cjs/form-field-legacy/FormFieldLegacy.js.map +1 -1
- package/dist-cjs/form-field-legacy/FormHelperText.js.map +1 -1
- package/dist-cjs/form-field-legacy/FormLabel.js.map +1 -1
- package/dist-cjs/form-field-legacy/NecessityIndicator.js.map +1 -1
- package/dist-cjs/form-field-legacy/StatusIndicator.js.map +1 -1
- package/dist-cjs/form-field-legacy/constant.js.map +1 -1
- package/dist-cjs/form-group/FormGroup.js.map +1 -1
- package/dist-cjs/formatted-input/FormattedInput.js.map +1 -1
- package/dist-cjs/formatted-input/internal/InputWithMask.js.map +1 -1
- package/dist-cjs/input-legacy/InputLegacy.js.map +1 -1
- package/dist-cjs/input-legacy/StaticInputAdornment.js.map +1 -1
- package/dist-cjs/input-legacy/useCursorOnFocus.js.map +1 -1
- package/dist-cjs/layer-layout/LayerLayout.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/ListItemGroup.js.map +1 -1
- package/dist-cjs/list/ListItemHeader.js.map +1 -1
- package/dist-cjs/list/VirtualizedList.js.map +1 -1
- package/dist-cjs/list/keyset.js.map +1 -1
- package/dist-cjs/list/useList.js.map +1 -1
- package/dist-cjs/list/useListHeight.js.map +1 -1
- package/dist-cjs/list/useVirtualization.js.map +1 -1
- package/dist-cjs/list-deprecated/List.js.map +1 -1
- 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/ListStateContext.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/DescendantContext.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/Highlighter.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/calcPreferredListHeight.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/helpers.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/scrollIntoView.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/useListAutoSizer.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/useWidth.js.map +1 -1
- package/dist-cjs/list-deprecated/itemToString.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.map +1 -1
- package/dist-cjs/logo/Logo.js.map +1 -1
- package/dist-cjs/logo/LogoImage.js.map +1 -1
- package/dist-cjs/logo/LogoSeparator.js.map +1 -1
- package/dist-cjs/menu-button/MenuButton.js.map +1 -1
- package/dist-cjs/menu-button/MenuButtonTrigger.js.map +1 -1
- package/dist-cjs/metric/Metric.js.map +1 -1
- package/dist-cjs/metric/MetricContent.js.map +1 -1
- package/dist-cjs/metric/MetricHeader.js.map +1 -1
- package/dist-cjs/metric/internal/MetricContext.js.map +1 -1
- package/dist-cjs/number-input/NumberInput.js.map +1 -1
- package/dist-cjs/number-input/internal/useActivateWhileMouseDown.js.map +1 -1
- package/dist-cjs/number-input/internal/useCaret.js.map +1 -1
- package/dist-cjs/number-input/internal/useInterval.js.map +1 -1
- package/dist-cjs/number-input/internal/utils.js.map +1 -1
- package/dist-cjs/number-input/useNumberInput.js.map +1 -1
- package/dist-cjs/portal/Portal.js.map +1 -1
- package/dist-cjs/query-input/QueryInput.js.map +1 -1
- package/dist-cjs/query-input/internal/CategoryList.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/QueryInputBody.js.map +1 -1
- package/dist-cjs/query-input/internal/SearchList.js.map +1 -1
- package/dist-cjs/query-input/internal/ValueList.js.map +1 -1
- package/dist-cjs/query-input/internal/ValueSelector.js.map +1 -1
- package/dist-cjs/query-input/internal/usePopperStatus.js.map +1 -1
- package/dist-cjs/query-input/useQueryInput.js.map +1 -1
- package/dist-cjs/responsive/OverflowReducer.js.map +1 -1
- package/dist-cjs/responsive/overflowUtils.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.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/static-list/StaticList.js.map +1 -1
- package/dist-cjs/static-list/StaticListItem.js.map +1 -1
- package/dist-cjs/static-list/StaticListItemContent.js.map +1 -1
- package/dist-cjs/system-status/SystemStatus.js.map +1 -1
- package/dist-cjs/system-status/SystemStatusActions.js.map +1 -1
- package/dist-cjs/system-status/SystemStatusContent.js.map +1 -1
- package/dist-cjs/table/TBody.js.map +1 -1
- package/dist-cjs/table/TD.js +6 -2
- package/dist-cjs/table/TD.js.map +1 -1
- package/dist-cjs/table/TFoot.js.map +1 -1
- package/dist-cjs/table/TH.js +6 -2
- package/dist-cjs/table/TH.js.map +1 -1
- package/dist-cjs/table/THead.js.map +1 -1
- package/dist-cjs/table/TR.js.map +1 -1
- package/dist-cjs/table/Table.css.js +1 -1
- package/dist-cjs/table/Table.js +2 -2
- package/dist-cjs/table/Table.js.map +1 -1
- package/dist-cjs/tabs/Tab.js.map +1 -1
- package/dist-cjs/tabs/TabActivationIndicator.js.map +1 -1
- package/dist-cjs/tabs/TabPanel.js.map +1 -1
- package/dist-cjs/tabs/Tabs.js.map +1 -1
- package/dist-cjs/tabs/Tabstrip.js.map +1 -1
- package/dist-cjs/tabs/drag-drop/Draggable.js.map +1 -1
- package/dist-cjs/tabs/drag-drop/drag-utils.js.map +1 -1
- package/dist-cjs/tabs/drag-drop/dragDropTypes.js.map +1 -1
- package/dist-cjs/tabs/drag-drop/useDragDrop.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/useActivationIndicator.js.map +1 -1
- package/dist-cjs/tabs/useEditableItem.js.map +1 -1
- package/dist-cjs/tabs/useItemsWithIds.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/TabBar.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.css.js +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.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/toast-group/ToastGroup.js.map +1 -1
- package/dist-cjs/tokenized-input/TokenizedInput.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/InputRuler.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/calcFirstHiddenIndex.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/defaultItemToString.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/getCursorPosition.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/isPlainObject.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/useResizeObserver.js.map +1 -1
- package/dist-cjs/tokenized-input/internal/useWidth.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/calcFirstHiddenIndex.js.map +1 -1
- package/dist-cjs/tokenized-input-next/internal/useResizeObserver.js.map +1 -1
- package/dist-cjs/tokenized-input-next/internal/useWidth.js.map +1 -1
- package/dist-cjs/tokenized-input-next/useTokenizedInputNext.js.map +1 -1
- package/dist-cjs/toolbar/Toolbar.js.map +1 -1
- package/dist-cjs/toolbar/ToolbarButton.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/overflow-panel/OverflowSeparator.js.map +1 -1
- package/dist-cjs/toolbar/toolbar-field/ToolbarField.js.map +1 -1
- package/dist-cjs/toolbar/toolbar-field/useToolbarField.js.map +1 -1
- 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/escapeRegExp.js.map +1 -1
- package/dist-cjs/utils/forwardCallbackProps.js.map +1 -1
- package/dist-cjs/utils/isEmail.js.map +1 -1
- package/dist-cjs/utils/isPlainObject.js.map +1 -1
- package/dist-cjs/utils/partition.js.map +1 -1
- package/dist-cjs/utils/useClickOutside.js.map +1 -1
- package/dist-cjs/utils/useEventCallback.js.map +1 -1
- package/dist-cjs/utils/useIsViewportLargerThanBreakpoint.js.map +1 -1
- package/dist-cjs/utils/useLayoutEffectOnce.js.map +1 -1
- package/dist-cjs/utils/useLayoutEffectSkipFirst.js.map +1 -1
- package/dist-cjs/utils/useOverflowDetection.js.map +1 -1
- package/dist-cjs/utils/useSlideSelection.js.map +1 -1
- package/dist-cjs/window/ElectronWindow.js.map +1 -1
- package/dist-cjs/window/WindowContext.js.map +1 -1
- package/dist-cjs/window/desktop-utils.js.map +1 -1
- package/dist-es/app-header/AppHeader.js.map +1 -1
- package/dist-es/breadcrumbs/Breadcrumb.js.map +1 -1
- package/dist-es/breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist-es/breadcrumbs/internal/BreadcrumbsCollapsed.js.map +1 -1
- package/dist-es/breadcrumbs/internal/BreadcrumbsContext.js.map +1 -1
- package/dist-es/breadcrumbs/internal/BreadcrumbsSeparator.js.map +1 -1
- package/dist-es/breadcrumbs/internal/useFocusMenuRemount.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/ButtonBarContext.js.map +1 -1
- package/dist-es/button-bar/internal/DescendantContext.js.map +1 -1
- package/dist-es/button-bar/internal/useDescendant.js.map +1 -1
- package/dist-es/button-bar/internal/useDescendants.js.map +1 -1
- package/dist-es/calendar/Calendar.css.js +1 -1
- package/dist-es/calendar/Calendar.js +12 -3
- package/dist-es/calendar/Calendar.js.map +1 -1
- package/dist-es/calendar/CalendarGrid.js +39 -37
- package/dist-es/calendar/CalendarGrid.js.map +1 -1
- package/dist-es/calendar/CalendarMonthHeader.js +1 -1
- package/dist-es/calendar/CalendarMonthHeader.js.map +1 -1
- package/dist-es/calendar/CalendarNavigation.css.js +1 -1
- package/dist-es/calendar/CalendarNavigation.js +21 -14
- package/dist-es/calendar/CalendarNavigation.js.map +1 -1
- package/dist-es/calendar/CalendarWeekHeader.css.js +1 -1
- package/dist-es/calendar/CalendarWeekHeader.js +2 -2
- package/dist-es/calendar/CalendarWeekHeader.js.map +1 -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 +27 -37
- package/dist-es/calendar/internal/CalendarDay.js.map +1 -1
- package/dist-es/calendar/internal/CalendarMonth.css.js +1 -1
- package/dist-es/calendar/internal/CalendarMonth.js +31 -10
- package/dist-es/calendar/internal/CalendarMonth.js.map +1 -1
- package/dist-es/calendar/internal/useFocusManagement.js.map +1 -1
- package/dist-es/calendar/internal/utils.js.map +1 -1
- package/dist-es/calendar/useCalendar.js +7 -9
- package/dist-es/calendar/useCalendar.js.map +1 -1
- package/dist-es/calendar/useCalendarDay.js +7 -11
- package/dist-es/calendar/useCalendarDay.js.map +1 -1
- package/dist-es/calendar/useCalendarSelection.js +144 -76
- package/dist-es/calendar/useCalendarSelection.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/CascadingMenuAction.js.map +1 -1
- package/dist-es/cascading-menu/internal/keydownHandlers.js.map +1 -1
- package/dist-es/cascading-menu/internal/menuPositioning.js.map +1 -1
- package/dist-es/cascading-menu/internal/stateUtils.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/useMountedRef.js.map +1 -1
- package/dist-es/cascading-menu/internal/useMouseHandlers.js.map +1 -1
- package/dist-es/cascading-menu/internal/useRefsManager.js.map +1 -1
- package/dist-es/cascading-menu/internal/useStateReducer.js.map +1 -1
- package/dist-es/cascading-menu/stateChangeTypes.js.map +1 -1
- package/dist-es/color-chooser/AlphaInputField.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/GetColorPalettes.js.map +1 -1
- package/dist-es/color-chooser/HexInput.js.map +1 -1
- package/dist-es/color-chooser/RGBAInput.js.map +1 -1
- package/dist-es/color-chooser/RGBAInputField.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/color-chooser/color-utils.js.map +1 -1
- package/dist-es/color-chooser/colorMap.js.map +1 -1
- package/dist-es/color-chooser/createTabsMapping.js.map +1 -1
- 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/ComboBoxDeprecated.js.map +1 -1
- package/dist-es/combo-box-deprecated/filterHelpers.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/useComboBox.js.map +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.map +1 -1
- package/dist-es/common-hooks/itemToString.js.map +1 -1
- package/dist-es/common-hooks/keyUtils.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/useAutoSizer.js.map +1 -1
- package/dist-es/common-hooks/useCollapsibleGroups.js.map +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.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.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/common-hooks/utils/filter-utils.js.map +1 -1
- package/dist-es/common-hooks/utils/isSelected.js.map +1 -1
- package/dist-es/contact-details/ContactAction.js.map +1 -1
- package/dist-es/contact-details/ContactActions.js.map +1 -1
- package/dist-es/contact-details/ContactAvatar.js.map +1 -1
- package/dist-es/contact-details/ContactDetails.js.map +1 -1
- package/dist-es/contact-details/ContactFavoriteToggle.js.map +1 -1
- package/dist-es/contact-details/ContactMetadata.js.map +1 -1
- package/dist-es/contact-details/ContactMetadataItem.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/MailLinkComponent.js.map +1 -1
- package/dist-es/contact-details/internal/ContactDetailsContext.js.map +1 -1
- package/dist-es/contact-details/internal/FavoriteToggle.js.map +1 -1
- package/dist-es/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
- package/dist-es/contact-details/internal/StarIcon.js.map +1 -1
- package/dist-es/contact-details/internal/StarIconContainer.js.map +1 -1
- package/dist-es/contact-details/internal/useComponentSize.js.map +1 -1
- package/dist-es/content-status/ContentStatus.js.map +1 -1
- package/dist-es/content-status/internal/StatusIndicator.js.map +1 -1
- package/dist-es/date-input/DateInputRange.js +3 -2
- package/dist-es/date-input/DateInputRange.js.map +1 -1
- package/dist-es/date-input/DateInputSingle.js +5 -2
- package/dist-es/date-input/DateInputSingle.js.map +1 -1
- package/dist-es/date-picker/DatePicker.js +0 -2
- package/dist-es/date-picker/DatePicker.js.map +1 -1
- package/dist-es/date-picker/DatePickerActions.js +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.js.map +1 -1
- package/dist-es/date-picker/DatePickerOverlay.js.map +1 -1
- package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -1
- package/dist-es/date-picker/DatePickerRangeGridPanel.js +2 -3
- package/dist-es/date-picker/DatePickerRangeGridPanel.js.map +1 -1
- package/dist-es/date-picker/DatePickerRangeInput.js +22 -8
- package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -1
- package/dist-es/date-picker/DatePickerRangePanel.js +2 -4
- package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -1
- package/dist-es/date-picker/DatePickerSingleGridPanel.js +2 -4
- package/dist-es/date-picker/DatePickerSingleGridPanel.js.map +1 -1
- package/dist-es/date-picker/DatePickerSingleInput.js +12 -7
- package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -1
- 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 +0 -17
- package/dist-es/date-picker/useDatePicker.js.map +1 -1
- package/dist-es/date-picker/useFocusOut.js.map +1 -1
- 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.map +1 -1
- 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-context-legacy/FormFieldLegacyContext.js.map +1 -1
- package/dist-es/form-field-context-legacy/useFormFieldLegacyProps.js.map +1 -1
- package/dist-es/form-field-legacy/FormActivationIndicator.js.map +1 -1
- package/dist-es/form-field-legacy/FormFieldLegacy.js.map +1 -1
- package/dist-es/form-field-legacy/FormHelperText.js.map +1 -1
- package/dist-es/form-field-legacy/FormLabel.js.map +1 -1
- package/dist-es/form-field-legacy/NecessityIndicator.js.map +1 -1
- package/dist-es/form-field-legacy/StatusIndicator.js.map +1 -1
- package/dist-es/form-field-legacy/constant.js.map +1 -1
- package/dist-es/form-group/FormGroup.js.map +1 -1
- package/dist-es/formatted-input/FormattedInput.js.map +1 -1
- package/dist-es/formatted-input/internal/InputWithMask.js.map +1 -1
- package/dist-es/input-legacy/InputLegacy.js.map +1 -1
- package/dist-es/input-legacy/StaticInputAdornment.js.map +1 -1
- package/dist-es/input-legacy/useCursorOnFocus.js.map +1 -1
- package/dist-es/layer-layout/LayerLayout.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/ListItemGroup.js.map +1 -1
- package/dist-es/list/ListItemHeader.js.map +1 -1
- package/dist-es/list/VirtualizedList.js.map +1 -1
- package/dist-es/list/keyset.js.map +1 -1
- package/dist-es/list/useList.js.map +1 -1
- package/dist-es/list/useListHeight.js.map +1 -1
- package/dist-es/list/useVirtualization.js.map +1 -1
- package/dist-es/list-deprecated/List.js.map +1 -1
- 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/ListStateContext.js.map +1 -1
- package/dist-es/list-deprecated/internal/DescendantContext.js.map +1 -1
- package/dist-es/list-deprecated/internal/Highlighter.js.map +1 -1
- package/dist-es/list-deprecated/internal/calcPreferredListHeight.js.map +1 -1
- package/dist-es/list-deprecated/internal/helpers.js.map +1 -1
- package/dist-es/list-deprecated/internal/scrollIntoView.js.map +1 -1
- package/dist-es/list-deprecated/internal/useListAutoSizer.js.map +1 -1
- package/dist-es/list-deprecated/internal/useWidth.js.map +1 -1
- package/dist-es/list-deprecated/itemToString.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.map +1 -1
- package/dist-es/logo/Logo.js.map +1 -1
- package/dist-es/logo/LogoImage.js.map +1 -1
- package/dist-es/logo/LogoSeparator.js.map +1 -1
- package/dist-es/menu-button/MenuButton.js.map +1 -1
- package/dist-es/menu-button/MenuButtonTrigger.js.map +1 -1
- package/dist-es/metric/Metric.js.map +1 -1
- package/dist-es/metric/MetricContent.js.map +1 -1
- package/dist-es/metric/MetricHeader.js.map +1 -1
- package/dist-es/metric/internal/MetricContext.js.map +1 -1
- package/dist-es/number-input/NumberInput.js.map +1 -1
- package/dist-es/number-input/internal/useActivateWhileMouseDown.js.map +1 -1
- package/dist-es/number-input/internal/useCaret.js.map +1 -1
- package/dist-es/number-input/internal/useInterval.js.map +1 -1
- package/dist-es/number-input/internal/utils.js.map +1 -1
- package/dist-es/number-input/useNumberInput.js.map +1 -1
- package/dist-es/portal/Portal.js.map +1 -1
- package/dist-es/query-input/QueryInput.js.map +1 -1
- package/dist-es/query-input/internal/CategoryList.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/QueryInputBody.js.map +1 -1
- package/dist-es/query-input/internal/SearchList.js.map +1 -1
- package/dist-es/query-input/internal/ValueList.js.map +1 -1
- package/dist-es/query-input/internal/ValueSelector.js.map +1 -1
- package/dist-es/query-input/internal/usePopperStatus.js.map +1 -1
- package/dist-es/query-input/useQueryInput.js.map +1 -1
- package/dist-es/responsive/OverflowReducer.js.map +1 -1
- package/dist-es/responsive/overflowUtils.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.map +1 -1
- package/dist-es/responsive/useOverflowCollectionItems.js.map +1 -1
- 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/static-list/StaticList.js.map +1 -1
- package/dist-es/static-list/StaticListItem.js.map +1 -1
- package/dist-es/static-list/StaticListItemContent.js.map +1 -1
- package/dist-es/system-status/SystemStatus.js.map +1 -1
- package/dist-es/system-status/SystemStatusActions.js.map +1 -1
- package/dist-es/system-status/SystemStatusContent.js.map +1 -1
- package/dist-es/table/TBody.js.map +1 -1
- package/dist-es/table/TD.js +6 -2
- package/dist-es/table/TD.js.map +1 -1
- package/dist-es/table/TFoot.js.map +1 -1
- package/dist-es/table/TH.js +6 -2
- package/dist-es/table/TH.js.map +1 -1
- package/dist-es/table/THead.js.map +1 -1
- package/dist-es/table/TR.js.map +1 -1
- package/dist-es/table/Table.css.js +1 -1
- package/dist-es/table/Table.js +2 -2
- package/dist-es/table/Table.js.map +1 -1
- package/dist-es/tabs/Tab.js.map +1 -1
- package/dist-es/tabs/TabActivationIndicator.js.map +1 -1
- package/dist-es/tabs/TabPanel.js.map +1 -1
- package/dist-es/tabs/Tabs.js.map +1 -1
- package/dist-es/tabs/Tabstrip.js.map +1 -1
- package/dist-es/tabs/drag-drop/Draggable.js.map +1 -1
- package/dist-es/tabs/drag-drop/drag-utils.js.map +1 -1
- package/dist-es/tabs/drag-drop/dragDropTypes.js.map +1 -1
- package/dist-es/tabs/drag-drop/useDragDrop.js.map +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/useActivationIndicator.js.map +1 -1
- package/dist-es/tabs/useEditableItem.js.map +1 -1
- package/dist-es/tabs/useItemsWithIds.js.map +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/TabBar.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.css.js +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.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/toast-group/ToastGroup.js.map +1 -1
- package/dist-es/tokenized-input/TokenizedInput.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/InputRuler.js.map +1 -1
- package/dist-es/tokenized-input/internal/calcFirstHiddenIndex.js.map +1 -1
- package/dist-es/tokenized-input/internal/defaultItemToString.js.map +1 -1
- package/dist-es/tokenized-input/internal/getCursorPosition.js.map +1 -1
- package/dist-es/tokenized-input/internal/isPlainObject.js.map +1 -1
- package/dist-es/tokenized-input/internal/useResizeObserver.js.map +1 -1
- package/dist-es/tokenized-input/internal/useWidth.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/calcFirstHiddenIndex.js.map +1 -1
- package/dist-es/tokenized-input-next/internal/useResizeObserver.js.map +1 -1
- package/dist-es/tokenized-input-next/internal/useWidth.js.map +1 -1
- package/dist-es/tokenized-input-next/useTokenizedInputNext.js.map +1 -1
- package/dist-es/toolbar/Toolbar.js.map +1 -1
- package/dist-es/toolbar/ToolbarButton.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/overflow-panel/OverflowSeparator.js.map +1 -1
- package/dist-es/toolbar/toolbar-field/ToolbarField.js.map +1 -1
- package/dist-es/toolbar/toolbar-field/useToolbarField.js.map +1 -1
- 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/escapeRegExp.js.map +1 -1
- package/dist-es/utils/forwardCallbackProps.js.map +1 -1
- package/dist-es/utils/isEmail.js.map +1 -1
- package/dist-es/utils/isPlainObject.js.map +1 -1
- package/dist-es/utils/partition.js.map +1 -1
- package/dist-es/utils/useClickOutside.js.map +1 -1
- package/dist-es/utils/useEventCallback.js.map +1 -1
- package/dist-es/utils/useIsViewportLargerThanBreakpoint.js.map +1 -1
- package/dist-es/utils/useLayoutEffectOnce.js.map +1 -1
- package/dist-es/utils/useLayoutEffectSkipFirst.js.map +1 -1
- package/dist-es/utils/useOverflowDetection.js.map +1 -1
- package/dist-es/utils/useSlideSelection.js.map +1 -1
- package/dist-es/window/ElectronWindow.js.map +1 -1
- package/dist-es/window/WindowContext.js.map +1 -1
- package/dist-es/window/desktop-utils.js.map +1 -1
- package/dist-types/calendar/useCalendar.d.ts +26 -25
- package/dist-types/calendar/useCalendarDay.d.ts +1 -5
- package/dist-types/calendar/useCalendarSelection.d.ts +14 -11
- package/dist-types/date-picker/DatePickerContext.d.ts +0 -6
- package/dist-types/date-picker/DatePickerRangeGridPanel.d.ts +2 -2
- package/dist-types/date-picker/DatePickerRangePanel.d.ts +4 -4
- package/dist-types/date-picker/DatePickerSingleGridPanel.d.ts +2 -2
- package/dist-types/date-picker/useDatePicker.d.ts +0 -6
- package/dist-types/table/TD.d.ts +6 -0
- package/dist-types/table/TH.d.ts +6 -0
- package/dist-types/table/Table.d.ts +3 -3
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMultiSelectComboBox.js","sources":["../src/combo-box-deprecated/internal/useMultiSelectComboBox.ts"],"sourcesContent":["import {\n useControlled,\n useForkRef,\n useId,\n useIsFocusVisible,\n useIsomorphicLayoutEffect,\n usePrevious,\n} from \"@salt-ds/core\";\nimport {\n type ChangeEvent,\n type FocusEvent,\n type KeyboardEvent,\n type KeyboardEventHandler,\n type MouseEvent,\n type Ref,\n type RefObject,\n type SyntheticEvent,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useList } from \"../../list-deprecated\";\nimport {\n type ExpandButtonProps,\n useTokenizedInput,\n} from \"../../tokenized-input\";\nimport { defaultItemToString } from \"../../tokenized-input/internal/defaultItemToString\";\n\nimport { getDefaultFilter, getDefaultFilterRegex } from \"../filterHelpers\";\nimport type { MultiSelectComboBoxProps } from \"./MultiSelectComboBox\";\nimport { isToggleList, usePopperStatus } from \"./usePopperStatus\";\n\nconst REQUIRE_PREV_HIGHLIGHT = [\"ArrowUp\", \"ArrowDown\", \"PageUp\", \"PageDown\"];\n\nexport type UseMultiSelectComboBoxProps<Item> = Omit<\n MultiSelectComboBoxProps<Item>,\n \"inputRef\" | \"listContext\" | \"inputHelpers\" | \"inputProps\" | \"listProps\"\n> & { expandButtonRef: RefObject<HTMLElement> };\n\nexport const useMultiSelectComboBox = <Item>(\n props: Omit<UseMultiSelectComboBoxProps<Item>, \"rootRef\" | \"classes\">,\n) => {\n // Deconstruct valid props for List, everything else will be passed to `useTokenizedInput` using `restProps`\n const {\n allowFreeText,\n displayedItemCount,\n virtualized,\n disabled,\n expandButtonRef,\n onBlur,\n onFocus,\n onChange,\n onSelect,\n onInputChange,\n onInputFocus,\n onInputBlur,\n onInputSelect,\n id: idProp,\n source: sourceProp,\n selectedItem: selectedItemProp,\n inputValue: inputValueProp,\n initialOpen,\n initialSelectedItem: initialSelectedItems,\n \"aria-labelledby\": ariaLabelledBy,\n getFilterRegex = getDefaultFilterRegex,\n itemToString = defaultItemToString,\n stringToItem: stringToItemProp = (_: Item[], value: string) => value.trim(),\n InputProps = {\n onBlur,\n onFocus,\n onInputBlur,\n onInputFocus,\n onInputChange,\n onInputSelect,\n },\n ListProps = {},\n ...restProps\n } = props;\n\n const id = useId(idProp);\n const inputId = `${id}-input`;\n const listId = `${id}-list`;\n\n const [inputValue, setInputValue] = useControlled({\n controlled: inputValueProp,\n default: \"\",\n name: \"MultiSelectComboBox\",\n state: \"inputValue\",\n });\n\n const { isOpen: isListOpen, notifyPopper } = usePopperStatus({\n initialOpen,\n isMultiSelect: true,\n });\n\n const [selectionChanged, setSelectionChanged] = useState(false);\n const inputBlurTimeout = useRef<number>(null);\n\n const [allowAnnouncement, setAllowAnnouncement] = useState(false);\n\n const labels = useMemo(\n () => sourceProp.map(itemToString),\n [sourceProp, itemToString],\n );\n\n const source = useMemo(() => {\n if (inputValue?.trim().length) {\n const itemFilter = getDefaultFilter(inputValue, getFilterRegex);\n return sourceProp.filter((item: Item) => itemFilter(itemToString(item)));\n }\n return sourceProp;\n }, [inputValue, sourceProp, getFilterRegex, itemToString]);\n\n const itemTextHighlightPattern = useMemo(\n () => (inputValue?.trim().length ? getFilterRegex(inputValue) : undefined),\n [inputValue, getFilterRegex],\n );\n\n const {\n focusedRef,\n listProps,\n state: listState,\n helpers: listHelpers,\n } = useList<Item, \"multiple\">({\n ...ListProps,\n source,\n disabled,\n virtualized,\n itemToString,\n displayedItemCount,\n onChange,\n onSelect,\n id: listId,\n disableFocus: true,\n disableMouseDown: true,\n selectionVariant: \"multiple\",\n initialSelectedItem: initialSelectedItems,\n selectedItem: selectedItemProp,\n \"aria-labelledby\": ariaLabelledBy,\n });\n\n const { \"aria-activedescendant\": ariaActiveDescendant, ...restListProps } =\n listProps;\n const { selectedItem } = listState;\n const [quickSelection, setQuickSelection] = useState(false);\n const {\n isFocusVisibleRef,\n onFocus: handleFocusVisible,\n onBlur: handleBlurVisible,\n ref: focusVisibleRef,\n } = useIsFocusVisible();\n const selectedItems = selectedItem as Item[];\n const {\n setSelectedItem: setSelectedItems,\n setHighlightedIndex: setHighlightedListIndex,\n } = listHelpers;\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n handleFocusVisible(event);\n if (isFocusVisibleRef.current) {\n listHelpers.setFocusVisible(true);\n }\n\n if (InputProps.onInputFocus) {\n InputProps.onInputFocus(event);\n }\n\n notifyPopper(event);\n };\n\n const handleInputBlur = (\n event: FocusEvent<HTMLDivElement | HTMLInputElement>,\n ) => {\n handleBlurVisible();\n setAllowAnnouncement(false);\n setInputValue(\"\");\n\n if (restListProps.onBlur) {\n restListProps.onBlur(event);\n }\n\n if (InputProps.onInputBlur) {\n InputProps.onInputBlur(event as FocusEvent<HTMLInputElement>);\n }\n\n notifyPopper(event);\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n setInputValue(event.target.value);\n\n setQuickSelection(event.target.value.length > 0 && !allowFreeText);\n\n if (InputProps.onInputChange) {\n InputProps.onInputChange(event);\n }\n };\n\n const handleItemsChange = (newItems: Item[] | undefined) => {\n const uniqueItems = Array.from(new Set(newItems));\n setSelectedItems(uniqueItems);\n onChange?.(null as unknown as ChangeEvent, uniqueItems);\n };\n\n const handleInputSelect = (event: SyntheticEvent<HTMLInputElement>) => {\n event.persist();\n setSelectionChanged(true);\n\n if (InputProps.onInputSelect) {\n InputProps.onInputSelect(event);\n }\n };\n\n const handleClear = () => {\n setSelectedItems([]);\n };\n\n const stringToItem = (selected: Item[], value: string): Item | null => {\n const trimmed = value.trim();\n const item = stringToItemProp(selected, trimmed);\n const isSelected = selected.map(itemToString).indexOf(trimmed) !== -1;\n\n // Either allow free text item OR the item has to be in the source list\n return !isSelected && (allowFreeText || labels.indexOf(trimmed) !== -1)\n ? (item as Item)\n : null;\n };\n\n // Reuse selectItem from list state for a controlled version of tokenized input\n const {\n inputRef,\n inputProps,\n state: inputState,\n helpers: inputHelpers,\n } = useTokenizedInput({\n ...restProps,\n ...InputProps,\n disabled,\n itemToString,\n stringToItem,\n selectedItems,\n initialSelectedItems,\n onInputFocus: handleInputFocus,\n onInputBlur: handleInputBlur,\n onInputChange: handleInputChange,\n onInputSelect: handleInputSelect,\n onChange: handleItemsChange,\n onClear: handleClear,\n onKeyDown: InputProps.onKeyDown as KeyboardEventHandler<\n HTMLInputElement | HTMLButtonElement\n >,\n });\n\n const handleFocusVisibleRef = useForkRef(\n focusVisibleRef,\n focusedRef,\n ) as Ref<HTMLInputElement>;\n const handleInputRef = useForkRef(inputRef, handleFocusVisibleRef);\n\n const { setHighlightedIndex: setHighlightedPillIndex } = inputHelpers;\n\n // Reset highlight when list closes\n useEffect(() => {\n if (!isListOpen) {\n setHighlightedListIndex(undefined);\n setQuickSelection(false);\n }\n }, [isListOpen, setHighlightedListIndex]);\n\n const previousSelectedItems = usePrevious(selectedItems);\n\n // Reset list highlight when selectItems change\n useIsomorphicLayoutEffect(() => {\n if (\n selectedItems.some(\n (item) => !(previousSelectedItems || []).includes(item),\n )\n ) {\n setInputValue(\"\");\n }\n\n if (!selectedItems.length) {\n setHighlightedListIndex(undefined);\n }\n }, [selectedItems, previousSelectedItems, setHighlightedListIndex]);\n\n // Remove highlight from list if a pill is highlighted\n useEffect(() => {\n if (\n inputState.highlightedIndex != null &&\n inputState.highlightedIndex >= 0\n ) {\n setHighlightedListIndex(undefined);\n setQuickSelection(false);\n }\n }, [inputState.highlightedIndex, setHighlightedListIndex]);\n\n const highlightedIndex = listState?.highlightedIndex;\n\n // Remove highlight from pills if a list item is highlighted\n useEffect(() => {\n if (highlightedIndex != null && highlightedIndex >= 0) {\n setHighlightedPillIndex(undefined);\n }\n }, [highlightedIndex, setHighlightedPillIndex]);\n\n // Keep highlighted index in sync with the filtered source\n useEffect(() => {\n if (source) {\n setHighlightedListIndex(undefined);\n }\n }, [source, setHighlightedListIndex]);\n\n const handleFirstItemSelection = (event: KeyboardEvent | ChangeEvent) => {\n if (\n !allowFreeText &&\n (event as KeyboardEvent).key === \"Enter\" &&\n quickSelection\n ) {\n const newItem = source[0];\n const newSelectedItems =\n selectedItems.indexOf(newItem) === -1\n ? selectedItems.concat(source.slice(0, 1))\n : selectedItems.filter((item) => item !== newItem);\n setSelectedItems(newSelectedItems);\n onSelect?.(event, newItem);\n onChange?.(event as ChangeEvent, newSelectedItems);\n }\n };\n\n const handleListOpenKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (\"Escape\" === event.key && inputProps.expanded) {\n setTimeout(() => {\n if (expandButtonRef.current) {\n expandButtonRef.current.focus();\n }\n }, 250);\n }\n\n handleFirstItemSelection(event);\n\n if (\n \"Home\" !== event.key &&\n \"End\" !== event.key &&\n !(\" \" === event.key && !event.ctrlKey)\n ) {\n if (restListProps.onKeyDown) {\n restListProps.onKeyDown(event);\n }\n setSelectionChanged(false);\n }\n };\n\n const handleInputKeyDown = (\n event: KeyboardEvent<HTMLInputElement | HTMLButtonElement | HTMLDivElement>,\n ) => {\n if (\"Escape\" === event.key) {\n setInputValue(\"\");\n setHighlightedListIndex(undefined);\n }\n\n // Space key clashes with the remove action of TokenizedInput\n // For combo box, pressing a space key should just add a space\n if (\" \" === event.key && !event.ctrlKey) {\n setHighlightedPillIndex(undefined);\n } else {\n if (inputProps.onKeyDown) {\n inputProps.onKeyDown(\n event as KeyboardEvent<HTMLInputElement | HTMLButtonElement>,\n );\n }\n }\n\n if (\n !isToggleList(event) &&\n listState.highlightedIndex == null &&\n REQUIRE_PREV_HIGHLIGHT.indexOf(event.key) !== -1\n ) {\n event.preventDefault();\n // Initialize list highlight if there's no previous value\n setHighlightedListIndex(\n Math.min(quickSelection ? 1 : 0, source.length - 1),\n );\n setQuickSelection(false);\n setSelectionChanged(false);\n } else if (isListOpen) {\n handleListOpenKeyDown(event as KeyboardEvent<HTMLDivElement>);\n }\n\n // Don't announce for deleting values\n setAllowAnnouncement(\"Backspace\" !== event.key);\n notifyPopper(event);\n };\n\n const handleListClick = (event: MouseEvent<HTMLDivElement>) => {\n clearTimeout(\n inputBlurTimeout.current == null ? undefined : inputBlurTimeout.current,\n );\n const inputEl = inputRef && (inputRef as RefObject<HTMLElement>).current;\n if (inputEl) {\n inputEl.focus();\n }\n\n if (restListProps.onClick) {\n restListProps.onClick(event);\n }\n };\n\n const mergedInputProps = {\n ...inputProps.InputProps,\n inputProps: {\n ...inputProps.InputProps?.inputProps,\n role: \"textbox\",\n \"aria-roledescription\": \"MultiSelect Combobox\",\n },\n };\n\n if (ariaActiveDescendant && !selectionChanged) {\n // either null or undefined will prevent tokenized-input from\n // setting active-descendant based on pill selection.\n mergedInputProps.inputProps[\"aria-activedescendant\"] = ariaActiveDescendant;\n }\n\n const expandButtonProps = {\n accessibleText: undefined,\n role: \"button\",\n \"aria-roledescription\": \"Expand combobox button\",\n \"aria-labelledby\": [ariaLabelledBy, `${inputId}-input`]\n .filter(Boolean)\n .join(\" \"),\n } as ExpandButtonProps;\n\n return {\n inputHelpers,\n inputRef: handleInputRef,\n listContext: {\n state: listState,\n helpers: listHelpers,\n },\n inputProps: {\n ...inputProps,\n selectedItems,\n allowAnnouncement,\n id: inputId,\n value: inputValue,\n ExpandButtonProps: expandButtonProps,\n InputProps: mergedInputProps,\n onKeyDown: handleInputKeyDown,\n },\n listProps: {\n ...restListProps,\n source,\n itemToString,\n itemTextHighlightPattern,\n onClick: handleListClick,\n isListOpen: isListOpen && Boolean(source.length),\n },\n };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useMultiSelectComboBox.js","sources":["../src/combo-box-deprecated/internal/useMultiSelectComboBox.ts"],"sourcesContent":["import {\n useControlled,\n useForkRef,\n useId,\n useIsFocusVisible,\n useIsomorphicLayoutEffect,\n usePrevious,\n} from \"@salt-ds/core\";\nimport {\n type ChangeEvent,\n type FocusEvent,\n type KeyboardEvent,\n type KeyboardEventHandler,\n type MouseEvent,\n type Ref,\n type RefObject,\n type SyntheticEvent,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useList } from \"../../list-deprecated\";\nimport {\n type ExpandButtonProps,\n useTokenizedInput,\n} from \"../../tokenized-input\";\nimport { defaultItemToString } from \"../../tokenized-input/internal/defaultItemToString\";\n\nimport { getDefaultFilter, getDefaultFilterRegex } from \"../filterHelpers\";\nimport type { MultiSelectComboBoxProps } from \"./MultiSelectComboBox\";\nimport { isToggleList, usePopperStatus } from \"./usePopperStatus\";\n\nconst REQUIRE_PREV_HIGHLIGHT = [\"ArrowUp\", \"ArrowDown\", \"PageUp\", \"PageDown\"];\n\nexport type UseMultiSelectComboBoxProps<Item> = Omit<\n MultiSelectComboBoxProps<Item>,\n \"inputRef\" | \"listContext\" | \"inputHelpers\" | \"inputProps\" | \"listProps\"\n> & { expandButtonRef: RefObject<HTMLElement> };\n\nexport const useMultiSelectComboBox = <Item>(\n props: Omit<UseMultiSelectComboBoxProps<Item>, \"rootRef\" | \"classes\">,\n) => {\n // Deconstruct valid props for List, everything else will be passed to `useTokenizedInput` using `restProps`\n const {\n allowFreeText,\n displayedItemCount,\n virtualized,\n disabled,\n expandButtonRef,\n onBlur,\n onFocus,\n onChange,\n onSelect,\n onInputChange,\n onInputFocus,\n onInputBlur,\n onInputSelect,\n id: idProp,\n source: sourceProp,\n selectedItem: selectedItemProp,\n inputValue: inputValueProp,\n initialOpen,\n initialSelectedItem: initialSelectedItems,\n \"aria-labelledby\": ariaLabelledBy,\n getFilterRegex = getDefaultFilterRegex,\n itemToString = defaultItemToString,\n stringToItem: stringToItemProp = (_: Item[], value: string) => value.trim(),\n InputProps = {\n onBlur,\n onFocus,\n onInputBlur,\n onInputFocus,\n onInputChange,\n onInputSelect,\n },\n ListProps = {},\n ...restProps\n } = props;\n\n const id = useId(idProp);\n const inputId = `${id}-input`;\n const listId = `${id}-list`;\n\n const [inputValue, setInputValue] = useControlled({\n controlled: inputValueProp,\n default: \"\",\n name: \"MultiSelectComboBox\",\n state: \"inputValue\",\n });\n\n const { isOpen: isListOpen, notifyPopper } = usePopperStatus({\n initialOpen,\n isMultiSelect: true,\n });\n\n const [selectionChanged, setSelectionChanged] = useState(false);\n const inputBlurTimeout = useRef<number>(null);\n\n const [allowAnnouncement, setAllowAnnouncement] = useState(false);\n\n const labels = useMemo(\n () => sourceProp.map(itemToString),\n [sourceProp, itemToString],\n );\n\n const source = useMemo(() => {\n if (inputValue?.trim().length) {\n const itemFilter = getDefaultFilter(inputValue, getFilterRegex);\n return sourceProp.filter((item: Item) => itemFilter(itemToString(item)));\n }\n return sourceProp;\n }, [inputValue, sourceProp, getFilterRegex, itemToString]);\n\n const itemTextHighlightPattern = useMemo(\n () => (inputValue?.trim().length ? getFilterRegex(inputValue) : undefined),\n [inputValue, getFilterRegex],\n );\n\n const {\n focusedRef,\n listProps,\n state: listState,\n helpers: listHelpers,\n } = useList<Item, \"multiple\">({\n ...ListProps,\n source,\n disabled,\n virtualized,\n itemToString,\n displayedItemCount,\n onChange,\n onSelect,\n id: listId,\n disableFocus: true,\n disableMouseDown: true,\n selectionVariant: \"multiple\",\n initialSelectedItem: initialSelectedItems,\n selectedItem: selectedItemProp,\n \"aria-labelledby\": ariaLabelledBy,\n });\n\n const { \"aria-activedescendant\": ariaActiveDescendant, ...restListProps } =\n listProps;\n const { selectedItem } = listState;\n const [quickSelection, setQuickSelection] = useState(false);\n const {\n isFocusVisibleRef,\n onFocus: handleFocusVisible,\n onBlur: handleBlurVisible,\n ref: focusVisibleRef,\n } = useIsFocusVisible();\n const selectedItems = selectedItem as Item[];\n const {\n setSelectedItem: setSelectedItems,\n setHighlightedIndex: setHighlightedListIndex,\n } = listHelpers;\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n handleFocusVisible(event);\n if (isFocusVisibleRef.current) {\n listHelpers.setFocusVisible(true);\n }\n\n if (InputProps.onInputFocus) {\n InputProps.onInputFocus(event);\n }\n\n notifyPopper(event);\n };\n\n const handleInputBlur = (\n event: FocusEvent<HTMLDivElement | HTMLInputElement>,\n ) => {\n handleBlurVisible();\n setAllowAnnouncement(false);\n setInputValue(\"\");\n\n if (restListProps.onBlur) {\n restListProps.onBlur(event);\n }\n\n if (InputProps.onInputBlur) {\n InputProps.onInputBlur(event as FocusEvent<HTMLInputElement>);\n }\n\n notifyPopper(event);\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n setInputValue(event.target.value);\n\n setQuickSelection(event.target.value.length > 0 && !allowFreeText);\n\n if (InputProps.onInputChange) {\n InputProps.onInputChange(event);\n }\n };\n\n const handleItemsChange = (newItems: Item[] | undefined) => {\n const uniqueItems = Array.from(new Set(newItems));\n setSelectedItems(uniqueItems);\n onChange?.(null as unknown as ChangeEvent, uniqueItems);\n };\n\n const handleInputSelect = (event: SyntheticEvent<HTMLInputElement>) => {\n event.persist();\n setSelectionChanged(true);\n\n if (InputProps.onInputSelect) {\n InputProps.onInputSelect(event);\n }\n };\n\n const handleClear = () => {\n setSelectedItems([]);\n };\n\n const stringToItem = (selected: Item[], value: string): Item | null => {\n const trimmed = value.trim();\n const item = stringToItemProp(selected, trimmed);\n const isSelected = selected.map(itemToString).indexOf(trimmed) !== -1;\n\n // Either allow free text item OR the item has to be in the source list\n return !isSelected && (allowFreeText || labels.indexOf(trimmed) !== -1)\n ? (item as Item)\n : null;\n };\n\n // Reuse selectItem from list state for a controlled version of tokenized input\n const {\n inputRef,\n inputProps,\n state: inputState,\n helpers: inputHelpers,\n } = useTokenizedInput({\n ...restProps,\n ...InputProps,\n disabled,\n itemToString,\n stringToItem,\n selectedItems,\n initialSelectedItems,\n onInputFocus: handleInputFocus,\n onInputBlur: handleInputBlur,\n onInputChange: handleInputChange,\n onInputSelect: handleInputSelect,\n onChange: handleItemsChange,\n onClear: handleClear,\n onKeyDown: InputProps.onKeyDown as KeyboardEventHandler<\n HTMLInputElement | HTMLButtonElement\n >,\n });\n\n const handleFocusVisibleRef = useForkRef(\n focusVisibleRef,\n focusedRef,\n ) as Ref<HTMLInputElement>;\n const handleInputRef = useForkRef(inputRef, handleFocusVisibleRef);\n\n const { setHighlightedIndex: setHighlightedPillIndex } = inputHelpers;\n\n // Reset highlight when list closes\n useEffect(() => {\n if (!isListOpen) {\n setHighlightedListIndex(undefined);\n setQuickSelection(false);\n }\n }, [isListOpen, setHighlightedListIndex]);\n\n const previousSelectedItems = usePrevious(selectedItems);\n\n // Reset list highlight when selectItems change\n useIsomorphicLayoutEffect(() => {\n if (\n selectedItems.some(\n (item) => !(previousSelectedItems || []).includes(item),\n )\n ) {\n setInputValue(\"\");\n }\n\n if (!selectedItems.length) {\n setHighlightedListIndex(undefined);\n }\n }, [selectedItems, previousSelectedItems, setHighlightedListIndex]);\n\n // Remove highlight from list if a pill is highlighted\n useEffect(() => {\n if (\n inputState.highlightedIndex != null &&\n inputState.highlightedIndex >= 0\n ) {\n setHighlightedListIndex(undefined);\n setQuickSelection(false);\n }\n }, [inputState.highlightedIndex, setHighlightedListIndex]);\n\n const highlightedIndex = listState?.highlightedIndex;\n\n // Remove highlight from pills if a list item is highlighted\n useEffect(() => {\n if (highlightedIndex != null && highlightedIndex >= 0) {\n setHighlightedPillIndex(undefined);\n }\n }, [highlightedIndex, setHighlightedPillIndex]);\n\n // Keep highlighted index in sync with the filtered source\n useEffect(() => {\n if (source) {\n setHighlightedListIndex(undefined);\n }\n }, [source, setHighlightedListIndex]);\n\n const handleFirstItemSelection = (event: KeyboardEvent | ChangeEvent) => {\n if (\n !allowFreeText &&\n (event as KeyboardEvent).key === \"Enter\" &&\n quickSelection\n ) {\n const newItem = source[0];\n const newSelectedItems =\n selectedItems.indexOf(newItem) === -1\n ? selectedItems.concat(source.slice(0, 1))\n : selectedItems.filter((item) => item !== newItem);\n setSelectedItems(newSelectedItems);\n onSelect?.(event, newItem);\n onChange?.(event as ChangeEvent, newSelectedItems);\n }\n };\n\n const handleListOpenKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (\"Escape\" === event.key && inputProps.expanded) {\n setTimeout(() => {\n if (expandButtonRef.current) {\n expandButtonRef.current.focus();\n }\n }, 250);\n }\n\n handleFirstItemSelection(event);\n\n if (\n \"Home\" !== event.key &&\n \"End\" !== event.key &&\n !(\" \" === event.key && !event.ctrlKey)\n ) {\n if (restListProps.onKeyDown) {\n restListProps.onKeyDown(event);\n }\n setSelectionChanged(false);\n }\n };\n\n const handleInputKeyDown = (\n event: KeyboardEvent<HTMLInputElement | HTMLButtonElement | HTMLDivElement>,\n ) => {\n if (\"Escape\" === event.key) {\n setInputValue(\"\");\n setHighlightedListIndex(undefined);\n }\n\n // Space key clashes with the remove action of TokenizedInput\n // For combo box, pressing a space key should just add a space\n if (\" \" === event.key && !event.ctrlKey) {\n setHighlightedPillIndex(undefined);\n } else {\n if (inputProps.onKeyDown) {\n inputProps.onKeyDown(\n event as KeyboardEvent<HTMLInputElement | HTMLButtonElement>,\n );\n }\n }\n\n if (\n !isToggleList(event) &&\n listState.highlightedIndex == null &&\n REQUIRE_PREV_HIGHLIGHT.indexOf(event.key) !== -1\n ) {\n event.preventDefault();\n // Initialize list highlight if there's no previous value\n setHighlightedListIndex(\n Math.min(quickSelection ? 1 : 0, source.length - 1),\n );\n setQuickSelection(false);\n setSelectionChanged(false);\n } else if (isListOpen) {\n handleListOpenKeyDown(event as KeyboardEvent<HTMLDivElement>);\n }\n\n // Don't announce for deleting values\n setAllowAnnouncement(\"Backspace\" !== event.key);\n notifyPopper(event);\n };\n\n const handleListClick = (event: MouseEvent<HTMLDivElement>) => {\n clearTimeout(\n inputBlurTimeout.current == null ? undefined : inputBlurTimeout.current,\n );\n const inputEl = inputRef && (inputRef as RefObject<HTMLElement>).current;\n if (inputEl) {\n inputEl.focus();\n }\n\n if (restListProps.onClick) {\n restListProps.onClick(event);\n }\n };\n\n const mergedInputProps = {\n ...inputProps.InputProps,\n inputProps: {\n ...inputProps.InputProps?.inputProps,\n role: \"textbox\",\n \"aria-roledescription\": \"MultiSelect Combobox\",\n },\n };\n\n if (ariaActiveDescendant && !selectionChanged) {\n // either null or undefined will prevent tokenized-input from\n // setting active-descendant based on pill selection.\n mergedInputProps.inputProps[\"aria-activedescendant\"] = ariaActiveDescendant;\n }\n\n const expandButtonProps = {\n accessibleText: undefined,\n role: \"button\",\n \"aria-roledescription\": \"Expand combobox button\",\n \"aria-labelledby\": [ariaLabelledBy, `${inputId}-input`]\n .filter(Boolean)\n .join(\" \"),\n } as ExpandButtonProps;\n\n return {\n inputHelpers,\n inputRef: handleInputRef,\n listContext: {\n state: listState,\n helpers: listHelpers,\n },\n inputProps: {\n ...inputProps,\n selectedItems,\n allowAnnouncement,\n id: inputId,\n value: inputValue,\n ExpandButtonProps: expandButtonProps,\n InputProps: mergedInputProps,\n onKeyDown: handleInputKeyDown,\n },\n listProps: {\n ...restListProps,\n source,\n itemToString,\n itemTextHighlightPattern,\n onClick: handleListClick,\n isListOpen: isListOpen && Boolean(source.length),\n },\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePopperStatus.js","sources":["../src/combo-box-deprecated/internal/usePopperStatus.ts"],"sourcesContent":["import { type KeyboardEvent, type SyntheticEvent, useState } from \"react\";\n\n// Alt+Arrow Up/Down toggles list open/close\nexport const isToggleList = (event: KeyboardEvent) =>\n event.altKey && [\"ArrowUp\", \"ArrowDown\"].indexOf(event.key) !== -1;\n\nexport const usePopperStatus = (props: {\n initialOpen?: boolean;\n isMultiSelect?: boolean;\n onClose?: (event: SyntheticEvent) => void;\n}) => {\n const { initialOpen, isMultiSelect = false, onClose } = props;\n const [isOpen, setOpen] = useState(initialOpen === true);\n\n const handleCloseList = (event: SyntheticEvent) => {\n setOpen(false);\n\n if (onClose) {\n onClose(event);\n }\n };\n\n const handleInputKeyDown = (event: KeyboardEvent) => {\n if (isToggleList(event)) {\n setOpen((open) => !open);\n } else if (\n !isOpen &&\n [\"Alt\", \"Tab\", \"Escape\", \"Control\", \"Shift\", \"Meta\"].indexOf(\n event.key,\n ) === -1\n ) {\n setOpen(true);\n } else if (isOpen && event.key === \"Escape\") {\n handleCloseList(event);\n } else if (isOpen && !isMultiSelect && event.key === \"Enter\") {\n handleCloseList(event);\n }\n };\n\n const notifyPopper = (event: SyntheticEvent) => {\n switch (event.type) {\n case \"focus\":\n setOpen(true);\n break;\n case \"blur\":\n handleCloseList(event);\n break;\n case \"keydown\":\n handleInputKeyDown(event as KeyboardEvent);\n break;\n case \"click\":\n handleCloseList(event);\n break;\n case \"keyup\":\n // ignore. Tokenized input invokes keyDown listener in response to keyup events\n break;\n default:\n throw Error(`usePopper: unexpected event type ${event.type}`);\n }\n };\n\n return {\n isOpen,\n notifyPopper,\n };\n};\n"],"names":[],"mappings":";;AAGO,MAAM,
|
|
1
|
+
{"version":3,"file":"usePopperStatus.js","sources":["../src/combo-box-deprecated/internal/usePopperStatus.ts"],"sourcesContent":["import { type KeyboardEvent, type SyntheticEvent, useState } from \"react\";\n\n// Alt+Arrow Up/Down toggles list open/close\nexport const isToggleList = (event: KeyboardEvent) =>\n event.altKey && [\"ArrowUp\", \"ArrowDown\"].indexOf(event.key) !== -1;\n\nexport const usePopperStatus = (props: {\n initialOpen?: boolean;\n isMultiSelect?: boolean;\n onClose?: (event: SyntheticEvent) => void;\n}) => {\n const { initialOpen, isMultiSelect = false, onClose } = props;\n const [isOpen, setOpen] = useState(initialOpen === true);\n\n const handleCloseList = (event: SyntheticEvent) => {\n setOpen(false);\n\n if (onClose) {\n onClose(event);\n }\n };\n\n const handleInputKeyDown = (event: KeyboardEvent) => {\n if (isToggleList(event)) {\n setOpen((open) => !open);\n } else if (\n !isOpen &&\n [\"Alt\", \"Tab\", \"Escape\", \"Control\", \"Shift\", \"Meta\"].indexOf(\n event.key,\n ) === -1\n ) {\n setOpen(true);\n } else if (isOpen && event.key === \"Escape\") {\n handleCloseList(event);\n } else if (isOpen && !isMultiSelect && event.key === \"Enter\") {\n handleCloseList(event);\n }\n };\n\n const notifyPopper = (event: SyntheticEvent) => {\n switch (event.type) {\n case \"focus\":\n setOpen(true);\n break;\n case \"blur\":\n handleCloseList(event);\n break;\n case \"keydown\":\n handleInputKeyDown(event as KeyboardEvent);\n break;\n case \"click\":\n handleCloseList(event);\n break;\n case \"keyup\":\n // ignore. Tokenized input invokes keyDown listener in response to keyup events\n break;\n default:\n throw Error(`usePopper: unexpected event type ${event.type}`);\n }\n };\n\n return {\n isOpen,\n notifyPopper,\n };\n};\n"],"names":[],"mappings":";;AAGO,MAAM,YAAA,GAAe,CAAC,KAAA,KAC3B,KAAA,CAAM,MAAA,IAAU,CAAC,SAAA,EAAW,WAAW,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,KAAM;AAE3D,MAAM,eAAA,GAAkB,CAAC,KAAA,KAI1B;AACJ,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,GAAgB,KAAA,EAAO,SAAQ,GAAI,KAAA;AACxD,EAAA,MAAM,CAAC,MAAA,EAAQ,OAAO,CAAA,GAAI,QAAA,CAAS,gBAAgB,IAAI,CAAA;AAEvD,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAA0B;AACjD,IAAA,OAAA,CAAQ,KAAK,CAAA;AAEb,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAyB;AACnD,IAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IACzB,CAAA,MAAA,IACE,CAAC,MAAA,IACD,CAAC,KAAA,EAAO,OAAO,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA,CAAE,OAAA;AAAA,MACnD,KAAA,CAAM;AAAA,UACF,EAAA,EACN;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,MAAA,IAAW,MAAA,IAAU,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU;AAC3C,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB,WAAW,MAAA,IAAU,CAAC,aAAA,IAAiB,KAAA,CAAM,QAAQ,OAAA,EAAS;AAC5D,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA0B;AAC9C,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,OAAA;AACH,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,kBAAA,CAAmB,KAAsB,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,QAAA;AAAA,MACF,KAAK,OAAA;AAEH,QAAA;AAAA,MACF;AACE,QAAA,MAAM,KAAA,CAAM,CAAA,iCAAA,EAAoC,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA;AAChE,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calcPreferredHeight.js","sources":["../src/common-hooks/calcPreferredHeight.js"],"sourcesContent":["// TODO refactor this into hook. See useListHeight hook. This code was originally used by List and Tree. List has been refactored,\n// Tree hasn't yet. When Tree is finalised, probably want to share the useListHeight hook, and rename it to make it more generic.\nexport const calcPreferredHeight = (props = {}) => {\n const {\n borderless,\n displayedItemCount = 0,\n itemCount = 0,\n itemHeight = 0,\n getItemHeight,\n gapSize = 1,\n } = props;\n\n let preferredHeight = borderless ? 0 : 2;\n\n // if there is no item we render with the preferred count\n const preferredItemCount =\n itemCount === 0\n ? displayedItemCount\n : Math.min(displayedItemCount, itemCount);\n\n if (typeof getItemHeight === \"function\") {\n preferredHeight +=\n Array.from({ length: preferredItemCount }).reduce(\n (total, _, index) => total + Number(getItemHeight(index)) + gapSize,\n 0,\n ) -\n // We don't want gap after the last item\n gapSize;\n } else {\n preferredHeight +=\n preferredItemCount * Number(itemHeight) +\n (preferredItemCount - 1) * gapSize;\n }\n\n // list height will be undefined if the item height can not be\n // converted to a number, for example rem or a percentage string\n return Number.isNaN(preferredHeight) ? undefined : preferredHeight;\n};\n"],"names":[],"mappings":"AAEO,MAAM,
|
|
1
|
+
{"version":3,"file":"calcPreferredHeight.js","sources":["../src/common-hooks/calcPreferredHeight.js"],"sourcesContent":["// TODO refactor this into hook. See useListHeight hook. This code was originally used by List and Tree. List has been refactored,\n// Tree hasn't yet. When Tree is finalised, probably want to share the useListHeight hook, and rename it to make it more generic.\nexport const calcPreferredHeight = (props = {}) => {\n const {\n borderless,\n displayedItemCount = 0,\n itemCount = 0,\n itemHeight = 0,\n getItemHeight,\n gapSize = 1,\n } = props;\n\n let preferredHeight = borderless ? 0 : 2;\n\n // if there is no item we render with the preferred count\n const preferredItemCount =\n itemCount === 0\n ? displayedItemCount\n : Math.min(displayedItemCount, itemCount);\n\n if (typeof getItemHeight === \"function\") {\n preferredHeight +=\n Array.from({ length: preferredItemCount }).reduce(\n (total, _, index) => total + Number(getItemHeight(index)) + gapSize,\n 0,\n ) -\n // We don't want gap after the last item\n gapSize;\n } else {\n preferredHeight +=\n preferredItemCount * Number(itemHeight) +\n (preferredItemCount - 1) * gapSize;\n }\n\n // list height will be undefined if the item height can not be\n // converted to a number, for example rem or a percentage string\n return Number.isNaN(preferredHeight) ? undefined : preferredHeight;\n};\n"],"names":[],"mappings":"AAEO,MAAM,mBAAA,GAAsB,CAAC,KAAA,GAAQ,EAAC,KAAM;AACjD,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,kBAAA,GAAqB,CAAA;AAAA,IACrB,SAAA,GAAY,CAAA;AAAA,IACZ,UAAA,GAAa,CAAA;AAAA,IACb,aAAA;AAAA,IACA,OAAA,GAAU;AAAA,GACZ,GAAI,KAAA;AAEJ,EAAA,IAAI,eAAA,GAAkB,aAAa,CAAA,GAAI,CAAA;AAGvC,EAAA,MAAM,qBACJ,SAAA,KAAc,CAAA,GACV,qBACA,IAAA,CAAK,GAAA,CAAI,oBAAoB,SAAS,CAAA;AAE5C,EAAA,IAAI,OAAO,kBAAkB,UAAA,EAAY;AACvC,IAAA,eAAA,IACE,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,kBAAA,EAAoB,CAAA,CAAE,MAAA;AAAA,MACzC,CAAC,OAAO,CAAA,EAAG,KAAA,KAAU,QAAQ,MAAA,CAAO,aAAA,CAAc,KAAK,CAAC,CAAA,GAAI,OAAA;AAAA,MAC5D;AAAA,KACF;AAAA,IAEA,OAAA;AAAA,EACJ,CAAA,MAAO;AACL,IAAA,eAAA,IACE,kBAAA,GAAqB,MAAA,CAAO,UAAU,CAAA,GAAA,CACrC,qBAAqB,CAAA,IAAK,OAAA;AAAA,EAC/B;AAIA,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA,GAAI,MAAA,GAAY,eAAA;AACrD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectionProvider.js","sources":["../src/common-hooks/collectionProvider.tsx"],"sourcesContent":["import {\n cloneElement,\n createContext,\n type ReactElement,\n useContext,\n} from \"react\";\nimport type { CollectionHookResult } from \"./collectionTypes\";\n\nexport interface collectionContext<T> {\n collection: CollectionHookResult<T>;\n}\n\nexport const CollectionContext = createContext<\n CollectionHookResult<any> | undefined\n>(undefined);\n\ninterface ContextProviderProps<Item> {\n children: ReactElement;\n collectionHook: CollectionHookResult<Item>;\n}\n\nexport function CollectionProvider<Item>({\n children,\n collectionHook,\n ...props\n}: ContextProviderProps<Item>) {\n return (\n <CollectionContext.Provider value={collectionHook}>\n {Object.keys(props).length > 0 ? cloneElement(children, props) : children}\n </CollectionContext.Provider>\n );\n}\n\nexport function useCollection<Item>(): CollectionHookResult<Item> | undefined {\n const collection = useContext(CollectionContext);\n if (collection) {\n return collection as CollectionHookResult<Item>;\n }\n}\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"collectionProvider.js","sources":["../src/common-hooks/collectionProvider.tsx"],"sourcesContent":["import {\n cloneElement,\n createContext,\n type ReactElement,\n useContext,\n} from \"react\";\nimport type { CollectionHookResult } from \"./collectionTypes\";\n\nexport interface collectionContext<T> {\n collection: CollectionHookResult<T>;\n}\n\nexport const CollectionContext = createContext<\n CollectionHookResult<any> | undefined\n>(undefined);\n\ninterface ContextProviderProps<Item> {\n children: ReactElement;\n collectionHook: CollectionHookResult<Item>;\n}\n\nexport function CollectionProvider<Item>({\n children,\n collectionHook,\n ...props\n}: ContextProviderProps<Item>) {\n return (\n <CollectionContext.Provider value={collectionHook}>\n {Object.keys(props).length > 0 ? cloneElement(children, props) : children}\n </CollectionContext.Provider>\n );\n}\n\nexport function useCollection<Item>(): CollectionHookResult<Item> | undefined {\n const collection = useContext(CollectionContext);\n if (collection) {\n return collection as CollectionHookResult<Item>;\n }\n}\n"],"names":[],"mappings":";;;AAYO,MAAM,iBAAA,GAAoB,cAE/B,MAAS;AAOJ,SAAS,kBAAA,CAAyB;AAAA,EACvC,QAAA;AAAA,EACA,cAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+B;AAC7B,EAAA,2BACG,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,KAAA,EAAO,gBAChC,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,GAAI,YAAA,CAAa,QAAA,EAAU,KAAK,IAAI,QAAA,EACnE,CAAA;AAEJ;AAEO,SAAS,aAAA,GAA8D;AAC5E,EAAA,MAAM,UAAA,GAAa,WAAW,iBAAiB,CAAA;AAC/C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"itemToString.js","sources":["../src/common-hooks/itemToString.ts"],"sourcesContent":["export type ItemToStringFunction = (item: any) => string;\n\nconst isPlainObject = (obj: unknown) =>\n Object.prototype.toString.call(obj) === \"[object Object]\";\n\nexport function itemToString(item: unknown): string {\n if (typeof item === \"string\") {\n return item;\n }\n if (!isPlainObject(item)) {\n return String(item);\n }\n\n if (item && typeof item === \"object\" && Object.hasOwn(item, \"label\")) {\n return String((item as { label?: string }).label);\n }\n\n console.warn(\n [\n \"itemToString: you've likely forgotten to set the label prop on the item object.\",\n \"You can also provide your own `itemToString` implementation.\",\n ].join(\"\\n\"),\n );\n\n return \"\";\n}\n"],"names":[],"mappings":"AAEA,MAAM,aAAA,GAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"itemToString.js","sources":["../src/common-hooks/itemToString.ts"],"sourcesContent":["export type ItemToStringFunction = (item: any) => string;\n\nconst isPlainObject = (obj: unknown) =>\n Object.prototype.toString.call(obj) === \"[object Object]\";\n\nexport function itemToString(item: unknown): string {\n if (typeof item === \"string\") {\n return item;\n }\n if (!isPlainObject(item)) {\n return String(item);\n }\n\n if (item && typeof item === \"object\" && Object.hasOwn(item, \"label\")) {\n return String((item as { label?: string }).label);\n }\n\n console.warn(\n [\n \"itemToString: you've likely forgotten to set the label prop on the item object.\",\n \"You can also provide your own `itemToString` implementation.\",\n ].join(\"\\n\"),\n );\n\n return \"\";\n}\n"],"names":[],"mappings":"AAEA,MAAM,aAAA,GAAgB,CAAC,GAAA,KACrB,MAAA,CAAO,UAAU,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,KAAM,iBAAA;AAEnC,SAAS,aAAa,IAAA,EAAuB;AAClD,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;AACxB,IAAA,OAAO,OAAO,IAAI,CAAA;AAAA,EACpB;AAEA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA,EAAG;AACpE,IAAA,OAAO,MAAA,CAAQ,KAA4B,KAAK,CAAA;AAAA,EAClD;AAEA,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN;AAAA,MACE,iFAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI;AAAA,GACb;AAEA,EAAA,OAAO,EAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyUtils.js","sources":["../src/common-hooks/keyUtils.ts"],"sourcesContent":["import type { KeyboardEvent } from \"react\";\n\nfunction union<T>(set1: Set<T>, ...sets: Set<T>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Home = \"Home\";\nexport const End = \"End\";\nexport const PageUp = \"PageUp\";\nexport const PageDown = \"PageDown\";\nexport const Space = \" \";\nexport const Tab = \"Tab\";\n\nconst actionKeys = new Set([\"Enter\", \"Delete\", \" \"]);\nconst focusKeys = new Set([\"Tab\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst navigationKeys = new Set([\n Home,\n End,\n PageUp,\n PageDown,\n ArrowDown,\n ArrowUp,\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n navigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys,\n);\nexport const isCharacterKey = (evt: KeyboardEvent): boolean => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n return evt.key.length === 1 && !evt.ctrlKey && !evt.metaKey && !evt.altKey;\n};\n\nexport const isNavigationKey = ({ key }: KeyboardEvent): boolean => {\n return navigationKeys.has(key);\n};\n"],"names":[],"mappings":"AAEA,SAAS,KAAA,CAAS,SAAiB,
|
|
1
|
+
{"version":3,"file":"keyUtils.js","sources":["../src/common-hooks/keyUtils.ts"],"sourcesContent":["import type { KeyboardEvent } from \"react\";\n\nfunction union<T>(set1: Set<T>, ...sets: Set<T>[]) {\n const result = new Set(set1);\n for (const set of sets) {\n for (const element of set) {\n result.add(element);\n }\n }\n return result;\n}\n\nexport const ArrowUp = \"ArrowUp\";\nexport const ArrowDown = \"ArrowDown\";\nexport const ArrowLeft = \"ArrowLeft\";\nexport const ArrowRight = \"ArrowRight\";\nexport const Enter = \"Enter\";\nexport const Escape = \"Escape\";\nexport const Home = \"Home\";\nexport const End = \"End\";\nexport const PageUp = \"PageUp\";\nexport const PageDown = \"PageDown\";\nexport const Space = \" \";\nexport const Tab = \"Tab\";\n\nconst actionKeys = new Set([\"Enter\", \"Delete\", \" \"]);\nconst focusKeys = new Set([\"Tab\"]);\nconst arrowLeftRightKeys = new Set([\"ArrowRight\", \"ArrowLeft\"]);\nconst navigationKeys = new Set([\n Home,\n End,\n PageUp,\n PageDown,\n ArrowDown,\n ArrowUp,\n]);\nconst functionKeys = new Set([\n \"F1\",\n \"F2\",\n \"F3\",\n \"F4\",\n \"F5\",\n \"F6\",\n \"F7\",\n \"F8\",\n \"F9\",\n \"F10\",\n \"F11\",\n \"F12\",\n]);\nconst specialKeys = union(\n actionKeys,\n navigationKeys,\n arrowLeftRightKeys,\n functionKeys,\n focusKeys,\n);\nexport const isCharacterKey = (evt: KeyboardEvent): boolean => {\n if (specialKeys.has(evt.key)) {\n return false;\n }\n return evt.key.length === 1 && !evt.ctrlKey && !evt.metaKey && !evt.altKey;\n};\n\nexport const isNavigationKey = ({ key }: KeyboardEvent): boolean => {\n return navigationKeys.has(key);\n};\n"],"names":[],"mappings":"AAEA,SAAS,KAAA,CAAS,SAAiB,IAAA,EAAgB;AACjD,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAI,CAAA;AAC3B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,MAAW,WAAW,GAAA,EAAK;AACzB,MAAA,MAAA,CAAO,IAAI,OAAO,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,MAAM,OAAA,GAAU;AAChB,MAAM,SAAA,GAAY;AAClB,MAAM,SAAA,GAAY;AAClB,MAAM,UAAA,GAAa;AACnB,MAAM,KAAA,GAAQ;AAEd,MAAM,IAAA,GAAO;AACb,MAAM,GAAA,GAAM;AACZ,MAAM,MAAA,GAAS;AACf,MAAM,QAAA,GAAW;AACjB,MAAM,KAAA,GAAQ;AAGrB,MAAM,6BAAa,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,QAAA,EAAU,GAAG,CAAC,CAAA;AACnD,MAAM,SAAA,mBAAY,IAAI,GAAA,CAAI,CAAC,KAAK,CAAC,CAAA;AACjC,MAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,WAAW,CAAC,CAAA;AAC9D,MAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA,EAC7B,IAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,MAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,MAAM,WAAA,GAAc,KAAA;AAAA,EAClB,UAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AACO,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAgC;AAC7D,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,CAAC,GAAA,CAAI,OAAA,IAAW,CAAC,GAAA,CAAI,OAAA,IAAW,CAAC,GAAA,CAAI,MAAA;AACtE;AAEO,MAAM,eAAA,GAAkB,CAAC,EAAE,GAAA,EAAI,KAA8B;AAClE,EAAA,OAAO,cAAA,CAAe,IAAI,GAAG,CAAA;AAC/B;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-dom-utils.js","sources":["../src/common-hooks/list-dom-utils.ts"],"sourcesContent":["export const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl?: HTMLElement) {\n if (listItemEl) {\n let idx: string | null | undefined = listItemEl.dataset.idx;\n if (idx) {\n return Number.parseInt(idx, 10);\n }\n if ((idx = listItemEl.ariaPosInSet)) {\n return Number.parseInt(idx, 10) - 1;\n }\n }\n return -1;\n}\n\nexport const listItemId = (el: HTMLElement | null) => el?.id;\n\nexport const closestListItem = (el: HTMLElement) =>\n el.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n"],"names":[],"mappings":"AAGO,SAAS,cAAc,
|
|
1
|
+
{"version":3,"file":"list-dom-utils.js","sources":["../src/common-hooks/list-dom-utils.ts"],"sourcesContent":["export const listItemElement = (listEl: HTMLElement, listItemIdx: number) =>\n listEl.querySelector(`:scope > [data-idx=\"${listItemIdx}\"]`);\n\nexport function listItemIndex(listItemEl?: HTMLElement) {\n if (listItemEl) {\n let idx: string | null | undefined = listItemEl.dataset.idx;\n if (idx) {\n return Number.parseInt(idx, 10);\n }\n if ((idx = listItemEl.ariaPosInSet)) {\n return Number.parseInt(idx, 10) - 1;\n }\n }\n return -1;\n}\n\nexport const listItemId = (el: HTMLElement | null) => el?.id;\n\nexport const closestListItem = (el: HTMLElement) =>\n el.closest(\"[data-idx],[aria-posinset]\") as HTMLElement;\n\nexport const closestListItemId = (el: HTMLElement) =>\n listItemId(closestListItem(el));\n\nexport const closestListItemIndex = (el: HTMLElement) =>\n listItemIndex(closestListItem(el));\n"],"names":[],"mappings":"AAGO,SAAS,cAAc,UAAA,EAA0B;AACtD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI,GAAA,GAAiC,WAAW,OAAA,CAAQ,GAAA;AACxD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AAAA,IAChC;AACA,IAAA,IAAK,GAAA,GAAM,WAAW,YAAA,EAAe;AACnC,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA,GAAI,CAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAIO,MAAM,eAAA,GAAkB,CAAC,EAAA,KAC9B,EAAA,CAAG,QAAQ,4BAA4B;AAKlC,MAAM,uBAAuB,CAAC,EAAA,KACnC,aAAA,CAAc,eAAA,CAAgB,EAAE,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectionTypes.js","sources":["../src/common-hooks/selectionTypes.ts"],"sourcesContent":["import type { KeyboardEvent, MouseEvent, SyntheticEvent } from \"react\";\nimport type { CollectionItem } from \"./collectionTypes\";\n\nexport const SINGLE = \"default\";\nexport const MULTIPLE = \"multiple\";\nexport const EXTENDED = \"extended\";\nexport const DESELECTABLE = \"deselectable\";\n\n// export type SelectionDisallowed = \"none\";\nexport type SingleSelectionStrategy = \"default\" | \"deselectable\";\nexport type MultiSelectionStrategy =\n | \"multiple\"\n | \"extended\"\n | \"extended-multi-range\";\nexport type SelectionStrategy =\n // | SelectionDisallowed\n SingleSelectionStrategy | MultiSelectionStrategy;\n\nexport type selectedType<\n Item,\n Selection extends SelectionStrategy,\n> = Selection extends MultiSelectionStrategy ? Item[] : Item | null;\n\nexport type SelectHandler<Item = string> = (\n event: SyntheticEvent,\n selectedItem: Item,\n) => void;\n\nexport type SelectionChangeHandler<\n Item = string,\n Selection extends SelectionStrategy = \"default\",\n> = (\n event: SyntheticEvent,\n selected: Selection extends SingleSelectionStrategy ? Item | null : Item[],\n) => void;\n\nexport const hasSelection = <Item = unknown>(\n selected: Item | Item[] | null,\n): boolean => {\n return Array.isArray(selected)\n ? selected.length > 0\n : selected !== null && selected !== undefined;\n};\n\nexport const getFirstSelectedItem = <Item = unknown>(\n selected: Item | Item[] | null,\n): Item | null => {\n return Array.isArray(selected) ? selected[0] : selected;\n};\n\nexport interface SelectionProps<\n Item,\n Selection extends SelectionStrategy = \"default\",\n> {\n defaultSelected?: Selection extends SingleSelectionStrategy\n ? Item | null\n : Item[];\n onSelect?: SelectHandler<Item>;\n onSelectionChange?: SelectionChangeHandler<Item, Selection>;\n selected?: Selection extends SingleSelectionStrategy ? Item | null : Item[];\n selectionStrategy?: Selection;\n}\n\nexport interface ListHandlers {\n onClick?: (event: MouseEvent<HTMLElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onKeyboardNavigation?: (\n event: KeyboardEvent<HTMLElement>,\n currentIndex: number,\n ) => void;\n onMouseMove?: (event: MouseEvent<HTMLElement>) => void;\n}\nexport interface SelectionHookProps<\n Item,\n Selection extends SelectionStrategy = \"default\",\n> extends SelectionProps<CollectionItem<Item>, Selection> {\n disableSelection?: boolean;\n highlightedIdx: number;\n indexPositions: CollectionItem<Item>[];\n label?: string;\n selectionKeys?: string[];\n tabToSelect?: boolean;\n}\n\nexport interface SelectionHookResult<\n Item,\n Selection extends SelectionStrategy = \"default\",\n> {\n listHandlers: ListHandlers;\n selected: Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n setSelected: (\n selected: Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[],\n ) => void;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"selectionTypes.js","sources":["../src/common-hooks/selectionTypes.ts"],"sourcesContent":["import type { KeyboardEvent, MouseEvent, SyntheticEvent } from \"react\";\nimport type { CollectionItem } from \"./collectionTypes\";\n\nexport const SINGLE = \"default\";\nexport const MULTIPLE = \"multiple\";\nexport const EXTENDED = \"extended\";\nexport const DESELECTABLE = \"deselectable\";\n\n// export type SelectionDisallowed = \"none\";\nexport type SingleSelectionStrategy = \"default\" | \"deselectable\";\nexport type MultiSelectionStrategy =\n | \"multiple\"\n | \"extended\"\n | \"extended-multi-range\";\nexport type SelectionStrategy =\n // | SelectionDisallowed\n SingleSelectionStrategy | MultiSelectionStrategy;\n\nexport type selectedType<\n Item,\n Selection extends SelectionStrategy,\n> = Selection extends MultiSelectionStrategy ? Item[] : Item | null;\n\nexport type SelectHandler<Item = string> = (\n event: SyntheticEvent,\n selectedItem: Item,\n) => void;\n\nexport type SelectionChangeHandler<\n Item = string,\n Selection extends SelectionStrategy = \"default\",\n> = (\n event: SyntheticEvent,\n selected: Selection extends SingleSelectionStrategy ? Item | null : Item[],\n) => void;\n\nexport const hasSelection = <Item = unknown>(\n selected: Item | Item[] | null,\n): boolean => {\n return Array.isArray(selected)\n ? selected.length > 0\n : selected !== null && selected !== undefined;\n};\n\nexport const getFirstSelectedItem = <Item = unknown>(\n selected: Item | Item[] | null,\n): Item | null => {\n return Array.isArray(selected) ? selected[0] : selected;\n};\n\nexport interface SelectionProps<\n Item,\n Selection extends SelectionStrategy = \"default\",\n> {\n defaultSelected?: Selection extends SingleSelectionStrategy\n ? Item | null\n : Item[];\n onSelect?: SelectHandler<Item>;\n onSelectionChange?: SelectionChangeHandler<Item, Selection>;\n selected?: Selection extends SingleSelectionStrategy ? Item | null : Item[];\n selectionStrategy?: Selection;\n}\n\nexport interface ListHandlers {\n onClick?: (event: MouseEvent<HTMLElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onKeyboardNavigation?: (\n event: KeyboardEvent<HTMLElement>,\n currentIndex: number,\n ) => void;\n onMouseMove?: (event: MouseEvent<HTMLElement>) => void;\n}\nexport interface SelectionHookProps<\n Item,\n Selection extends SelectionStrategy = \"default\",\n> extends SelectionProps<CollectionItem<Item>, Selection> {\n disableSelection?: boolean;\n highlightedIdx: number;\n indexPositions: CollectionItem<Item>[];\n label?: string;\n selectionKeys?: string[];\n tabToSelect?: boolean;\n}\n\nexport interface SelectionHookResult<\n Item,\n Selection extends SelectionStrategy = \"default\",\n> {\n listHandlers: ListHandlers;\n selected: Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n setSelected: (\n selected: Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[],\n ) => void;\n}\n"],"names":[],"mappings":"AAoCO,MAAM,YAAA,GAAe,CAC1B,QAAA,KACY;AACZ,EAAA,OAAO,KAAA,CAAM,QAAQ,QAAQ,CAAA,GACzB,SAAS,MAAA,GAAS,CAAA,GAClB,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA;AACxC;AAEO,MAAM,oBAAA,GAAuB,CAClC,QAAA,KACgB;AAChB,EAAA,OAAO,MAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA;AACjD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAutoSizer.js","sources":["../src/common-hooks/useAutoSizer.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { type RefObject, useCallback, useState } from \"react\";\n\nexport interface ListAutosizerProps {\n containerRef: RefObject<Element>;\n responsive: boolean;\n height?: number | string;\n width?: number | string;\n}\n\ninterface size {\n height?: number | string;\n width?: number | string;\n}\n\nexport function useAutoSizer(props: ListAutosizerProps): size {\n const { containerRef: ref, responsive, width, height } = props;\n const [size, setSize] = useState({ width, height });\n\n const handleResize = useCallback(function handleResize(contentRect: DOMRect) {\n if (contentRect.width > 0 && contentRect.height > 0) {\n setSize({\n width: contentRect.width,\n height: contentRect.height,\n });\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n setSize({ width, height });\n }, [width, height]);\n\n useIsomorphicLayoutEffect(() => {\n if (responsive) {\n // let observer: ResizeObserver;\n if (ref.current) {\n handleResize(ref.current.getBoundingClientRect());\n // observer = new ResizeObserver(\n // ([{ contentRect }]: ResizeObserverEntry[]) => {\n // // TODO (currently firing because of scrollbar)\n // // handleResize(contentRect);\n // },\n // );\n // observer.observe(ref.current);\n }\n return () => {\n // if (observer) {\n // observer.disconnect();\n // }\n };\n }\n }, [handleResize, responsive, ref]);\n\n return size;\n}\n"],"names":["handleResize"],"mappings":";;;AAeO,SAAS,aAAa,
|
|
1
|
+
{"version":3,"file":"useAutoSizer.js","sources":["../src/common-hooks/useAutoSizer.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { type RefObject, useCallback, useState } from \"react\";\n\nexport interface ListAutosizerProps {\n containerRef: RefObject<Element>;\n responsive: boolean;\n height?: number | string;\n width?: number | string;\n}\n\ninterface size {\n height?: number | string;\n width?: number | string;\n}\n\nexport function useAutoSizer(props: ListAutosizerProps): size {\n const { containerRef: ref, responsive, width, height } = props;\n const [size, setSize] = useState({ width, height });\n\n const handleResize = useCallback(function handleResize(contentRect: DOMRect) {\n if (contentRect.width > 0 && contentRect.height > 0) {\n setSize({\n width: contentRect.width,\n height: contentRect.height,\n });\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n setSize({ width, height });\n }, [width, height]);\n\n useIsomorphicLayoutEffect(() => {\n if (responsive) {\n // let observer: ResizeObserver;\n if (ref.current) {\n handleResize(ref.current.getBoundingClientRect());\n // observer = new ResizeObserver(\n // ([{ contentRect }]: ResizeObserverEntry[]) => {\n // // TODO (currently firing because of scrollbar)\n // // handleResize(contentRect);\n // },\n // );\n // observer.observe(ref.current);\n }\n return () => {\n // if (observer) {\n // observer.disconnect();\n // }\n };\n }\n }, [handleResize, responsive, ref]);\n\n return size;\n}\n"],"names":["handleResize"],"mappings":";;;AAeO,SAAS,aAAa,KAAA,EAAiC;AAC5D,EAAA,MAAM,EAAE,YAAA,EAAc,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAO,GAAI,KAAA;AACzD,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAI,SAAS,EAAE,KAAA,EAAO,QAAQ,CAAA;AAElD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,SAASA,aAAAA,CAAa,WAAA,EAAsB;AAC3E,IAAA,IAAI,WAAA,CAAY,KAAA,GAAQ,CAAA,IAAK,WAAA,CAAY,SAAS,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ;AAAA,QACN,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,QAAQ,WAAA,CAAY;AAAA,OACrB,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,OAAA,CAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,CAAA;AAAA,MAQlD;AACA,MAAA,OAAO,MAAM;AAAA,MAIb,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,UAAA,EAAY,GAAG,CAAC,CAAA;AAElC,EAAA,OAAO,IAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCollapsibleGroups.js","sources":["../src/common-hooks/useCollapsibleGroups.ts"],"sourcesContent":["import { type KeyboardEvent, type MouseEvent, useMemo } from \"react\";\nimport { useEventCallback } from \"../utils/useEventCallback\";\nimport type { CollectionHookResult, CollectionItem } from \"./collectionTypes\";\nimport { ArrowLeft, ArrowRight, Enter } from \"./keyUtils\";\nimport type { ListHandlers } from \"./selectionTypes\";\n\nconst NO_HANDLERS = {};\nconst canToggleItem = (item: CollectionItem<unknown>) =>\n Array.isArray(item.childNodes);\n// TODO how do we determine this and where does this function belong = in the collectionHook ?\nconst canSelectItem = () => true;\n\nconst toggleIconClicked = (el: HTMLElement) => {\n const closestToggle = el.closest(\n \"[data-toggle],[aria-expanded]\",\n ) as HTMLElement;\n return closestToggle.dataset.toggle === \"true\";\n};\n\ninterface CollapsibleHookProps<Item> {\n collapsibleHeaders?: boolean;\n collectionHook: CollectionHookResult<Item>;\n highlightedIdx: number;\n onToggle?: (node: Item) => void;\n}\n\ninterface CollapsibleHookResult {\n onClick?: ListHandlers[\"onClick\"];\n onKeyDown?: ListHandlers[\"onKeyDown\"];\n}\n\nexport const useCollapsibleGroups = <Item>({\n collapsibleHeaders,\n collectionHook,\n highlightedIdx,\n onToggle,\n}: CollapsibleHookProps<Item>): CollapsibleHookResult => {\n const handleKeyDown = useEventCallback((e: KeyboardEvent) => {\n if (e.key === ArrowRight || e.key === Enter) {\n const item = collectionHook.data[highlightedIdx];\n if (item) {\n if (item.expanded === false && item.value) {\n e.preventDefault();\n collectionHook.expandGroupItem(item);\n onToggle?.(item.value);\n }\n }\n }\n\n if (e.key === ArrowLeft || e.key === Enter) {\n const item = collectionHook.data[highlightedIdx];\n if (item) {\n if (item.expanded && item.value) {\n e.preventDefault();\n collectionHook.collapseGroupItem(item);\n onToggle?.(item.value);\n }\n }\n }\n });\n\n const handleClick = useEventCallback((evt: MouseEvent<HTMLElement>) => {\n console.log(`useCollapsibleGroups idx=${highlightedIdx}`);\n const item = collectionHook.data[highlightedIdx];\n console.log(evt.target, evt.currentTarget);\n if (\n item &&\n canToggleItem(item) &&\n (!canSelectItem() || toggleIconClicked(evt.target as HTMLElement))\n ) {\n evt.stopPropagation();\n evt.preventDefault();\n if (item.expanded === false && item.value) {\n collectionHook.expandGroupItem(item);\n onToggle?.(item.value);\n } else if (item.expanded === true && item.value) {\n collectionHook.collapseGroupItem(item);\n onToggle?.(item.value);\n }\n }\n });\n\n /**\n * These are List handlers, so we will not have reference to the actual node\n * element. We must rely on highlightedIdx to tell us which node is interactive.\n */\n const listHandlers = useMemo(\n () => ({\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n }),\n [handleClick, handleKeyDown],\n );\n\n return collapsibleHeaders ? listHandlers : NO_HANDLERS;\n};\n"],"names":[],"mappings":";;;;AAMA,MAAM,cAAc,EAAC;AACrB,MAAM,gBAAgB,CAAC,IAAA,KACrB,
|
|
1
|
+
{"version":3,"file":"useCollapsibleGroups.js","sources":["../src/common-hooks/useCollapsibleGroups.ts"],"sourcesContent":["import { type KeyboardEvent, type MouseEvent, useMemo } from \"react\";\nimport { useEventCallback } from \"../utils/useEventCallback\";\nimport type { CollectionHookResult, CollectionItem } from \"./collectionTypes\";\nimport { ArrowLeft, ArrowRight, Enter } from \"./keyUtils\";\nimport type { ListHandlers } from \"./selectionTypes\";\n\nconst NO_HANDLERS = {};\nconst canToggleItem = (item: CollectionItem<unknown>) =>\n Array.isArray(item.childNodes);\n// TODO how do we determine this and where does this function belong = in the collectionHook ?\nconst canSelectItem = () => true;\n\nconst toggleIconClicked = (el: HTMLElement) => {\n const closestToggle = el.closest(\n \"[data-toggle],[aria-expanded]\",\n ) as HTMLElement;\n return closestToggle.dataset.toggle === \"true\";\n};\n\ninterface CollapsibleHookProps<Item> {\n collapsibleHeaders?: boolean;\n collectionHook: CollectionHookResult<Item>;\n highlightedIdx: number;\n onToggle?: (node: Item) => void;\n}\n\ninterface CollapsibleHookResult {\n onClick?: ListHandlers[\"onClick\"];\n onKeyDown?: ListHandlers[\"onKeyDown\"];\n}\n\nexport const useCollapsibleGroups = <Item>({\n collapsibleHeaders,\n collectionHook,\n highlightedIdx,\n onToggle,\n}: CollapsibleHookProps<Item>): CollapsibleHookResult => {\n const handleKeyDown = useEventCallback((e: KeyboardEvent) => {\n if (e.key === ArrowRight || e.key === Enter) {\n const item = collectionHook.data[highlightedIdx];\n if (item) {\n if (item.expanded === false && item.value) {\n e.preventDefault();\n collectionHook.expandGroupItem(item);\n onToggle?.(item.value);\n }\n }\n }\n\n if (e.key === ArrowLeft || e.key === Enter) {\n const item = collectionHook.data[highlightedIdx];\n if (item) {\n if (item.expanded && item.value) {\n e.preventDefault();\n collectionHook.collapseGroupItem(item);\n onToggle?.(item.value);\n }\n }\n }\n });\n\n const handleClick = useEventCallback((evt: MouseEvent<HTMLElement>) => {\n console.log(`useCollapsibleGroups idx=${highlightedIdx}`);\n const item = collectionHook.data[highlightedIdx];\n console.log(evt.target, evt.currentTarget);\n if (\n item &&\n canToggleItem(item) &&\n (!canSelectItem() || toggleIconClicked(evt.target as HTMLElement))\n ) {\n evt.stopPropagation();\n evt.preventDefault();\n if (item.expanded === false && item.value) {\n collectionHook.expandGroupItem(item);\n onToggle?.(item.value);\n } else if (item.expanded === true && item.value) {\n collectionHook.collapseGroupItem(item);\n onToggle?.(item.value);\n }\n }\n });\n\n /**\n * These are List handlers, so we will not have reference to the actual node\n * element. We must rely on highlightedIdx to tell us which node is interactive.\n */\n const listHandlers = useMemo(\n () => ({\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n }),\n [handleClick, handleKeyDown],\n );\n\n return collapsibleHeaders ? listHandlers : NO_HANDLERS;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCollectionItems.js","sources":["../src/common-hooks/useCollectionItems.ts"],"sourcesContent":["import { isValidElement, useCallback, useMemo, useRef, useState } from \"react\";\nimport { useCollection } from \"./collectionProvider\";\nimport type {\n CollectionHookProps,\n CollectionHookResult,\n CollectionIndexer,\n CollectionItem,\n} from \"./collectionTypes\";\nimport { itemToString as defaultItemToString } from \"./itemToString\";\nimport type {\n SelectionStrategy,\n SingleSelectionStrategy,\n} from \"./selectionTypes\";\nimport {\n childItems,\n countChildItems,\n type FilterPredicate,\n getDefaultFilter,\n getDefaultFilterRegex,\n isDisabled,\n isFocusable,\n isGroupNode,\n isHeader,\n isParentPath,\n replaceCollectionItem,\n sourceItems,\n} from \"./utils\";\n\nconst defaultCollectionOptions = {};\n\nexport const useCollectionItems = <Item>({\n children,\n id: idRoot,\n label: _label = \"\",\n options = defaultCollectionOptions,\n // revealSelected = false,\n source,\n}: CollectionHookProps<Item>): CollectionHookResult<Item> => {\n const { getItemId } = options;\n\n const [, forceUpdate] = useState<unknown>(null);\n const inheritedCollectionHook = useCollection<Item>();\n const dataRef = useRef<CollectionItem<Item>[]>([]);\n const flattenedDataRef = useRef<CollectionItem<Item>[]>([]);\n const EMPTY_COLLECTION: CollectionItem<Item>[] = useMemo(() => [], []);\n const filterPattern = useRef<string>(options.filterPattern ?? \"\");\n\n // destructure individual option values so we can safely reference them in dependency arrays\n const {\n getFilterRegex = getDefaultFilterRegex,\n noChildrenLabel,\n itemToString = defaultItemToString,\n } = options;\n\n const isExpanded = useCallback(() => {\n // We can't do this here because itemToId won't work until we complete this phase\n // if (Array.isArray(revealSelected)) {\n // const selectedIds = revealSelected.map(itemToId);\n // return selectedIds.some((id) => isParentPath(path, id));\n // }\n return options.defaultExpanded || false;\n }, [options.defaultExpanded]);\n\n const addMetadataToItems = useCallback(\n <Item>(\n items: CollectionItem<Item>[],\n indexer: CollectionIndexer,\n level = 1,\n path = \"\",\n results: CollectionItem<Item>[] = [],\n flattenedCollection: CollectionItem<Item>[] = [],\n flattenedSource: (Item | null)[] = [],\n ): [CollectionItem<Item>[], (Item | null)[], CollectionItem<Item>[]] => {\n items.forEach((item, i, all) => {\n const isCollapsibleHeader = item.header && options.collapsibleHeaders;\n const isNonCollapsibleGroupNode =\n item.childNodes && options.collapsibleHeaders === false;\n const isLeaf = !item.childNodes || item.childNodes.length === 0;\n const nonCollapsible =\n isNonCollapsibleGroupNode || (isLeaf && !isCollapsibleHeader);\n const childPath = path ? `${path}.${i}` : `item-${i}`;\n // getItemId is backward compatible with earlier List implementation.\n // It is not appropriate for a nested source structure, where index\n // will not always be an absolute offset.\n const id =\n item.id ?? (getItemId ? getItemId(i) : `${idRoot}-${childPath}`);\n\n const expanded = nonCollapsible\n ? undefined\n : (item.expanded ?? isExpanded());\n //TODO dev time check - if id is provided by user, make sure\n // hierarchical pattern is consistent\n const normalisedItem: CollectionItem<Item> = {\n ...item,\n childNodes: undefined,\n count:\n !isNonCollapsibleGroupNode && expanded === undefined\n ? 0\n : countChildItems(item, all, i),\n description: item.description,\n disabled: isDisabled(item.value),\n focusable: isFocusable(item.value) ? undefined : false,\n id,\n index: indexer.value,\n expanded,\n level,\n };\n results.push(normalisedItem);\n flattenedCollection.push(normalisedItem);\n flattenedSource.push(items[i].value);\n\n indexer.value += 1;\n\n // if ((isNonCollapsibleGroupNode || expanded !== undefined) && !isCollapsibleHeader) {\n if (item.childNodes) {\n const [children] = addMetadataToItems<Item>(\n item.childNodes,\n indexer,\n level + 1,\n childPath,\n [],\n flattenedCollection,\n flattenedSource,\n );\n normalisedItem.childNodes = children;\n }\n });\n return [results, flattenedSource, flattenedCollection];\n },\n [options.collapsibleHeaders, getItemId, idRoot, isExpanded],\n );\n\n const getFilter = useCallback(() => {\n if (filterPattern.current) {\n return getDefaultFilter(filterPattern.current, getFilterRegex);\n }\n return null;\n }, [getFilterRegex]);\n\n const collectVisibleItems = useCallback(\n (\n items: CollectionItem<Item>[],\n filter: null | FilterPredicate = getFilter(),\n results: CollectionItem<Item>[] = [],\n idx: { value: number } = { value: 0 },\n ): CollectionItem<Item>[] => {\n let skipToNextHeader = false;\n for (const item of items) {\n if (!(skipToNextHeader && !isHeader(item))) {\n if (\n item.value !== null &&\n (filter === null || filter(itemToString(item.value)))\n ) {\n results[idx.value] = item;\n idx.value += 1;\n }\n skipToNextHeader = false;\n if (isHeader(item) && item.expanded === false) {\n skipToNextHeader = true;\n } else if (isGroupNode(item)) {\n if (item.expanded !== false && item.childNodes) {\n collectVisibleItems(item.childNodes, filter, results, idx);\n }\n }\n }\n }\n return results;\n },\n [getFilter, itemToString],\n );\n\n // Stage 1 - convert source or children to CollectionItems.\n const partialCollectionItems = useMemo(() => {\n return inheritedCollectionHook\n ? EMPTY_COLLECTION\n : sourceItems<Item>(source, { itemToString, noChildrenLabel }) ||\n childItems(children) ||\n [];\n }, [\n inheritedCollectionHook,\n EMPTY_COLLECTION,\n source,\n itemToString,\n noChildrenLabel,\n children,\n ]);\n\n // Stage 2 - extend the collectionItems with additional metadata\n const [collectionItems, flattenedSource, flattenedCollection] = useMemo(\n () =>\n inheritedCollectionHook\n ? [EMPTY_COLLECTION, EMPTY_COLLECTION, EMPTY_COLLECTION]\n : //@ts-ignore\n addMetadataToItems<Item>(partialCollectionItems, { value: 0 }),\n [\n EMPTY_COLLECTION,\n addMetadataToItems,\n inheritedCollectionHook,\n partialCollectionItems,\n ],\n );\n flattenedDataRef.current = flattenedCollection;\n\n // Stage 3 prepare the list of visible items, this is what will be rendered\n useMemo(\n () =>\n inheritedCollectionHook\n ? EMPTY_COLLECTION\n : (dataRef.current = collectVisibleItems(collectionItems)),\n [\n EMPTY_COLLECTION,\n collectVisibleItems,\n collectionItems,\n inheritedCollectionHook,\n ],\n );\n\n const collectionItemsRef = useRef(collectionItems);\n\n const setFilterPattern = useCallback(\n (pattern = \"\") => {\n if (typeof pattern === \"string\") {\n filterPattern.current = pattern;\n dataRef.current = collectVisibleItems(collectionItems);\n forceUpdate({});\n }\n },\n [collectionItems, collectVisibleItems],\n );\n\n const itemById = useCallback(\n (\n id: string,\n target: CollectionItem<Item>[] = collectionItems,\n ): Item | never => {\n const sourceWithId = target.find(\n (i) => i.id === id || (i?.childNodes?.length && isParentPath(i.id, id)),\n );\n if (sourceWithId?.id === id && sourceWithId.index != null) {\n //TODO do we need the flattered source at all ?\n return flattenedSource?.[sourceWithId.index] as Item;\n }\n if (sourceWithId) {\n return itemById(id, sourceWithId.childNodes);\n }\n throw Error(`useCollectionData itemById, id ${id} not found `);\n },\n [flattenedSource, collectionItems],\n );\n\n const toCollectionItem = useCallback(\n (item: Item): CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n // const collectionItem = collectionItemsRef.current.find((i) =>\n isValidElement(i.value) ? i.label === item : i.value === item,\n );\n if (collectionItem) {\n return collectionItem;\n }\n throw Error(\"useCollectionData toCollectionItem, item not found \");\n },\n [],\n );\n\n // TODO types need more work, these are correct but we\n // don't really want references to Selection in here\n const itemToCollectionItem = useCallback(\n <\n Selection extends SelectionStrategy,\n U extends Item | Item[] | null | undefined,\n >(\n sel: U,\n ): Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[] => {\n type returnType = Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n\n if (sel === null) {\n return null as returnType;\n }\n if (Array.isArray(sel)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of sel) {\n const collectionItem = toCollectionItem(item);\n result.push(collectionItem);\n }\n return result as returnType;\n }\n if (sel !== undefined) {\n return toCollectionItem(sel as Item) as returnType;\n }\n\n return undefined as unknown as returnType;\n },\n [toCollectionItem],\n );\n\n const stringToCollectionItem = useCallback(\n <Selection extends SelectionStrategy>(\n value: string | null | undefined,\n ): Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[] => {\n type returnType = Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n\n const toCollectionItem = (\n item: string,\n ): undefined | CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n // const collectionItem = collectionItemsRef.current.find((i) =>\n isValidElement(i.value)\n ? i.label === item\n : i.value !== null && itemToString(i.value) === item,\n );\n if (collectionItem) {\n return collectionItem;\n }\n };\n\n if (value === null) {\n return null as returnType;\n }\n if (Array.isArray(value)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of value) {\n const collectionItem = toCollectionItem(item);\n if (collectionItem) {\n result.push(collectionItem);\n }\n }\n return result as returnType;\n }\n if (value !== undefined) {\n return toCollectionItem(value) as returnType;\n }\n\n return undefined as unknown as returnType;\n },\n [itemToString],\n );\n\n const itemToId = useCallback((item: Item): string => {\n for (const collectionItem of collectionItemsRef.current) {\n if (item === collectionItem.value) {\n return collectionItem.id;\n }\n }\n throw Error(\"useCollectionData itemToId, item not found\");\n }, []);\n\n const collapseGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem(\n collectionItemsRef.current,\n item.id,\n {\n expanded: false,\n },\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems],\n );\n\n const expandGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem<Item>(\n collectionItemsRef.current,\n item.id,\n {\n expanded: true,\n },\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems],\n );\n\n return (\n inheritedCollectionHook || {\n collapseGroupItem,\n data: dataRef.current,\n expandGroupItem, // why not toggle, or just rely on setdata ?\n setFilterPattern,\n itemById,\n itemToId,\n toCollectionItem,\n itemToCollectionItem,\n stringToCollectionItem,\n }\n );\n};\n"],"names":["itemToString","defaultItemToString","flattenedCollection","flattenedSource","children","toCollectionItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useCollectionItems.js","sources":["../src/common-hooks/useCollectionItems.ts"],"sourcesContent":["import { isValidElement, useCallback, useMemo, useRef, useState } from \"react\";\nimport { useCollection } from \"./collectionProvider\";\nimport type {\n CollectionHookProps,\n CollectionHookResult,\n CollectionIndexer,\n CollectionItem,\n} from \"./collectionTypes\";\nimport { itemToString as defaultItemToString } from \"./itemToString\";\nimport type {\n SelectionStrategy,\n SingleSelectionStrategy,\n} from \"./selectionTypes\";\nimport {\n childItems,\n countChildItems,\n type FilterPredicate,\n getDefaultFilter,\n getDefaultFilterRegex,\n isDisabled,\n isFocusable,\n isGroupNode,\n isHeader,\n isParentPath,\n replaceCollectionItem,\n sourceItems,\n} from \"./utils\";\n\nconst defaultCollectionOptions = {};\n\nexport const useCollectionItems = <Item>({\n children,\n id: idRoot,\n label: _label = \"\",\n options = defaultCollectionOptions,\n // revealSelected = false,\n source,\n}: CollectionHookProps<Item>): CollectionHookResult<Item> => {\n const { getItemId } = options;\n\n const [, forceUpdate] = useState<unknown>(null);\n const inheritedCollectionHook = useCollection<Item>();\n const dataRef = useRef<CollectionItem<Item>[]>([]);\n const flattenedDataRef = useRef<CollectionItem<Item>[]>([]);\n const EMPTY_COLLECTION: CollectionItem<Item>[] = useMemo(() => [], []);\n const filterPattern = useRef<string>(options.filterPattern ?? \"\");\n\n // destructure individual option values so we can safely reference them in dependency arrays\n const {\n getFilterRegex = getDefaultFilterRegex,\n noChildrenLabel,\n itemToString = defaultItemToString,\n } = options;\n\n const isExpanded = useCallback(() => {\n // We can't do this here because itemToId won't work until we complete this phase\n // if (Array.isArray(revealSelected)) {\n // const selectedIds = revealSelected.map(itemToId);\n // return selectedIds.some((id) => isParentPath(path, id));\n // }\n return options.defaultExpanded || false;\n }, [options.defaultExpanded]);\n\n const addMetadataToItems = useCallback(\n <Item>(\n items: CollectionItem<Item>[],\n indexer: CollectionIndexer,\n level = 1,\n path = \"\",\n results: CollectionItem<Item>[] = [],\n flattenedCollection: CollectionItem<Item>[] = [],\n flattenedSource: (Item | null)[] = [],\n ): [CollectionItem<Item>[], (Item | null)[], CollectionItem<Item>[]] => {\n items.forEach((item, i, all) => {\n const isCollapsibleHeader = item.header && options.collapsibleHeaders;\n const isNonCollapsibleGroupNode =\n item.childNodes && options.collapsibleHeaders === false;\n const isLeaf = !item.childNodes || item.childNodes.length === 0;\n const nonCollapsible =\n isNonCollapsibleGroupNode || (isLeaf && !isCollapsibleHeader);\n const childPath = path ? `${path}.${i}` : `item-${i}`;\n // getItemId is backward compatible with earlier List implementation.\n // It is not appropriate for a nested source structure, where index\n // will not always be an absolute offset.\n const id =\n item.id ?? (getItemId ? getItemId(i) : `${idRoot}-${childPath}`);\n\n const expanded = nonCollapsible\n ? undefined\n : (item.expanded ?? isExpanded());\n //TODO dev time check - if id is provided by user, make sure\n // hierarchical pattern is consistent\n const normalisedItem: CollectionItem<Item> = {\n ...item,\n childNodes: undefined,\n count:\n !isNonCollapsibleGroupNode && expanded === undefined\n ? 0\n : countChildItems(item, all, i),\n description: item.description,\n disabled: isDisabled(item.value),\n focusable: isFocusable(item.value) ? undefined : false,\n id,\n index: indexer.value,\n expanded,\n level,\n };\n results.push(normalisedItem);\n flattenedCollection.push(normalisedItem);\n flattenedSource.push(items[i].value);\n\n indexer.value += 1;\n\n // if ((isNonCollapsibleGroupNode || expanded !== undefined) && !isCollapsibleHeader) {\n if (item.childNodes) {\n const [children] = addMetadataToItems<Item>(\n item.childNodes,\n indexer,\n level + 1,\n childPath,\n [],\n flattenedCollection,\n flattenedSource,\n );\n normalisedItem.childNodes = children;\n }\n });\n return [results, flattenedSource, flattenedCollection];\n },\n [options.collapsibleHeaders, getItemId, idRoot, isExpanded],\n );\n\n const getFilter = useCallback(() => {\n if (filterPattern.current) {\n return getDefaultFilter(filterPattern.current, getFilterRegex);\n }\n return null;\n }, [getFilterRegex]);\n\n const collectVisibleItems = useCallback(\n (\n items: CollectionItem<Item>[],\n filter: null | FilterPredicate = getFilter(),\n results: CollectionItem<Item>[] = [],\n idx: { value: number } = { value: 0 },\n ): CollectionItem<Item>[] => {\n let skipToNextHeader = false;\n for (const item of items) {\n if (!(skipToNextHeader && !isHeader(item))) {\n if (\n item.value !== null &&\n (filter === null || filter(itemToString(item.value)))\n ) {\n results[idx.value] = item;\n idx.value += 1;\n }\n skipToNextHeader = false;\n if (isHeader(item) && item.expanded === false) {\n skipToNextHeader = true;\n } else if (isGroupNode(item)) {\n if (item.expanded !== false && item.childNodes) {\n collectVisibleItems(item.childNodes, filter, results, idx);\n }\n }\n }\n }\n return results;\n },\n [getFilter, itemToString],\n );\n\n // Stage 1 - convert source or children to CollectionItems.\n const partialCollectionItems = useMemo(() => {\n return inheritedCollectionHook\n ? EMPTY_COLLECTION\n : sourceItems<Item>(source, { itemToString, noChildrenLabel }) ||\n childItems(children) ||\n [];\n }, [\n inheritedCollectionHook,\n EMPTY_COLLECTION,\n source,\n itemToString,\n noChildrenLabel,\n children,\n ]);\n\n // Stage 2 - extend the collectionItems with additional metadata\n const [collectionItems, flattenedSource, flattenedCollection] = useMemo(\n () =>\n inheritedCollectionHook\n ? [EMPTY_COLLECTION, EMPTY_COLLECTION, EMPTY_COLLECTION]\n : //@ts-ignore\n addMetadataToItems<Item>(partialCollectionItems, { value: 0 }),\n [\n EMPTY_COLLECTION,\n addMetadataToItems,\n inheritedCollectionHook,\n partialCollectionItems,\n ],\n );\n flattenedDataRef.current = flattenedCollection;\n\n // Stage 3 prepare the list of visible items, this is what will be rendered\n useMemo(\n () =>\n inheritedCollectionHook\n ? EMPTY_COLLECTION\n : (dataRef.current = collectVisibleItems(collectionItems)),\n [\n EMPTY_COLLECTION,\n collectVisibleItems,\n collectionItems,\n inheritedCollectionHook,\n ],\n );\n\n const collectionItemsRef = useRef(collectionItems);\n\n const setFilterPattern = useCallback(\n (pattern = \"\") => {\n if (typeof pattern === \"string\") {\n filterPattern.current = pattern;\n dataRef.current = collectVisibleItems(collectionItems);\n forceUpdate({});\n }\n },\n [collectionItems, collectVisibleItems],\n );\n\n const itemById = useCallback(\n (\n id: string,\n target: CollectionItem<Item>[] = collectionItems,\n ): Item | never => {\n const sourceWithId = target.find(\n (i) => i.id === id || (i?.childNodes?.length && isParentPath(i.id, id)),\n );\n if (sourceWithId?.id === id && sourceWithId.index != null) {\n //TODO do we need the flattered source at all ?\n return flattenedSource?.[sourceWithId.index] as Item;\n }\n if (sourceWithId) {\n return itemById(id, sourceWithId.childNodes);\n }\n throw Error(`useCollectionData itemById, id ${id} not found `);\n },\n [flattenedSource, collectionItems],\n );\n\n const toCollectionItem = useCallback(\n (item: Item): CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n // const collectionItem = collectionItemsRef.current.find((i) =>\n isValidElement(i.value) ? i.label === item : i.value === item,\n );\n if (collectionItem) {\n return collectionItem;\n }\n throw Error(\"useCollectionData toCollectionItem, item not found \");\n },\n [],\n );\n\n // TODO types need more work, these are correct but we\n // don't really want references to Selection in here\n const itemToCollectionItem = useCallback(\n <\n Selection extends SelectionStrategy,\n U extends Item | Item[] | null | undefined,\n >(\n sel: U,\n ): Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[] => {\n type returnType = Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n\n if (sel === null) {\n return null as returnType;\n }\n if (Array.isArray(sel)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of sel) {\n const collectionItem = toCollectionItem(item);\n result.push(collectionItem);\n }\n return result as returnType;\n }\n if (sel !== undefined) {\n return toCollectionItem(sel as Item) as returnType;\n }\n\n return undefined as unknown as returnType;\n },\n [toCollectionItem],\n );\n\n const stringToCollectionItem = useCallback(\n <Selection extends SelectionStrategy>(\n value: string | null | undefined,\n ): Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[] => {\n type returnType = Selection extends SingleSelectionStrategy\n ? CollectionItem<Item> | null\n : CollectionItem<Item>[];\n\n const toCollectionItem = (\n item: string,\n ): undefined | CollectionItem<Item> | never => {\n // TODO what about Tree structures, we need to search flattened source\n const collectionItem = flattenedDataRef.current.find((i) =>\n // const collectionItem = collectionItemsRef.current.find((i) =>\n isValidElement(i.value)\n ? i.label === item\n : i.value !== null && itemToString(i.value) === item,\n );\n if (collectionItem) {\n return collectionItem;\n }\n };\n\n if (value === null) {\n return null as returnType;\n }\n if (Array.isArray(value)) {\n const result: CollectionItem<Item>[] = [];\n for (const item of value) {\n const collectionItem = toCollectionItem(item);\n if (collectionItem) {\n result.push(collectionItem);\n }\n }\n return result as returnType;\n }\n if (value !== undefined) {\n return toCollectionItem(value) as returnType;\n }\n\n return undefined as unknown as returnType;\n },\n [itemToString],\n );\n\n const itemToId = useCallback((item: Item): string => {\n for (const collectionItem of collectionItemsRef.current) {\n if (item === collectionItem.value) {\n return collectionItem.id;\n }\n }\n throw Error(\"useCollectionData itemToId, item not found\");\n }, []);\n\n const collapseGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem(\n collectionItemsRef.current,\n item.id,\n {\n expanded: false,\n },\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems],\n );\n\n const expandGroupItem = useCallback(\n (item: CollectionItem<Item>) => {\n collectionItemsRef.current = replaceCollectionItem<Item>(\n collectionItemsRef.current,\n item.id,\n {\n expanded: true,\n },\n );\n dataRef.current = collectVisibleItems(collectionItemsRef.current);\n forceUpdate({});\n },\n [collectVisibleItems],\n );\n\n return (\n inheritedCollectionHook || {\n collapseGroupItem,\n data: dataRef.current,\n expandGroupItem, // why not toggle, or just rely on setdata ?\n setFilterPattern,\n itemById,\n itemToId,\n toCollectionItem,\n itemToCollectionItem,\n stringToCollectionItem,\n }\n );\n};\n"],"names":["itemToString","defaultItemToString","flattenedCollection","flattenedSource","children","toCollectionItem"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useImperativeScrollingAPI.js","sources":["../src/common-hooks/useImperativeScrollingAPI.ts"],"sourcesContent":["import {\n type ForwardedRef,\n type MutableRefObject,\n useImperativeHandle,\n useMemo,\n} from \"react\";\nimport type { CollectionHookResult, CollectionItem } from \"./collectionTypes\";\n\nexport interface ScrollingAPI<Item> {\n scrollToIndex: (itemIndex: number) => void;\n scrollToItem: (item: Item) => void;\n scrollTo: (scrollOffset: number) => void;\n}\n\nexport interface ScrollingAPIHook<Item> {\n collectionHook: CollectionHookResult<Item>;\n forwardedRef?: ForwardedRef<ScrollingAPI<Item>>;\n scrollableRef: MutableRefObject<HTMLElement | null>;\n scrollIntoView?: (item: CollectionItem<Item>) => void;\n}\n\nconst noScrolling: ScrollingAPI<unknown> = {\n scrollToIndex: () => undefined,\n scrollToItem: () => undefined,\n scrollTo: () => undefined,\n};\n\nexport const useImperativeScrollingAPI = <Item>({\n collectionHook,\n forwardedRef,\n scrollableRef,\n scrollIntoView,\n}: ScrollingAPIHook<Item>) => {\n const scrollHandles: ScrollingAPI<Item> = useMemo(\n () => ({\n scrollToIndex: (itemIndex: number) => {\n const collectionItem = collectionHook.data[itemIndex];\n if (collectionItem) {\n scrollIntoView?.(collectionItem);\n }\n },\n scrollToItem: (item: Item) => {\n const collectionItem = collectionHook.toCollectionItem(item);\n if (collectionItem) {\n scrollIntoView?.(collectionItem);\n }\n },\n scrollTo: (scrollOffset: number) => {\n if (scrollableRef?.current) {\n scrollableRef.current.scrollTop = scrollOffset;\n }\n },\n }),\n [\n collectionHook.data,\n collectionHook.toCollectionItem,\n scrollIntoView,\n scrollableRef,\n ],\n );\n\n useImperativeHandle(forwardedRef, () => {\n if (scrollableRef.current) {\n return scrollHandles;\n }\n return noScrolling;\n }, [scrollHandles, scrollableRef]);\n};\n"],"names":[],"mappings":";;AAqBA,MAAM,
|
|
1
|
+
{"version":3,"file":"useImperativeScrollingAPI.js","sources":["../src/common-hooks/useImperativeScrollingAPI.ts"],"sourcesContent":["import {\n type ForwardedRef,\n type MutableRefObject,\n useImperativeHandle,\n useMemo,\n} from \"react\";\nimport type { CollectionHookResult, CollectionItem } from \"./collectionTypes\";\n\nexport interface ScrollingAPI<Item> {\n scrollToIndex: (itemIndex: number) => void;\n scrollToItem: (item: Item) => void;\n scrollTo: (scrollOffset: number) => void;\n}\n\nexport interface ScrollingAPIHook<Item> {\n collectionHook: CollectionHookResult<Item>;\n forwardedRef?: ForwardedRef<ScrollingAPI<Item>>;\n scrollableRef: MutableRefObject<HTMLElement | null>;\n scrollIntoView?: (item: CollectionItem<Item>) => void;\n}\n\nconst noScrolling: ScrollingAPI<unknown> = {\n scrollToIndex: () => undefined,\n scrollToItem: () => undefined,\n scrollTo: () => undefined,\n};\n\nexport const useImperativeScrollingAPI = <Item>({\n collectionHook,\n forwardedRef,\n scrollableRef,\n scrollIntoView,\n}: ScrollingAPIHook<Item>) => {\n const scrollHandles: ScrollingAPI<Item> = useMemo(\n () => ({\n scrollToIndex: (itemIndex: number) => {\n const collectionItem = collectionHook.data[itemIndex];\n if (collectionItem) {\n scrollIntoView?.(collectionItem);\n }\n },\n scrollToItem: (item: Item) => {\n const collectionItem = collectionHook.toCollectionItem(item);\n if (collectionItem) {\n scrollIntoView?.(collectionItem);\n }\n },\n scrollTo: (scrollOffset: number) => {\n if (scrollableRef?.current) {\n scrollableRef.current.scrollTop = scrollOffset;\n }\n },\n }),\n [\n collectionHook.data,\n collectionHook.toCollectionItem,\n scrollIntoView,\n scrollableRef,\n ],\n );\n\n useImperativeHandle(forwardedRef, () => {\n if (scrollableRef.current) {\n return scrollHandles;\n }\n return noScrolling;\n }, [scrollHandles, scrollableRef]);\n};\n"],"names":[],"mappings":";;AAqBA,MAAM,WAAA,GAAqC;AAAA,EACzC,eAAe,MAAM,MAAA;AAAA,EACrB,cAAc,MAAM,MAAA;AAAA,EACpB,UAAU,MAAM;AAClB,CAAA;AAEO,MAAM,4BAA4B,CAAO;AAAA,EAC9C,cAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA8B;AAC5B,EAAA,MAAM,aAAA,GAAoC,OAAA;AAAA,IACxC,OAAO;AAAA,MACL,aAAA,EAAe,CAAC,SAAA,KAAsB;AACpC,QAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AACpD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAiB,cAAA,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MACA,YAAA,EAAc,CAAC,IAAA,KAAe;AAC5B,QAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,gBAAA,CAAiB,IAAI,CAAA;AAC3D,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAiB,cAAA,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,YAAA,KAAyB;AAClC,QAAA,IAAI,+CAAe,OAAA,EAAS;AAC1B,UAAA,aAAA,CAAc,QAAQ,SAAA,GAAY,YAAA;AAAA,QACpC;AAAA,MACF;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,cAAA,CAAe,IAAA;AAAA,MACf,cAAA,CAAe,gBAAA;AAAA,MACf,cAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,mBAAA,CAAoB,cAAc,MAAM;AACtC,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,OAAO,aAAA;AAAA,IACT;AACA,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,EAAG,CAAC,aAAA,EAAe,aAAa,CAAC,CAAA;AACnC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeyboardNavigation.js","sources":["../src/common-hooks/useKeyboardNavigation.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport {\n type FocusEvent,\n type KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { CollectionItem } from \"./collectionTypes\";\nimport {\n ArrowDown,\n ArrowUp,\n End,\n Home,\n isCharacterKey,\n isNavigationKey,\n PageDown,\n PageUp,\n} from \"./keyUtils\";\nimport type {\n NavigationHookProps,\n NavigationHookResult,\n} from \"./navigationTypes\";\nimport {\n getFirstSelectedItem,\n hasSelection,\n type SelectionStrategy,\n} from \"./selectionTypes\";\n\nexport const LIST_FOCUS_VISIBLE = -2;\n\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === ArrowUp || key === End) {\n if (idx > 0) {\n return idx - 1;\n }\n return idx;\n }\n if (idx === null) {\n return 0;\n }\n if (idx === count - 1) {\n return idx;\n }\n return idx + 1;\n}\n\nconst getIndexOfSelectedItem = (\n items: CollectionItem<unknown>[],\n selected?: CollectionItem<unknown> | null | CollectionItem<unknown>[],\n) => {\n const selectedItem = getFirstSelectedItem(selected);\n if (selectedItem) {\n return items.indexOf(selectedItem);\n }\n return -1;\n};\n\nconst getStartIdx = (\n key: string,\n idx: number,\n selectedIdx: number,\n length: number,\n) => {\n if (key === End) {\n return length;\n }\n if (key === Home) {\n return -1;\n }\n if (idx !== -1) {\n return idx;\n }\n return selectedIdx;\n};\n\nconst getItemRect = (item: CollectionItem<unknown>) => {\n const el = document.getElementById(item.id);\n if (el) {\n return el.getBoundingClientRect();\n }\n throw Error(\n `useKeyboardNavigation.getItemRect no element found for item #${item?.id}`,\n );\n};\n\nconst pageDown = (\n containerEl: HTMLElement,\n itemEl: HTMLElement,\n indexPositions: CollectionItem<unknown>[],\n index: number,\n): number | undefined => {\n const { top: itemTop } = itemEl.getBoundingClientRect();\n const { scrollTop, clientHeight, scrollHeight } = containerEl;\n const lastIndexPosition = indexPositions.length - 1;\n const newScrollTop = Math.min(\n scrollTop + clientHeight,\n scrollHeight - clientHeight,\n );\n if (newScrollTop !== scrollTop && index < lastIndexPosition) {\n containerEl.scrollTo(0, newScrollTop);\n // Might need to do this in a timeout, in case virtualized content has rendered\n let nextIdx = index;\n let nextRect: DOMRect;\n do {\n nextIdx += 1;\n nextRect = getItemRect(indexPositions[nextIdx]);\n } while (nextRect.top < itemTop && nextIdx < lastIndexPosition);\n return nextIdx;\n }\n};\n\nconst pageUp = async (\n containerEl: HTMLElement,\n itemEl: HTMLElement,\n indexPositions: CollectionItem<unknown>[],\n index: number,\n): Promise<number | undefined> => {\n const { top: itemTop } = itemEl.getBoundingClientRect();\n const { scrollTop, clientHeight } = containerEl;\n const newScrollTop = Math.max(scrollTop - clientHeight, 0);\n if (newScrollTop !== scrollTop && index > 0) {\n containerEl.scrollTo(0, newScrollTop);\n return new Promise((resolve) => {\n // We must defer this operation until after render. If Items are virtualized.\n // we need to allow them to be rendered.\n requestAnimationFrame(() => {\n let nextIdx = index;\n let nextRect: DOMRect;\n do {\n nextIdx -= 1;\n nextRect = getItemRect(indexPositions[nextIdx]);\n } while (nextRect.top > itemTop && nextIdx > 0);\n resolve(nextIdx);\n });\n });\n }\n};\n\nconst isLeaf = <Item>(item: CollectionItem<Item>): boolean =>\n !item.header && !item.childNodes;\nconst isFocusable = <Item>(item: CollectionItem<Item>) =>\n isLeaf(item) || item.expanded !== undefined;\n\nexport const useKeyboardNavigation = <\n Item,\n Selection extends SelectionStrategy,\n>({\n containerRef,\n defaultHighlightedIndex = -1,\n disableHighlightOnFocus,\n highlightedIndex: highlightedIndexProp,\n indexPositions,\n onHighlight,\n onKeyboardNavigation,\n restoreLastFocus,\n selected,\n}: NavigationHookProps<Item, Selection>): NavigationHookResult => {\n const lastFocus = useRef(-1);\n const [, forceRender] = useState({});\n const [highlightedIndex, setHighlightedIdx, isControlledHighlighting] =\n useControlled({\n controlled: highlightedIndexProp,\n default: defaultHighlightedIndex,\n name: \"UseKeyboardNavigation\",\n });\n\n const setHighlightedIndex = useCallback(\n (idx: number, fromKeyboard = false) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n if (fromKeyboard) {\n lastFocus.current = idx;\n }\n },\n [onHighlight],\n );\n\n const nextPageItemIdx = useCallback(\n async (e: KeyboardEvent<HTMLElement>, index: number): Promise<number> => {\n const { id } = indexPositions[index];\n let result: number | undefined;\n if (id) {\n const itemEl = document.getElementById(id);\n const { current: containerEl } = containerRef;\n if (itemEl && containerEl) {\n result =\n e.key === PageDown\n ? pageDown(containerEl, itemEl, indexPositions, index)\n : await pageUp(containerEl, itemEl, indexPositions, index);\n }\n }\n return result ?? index;\n },\n [containerRef, indexPositions],\n );\n\n const nextFocusableItemIdx = useCallback(\n (\n key = ArrowDown,\n idx: number = key === ArrowDown ? -1 : indexPositions.length,\n ) => {\n if (indexPositions.length === 0) {\n return -1;\n }\n const indexOfSelectedItem = getIndexOfSelectedItem(\n indexPositions,\n selected,\n );\n // The start index is generally the highlightedIdx (passed in as idx).\n // We don't need it for Home and End navigation.\n // Special case where we have selection, but no highlighting - begin\n // navigation from selected item.\n const startIdx = getStartIdx(\n key,\n idx,\n indexOfSelectedItem,\n indexPositions.length,\n );\n\n let nextIdx = nextItemIdx(indexPositions.length, key, startIdx);\n // Guard against returning zero, when first item is a header or group\n if (nextIdx === 0 && key === ArrowUp && !isFocusable(indexPositions[0])) {\n return idx;\n }\n while (\n (((key === ArrowDown || key === Home) &&\n nextIdx < indexPositions.length) ||\n ((key === ArrowUp || key === End) && nextIdx > 0)) &&\n !isFocusable(indexPositions[nextIdx])\n ) {\n nextIdx = nextItemIdx(indexPositions.length, key, nextIdx);\n }\n return nextIdx;\n },\n [indexPositions, selected],\n );\n\n // does this belong here or should it be a method passed in?\n const keyboardNavigation = useRef(false);\n const ignoreFocus = useRef<boolean>(false);\n const setIgnoreFocus = useCallback(\n (value: boolean) => (ignoreFocus.current = value),\n [],\n );\n\n const handleFocus = useCallback(() => {\n // Ignore focus if mouse has been used\n if (ignoreFocus.current) {\n ignoreFocus.current = false;\n } else {\n // If mouse wan't used, then keyboard must have been\n keyboardNavigation.current = true;\n if (indexPositions.length === 0) {\n setHighlightedIndex(LIST_FOCUS_VISIBLE);\n } else if (highlightedIndex !== -1) {\n // We need to force a render here. We're not changing the highlightedIdx, but we want to\n // make sure we render with the correct focusVisible value. We don't store focusVisible\n // in state, as there are places where we would double render, as highlightedIdx also changes.\n forceRender({});\n } else if (restoreLastFocus) {\n if (lastFocus.current !== -1) {\n setHighlightedIndex(lastFocus.current);\n } else {\n const selectedItemIdx = getIndexOfSelectedItem(\n indexPositions,\n selected,\n );\n if (selectedItemIdx !== -1) {\n setHighlightedIndex(selectedItemIdx);\n } else {\n setHighlightedIndex(0);\n }\n }\n } else if (hasSelection(selected)) {\n const selectedItemIdx = getIndexOfSelectedItem(\n indexPositions,\n selected,\n );\n setHighlightedIndex(selectedItemIdx);\n } else if (disableHighlightOnFocus !== true) {\n setHighlightedIndex(nextFocusableItemIdx());\n }\n }\n }, [\n disableHighlightOnFocus,\n highlightedIndex,\n indexPositions,\n nextFocusableItemIdx,\n restoreLastFocus,\n selected,\n setHighlightedIndex,\n ]);\n\n const navigateChildItems = useCallback(\n async (e: KeyboardEvent<HTMLElement>) => {\n const nextIdx =\n e.key === PageDown || e.key === PageUp\n ? await nextPageItemIdx(e, highlightedIndex)\n : nextFocusableItemIdx(e.key, highlightedIndex);\n\n if (nextIdx !== highlightedIndex) {\n setHighlightedIndex(nextIdx, true);\n }\n // Users may need to know that a Keyboard navigation event has been handled\n // even if no actual navigation was effected. e.g. fine-grained control\n // over aria-activedescendant requires this.\n onKeyboardNavigation?.(e, nextIdx);\n },\n [\n highlightedIndex,\n nextFocusableItemIdx,\n nextPageItemIdx,\n onKeyboardNavigation,\n setHighlightedIndex,\n ],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n if (indexPositions.length > 0 && isNavigationKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n keyboardNavigation.current = true;\n void navigateChildItems(e);\n } else if (isCharacterKey(e)) {\n keyboardNavigation.current = true;\n }\n },\n [indexPositions, navigateChildItems],\n );\n\n const listProps = useMemo(() => {\n return {\n onBlur: (e: FocusEvent) => {\n //TODO no direct ref to List\n const sourceTarget = (e.target as HTMLElement).closest(\".saltList\");\n const destTarget = e.relatedTarget as HTMLElement;\n if (sourceTarget && !sourceTarget?.contains(destTarget)) {\n keyboardNavigation.current = false;\n setHighlightedIdx(-1);\n if (!restoreLastFocus) {\n lastFocus.current = -1;\n }\n }\n },\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyboardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyboardNavigation.current) {\n keyboardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n keyboardNavigation.current = false;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n };\n }, [\n handleFocus,\n handleKeyDown,\n restoreLastFocus,\n setHighlightedIndex,\n setIgnoreFocus,\n ]);\n\n return {\n focusVisible: keyboardNavigation.current ? highlightedIndex : -1,\n controlledHighlighting: isControlledHighlighting,\n highlightedIndex,\n setHighlightedIndex,\n keyboardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useKeyboardNavigation.js","sources":["../src/common-hooks/useKeyboardNavigation.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport {\n type FocusEvent,\n type KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { CollectionItem } from \"./collectionTypes\";\nimport {\n ArrowDown,\n ArrowUp,\n End,\n Home,\n isCharacterKey,\n isNavigationKey,\n PageDown,\n PageUp,\n} from \"./keyUtils\";\nimport type {\n NavigationHookProps,\n NavigationHookResult,\n} from \"./navigationTypes\";\nimport {\n getFirstSelectedItem,\n hasSelection,\n type SelectionStrategy,\n} from \"./selectionTypes\";\n\nexport const LIST_FOCUS_VISIBLE = -2;\n\nfunction nextItemIdx(count: number, key: string, idx: number) {\n if (key === ArrowUp || key === End) {\n if (idx > 0) {\n return idx - 1;\n }\n return idx;\n }\n if (idx === null) {\n return 0;\n }\n if (idx === count - 1) {\n return idx;\n }\n return idx + 1;\n}\n\nconst getIndexOfSelectedItem = (\n items: CollectionItem<unknown>[],\n selected?: CollectionItem<unknown> | null | CollectionItem<unknown>[],\n) => {\n const selectedItem = getFirstSelectedItem(selected);\n if (selectedItem) {\n return items.indexOf(selectedItem);\n }\n return -1;\n};\n\nconst getStartIdx = (\n key: string,\n idx: number,\n selectedIdx: number,\n length: number,\n) => {\n if (key === End) {\n return length;\n }\n if (key === Home) {\n return -1;\n }\n if (idx !== -1) {\n return idx;\n }\n return selectedIdx;\n};\n\nconst getItemRect = (item: CollectionItem<unknown>) => {\n const el = document.getElementById(item.id);\n if (el) {\n return el.getBoundingClientRect();\n }\n throw Error(\n `useKeyboardNavigation.getItemRect no element found for item #${item?.id}`,\n );\n};\n\nconst pageDown = (\n containerEl: HTMLElement,\n itemEl: HTMLElement,\n indexPositions: CollectionItem<unknown>[],\n index: number,\n): number | undefined => {\n const { top: itemTop } = itemEl.getBoundingClientRect();\n const { scrollTop, clientHeight, scrollHeight } = containerEl;\n const lastIndexPosition = indexPositions.length - 1;\n const newScrollTop = Math.min(\n scrollTop + clientHeight,\n scrollHeight - clientHeight,\n );\n if (newScrollTop !== scrollTop && index < lastIndexPosition) {\n containerEl.scrollTo(0, newScrollTop);\n // Might need to do this in a timeout, in case virtualized content has rendered\n let nextIdx = index;\n let nextRect: DOMRect;\n do {\n nextIdx += 1;\n nextRect = getItemRect(indexPositions[nextIdx]);\n } while (nextRect.top < itemTop && nextIdx < lastIndexPosition);\n return nextIdx;\n }\n};\n\nconst pageUp = async (\n containerEl: HTMLElement,\n itemEl: HTMLElement,\n indexPositions: CollectionItem<unknown>[],\n index: number,\n): Promise<number | undefined> => {\n const { top: itemTop } = itemEl.getBoundingClientRect();\n const { scrollTop, clientHeight } = containerEl;\n const newScrollTop = Math.max(scrollTop - clientHeight, 0);\n if (newScrollTop !== scrollTop && index > 0) {\n containerEl.scrollTo(0, newScrollTop);\n return new Promise((resolve) => {\n // We must defer this operation until after render. If Items are virtualized.\n // we need to allow them to be rendered.\n requestAnimationFrame(() => {\n let nextIdx = index;\n let nextRect: DOMRect;\n do {\n nextIdx -= 1;\n nextRect = getItemRect(indexPositions[nextIdx]);\n } while (nextRect.top > itemTop && nextIdx > 0);\n resolve(nextIdx);\n });\n });\n }\n};\n\nconst isLeaf = <Item>(item: CollectionItem<Item>): boolean =>\n !item.header && !item.childNodes;\nconst isFocusable = <Item>(item: CollectionItem<Item>) =>\n isLeaf(item) || item.expanded !== undefined;\n\nexport const useKeyboardNavigation = <\n Item,\n Selection extends SelectionStrategy,\n>({\n containerRef,\n defaultHighlightedIndex = -1,\n disableHighlightOnFocus,\n highlightedIndex: highlightedIndexProp,\n indexPositions,\n onHighlight,\n onKeyboardNavigation,\n restoreLastFocus,\n selected,\n}: NavigationHookProps<Item, Selection>): NavigationHookResult => {\n const lastFocus = useRef(-1);\n const [, forceRender] = useState({});\n const [highlightedIndex, setHighlightedIdx, isControlledHighlighting] =\n useControlled({\n controlled: highlightedIndexProp,\n default: defaultHighlightedIndex,\n name: \"UseKeyboardNavigation\",\n });\n\n const setHighlightedIndex = useCallback(\n (idx: number, fromKeyboard = false) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n if (fromKeyboard) {\n lastFocus.current = idx;\n }\n },\n [onHighlight],\n );\n\n const nextPageItemIdx = useCallback(\n async (e: KeyboardEvent<HTMLElement>, index: number): Promise<number> => {\n const { id } = indexPositions[index];\n let result: number | undefined;\n if (id) {\n const itemEl = document.getElementById(id);\n const { current: containerEl } = containerRef;\n if (itemEl && containerEl) {\n result =\n e.key === PageDown\n ? pageDown(containerEl, itemEl, indexPositions, index)\n : await pageUp(containerEl, itemEl, indexPositions, index);\n }\n }\n return result ?? index;\n },\n [containerRef, indexPositions],\n );\n\n const nextFocusableItemIdx = useCallback(\n (\n key = ArrowDown,\n idx: number = key === ArrowDown ? -1 : indexPositions.length,\n ) => {\n if (indexPositions.length === 0) {\n return -1;\n }\n const indexOfSelectedItem = getIndexOfSelectedItem(\n indexPositions,\n selected,\n );\n // The start index is generally the highlightedIdx (passed in as idx).\n // We don't need it for Home and End navigation.\n // Special case where we have selection, but no highlighting - begin\n // navigation from selected item.\n const startIdx = getStartIdx(\n key,\n idx,\n indexOfSelectedItem,\n indexPositions.length,\n );\n\n let nextIdx = nextItemIdx(indexPositions.length, key, startIdx);\n // Guard against returning zero, when first item is a header or group\n if (nextIdx === 0 && key === ArrowUp && !isFocusable(indexPositions[0])) {\n return idx;\n }\n while (\n (((key === ArrowDown || key === Home) &&\n nextIdx < indexPositions.length) ||\n ((key === ArrowUp || key === End) && nextIdx > 0)) &&\n !isFocusable(indexPositions[nextIdx])\n ) {\n nextIdx = nextItemIdx(indexPositions.length, key, nextIdx);\n }\n return nextIdx;\n },\n [indexPositions, selected],\n );\n\n // does this belong here or should it be a method passed in?\n const keyboardNavigation = useRef(false);\n const ignoreFocus = useRef<boolean>(false);\n const setIgnoreFocus = useCallback(\n (value: boolean) => (ignoreFocus.current = value),\n [],\n );\n\n const handleFocus = useCallback(() => {\n // Ignore focus if mouse has been used\n if (ignoreFocus.current) {\n ignoreFocus.current = false;\n } else {\n // If mouse wan't used, then keyboard must have been\n keyboardNavigation.current = true;\n if (indexPositions.length === 0) {\n setHighlightedIndex(LIST_FOCUS_VISIBLE);\n } else if (highlightedIndex !== -1) {\n // We need to force a render here. We're not changing the highlightedIdx, but we want to\n // make sure we render with the correct focusVisible value. We don't store focusVisible\n // in state, as there are places where we would double render, as highlightedIdx also changes.\n forceRender({});\n } else if (restoreLastFocus) {\n if (lastFocus.current !== -1) {\n setHighlightedIndex(lastFocus.current);\n } else {\n const selectedItemIdx = getIndexOfSelectedItem(\n indexPositions,\n selected,\n );\n if (selectedItemIdx !== -1) {\n setHighlightedIndex(selectedItemIdx);\n } else {\n setHighlightedIndex(0);\n }\n }\n } else if (hasSelection(selected)) {\n const selectedItemIdx = getIndexOfSelectedItem(\n indexPositions,\n selected,\n );\n setHighlightedIndex(selectedItemIdx);\n } else if (disableHighlightOnFocus !== true) {\n setHighlightedIndex(nextFocusableItemIdx());\n }\n }\n }, [\n disableHighlightOnFocus,\n highlightedIndex,\n indexPositions,\n nextFocusableItemIdx,\n restoreLastFocus,\n selected,\n setHighlightedIndex,\n ]);\n\n const navigateChildItems = useCallback(\n async (e: KeyboardEvent<HTMLElement>) => {\n const nextIdx =\n e.key === PageDown || e.key === PageUp\n ? await nextPageItemIdx(e, highlightedIndex)\n : nextFocusableItemIdx(e.key, highlightedIndex);\n\n if (nextIdx !== highlightedIndex) {\n setHighlightedIndex(nextIdx, true);\n }\n // Users may need to know that a Keyboard navigation event has been handled\n // even if no actual navigation was effected. e.g. fine-grained control\n // over aria-activedescendant requires this.\n onKeyboardNavigation?.(e, nextIdx);\n },\n [\n highlightedIndex,\n nextFocusableItemIdx,\n nextPageItemIdx,\n onKeyboardNavigation,\n setHighlightedIndex,\n ],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n if (indexPositions.length > 0 && isNavigationKey(e)) {\n e.preventDefault();\n e.stopPropagation();\n keyboardNavigation.current = true;\n void navigateChildItems(e);\n } else if (isCharacterKey(e)) {\n keyboardNavigation.current = true;\n }\n },\n [indexPositions, navigateChildItems],\n );\n\n const listProps = useMemo(() => {\n return {\n onBlur: (e: FocusEvent) => {\n //TODO no direct ref to List\n const sourceTarget = (e.target as HTMLElement).closest(\".saltList\");\n const destTarget = e.relatedTarget as HTMLElement;\n if (sourceTarget && !sourceTarget?.contains(destTarget)) {\n keyboardNavigation.current = false;\n setHighlightedIdx(-1);\n if (!restoreLastFocus) {\n lastFocus.current = -1;\n }\n }\n },\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyboardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyboardNavigation.current) {\n keyboardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n keyboardNavigation.current = false;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n };\n }, [\n handleFocus,\n handleKeyDown,\n restoreLastFocus,\n setHighlightedIndex,\n setIgnoreFocus,\n ]);\n\n return {\n focusVisible: keyboardNavigation.current ? highlightedIndex : -1,\n controlledHighlighting: isControlledHighlighting,\n highlightedIndex,\n setHighlightedIndex,\n keyboardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeyboardNavigationPanel.js","sources":["../src/common-hooks/useKeyboardNavigationPanel.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport { type KeyboardEvent, useCallback, useMemo, useRef } from \"react\";\nimport type { CollectionItem } from \"./collectionTypes\";\nimport type { NavigationHookResult, NavigationProps } from \"./navigationTypes\";\n\ntype NavigationDirection = \"FWD\" | \"BWD\";\n\nfunction nextItemIdx(\n count: number,\n direction: NavigationDirection,\n idx: number,\n cycleFocus = false,\n) {\n if (direction === \"BWD\") {\n if (idx > 0) {\n return idx - 1;\n }\n return cycleFocus ? count - 1 : idx;\n }\n if (idx === null) {\n return 0;\n }\n if (idx === count - 1) {\n return cycleFocus ? 0 : idx;\n }\n return idx + 1;\n}\n\nconst isLeaf = <Item>(item: CollectionItem<Item>): boolean =>\n !item.header && !item.childNodes;\nconst isFocusable = <Item>(item: CollectionItem<Item>) =>\n (isLeaf(item) || item.expanded !== undefined) && item.focusable !== false;\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigationPanel = ({\n cycleFocus = false,\n defaultHighlightedIndex: defaultHighlightedIdx = -1,\n focusOnHighlight = false,\n highlightedIndex: highlightedIdxProp,\n indexPositions,\n onHighlight,\n onKeyboardNavigation,\n}: NavigationProps): NavigationHookResult => {\n const [highlightedIdx, setHighlightedIdx, isControlledHighlighting] =\n useControlled({\n controlled: highlightedIdxProp,\n default: defaultHighlightedIdx,\n name: \"UseKeyboardNavigation\",\n });\n\n // does this belong here or should it be a method passed in?\n const keyboardNavigation = useRef(true);\n const ignoreFocus = useRef<boolean>(false);\n const setIgnoreFocus = useCallback(\n (value: boolean) => (ignoreFocus.current = value),\n [],\n );\n\n const setHighlightedIndex = useCallback(\n (idx: number) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n if (focusOnHighlight && idx !== -1) {\n const { id } = indexPositions[idx];\n const formField = document.getElementById(id);\n const targetEl = formField?.querySelector(\"[tabindex]\") as HTMLElement;\n setIgnoreFocus(true);\n targetEl?.focus();\n }\n },\n [focusOnHighlight, indexPositions, onHighlight, setIgnoreFocus],\n );\n\n const nextFocusableItemIdx = useCallback(\n (\n direction: NavigationDirection = \"FWD\",\n idx = direction === \"FWD\" ? -1 : indexPositions.length,\n ) => {\n let nextIdx = nextItemIdx(\n indexPositions.length,\n direction,\n idx,\n cycleFocus,\n );\n while (\n ((direction === \"FWD\" && nextIdx < indexPositions.length) ||\n (direction === \"BWD\" && nextIdx > 0)) &&\n !isFocusable(indexPositions[nextIdx])\n ) {\n nextIdx = nextItemIdx(\n indexPositions.length,\n direction,\n nextIdx,\n cycleFocus,\n );\n }\n return nextIdx;\n },\n [cycleFocus, indexPositions],\n );\n\n const handleFocus = useCallback(() => {\n if (ignoreFocus.current) {\n ignoreFocus.current = false;\n } else {\n setHighlightedIndex(nextFocusableItemIdx());\n }\n }, [nextFocusableItemIdx, setHighlightedIndex]);\n\n const navigateChildItems = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n const direction: NavigationDirection = e.shiftKey ? \"BWD\" : \"FWD\";\n const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);\n console.log(`nextFocusableItem from ${highlightedIdx} is ${nextIdx}`);\n if (nextIdx !== highlightedIdx) {\n setHighlightedIndex(nextIdx);\n // What exactly is the point of this ?\n onKeyboardNavigation?.(e, nextIdx);\n }\n },\n [\n highlightedIdx,\n nextFocusableItemIdx,\n onKeyboardNavigation,\n setHighlightedIndex,\n ],\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent<HTMLElement>) => {\n if (indexPositions.length > 0 && evt.key === \"Tab\") {\n evt.preventDefault();\n evt.stopPropagation();\n keyboardNavigation.current = true;\n navigateChildItems(evt);\n }\n },\n [indexPositions, navigateChildItems],\n );\n\n const listProps = useMemo(\n () => ({\n onBlur: () => {\n // This sets highlightedIdx to -1 before a click on ListItem can effect selection\n // maybe in a timeout\n // setHighlightedIndex(-1);\n },\n onFocus: handleFocus,\n // Does this have to be capture ? We'll have to change the types\n // onKeyDownCapture: handleKeyDown,\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyboardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyboardNavigation.current) {\n keyboardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n keyboardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [handleFocus, handleKeyDown, setHighlightedIndex, setIgnoreFocus],\n );\n\n return {\n focusVisible: keyboardNavigation.current ? highlightedIdx : -1,\n controlledHighlighting: isControlledHighlighting,\n highlightedIndex: highlightedIdx,\n setHighlightedIndex,\n keyboardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n"],"names":[],"mappings":";;;AAOA,SAAS,
|
|
1
|
+
{"version":3,"file":"useKeyboardNavigationPanel.js","sources":["../src/common-hooks/useKeyboardNavigationPanel.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport { type KeyboardEvent, useCallback, useMemo, useRef } from \"react\";\nimport type { CollectionItem } from \"./collectionTypes\";\nimport type { NavigationHookResult, NavigationProps } from \"./navigationTypes\";\n\ntype NavigationDirection = \"FWD\" | \"BWD\";\n\nfunction nextItemIdx(\n count: number,\n direction: NavigationDirection,\n idx: number,\n cycleFocus = false,\n) {\n if (direction === \"BWD\") {\n if (idx > 0) {\n return idx - 1;\n }\n return cycleFocus ? count - 1 : idx;\n }\n if (idx === null) {\n return 0;\n }\n if (idx === count - 1) {\n return cycleFocus ? 0 : idx;\n }\n return idx + 1;\n}\n\nconst isLeaf = <Item>(item: CollectionItem<Item>): boolean =>\n !item.header && !item.childNodes;\nconst isFocusable = <Item>(item: CollectionItem<Item>) =>\n (isLeaf(item) || item.expanded !== undefined) && item.focusable !== false;\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigationPanel = ({\n cycleFocus = false,\n defaultHighlightedIndex: defaultHighlightedIdx = -1,\n focusOnHighlight = false,\n highlightedIndex: highlightedIdxProp,\n indexPositions,\n onHighlight,\n onKeyboardNavigation,\n}: NavigationProps): NavigationHookResult => {\n const [highlightedIdx, setHighlightedIdx, isControlledHighlighting] =\n useControlled({\n controlled: highlightedIdxProp,\n default: defaultHighlightedIdx,\n name: \"UseKeyboardNavigation\",\n });\n\n // does this belong here or should it be a method passed in?\n const keyboardNavigation = useRef(true);\n const ignoreFocus = useRef<boolean>(false);\n const setIgnoreFocus = useCallback(\n (value: boolean) => (ignoreFocus.current = value),\n [],\n );\n\n const setHighlightedIndex = useCallback(\n (idx: number) => {\n onHighlight?.(idx);\n setHighlightedIdx(idx);\n if (focusOnHighlight && idx !== -1) {\n const { id } = indexPositions[idx];\n const formField = document.getElementById(id);\n const targetEl = formField?.querySelector(\"[tabindex]\") as HTMLElement;\n setIgnoreFocus(true);\n targetEl?.focus();\n }\n },\n [focusOnHighlight, indexPositions, onHighlight, setIgnoreFocus],\n );\n\n const nextFocusableItemIdx = useCallback(\n (\n direction: NavigationDirection = \"FWD\",\n idx = direction === \"FWD\" ? -1 : indexPositions.length,\n ) => {\n let nextIdx = nextItemIdx(\n indexPositions.length,\n direction,\n idx,\n cycleFocus,\n );\n while (\n ((direction === \"FWD\" && nextIdx < indexPositions.length) ||\n (direction === \"BWD\" && nextIdx > 0)) &&\n !isFocusable(indexPositions[nextIdx])\n ) {\n nextIdx = nextItemIdx(\n indexPositions.length,\n direction,\n nextIdx,\n cycleFocus,\n );\n }\n return nextIdx;\n },\n [cycleFocus, indexPositions],\n );\n\n const handleFocus = useCallback(() => {\n if (ignoreFocus.current) {\n ignoreFocus.current = false;\n } else {\n setHighlightedIndex(nextFocusableItemIdx());\n }\n }, [nextFocusableItemIdx, setHighlightedIndex]);\n\n const navigateChildItems = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n const direction: NavigationDirection = e.shiftKey ? \"BWD\" : \"FWD\";\n const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);\n console.log(`nextFocusableItem from ${highlightedIdx} is ${nextIdx}`);\n if (nextIdx !== highlightedIdx) {\n setHighlightedIndex(nextIdx);\n // What exactly is the point of this ?\n onKeyboardNavigation?.(e, nextIdx);\n }\n },\n [\n highlightedIdx,\n nextFocusableItemIdx,\n onKeyboardNavigation,\n setHighlightedIndex,\n ],\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent<HTMLElement>) => {\n if (indexPositions.length > 0 && evt.key === \"Tab\") {\n evt.preventDefault();\n evt.stopPropagation();\n keyboardNavigation.current = true;\n navigateChildItems(evt);\n }\n },\n [indexPositions, navigateChildItems],\n );\n\n const listProps = useMemo(\n () => ({\n onBlur: () => {\n // This sets highlightedIdx to -1 before a click on ListItem can effect selection\n // maybe in a timeout\n // setHighlightedIndex(-1);\n },\n onFocus: handleFocus,\n // Does this have to be capture ? We'll have to change the types\n // onKeyDownCapture: handleKeyDown,\n onKeyDown: handleKeyDown,\n onMouseDownCapture: () => {\n keyboardNavigation.current = false;\n setIgnoreFocus(true);\n },\n\n // onMouseEnter would seem less expensive but it misses some cases\n onMouseMove: () => {\n if (keyboardNavigation.current) {\n keyboardNavigation.current = false;\n }\n },\n onMouseLeave: () => {\n keyboardNavigation.current = true;\n setIgnoreFocus(false);\n setHighlightedIndex(-1);\n },\n }),\n [handleFocus, handleKeyDown, setHighlightedIndex, setIgnoreFocus],\n );\n\n return {\n focusVisible: keyboardNavigation.current ? highlightedIdx : -1,\n controlledHighlighting: isControlledHighlighting,\n highlightedIndex: highlightedIdx,\n setHighlightedIndex,\n keyboardNavigation,\n listProps,\n setIgnoreFocus,\n };\n};\n"],"names":[],"mappings":"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"}
|