@salt-ds/lab 1.0.0-alpha.1 → 1.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjs/packages/lab/src/accordion/AccordionSection.js +1 -0
- package/dist-cjs/packages/lab/src/accordion/AccordionSection.js.map +1 -1
- package/dist-cjs/packages/lab/src/app-header/AppHeader.js +1 -0
- package/dist-cjs/packages/lab/src/app-header/AppHeader.js.map +1 -1
- package/dist-cjs/packages/lab/src/breadcrumbs/Breadcrumb.js.map +1 -1
- package/dist-cjs/packages/lab/src/button-bar/OrderedButton.js +1 -0
- package/dist-cjs/packages/lab/src/button-bar/OrderedButton.js.map +1 -1
- package/dist-cjs/packages/lab/src/calendar/internal/CalendarDay.js +33 -49
- package/dist-cjs/packages/lab/src/calendar/internal/CalendarDay.js.map +1 -1
- package/dist-cjs/packages/lab/src/calendar/internal/CalendarNavigation.js +34 -64
- package/dist-cjs/packages/lab/src/calendar/internal/CalendarNavigation.js.map +1 -1
- package/dist-cjs/packages/lab/src/calendar/useSelection.js +1 -0
- package/dist-cjs/packages/lab/src/calendar/useSelection.js.map +1 -1
- package/dist-cjs/packages/lab/src/carousel/Carousel.js +1 -0
- package/dist-cjs/packages/lab/src/carousel/Carousel.js.map +1 -1
- package/dist-cjs/packages/lab/src/cascading-menu/CascadingMenu.js +1 -0
- package/dist-cjs/packages/lab/src/cascading-menu/CascadingMenu.js.map +1 -1
- package/dist-cjs/packages/lab/src/cascading-menu/CascadingMenuItem.js +46 -60
- package/dist-cjs/packages/lab/src/cascading-menu/CascadingMenuItem.js.map +1 -1
- package/dist-cjs/packages/lab/src/cascading-menu/CascadingMenuList.js +3 -3
- package/dist-cjs/packages/lab/src/cascading-menu/CascadingMenuList.js.map +1 -1
- package/dist-cjs/packages/lab/src/cascading-menu/internal/useClickAway.js +1 -0
- package/dist-cjs/packages/lab/src/cascading-menu/internal/useClickAway.js.map +1 -1
- package/dist-cjs/packages/lab/src/cascading-menu/internal/useMenuTriggerHandlers.js +1 -0
- package/dist-cjs/packages/lab/src/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
- package/dist-cjs/packages/lab/src/combo-box/ComboBox.js +1 -0
- package/dist-cjs/packages/lab/src/combo-box/ComboBox.js.map +1 -1
- package/dist-cjs/packages/lab/src/combo-box/useCombobox.js +1 -0
- package/dist-cjs/packages/lab/src/combo-box/useCombobox.js.map +1 -1
- package/dist-cjs/packages/lab/src/combo-box-deprecated/filterHelpers.js +1 -0
- package/dist-cjs/packages/lab/src/combo-box-deprecated/filterHelpers.js.map +1 -1
- package/dist-cjs/packages/lab/src/combo-box-deprecated/internal/DefaultComboBox.js +21 -39
- package/dist-cjs/packages/lab/src/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
- package/dist-cjs/packages/lab/src/combo-box-deprecated/internal/MultiSelectComboBox.js +28 -49
- package/dist-cjs/packages/lab/src/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
- package/dist-cjs/packages/lab/src/combo-box-deprecated/internal/useComboBox.js +1 -0
- package/dist-cjs/packages/lab/src/combo-box-deprecated/internal/useComboBox.js.map +1 -1
- package/dist-cjs/packages/lab/src/combo-box-deprecated/internal/useMultiSelectComboBox.js +1 -0
- package/dist-cjs/packages/lab/src/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
- package/dist-cjs/packages/lab/src/common-hooks/useViewportTracking.js +1 -0
- package/dist-cjs/packages/lab/src/common-hooks/useViewportTracking.js.map +1 -1
- package/dist-cjs/packages/lab/src/common-hooks/utils/filter-utils.js +1 -0
- package/dist-cjs/packages/lab/src/common-hooks/utils/filter-utils.js.map +1 -1
- package/dist-cjs/packages/lab/src/contact-details/ContactAction.js +8 -23
- package/dist-cjs/packages/lab/src/contact-details/ContactAction.js.map +1 -1
- package/dist-cjs/packages/lab/src/contact-details/ContactFavoriteToggle.js.map +1 -1
- package/dist-cjs/packages/lab/src/contact-details/MailLinkComponent.js +1 -0
- package/dist-cjs/packages/lab/src/contact-details/MailLinkComponent.js.map +1 -1
- package/dist-cjs/packages/lab/src/contact-details/internal/FavoriteToggleWithTooltip.js +8 -19
- package/dist-cjs/packages/lab/src/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
- package/dist-cjs/packages/lab/src/content-status/internal/StatusIndicator.js +1 -2
- package/dist-cjs/packages/lab/src/content-status/internal/StatusIndicator.js.map +1 -1
- package/dist-cjs/packages/lab/src/deck-layout/DeckLayout.js +1 -0
- package/dist-cjs/packages/lab/src/deck-layout/DeckLayout.js.map +1 -1
- package/dist-cjs/packages/lab/src/dropdown/Dropdown.js +1 -0
- package/dist-cjs/packages/lab/src/dropdown/Dropdown.js.map +1 -1
- package/dist-cjs/packages/lab/src/dropdown/DropdownBase.js +6 -6
- package/dist-cjs/packages/lab/src/dropdown/DropdownBase.js.map +1 -1
- package/dist-cjs/packages/lab/src/dropdown/useDropdown.js +1 -0
- package/dist-cjs/packages/lab/src/dropdown/useDropdown.js.map +1 -1
- package/dist-cjs/packages/lab/src/dropdown/useDropdownBase.js +1 -0
- package/dist-cjs/packages/lab/src/dropdown/useDropdownBase.js.map +1 -1
- package/dist-cjs/packages/lab/src/form-field/FormField.js +60 -73
- package/dist-cjs/packages/lab/src/form-field/FormField.js.map +1 -1
- package/dist-cjs/packages/lab/src/form-field/StatusIndicator.js +17 -30
- package/dist-cjs/packages/lab/src/form-field/StatusIndicator.js.map +1 -1
- package/dist-cjs/packages/lab/src/index.js +3 -15
- package/dist-cjs/packages/lab/src/index.js.map +1 -1
- package/dist-cjs/packages/lab/src/layer-layout/LayerLayout.js +3 -2
- package/dist-cjs/packages/lab/src/layer-layout/LayerLayout.js.map +1 -1
- package/dist-cjs/packages/lab/src/list/Highlighter.js +1 -0
- package/dist-cjs/packages/lab/src/list/Highlighter.js.map +1 -1
- package/dist-cjs/packages/lab/src/list/List.js +1 -0
- package/dist-cjs/packages/lab/src/list/List.js.map +1 -1
- package/dist-cjs/packages/lab/src/list/VirtualizedList.js +1 -0
- package/dist-cjs/packages/lab/src/list/VirtualizedList.js.map +1 -1
- package/dist-cjs/packages/lab/src/list/useList.js +1 -0
- package/dist-cjs/packages/lab/src/list/useList.js.map +1 -1
- package/dist-cjs/packages/lab/src/list/useListHeight.js +1 -0
- package/dist-cjs/packages/lab/src/list/useListHeight.js.map +1 -1
- package/dist-cjs/packages/lab/src/list-deprecated/List.js +5 -26
- package/dist-cjs/packages/lab/src/list-deprecated/List.js.map +1 -1
- package/dist-cjs/packages/lab/src/list-deprecated/ListItemBase.js +28 -58
- package/dist-cjs/packages/lab/src/list-deprecated/ListItemBase.js.map +1 -1
- package/dist-cjs/packages/lab/src/list-deprecated/internal/Highlighter.js +1 -0
- package/dist-cjs/packages/lab/src/list-deprecated/internal/Highlighter.js.map +1 -1
- package/dist-cjs/packages/lab/src/list-deprecated/useTypeSelect.js +1 -0
- package/dist-cjs/packages/lab/src/list-deprecated/useTypeSelect.js.map +1 -1
- package/dist-cjs/packages/lab/src/overlay/Overlay.js +1 -1
- package/dist-cjs/packages/lab/src/overlay/Overlay.js.map +1 -1
- package/dist-cjs/packages/lab/src/overlay/useOverlay.js +11 -12
- package/dist-cjs/packages/lab/src/overlay/useOverlay.js.map +1 -1
- package/dist-cjs/packages/lab/src/parent-child-layout/ParentChildLayout.js +1 -0
- package/dist-cjs/packages/lab/src/parent-child-layout/ParentChildLayout.js.map +1 -1
- package/dist-cjs/packages/lab/src/pill/PillBase.js +39 -55
- package/dist-cjs/packages/lab/src/pill/PillBase.js.map +1 -1
- package/dist-cjs/packages/lab/src/query-input/internal/CategoryList.js +1 -0
- package/dist-cjs/packages/lab/src/query-input/internal/CategoryList.js.map +1 -1
- package/dist-cjs/packages/lab/src/query-input/internal/CategoryListItem.js +1 -0
- package/dist-cjs/packages/lab/src/query-input/internal/CategoryListItem.js.map +1 -1
- package/dist-cjs/packages/lab/src/query-input/internal/QueryInputBody.js +1 -0
- package/dist-cjs/packages/lab/src/query-input/internal/QueryInputBody.js.map +1 -1
- package/dist-cjs/packages/lab/src/query-input/internal/SearchList.js +1 -0
- package/dist-cjs/packages/lab/src/query-input/internal/SearchList.js.map +1 -1
- package/dist-cjs/packages/lab/src/query-input/internal/ValueList.js +1 -0
- package/dist-cjs/packages/lab/src/query-input/internal/ValueList.js.map +1 -1
- package/dist-cjs/packages/lab/src/query-input/internal/ValueSelector.js +2 -3
- package/dist-cjs/packages/lab/src/query-input/internal/ValueSelector.js.map +1 -1
- package/dist-cjs/packages/lab/src/query-input/useQueryInput.js +1 -0
- package/dist-cjs/packages/lab/src/query-input/useQueryInput.js.map +1 -1
- package/dist-cjs/packages/lab/src/responsive/useOverflow.js +1 -0
- package/dist-cjs/packages/lab/src/responsive/useOverflow.js.map +1 -1
- package/dist-cjs/packages/lab/src/slider/internal/SliderHandle.js +17 -26
- package/dist-cjs/packages/lab/src/slider/internal/SliderHandle.js.map +1 -1
- package/dist-cjs/packages/lab/src/tabs/Tabstrip.js +35 -45
- package/dist-cjs/packages/lab/src/tabs/Tabstrip.js.map +1 -1
- package/dist-cjs/packages/lab/src/tabs/useActivationIndicator.js +1 -0
- package/dist-cjs/packages/lab/src/tabs/useActivationIndicator.js.map +1 -1
- package/dist-cjs/packages/lab/src/tabs/useKeyboardNavigation.js +1 -0
- package/dist-cjs/packages/lab/src/tabs/useKeyboardNavigation.js.map +1 -1
- package/dist-cjs/packages/lab/src/toggle-button/ToggleButton.js +6 -26
- package/dist-cjs/packages/lab/src/toggle-button/ToggleButton.js.map +1 -1
- package/dist-cjs/packages/lab/src/tokenized-input/TokenizedInput.js.map +1 -1
- package/dist-cjs/packages/lab/src/tokenized-input/useTokenizedInput.js +1 -0
- package/dist-cjs/packages/lab/src/tokenized-input/useTokenizedInput.js.map +1 -1
- package/dist-cjs/packages/lab/src/toolbar/Toolbar.js +1 -0
- package/dist-cjs/packages/lab/src/toolbar/Toolbar.js.map +1 -1
- package/dist-cjs/packages/lab/src/toolbar/internal/renderToolbarItems.js +1 -0
- package/dist-cjs/packages/lab/src/toolbar/internal/renderToolbarItems.js.map +1 -1
- package/dist-cjs/packages/lab/src/toolbar/overflow-panel/OverflowPanel.js +1 -0
- package/dist-cjs/packages/lab/src/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
- package/dist-cjs/packages/lab/src/tree/Tree.js +1 -0
- package/dist-cjs/packages/lab/src/tree/Tree.js.map +1 -1
- package/dist-cjs/packages/lab/src/tree/useTree.js +1 -0
- package/dist-cjs/packages/lab/src/tree/useTree.js.map +1 -1
- package/dist-cjs/packages/lab/src/utils/useFloatingUI.js +38 -0
- package/dist-cjs/packages/lab/src/utils/useFloatingUI.js.map +1 -0
- package/dist-cjs/packages/lab/src/utils/useIsViewportLargerThanBreakpoint.js +1 -2
- package/dist-cjs/packages/lab/src/utils/useIsViewportLargerThanBreakpoint.js.map +1 -1
- package/dist-es/packages/lab/src/accordion/AccordionSection.js +1 -0
- package/dist-es/packages/lab/src/accordion/AccordionSection.js.map +1 -1
- package/dist-es/packages/lab/src/app-header/AppHeader.js +1 -0
- package/dist-es/packages/lab/src/app-header/AppHeader.js.map +1 -1
- package/dist-es/packages/lab/src/breadcrumbs/Breadcrumb.js.map +1 -1
- package/dist-es/packages/lab/src/button-bar/OrderedButton.js +1 -0
- package/dist-es/packages/lab/src/button-bar/OrderedButton.js.map +1 -1
- package/dist-es/packages/lab/src/calendar/internal/CalendarDay.js +35 -51
- package/dist-es/packages/lab/src/calendar/internal/CalendarDay.js.map +1 -1
- package/dist-es/packages/lab/src/calendar/internal/CalendarNavigation.js +35 -65
- package/dist-es/packages/lab/src/calendar/internal/CalendarNavigation.js.map +1 -1
- package/dist-es/packages/lab/src/calendar/useSelection.js +1 -0
- package/dist-es/packages/lab/src/calendar/useSelection.js.map +1 -1
- package/dist-es/packages/lab/src/carousel/Carousel.js +1 -0
- package/dist-es/packages/lab/src/carousel/Carousel.js.map +1 -1
- package/dist-es/packages/lab/src/cascading-menu/CascadingMenu.js +1 -0
- package/dist-es/packages/lab/src/cascading-menu/CascadingMenu.js.map +1 -1
- package/dist-es/packages/lab/src/cascading-menu/CascadingMenuItem.js +48 -62
- package/dist-es/packages/lab/src/cascading-menu/CascadingMenuItem.js.map +1 -1
- package/dist-es/packages/lab/src/cascading-menu/CascadingMenuList.js +3 -3
- package/dist-es/packages/lab/src/cascading-menu/CascadingMenuList.js.map +1 -1
- package/dist-es/packages/lab/src/cascading-menu/internal/useClickAway.js +1 -0
- package/dist-es/packages/lab/src/cascading-menu/internal/useClickAway.js.map +1 -1
- package/dist-es/packages/lab/src/cascading-menu/internal/useMenuTriggerHandlers.js +1 -0
- package/dist-es/packages/lab/src/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
- package/dist-es/packages/lab/src/combo-box/ComboBox.js +1 -0
- package/dist-es/packages/lab/src/combo-box/ComboBox.js.map +1 -1
- package/dist-es/packages/lab/src/combo-box/useCombobox.js +1 -0
- package/dist-es/packages/lab/src/combo-box/useCombobox.js.map +1 -1
- package/dist-es/packages/lab/src/combo-box-deprecated/filterHelpers.js +1 -0
- package/dist-es/packages/lab/src/combo-box-deprecated/filterHelpers.js.map +1 -1
- package/dist-es/packages/lab/src/combo-box-deprecated/internal/DefaultComboBox.js +19 -37
- package/dist-es/packages/lab/src/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
- package/dist-es/packages/lab/src/combo-box-deprecated/internal/MultiSelectComboBox.js +26 -47
- package/dist-es/packages/lab/src/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
- package/dist-es/packages/lab/src/combo-box-deprecated/internal/useComboBox.js +1 -0
- package/dist-es/packages/lab/src/combo-box-deprecated/internal/useComboBox.js.map +1 -1
- package/dist-es/packages/lab/src/combo-box-deprecated/internal/useMultiSelectComboBox.js +1 -0
- package/dist-es/packages/lab/src/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
- package/dist-es/packages/lab/src/common-hooks/useViewportTracking.js +1 -0
- package/dist-es/packages/lab/src/common-hooks/useViewportTracking.js.map +1 -1
- package/dist-es/packages/lab/src/common-hooks/utils/filter-utils.js +1 -0
- package/dist-es/packages/lab/src/common-hooks/utils/filter-utils.js.map +1 -1
- package/dist-es/packages/lab/src/contact-details/ContactAction.js +10 -25
- package/dist-es/packages/lab/src/contact-details/ContactAction.js.map +1 -1
- package/dist-es/packages/lab/src/contact-details/ContactFavoriteToggle.js.map +1 -1
- package/dist-es/packages/lab/src/contact-details/MailLinkComponent.js +1 -0
- package/dist-es/packages/lab/src/contact-details/MailLinkComponent.js.map +1 -1
- package/dist-es/packages/lab/src/contact-details/internal/FavoriteToggleWithTooltip.js +9 -20
- package/dist-es/packages/lab/src/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
- package/dist-es/packages/lab/src/content-status/internal/StatusIndicator.js +1 -2
- package/dist-es/packages/lab/src/content-status/internal/StatusIndicator.js.map +1 -1
- package/dist-es/packages/lab/src/deck-layout/DeckLayout.js +1 -0
- package/dist-es/packages/lab/src/deck-layout/DeckLayout.js.map +1 -1
- package/dist-es/packages/lab/src/dropdown/Dropdown.js +1 -0
- package/dist-es/packages/lab/src/dropdown/Dropdown.js.map +1 -1
- package/dist-es/packages/lab/src/dropdown/DropdownBase.js +3 -3
- package/dist-es/packages/lab/src/dropdown/DropdownBase.js.map +1 -1
- package/dist-es/packages/lab/src/dropdown/useDropdown.js +1 -0
- package/dist-es/packages/lab/src/dropdown/useDropdown.js.map +1 -1
- package/dist-es/packages/lab/src/dropdown/useDropdownBase.js +1 -0
- package/dist-es/packages/lab/src/dropdown/useDropdownBase.js.map +1 -1
- package/dist-es/packages/lab/src/form-field/FormField.js +62 -75
- package/dist-es/packages/lab/src/form-field/FormField.js.map +1 -1
- package/dist-es/packages/lab/src/form-field/StatusIndicator.js +18 -31
- package/dist-es/packages/lab/src/form-field/StatusIndicator.js.map +1 -1
- package/dist-es/packages/lab/src/index.js +1 -6
- package/dist-es/packages/lab/src/index.js.map +1 -1
- package/dist-es/packages/lab/src/layer-layout/LayerLayout.js +3 -2
- package/dist-es/packages/lab/src/layer-layout/LayerLayout.js.map +1 -1
- package/dist-es/packages/lab/src/list/Highlighter.js +1 -0
- package/dist-es/packages/lab/src/list/Highlighter.js.map +1 -1
- package/dist-es/packages/lab/src/list/List.js +1 -0
- package/dist-es/packages/lab/src/list/List.js.map +1 -1
- package/dist-es/packages/lab/src/list/VirtualizedList.js +1 -0
- package/dist-es/packages/lab/src/list/VirtualizedList.js.map +1 -1
- package/dist-es/packages/lab/src/list/useList.js +1 -0
- package/dist-es/packages/lab/src/list/useList.js.map +1 -1
- package/dist-es/packages/lab/src/list/useListHeight.js +1 -0
- package/dist-es/packages/lab/src/list/useListHeight.js.map +1 -1
- package/dist-es/packages/lab/src/list-deprecated/List.js +5 -26
- package/dist-es/packages/lab/src/list-deprecated/List.js.map +1 -1
- package/dist-es/packages/lab/src/list-deprecated/ListItemBase.js +31 -61
- package/dist-es/packages/lab/src/list-deprecated/ListItemBase.js.map +1 -1
- package/dist-es/packages/lab/src/list-deprecated/internal/Highlighter.js +1 -0
- package/dist-es/packages/lab/src/list-deprecated/internal/Highlighter.js.map +1 -1
- package/dist-es/packages/lab/src/list-deprecated/useTypeSelect.js +1 -0
- package/dist-es/packages/lab/src/list-deprecated/useTypeSelect.js.map +1 -1
- package/dist-es/packages/lab/src/overlay/Overlay.js +1 -1
- package/dist-es/packages/lab/src/overlay/Overlay.js.map +1 -1
- package/dist-es/packages/lab/src/overlay/useOverlay.js +2 -3
- package/dist-es/packages/lab/src/overlay/useOverlay.js.map +1 -1
- package/dist-es/packages/lab/src/parent-child-layout/ParentChildLayout.js +1 -0
- package/dist-es/packages/lab/src/parent-child-layout/ParentChildLayout.js.map +1 -1
- package/dist-es/packages/lab/src/pill/PillBase.js +41 -57
- package/dist-es/packages/lab/src/pill/PillBase.js.map +1 -1
- package/dist-es/packages/lab/src/query-input/internal/CategoryList.js +1 -0
- package/dist-es/packages/lab/src/query-input/internal/CategoryList.js.map +1 -1
- package/dist-es/packages/lab/src/query-input/internal/CategoryListItem.js +1 -0
- package/dist-es/packages/lab/src/query-input/internal/CategoryListItem.js.map +1 -1
- package/dist-es/packages/lab/src/query-input/internal/QueryInputBody.js +1 -0
- package/dist-es/packages/lab/src/query-input/internal/QueryInputBody.js.map +1 -1
- package/dist-es/packages/lab/src/query-input/internal/SearchList.js +1 -0
- package/dist-es/packages/lab/src/query-input/internal/SearchList.js.map +1 -1
- package/dist-es/packages/lab/src/query-input/internal/ValueList.js +1 -0
- package/dist-es/packages/lab/src/query-input/internal/ValueList.js.map +1 -1
- package/dist-es/packages/lab/src/query-input/internal/ValueSelector.js +2 -3
- package/dist-es/packages/lab/src/query-input/internal/ValueSelector.js.map +1 -1
- package/dist-es/packages/lab/src/query-input/useQueryInput.js +1 -0
- package/dist-es/packages/lab/src/query-input/useQueryInput.js.map +1 -1
- package/dist-es/packages/lab/src/responsive/useOverflow.js +1 -0
- package/dist-es/packages/lab/src/responsive/useOverflow.js.map +1 -1
- package/dist-es/packages/lab/src/slider/internal/SliderHandle.js +19 -28
- package/dist-es/packages/lab/src/slider/internal/SliderHandle.js.map +1 -1
- package/dist-es/packages/lab/src/tabs/Tabstrip.js +36 -46
- package/dist-es/packages/lab/src/tabs/Tabstrip.js.map +1 -1
- package/dist-es/packages/lab/src/tabs/useActivationIndicator.js +1 -0
- package/dist-es/packages/lab/src/tabs/useActivationIndicator.js.map +1 -1
- package/dist-es/packages/lab/src/tabs/useKeyboardNavigation.js +1 -0
- package/dist-es/packages/lab/src/tabs/useKeyboardNavigation.js.map +1 -1
- package/dist-es/packages/lab/src/toggle-button/ToggleButton.js +8 -28
- package/dist-es/packages/lab/src/toggle-button/ToggleButton.js.map +1 -1
- package/dist-es/packages/lab/src/tokenized-input/TokenizedInput.js.map +1 -1
- package/dist-es/packages/lab/src/tokenized-input/useTokenizedInput.js +1 -0
- package/dist-es/packages/lab/src/tokenized-input/useTokenizedInput.js.map +1 -1
- package/dist-es/packages/lab/src/toolbar/Toolbar.js +1 -0
- package/dist-es/packages/lab/src/toolbar/Toolbar.js.map +1 -1
- package/dist-es/packages/lab/src/toolbar/internal/renderToolbarItems.js +1 -0
- package/dist-es/packages/lab/src/toolbar/internal/renderToolbarItems.js.map +1 -1
- package/dist-es/packages/lab/src/toolbar/overflow-panel/OverflowPanel.js +1 -0
- package/dist-es/packages/lab/src/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
- package/dist-es/packages/lab/src/tree/Tree.js +1 -0
- package/dist-es/packages/lab/src/tree/Tree.js.map +1 -1
- package/dist-es/packages/lab/src/tree/useTree.js +1 -0
- package/dist-es/packages/lab/src/tree/useTree.js.map +1 -1
- package/dist-es/packages/lab/src/{popper → utils}/useFloatingUI.js +10 -9
- package/dist-es/packages/lab/src/utils/useFloatingUI.js.map +1 -0
- package/dist-es/packages/lab/src/utils/useIsViewportLargerThanBreakpoint.js +1 -2
- package/dist-es/packages/lab/src/utils/useIsViewportLargerThanBreakpoint.js.map +1 -1
- package/dist-types/breadcrumbs/Breadcrumb.d.ts +1 -1
- package/dist-types/calendar/internal/CalendarCarousel.d.ts +1 -1
- package/dist-types/calendar/internal/CalendarDay.d.ts +2 -2
- package/dist-types/calendar/internal/CalendarMonth.d.ts +1 -1
- package/dist-types/calendar/internal/CalendarNavigation.d.ts +1 -1
- package/dist-types/calendar/internal/CalendarWeekHeader.d.ts +2 -2
- package/dist-types/calendar/useCalendarDay.d.ts +1 -1
- package/dist-types/cascading-menu/CascadingMenuList.d.ts +1 -1
- package/dist-types/cascading-menu/CascadingMenuProps.d.ts +1 -1
- package/dist-types/combo-box-deprecated/internal/DefaultComboBox.d.ts +1 -3
- package/dist-types/combo-box-deprecated/internal/useComboBox.d.ts +3 -4
- package/dist-types/combo-box-deprecated/internal/useMultiSelectComboBox.d.ts +10 -5
- package/dist-types/contact-details/ContactAction.d.ts +1 -2
- package/dist-types/contact-details/ContactFavoriteToggle.d.ts +1 -1
- package/dist-types/contact-details/internal/FavoriteToggleWithTooltip.d.ts +1 -1
- package/dist-types/content-status/internal/StatusIndicator.d.ts +1 -2
- package/dist-types/form-field/StatusIndicator.d.ts +1 -1
- package/dist-types/index.d.ts +0 -4
- package/dist-types/layer-layout/LayerLayout.d.ts +1 -1
- package/dist-types/list-deprecated/ListProps.d.ts +0 -5
- package/dist-types/overlay/Overlay.d.ts +1 -1
- package/dist-types/overlay/useOverlay.d.ts +1 -1
- package/dist-types/pill/PillBase.d.ts +1 -1
- package/dist-types/skip-link/SkipLink.d.ts +1 -1
- package/dist-types/stepper-input/useStepperInput.d.ts +3 -0
- package/dist-types/tokenized-input/TokenizedInput.d.ts +1 -1
- package/dist-types/toolbar/ToolbarProps.d.ts +1 -1
- package/dist-types/utils/index.d.ts +1 -0
- package/dist-types/utils/useFloatingUI.d.ts +34 -0
- package/dist-types/window/ElectronWindow.d.ts +1 -1
- package/dist-types/window/WindowContext.d.ts +3 -3
- package/package.json +3 -3
- package/dist-cjs/packages/lab/src/popper/useFloatingUI.js +0 -37
- package/dist-cjs/packages/lab/src/popper/useFloatingUI.js.map +0 -1
- package/dist-cjs/packages/lab/src/spinner/Spinner.css.js +0 -9
- package/dist-cjs/packages/lab/src/spinner/Spinner.css.js.map +0 -1
- package/dist-cjs/packages/lab/src/spinner/Spinner.js +0 -76
- package/dist-cjs/packages/lab/src/spinner/Spinner.js.map +0 -1
- package/dist-cjs/packages/lab/src/spinner/svgSpinners/SpinnerLarge.js +0 -71
- package/dist-cjs/packages/lab/src/spinner/svgSpinners/SpinnerLarge.js.map +0 -1
- package/dist-cjs/packages/lab/src/spinner/svgSpinners/SpinnerMedium.js +0 -71
- package/dist-cjs/packages/lab/src/spinner/svgSpinners/SpinnerMedium.js.map +0 -1
- package/dist-cjs/packages/lab/src/spinner/svgSpinners/SpinnerSmall.js +0 -71
- package/dist-cjs/packages/lab/src/spinner/svgSpinners/SpinnerSmall.js.map +0 -1
- package/dist-cjs/packages/lab/src/spinner/svgSpinners/index.js +0 -21
- package/dist-cjs/packages/lab/src/spinner/svgSpinners/index.js.map +0 -1
- package/dist-cjs/packages/lab/src/split-layout/SplitLayout.css.js +0 -9
- package/dist-cjs/packages/lab/src/split-layout/SplitLayout.css.js.map +0 -1
- package/dist-cjs/packages/lab/src/split-layout/SplitLayout.js +0 -40
- package/dist-cjs/packages/lab/src/split-layout/SplitLayout.js.map +0 -1
- package/dist-cjs/packages/lab/src/tooltip/Tooltip.css.js +0 -9
- package/dist-cjs/packages/lab/src/tooltip/Tooltip.css.js.map +0 -1
- package/dist-cjs/packages/lab/src/tooltip/Tooltip.js +0 -84
- package/dist-cjs/packages/lab/src/tooltip/Tooltip.js.map +0 -1
- package/dist-cjs/packages/lab/src/tooltip/TooltipContext.js +0 -26
- package/dist-cjs/packages/lab/src/tooltip/TooltipContext.js.map +0 -1
- package/dist-cjs/packages/lab/src/tooltip/useAriaAnnounce.js +0 -87
- package/dist-cjs/packages/lab/src/tooltip/useAriaAnnounce.js.map +0 -1
- package/dist-cjs/packages/lab/src/tooltip/useTooltip.js +0 -137
- package/dist-cjs/packages/lab/src/tooltip/useTooltip.js.map +0 -1
- package/dist-es/packages/lab/src/popper/useFloatingUI.js.map +0 -1
- package/dist-es/packages/lab/src/spinner/Spinner.css.js +0 -7
- package/dist-es/packages/lab/src/spinner/Spinner.css.js.map +0 -1
- package/dist-es/packages/lab/src/spinner/Spinner.js +0 -71
- package/dist-es/packages/lab/src/spinner/Spinner.js.map +0 -1
- package/dist-es/packages/lab/src/spinner/svgSpinners/SpinnerLarge.js +0 -67
- package/dist-es/packages/lab/src/spinner/svgSpinners/SpinnerLarge.js.map +0 -1
- package/dist-es/packages/lab/src/spinner/svgSpinners/SpinnerMedium.js +0 -67
- package/dist-es/packages/lab/src/spinner/svgSpinners/SpinnerMedium.js.map +0 -1
- package/dist-es/packages/lab/src/spinner/svgSpinners/SpinnerSmall.js +0 -67
- package/dist-es/packages/lab/src/spinner/svgSpinners/SpinnerSmall.js.map +0 -1
- package/dist-es/packages/lab/src/spinner/svgSpinners/index.js +0 -17
- package/dist-es/packages/lab/src/spinner/svgSpinners/index.js.map +0 -1
- package/dist-es/packages/lab/src/split-layout/SplitLayout.css.js +0 -7
- package/dist-es/packages/lab/src/split-layout/SplitLayout.css.js.map +0 -1
- package/dist-es/packages/lab/src/split-layout/SplitLayout.js +0 -36
- package/dist-es/packages/lab/src/split-layout/SplitLayout.js.map +0 -1
- package/dist-es/packages/lab/src/tooltip/Tooltip.css.js +0 -7
- package/dist-es/packages/lab/src/tooltip/Tooltip.css.js.map +0 -1
- package/dist-es/packages/lab/src/tooltip/Tooltip.js +0 -80
- package/dist-es/packages/lab/src/tooltip/Tooltip.js.map +0 -1
- package/dist-es/packages/lab/src/tooltip/TooltipContext.js +0 -21
- package/dist-es/packages/lab/src/tooltip/TooltipContext.js.map +0 -1
- package/dist-es/packages/lab/src/tooltip/useAriaAnnounce.js +0 -83
- package/dist-es/packages/lab/src/tooltip/useAriaAnnounce.js.map +0 -1
- package/dist-es/packages/lab/src/tooltip/useTooltip.js +0 -133
- package/dist-es/packages/lab/src/tooltip/useTooltip.js.map +0 -1
- package/dist-types/popper/index.d.ts +0 -1
- package/dist-types/popper/useFloatingUI.d.ts +0 -5
- package/dist-types/spinner/Spinner.d.ts +0 -45
- package/dist-types/spinner/index.d.ts +0 -1
- package/dist-types/spinner/svgSpinners/SpinnerLarge.d.ts +0 -2
- package/dist-types/spinner/svgSpinners/SpinnerMedium.d.ts +0 -2
- package/dist-types/spinner/svgSpinners/SpinnerSmall.d.ts +0 -2
- package/dist-types/spinner/svgSpinners/index.d.ts +0 -2
- package/dist-types/split-layout/SplitLayout.d.ts +0 -32
- package/dist-types/split-layout/index.d.ts +0 -1
- package/dist-types/tooltip/Tooltip.d.ts +0 -37
- package/dist-types/tooltip/TooltipContext.d.ts +0 -22
- package/dist-types/tooltip/index.d.ts +0 -3
- package/dist-types/tooltip/useAriaAnnounce.d.ts +0 -9
- package/dist-types/tooltip/useTooltip.d.ts +0 -31
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeyboardNavigation.js","sources":["../src/tabs/useKeyboardNavigation.ts"],"sourcesContent":["import { useControlled, useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport {\n FocusEvent,\n FocusEventHandler,\n KeyboardEvent,\n MouseEvent,\n MouseEventHandler,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { OverflowItem } from \"../responsive\";\nimport {\n ArrowDown,\n ArrowUp,\n ArrowLeft,\n ArrowRight,\n Home,\n End,\n} from \"../common-hooks\";\n\ntype orientationType = \"horizontal\" | \"vertical\";\ntype directionType = \"bwd\" | \"fwd\" | \"start\" | \"end\";\ntype directionMap = { [key: string]: directionType };\nconst navigation = {\n horizontal: {\n [Home]: \"start\",\n [End]: \"end\",\n [ArrowLeft]: \"bwd\",\n [ArrowRight]: \"fwd\",\n } as directionMap,\n vertical: {\n [Home]: \"start\",\n [End]: \"end\",\n [ArrowUp]: \"bwd\",\n [ArrowDown]: \"fwd\",\n } as directionMap,\n};\n\nconst isNavigationKey = (\n key: string,\n orientation: orientationType = \"horizontal\"\n) => navigation[orientation][key] !== undefined;\n\nfunction nextItemIdx(count: number, direction: directionType, idx: number) {\n if (direction === \"start\") {\n return 0;\n } else if (direction === \"end\") {\n return count - 1;\n } else if (direction === \"bwd\") {\n if (idx > 0) {\n return idx - 1;\n } else {\n return idx;\n }\n } else {\n if (idx === null) {\n return 0;\n } else if (idx === count - 1) {\n return idx;\n } else {\n return idx + 1;\n }\n }\n}\n\nconst isFocusable = (item: OverflowItem) => !item.overflowed;\nconst getFocusableElement = (el: HTMLElement | null) =>\n el\n ? el.hasAttribute(\"tabindex\")\n ? el\n : (el.querySelector(\"[tabindex]\") as HTMLElement)\n : null;\n\nexport interface ContainerNavigationProps {\n onBlur: FocusEventHandler;\n onFocus: FocusEventHandler;\n onMouseDownCapture: MouseEventHandler;\n onMouseLeave: MouseEventHandler;\n}\n\ninterface TabstripNavigationHookProps {\n defaultHighlightedIdx?: number;\n highlightedIdx?: number;\n indexPositions: OverflowItem[];\n keyBoardActivation?: \"manual\" | \"automatic\";\n orientation: orientationType;\n selectedIndex: number;\n}\n\ninterface TabstripNavigationHookResult {\n containerProps: ContainerNavigationProps;\n highlightedIdx: number;\n focusTab: (\n tabIndex: number,\n immediateFocus?: boolean,\n withKeyboard?: boolean\n ) => void;\n focusVisible: number;\n focusIsWithinComponent: boolean;\n onClick: (evt: MouseEvent, tabIndex: number) => void;\n onFocus: (evt: FocusEvent<HTMLElement>) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n}\n\nexport const useKeyboardNavigation = ({\n defaultHighlightedIdx = -1,\n highlightedIdx: highlightedIdxProp,\n indexPositions,\n keyBoardActivation,\n orientation,\n selectedIndex: selectedTabIndex = 0,\n}: TabstripNavigationHookProps): TabstripNavigationHookResult => {\n const manualActivation = keyBoardActivation === \"manual\";\n const mouseClickPending = useRef(false);\n const focusedRef = useRef<number>(-1);\n const [hasFocus, setHasFocus] = useState(false);\n const [, forceRefresh] = useState({});\n const [highlightedIdx, _setHighlightedIdx] = useControlled({\n controlled: highlightedIdxProp,\n default: defaultHighlightedIdx,\n name: \"UseKeyboardNavigation\",\n });\n\n const setHighlightedIdx = useCallback(\n (value: number) => {\n _setHighlightedIdx((focusedRef.current = value));\n },\n [_setHighlightedIdx]\n );\n\n const keyboardNavigation = useRef(false);\n\n const focusTab = useCallback(\n (tabIndex: number, immediateFocus = false, withKeyboard?: boolean) => {\n // The timeout is important in two scenarios:\n // 1) where tab has overflowed and is being selected from overflow menu.\n // We must not focus it until the overflow mechanism + render has restored\n // it to the main display.\n // 2) when we are focussing a new tab\n // We MUST NOT delay focus when using keyboard nav, else when focus moves from\n // close button (focus ring styled by :focus-visible) to Tab label (focus ring\n // styled by css class) focus style will briefly linger on both.\n setHighlightedIdx(tabIndex);\n\n if (withKeyboard === true && !keyboardNavigation.current) {\n keyboardNavigation.current = true;\n }\n\n const setFocus = () => {\n const item = indexPositions.find((i) => i.index === tabIndex);\n\n if (item) {\n const focussableElement = getFocusableElement(\n document.getElementById(item.id)\n );\n focussableElement?.focus();\n }\n };\n if (immediateFocus) {\n setFocus();\n } else {\n setTimeout(setFocus, 70);\n }\n },\n [indexPositions, setHighlightedIdx]\n );\n\n const onFocus = (e: FocusEvent<HTMLElement>) => {\n // If focus is received by keyboard navigation, item with tabindex 0 will receive\n // focus. If the item receiving focus has tabindex -1, then focus has been set\n // programatically. We must respect this and not reset focus to selected tab.\n if (focusedRef.current === -1) {\n // Focus is entering tabstrip. Assume keyboard - if it'a actually mouse-driven,\n // the click event will have set correct value.\n if (e.target.tabIndex === -1) {\n // Do nothing, assume focus is being passed back to button by closing dialog. Might need\n // to revisit this and add code here if we may get focus set programatically in other ways.\n } else {\n setTimeout(() => {\n // The selected tab will have tabIndex 0 make sure our internal state is aligned.\n if (focusedRef.current === -1) {\n setHighlightedIdx(selectedTabIndex);\n }\n }, 200);\n }\n }\n };\n\n const nextFocusableItemIdx = useCallback(\n (\n direction: directionType = \"fwd\",\n idx = direction === \"fwd\" ? -1 : indexPositions.length\n ) => {\n let nextIdx = nextItemIdx(indexPositions.length, direction, idx);\n const nextDirection =\n direction === \"start\" ? \"fwd\" : direction === \"end\" ? \"bwd\" : direction;\n while (\n ((nextDirection === \"fwd\" && nextIdx < indexPositions.length) ||\n (nextDirection === \"bwd\" && nextIdx > 0)) &&\n !isFocusable(indexPositions[nextIdx])\n ) {\n const newIdx = nextItemIdx(\n indexPositions.length,\n nextDirection,\n nextIdx\n );\n if (newIdx === nextIdx) {\n break;\n } else {\n nextIdx = newIdx;\n }\n }\n return nextIdx;\n },\n [indexPositions]\n );\n\n // forceFocusVisible supports an edge case - first or last Tab are clicked\n // then Left or Right Arrow keys are pressed, There will be no navigation\n // but focusVisible must be applied\n const navigateChildItems = useCallback(\n (e: React.KeyboardEvent, forceFocusVisible = false) => {\n const direction = navigation[orientation][e.key];\n const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);\n if (nextIdx !== highlightedIdx) {\n const immediateFocus = true;\n if (manualActivation) {\n focusTab(nextIdx, immediateFocus);\n } else {\n // activateTab(newTabIndex);\n }\n } else if (forceFocusVisible) {\n forceRefresh({});\n }\n },\n [\n highlightedIdx,\n manualActivation,\n nextFocusableItemIdx,\n focusTab,\n orientation,\n ]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (indexPositions.length > 0 && isNavigationKey(e.key, orientation)) {\n e.preventDefault();\n if (keyboardNavigation.current) {\n navigateChildItems(e);\n } else {\n keyboardNavigation.current = true;\n navigateChildItems(e, true);\n }\n }\n },\n [indexPositions, navigateChildItems, orientation]\n );\n\n // TODO, in common hooks, we use mouse movement to track current highlighted\n // index, rather than rely on component item reporting it\n const handleItemClick = (_: MouseEvent, tabIndex: number) => {\n setHighlightedIdx(tabIndex);\n };\n\n const handleFocus = useCallback(\n (evt: FocusEvent) => {\n if (!hasFocus) {\n setHasFocus(true);\n if (!mouseClickPending.current) {\n keyboardNavigation.current = true;\n } else {\n mouseClickPending.current = false;\n }\n }\n },\n [hasFocus]\n );\n\n const handleContainerMouseDown = useCallback(\n (evt: MouseEvent) => {\n if (!hasFocus) {\n mouseClickPending.current = true;\n }\n keyboardNavigation.current = false;\n },\n [hasFocus]\n );\n\n const containerProps = {\n onBlur: (e: FocusEvent) => {\n const sourceTarget = (e.target as HTMLElement).closest(\".saltTabstrip\");\n const destTarget = e.relatedTarget as HTMLElement;\n if (sourceTarget && !sourceTarget?.contains(destTarget)) {\n setHighlightedIdx(-1);\n setHasFocus(false);\n }\n },\n onMouseDownCapture: handleContainerMouseDown,\n onFocus: handleFocus,\n onMouseLeave: () => {\n keyboardNavigation.current = true;\n setHighlightedIdx(-1);\n mouseClickPending.current = false;\n },\n };\n\n useIsomorphicLayoutEffect(() => {\n if (hasFocus && selectedTabIndex !== undefined) {\n focusTab(selectedTabIndex);\n }\n }, [focusTab, hasFocus, selectedTabIndex]);\n\n return {\n containerProps,\n focusVisible: keyboardNavigation.current ? highlightedIdx : -1,\n focusIsWithinComponent: hasFocus,\n highlightedIdx,\n focusTab,\n onClick: handleItemClick,\n onFocus,\n onKeyDown: handleKeyDown,\n };\n};\n"],"names":["Home","End","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","useRef","useState","useControlled","useCallback","useIsomorphicLayoutEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useKeyboardNavigation.js","sources":["../src/tabs/useKeyboardNavigation.ts"],"sourcesContent":["import { useControlled, useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport {\n FocusEvent,\n FocusEventHandler,\n KeyboardEvent,\n MouseEvent,\n MouseEventHandler,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { OverflowItem } from \"../responsive\";\nimport {\n ArrowDown,\n ArrowUp,\n ArrowLeft,\n ArrowRight,\n Home,\n End,\n} from \"../common-hooks\";\n\ntype orientationType = \"horizontal\" | \"vertical\";\ntype directionType = \"bwd\" | \"fwd\" | \"start\" | \"end\";\ntype directionMap = { [key: string]: directionType };\nconst navigation = {\n horizontal: {\n [Home]: \"start\",\n [End]: \"end\",\n [ArrowLeft]: \"bwd\",\n [ArrowRight]: \"fwd\",\n } as directionMap,\n vertical: {\n [Home]: \"start\",\n [End]: \"end\",\n [ArrowUp]: \"bwd\",\n [ArrowDown]: \"fwd\",\n } as directionMap,\n};\n\nconst isNavigationKey = (\n key: string,\n orientation: orientationType = \"horizontal\"\n) => navigation[orientation][key] !== undefined;\n\nfunction nextItemIdx(count: number, direction: directionType, idx: number) {\n if (direction === \"start\") {\n return 0;\n } else if (direction === \"end\") {\n return count - 1;\n } else if (direction === \"bwd\") {\n if (idx > 0) {\n return idx - 1;\n } else {\n return idx;\n }\n } else {\n if (idx === null) {\n return 0;\n } else if (idx === count - 1) {\n return idx;\n } else {\n return idx + 1;\n }\n }\n}\n\nconst isFocusable = (item: OverflowItem) => !item.overflowed;\nconst getFocusableElement = (el: HTMLElement | null) =>\n el\n ? el.hasAttribute(\"tabindex\")\n ? el\n : (el.querySelector(\"[tabindex]\") as HTMLElement)\n : null;\n\nexport interface ContainerNavigationProps {\n onBlur: FocusEventHandler;\n onFocus: FocusEventHandler;\n onMouseDownCapture: MouseEventHandler;\n onMouseLeave: MouseEventHandler;\n}\n\ninterface TabstripNavigationHookProps {\n defaultHighlightedIdx?: number;\n highlightedIdx?: number;\n indexPositions: OverflowItem[];\n keyBoardActivation?: \"manual\" | \"automatic\";\n orientation: orientationType;\n selectedIndex: number;\n}\n\ninterface TabstripNavigationHookResult {\n containerProps: ContainerNavigationProps;\n highlightedIdx: number;\n focusTab: (\n tabIndex: number,\n immediateFocus?: boolean,\n withKeyboard?: boolean\n ) => void;\n focusVisible: number;\n focusIsWithinComponent: boolean;\n onClick: (evt: MouseEvent, tabIndex: number) => void;\n onFocus: (evt: FocusEvent<HTMLElement>) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n}\n\nexport const useKeyboardNavigation = ({\n defaultHighlightedIdx = -1,\n highlightedIdx: highlightedIdxProp,\n indexPositions,\n keyBoardActivation,\n orientation,\n selectedIndex: selectedTabIndex = 0,\n}: TabstripNavigationHookProps): TabstripNavigationHookResult => {\n const manualActivation = keyBoardActivation === \"manual\";\n const mouseClickPending = useRef(false);\n const focusedRef = useRef<number>(-1);\n const [hasFocus, setHasFocus] = useState(false);\n const [, forceRefresh] = useState({});\n const [highlightedIdx, _setHighlightedIdx] = useControlled({\n controlled: highlightedIdxProp,\n default: defaultHighlightedIdx,\n name: \"UseKeyboardNavigation\",\n });\n\n const setHighlightedIdx = useCallback(\n (value: number) => {\n _setHighlightedIdx((focusedRef.current = value));\n },\n [_setHighlightedIdx]\n );\n\n const keyboardNavigation = useRef(false);\n\n const focusTab = useCallback(\n (tabIndex: number, immediateFocus = false, withKeyboard?: boolean) => {\n // The timeout is important in two scenarios:\n // 1) where tab has overflowed and is being selected from overflow menu.\n // We must not focus it until the overflow mechanism + render has restored\n // it to the main display.\n // 2) when we are focussing a new tab\n // We MUST NOT delay focus when using keyboard nav, else when focus moves from\n // close button (focus ring styled by :focus-visible) to Tab label (focus ring\n // styled by css class) focus style will briefly linger on both.\n setHighlightedIdx(tabIndex);\n\n if (withKeyboard === true && !keyboardNavigation.current) {\n keyboardNavigation.current = true;\n }\n\n const setFocus = () => {\n const item = indexPositions.find((i) => i.index === tabIndex);\n\n if (item) {\n const focussableElement = getFocusableElement(\n document.getElementById(item.id)\n );\n focussableElement?.focus();\n }\n };\n if (immediateFocus) {\n setFocus();\n } else {\n setTimeout(setFocus, 70);\n }\n },\n [indexPositions, setHighlightedIdx]\n );\n\n const onFocus = (e: FocusEvent<HTMLElement>) => {\n // If focus is received by keyboard navigation, item with tabindex 0 will receive\n // focus. If the item receiving focus has tabindex -1, then focus has been set\n // programatically. We must respect this and not reset focus to selected tab.\n if (focusedRef.current === -1) {\n // Focus is entering tabstrip. Assume keyboard - if it'a actually mouse-driven,\n // the click event will have set correct value.\n if (e.target.tabIndex === -1) {\n // Do nothing, assume focus is being passed back to button by closing dialog. Might need\n // to revisit this and add code here if we may get focus set programatically in other ways.\n } else {\n setTimeout(() => {\n // The selected tab will have tabIndex 0 make sure our internal state is aligned.\n if (focusedRef.current === -1) {\n setHighlightedIdx(selectedTabIndex);\n }\n }, 200);\n }\n }\n };\n\n const nextFocusableItemIdx = useCallback(\n (\n direction: directionType = \"fwd\",\n idx = direction === \"fwd\" ? -1 : indexPositions.length\n ) => {\n let nextIdx = nextItemIdx(indexPositions.length, direction, idx);\n const nextDirection =\n direction === \"start\" ? \"fwd\" : direction === \"end\" ? \"bwd\" : direction;\n while (\n ((nextDirection === \"fwd\" && nextIdx < indexPositions.length) ||\n (nextDirection === \"bwd\" && nextIdx > 0)) &&\n !isFocusable(indexPositions[nextIdx])\n ) {\n const newIdx = nextItemIdx(\n indexPositions.length,\n nextDirection,\n nextIdx\n );\n if (newIdx === nextIdx) {\n break;\n } else {\n nextIdx = newIdx;\n }\n }\n return nextIdx;\n },\n [indexPositions]\n );\n\n // forceFocusVisible supports an edge case - first or last Tab are clicked\n // then Left or Right Arrow keys are pressed, There will be no navigation\n // but focusVisible must be applied\n const navigateChildItems = useCallback(\n (e: React.KeyboardEvent, forceFocusVisible = false) => {\n const direction = navigation[orientation][e.key];\n const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);\n if (nextIdx !== highlightedIdx) {\n const immediateFocus = true;\n if (manualActivation) {\n focusTab(nextIdx, immediateFocus);\n } else {\n // activateTab(newTabIndex);\n }\n } else if (forceFocusVisible) {\n forceRefresh({});\n }\n },\n [\n highlightedIdx,\n manualActivation,\n nextFocusableItemIdx,\n focusTab,\n orientation,\n ]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (indexPositions.length > 0 && isNavigationKey(e.key, orientation)) {\n e.preventDefault();\n if (keyboardNavigation.current) {\n navigateChildItems(e);\n } else {\n keyboardNavigation.current = true;\n navigateChildItems(e, true);\n }\n }\n },\n [indexPositions, navigateChildItems, orientation]\n );\n\n // TODO, in common hooks, we use mouse movement to track current highlighted\n // index, rather than rely on component item reporting it\n const handleItemClick = (_: MouseEvent, tabIndex: number) => {\n setHighlightedIdx(tabIndex);\n };\n\n const handleFocus = useCallback(\n (evt: FocusEvent) => {\n if (!hasFocus) {\n setHasFocus(true);\n if (!mouseClickPending.current) {\n keyboardNavigation.current = true;\n } else {\n mouseClickPending.current = false;\n }\n }\n },\n [hasFocus]\n );\n\n const handleContainerMouseDown = useCallback(\n (evt: MouseEvent) => {\n if (!hasFocus) {\n mouseClickPending.current = true;\n }\n keyboardNavigation.current = false;\n },\n [hasFocus]\n );\n\n const containerProps = {\n onBlur: (e: FocusEvent) => {\n const sourceTarget = (e.target as HTMLElement).closest(\".saltTabstrip\");\n const destTarget = e.relatedTarget as HTMLElement;\n if (sourceTarget && !sourceTarget?.contains(destTarget)) {\n setHighlightedIdx(-1);\n setHasFocus(false);\n }\n },\n onMouseDownCapture: handleContainerMouseDown,\n onFocus: handleFocus,\n onMouseLeave: () => {\n keyboardNavigation.current = true;\n setHighlightedIdx(-1);\n mouseClickPending.current = false;\n },\n };\n\n useIsomorphicLayoutEffect(() => {\n if (hasFocus && selectedTabIndex !== undefined) {\n focusTab(selectedTabIndex);\n }\n }, [focusTab, hasFocus, selectedTabIndex]);\n\n return {\n containerProps,\n focusVisible: keyboardNavigation.current ? highlightedIdx : -1,\n focusIsWithinComponent: hasFocus,\n highlightedIdx,\n focusTab,\n onClick: handleItemClick,\n onFocus,\n onKeyDown: handleKeyDown,\n };\n};\n"],"names":["Home","End","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","useRef","useState","useControlled","useCallback","useIsomorphicLayoutEffect"],"mappings":"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"}
|
|
@@ -7,9 +7,6 @@ var core = require('@salt-ds/core');
|
|
|
7
7
|
var clsx = require('clsx');
|
|
8
8
|
var React = require('react');
|
|
9
9
|
var ToggleButtonGroupContext = require('./internal/ToggleButtonGroupContext.js');
|
|
10
|
-
var Tooltip = require('../tooltip/Tooltip.js');
|
|
11
|
-
require('../tooltip/TooltipContext.js');
|
|
12
|
-
var useTooltip = require('../tooltip/useTooltip.js');
|
|
13
10
|
require('./ToggleButton.css.js');
|
|
14
11
|
|
|
15
12
|
const withBaseName = core.makePrefixer("saltToggleButton");
|
|
@@ -62,12 +59,12 @@ const ToggleButton = React.forwardRef(
|
|
|
62
59
|
}
|
|
63
60
|
};
|
|
64
61
|
const tabIndex = toggled && !disabled ? 0 : -1;
|
|
65
|
-
|
|
62
|
+
return /* @__PURE__ */ jsxRuntime.jsx(core.Tooltip, {
|
|
63
|
+
content: tooltipText,
|
|
66
64
|
disabled: disableTooltip,
|
|
67
|
-
placement: orientation === "horizontal" ? "bottom" : "right"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
{
|
|
65
|
+
placement: orientation === "horizontal" ? "bottom" : "right",
|
|
66
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(core.Button, {
|
|
67
|
+
ref: handleIconOnlyButton,
|
|
71
68
|
"aria-checked": toggled,
|
|
72
69
|
"aria-label": ariaLabel,
|
|
73
70
|
"aria-posinset": index !== void 0 ? index + 1 : void 0,
|
|
@@ -91,24 +88,7 @@ const ToggleButton = React.forwardRef(
|
|
|
91
88
|
tabIndex: groupContext ? tabIndex : void 0,
|
|
92
89
|
variant,
|
|
93
90
|
...restProps
|
|
94
|
-
}
|
|
95
|
-
);
|
|
96
|
-
const handleButtonRef = core.useForkRef(ref, buttonRef);
|
|
97
|
-
const handleIconOnlyButtonRef = core.useForkRef(
|
|
98
|
-
handleIconOnlyButton,
|
|
99
|
-
handleButtonRef
|
|
100
|
-
);
|
|
101
|
-
const handleRef = core.useForkRef(triggerRef, handleIconOnlyButtonRef);
|
|
102
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
103
|
-
children: [
|
|
104
|
-
/* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, {
|
|
105
|
-
...getTooltipProps({ title: tooltipText })
|
|
106
|
-
}),
|
|
107
|
-
/* @__PURE__ */ jsxRuntime.jsx(core.Button, {
|
|
108
|
-
...triggerProps,
|
|
109
|
-
ref: handleRef
|
|
110
|
-
})
|
|
111
|
-
]
|
|
91
|
+
})
|
|
112
92
|
});
|
|
113
93
|
}
|
|
114
94
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToggleButton.js","sources":["../src/toggle-button/ToggleButton.tsx"],"sourcesContent":["import { Button, ButtonProps, makePrefixer,
|
|
1
|
+
{"version":3,"file":"ToggleButton.js","sources":["../src/toggle-button/ToggleButton.tsx"],"sourcesContent":["import { Button, ButtonProps, makePrefixer, Tooltip } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n SyntheticEvent,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ToggleButtonGroupContext } from \"./internal/ToggleButtonGroupContext\";\n\nimport \"./ToggleButton.css\";\n\nconst withBaseName = makePrefixer(\"saltToggleButton\");\n\nexport type ToggleButtonToggleEventHandler = (\n event: SyntheticEvent<HTMLButtonElement>,\n toggled: boolean\n) => void;\n\nexport interface ToggleButtonProps extends ButtonProps {\n \"aria-label\"?: string;\n \"data-button-index\"?: number;\n toggled?: boolean;\n tooltipText?: string;\n disableTooltip?: boolean;\n onToggle?: ToggleButtonToggleEventHandler;\n}\n\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(\n (props, ref) => {\n const {\n \"aria-label\": ariaLabel,\n className,\n onToggle,\n toggled = false,\n tooltipText = ariaLabel,\n variant: variantProp = \"primary\",\n disabled: disabledProp,\n disableTooltip: disableTooltipProp,\n focusableWhenDisabled: focusableWhenDisabledProp,\n \"data-button-index\": index,\n ...restProps\n } = props;\n\n const [iconOnly, setIconOnly] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const groupContext = useContext(ToggleButtonGroupContext);\n\n const handleIconOnlyButton = useCallback(\n (button: HTMLButtonElement | null) => {\n setIconOnly(\n button?.querySelector(\".saltIcon\") != null &&\n button?.childElementCount === 1\n );\n },\n [setIconOnly]\n );\n\n const {\n register,\n unregister,\n disabled = disabledProp,\n disableTooltip = disableTooltipProp,\n focusableWhenDisabled = focusableWhenDisabledProp,\n orientation = \"horizontal\",\n variant = variantProp,\n } = groupContext || {};\n\n useEffect(() => {\n if (\n index !== undefined &&\n register &&\n unregister &&\n (!disabled || focusableWhenDisabled)\n ) {\n register(buttonRef.current, index);\n\n return function cleanup() {\n unregister(index);\n };\n }\n }, [index, disabled, focusableWhenDisabled, register, unregister]);\n\n const handleToggle = (event: SyntheticEvent<HTMLButtonElement>) => {\n if (!disabled) {\n onToggle?.(event, !toggled);\n }\n };\n\n const tabIndex = toggled && !disabled ? 0 : -1;\n\n return (\n <Tooltip\n content={tooltipText}\n disabled={disableTooltip}\n placement={orientation === \"horizontal\" ? \"bottom\" : \"right\"}\n >\n <Button\n ref={handleIconOnlyButton}\n aria-checked={toggled}\n aria-label={ariaLabel}\n aria-posinset={index !== undefined ? index + 1 : undefined}\n className={clsx(\n withBaseName(),\n withBaseName(orientation),\n {\n [withBaseName(\"primary\")]: variant === \"primary\",\n [withBaseName(\"cta\")]: variant === \"cta\",\n [withBaseName(\"secondary\")]: variant === \"secondary\",\n [withBaseName(\"toggled\")]: toggled,\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"iconOnly\")]: iconOnly,\n },\n className\n )}\n onClick={handleToggle}\n disabled={disabled}\n focusableWhenDisabled={focusableWhenDisabled}\n role={groupContext ? \"radio\" : \"checkbox\"}\n tabIndex={groupContext ? tabIndex : undefined}\n variant={variant}\n {...restProps}\n />\n </Tooltip>\n );\n }\n);\n"],"names":["makePrefixer","forwardRef","useState","useRef","useContext","ToggleButtonGroupContext","useCallback","useEffect","jsx","Tooltip","Button","clsx"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenizedInput.js","sources":["../src/tokenized-input/TokenizedInput.tsx"],"sourcesContent":["import { useForkRef } from \"@salt-ds/core\";\nimport { ComponentType, ForwardedRef, forwardRef } from \"react\";\nimport {\n TokenizedInputBase,\n TokenizedInputBaseProps,\n} from \"./TokenizedInputBase\";\nimport { useTokenizedInput } from \"./useTokenizedInput\";\
|
|
1
|
+
{"version":3,"file":"TokenizedInput.js","sources":["../src/tokenized-input/TokenizedInput.tsx"],"sourcesContent":["import { useForkRef, UseTooltipProps } from \"@salt-ds/core\";\nimport { ComponentType, ForwardedRef, forwardRef } from \"react\";\nimport {\n TokenizedInputBase,\n TokenizedInputBaseProps,\n} from \"./TokenizedInputBase\";\nimport { useTokenizedInput } from \"./useTokenizedInput\";\n\nimport \"./TokenizedInput.css\";\n\nexport type StringToItem<Item> = (\n selectedItems: Array<Item>,\n value: string\n) => Item | null | undefined;\n\nexport type ChangeHandler<Item> = (selectedItems: Item[] | undefined) => void;\n\nexport interface TokenizedInputProps<Item>\n extends Omit<\n TokenizedInputBaseProps<Item>,\n | \"activeIndices\"\n | \"focused\"\n | \"highlightedIndex\"\n | \"helpers\"\n | \"onRemoveItem\"\n > {\n Tooltip?: ComponentType;\n delimiter?: string | Array<string>;\n disableAddOnBlur?: boolean;\n initialSelectedItems?: Array<Item>;\n onChange?: ChangeHandler<Item>;\n onCollapse?: () => void;\n onExpand?: () => void;\n stringToItem?: StringToItem<Item>;\n tooltipEnterDelay?: UseTooltipProps[\"enterDelay\"];\n tooltipLeaveDelay?: UseTooltipProps[\"leaveDelay\"];\n tooltipPlacement?: UseTooltipProps[\"placement\"];\n}\n\nexport const TokenizedInput = forwardRef(function TokenizedInput<Item>(\n props: TokenizedInputProps<Item>,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const { inputRef: inputRefProp, ...restProps } = props;\n\n const { inputRef, helpers, inputProps } = useTokenizedInput(restProps);\n\n return (\n <TokenizedInputBase\n helpers={helpers}\n inputRef={useForkRef(inputRef, inputRefProp)}\n ref={ref}\n {...inputProps}\n />\n );\n});\n"],"names":["forwardRef","TokenizedInput","useTokenizedInput","jsx","TokenizedInputBase","useForkRef"],"mappings":";;;;;;;;;;;AAuCO,MAAM,cAAiB,GAAAA,gBAAA,CAAW,SAASC,eAAAA,CAChD,OACA,GACA,EAAA;AACA,EAAA,MAAM,EAAE,QAAA,EAAU,YAAiB,EAAA,GAAA,SAAA,EAAc,GAAA,KAAA,CAAA;AAEjD,EAAA,MAAM,EAAE,QAAU,EAAA,OAAA,EAAS,UAAW,EAAA,GAAIC,oCAAkB,SAAS,CAAA,CAAA;AAErE,EAAA,uBACGC,cAAA,CAAAC,qCAAA,EAAA;AAAA,IACC,OAAA;AAAA,IACA,QAAA,EAAUC,eAAW,CAAA,QAAA,EAAU,YAAY,CAAA;AAAA,IAC3C,GAAA;AAAA,IACC,GAAG,UAAA;AAAA,GACN,CAAA,CAAA;AAEJ,CAAC;;;;"}
|
|
@@ -7,6 +7,7 @@ var copy = require('clipboard-copy');
|
|
|
7
7
|
var React = require('react');
|
|
8
8
|
var escapeRegExp = require('../utils/escapeRegExp.js');
|
|
9
9
|
var useEventCallback = require('../utils/useEventCallback.js');
|
|
10
|
+
require('../utils/useFloatingUI.js');
|
|
10
11
|
var defaultItemToString = require('./internal/defaultItemToString.js');
|
|
11
12
|
var getCursorPosition = require('./internal/getCursorPosition.js');
|
|
12
13
|
require('../form-field-context/FormFieldContext.js');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenizedInput.js","sources":["../src/tokenized-input/useTokenizedInput.tsx"],"sourcesContent":["//TODO remove when popout code has been migrated\n/* eslint-disable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access */\nimport { ownerWindow, useControlled, useDensity, useId } from \"@salt-ds/core\";\nimport copy from \"clipboard-copy\";\nimport {\n ChangeEvent,\n FocusEvent,\n InputHTMLAttributes,\n KeyboardEvent,\n KeyboardEventHandler,\n Ref,\n SetStateAction,\n SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { escapeRegExp, useEventCallback } from \"../utils\";\nimport { defaultItemToString } from \"./internal/defaultItemToString\";\nimport { getCursorPosition } from \"./internal/getCursorPosition\";\nimport { TokenizedInputProps } from \"./TokenizedInput\";\nimport { TokenizedInputBaseProps } from \"./TokenizedInputBase\";\nimport { useFormFieldProps } from \"../form-field-context\";\n\nexport interface TokenizedInputState<Item> {\n activeIndices: Array<number>;\n expanded: boolean | undefined;\n focused: boolean;\n highlightedIndex: number | undefined;\n selectedItems: Array<Item>;\n value: string | undefined;\n}\n\nexport interface TokenizedInputHelpers<Item> {\n cancelBlur: () => void;\n setFocused: (expanded: boolean) => void;\n setHighlightedIndex: (value?: number) => void;\n setValue: (value: string) => void;\n setSelectedItems: (selectedItems: Array<Item>) => void;\n updateExpanded: (expanded: boolean) => void;\n}\n\n// Timeout to accommodate blur from the input and a click inside of the container\nconst BLUR_TIMEOUT = 200;\n\n/**\n * Map of the height of TokenizedInput in different density.\n * We have to keep a map of this as we can't always measure the height of the input in it's\n * collapsed state, e.g. in a controlled 'expanded' state.\n */\nconst SINGLE_LINE_HEIGHT_MAP = {\n touch: 45,\n low: 36,\n medium: 28,\n high: 23,\n};\n\nfunction isValidItem<Item>(data: unknown): data is Item {\n return (\n (typeof data === \"string\" && Boolean(data.length)) ||\n (typeof data !== \"string\" && data != null)\n );\n}\n\ntype useTokenizedInputResult<Item> = {\n /**\n * Used to do auto focus. It should be set to the actual input node.\n */\n inputRef: Ref<HTMLInputElement>;\n /**\n * The tokenized input state\n */\n state: TokenizedInputState<Item>;\n /**\n * Utility functions for modifying tokenized input state\n */\n helpers: TokenizedInputHelpers<Item>;\n /**\n * Properties applied to a basic tokenized input component\n */\n inputProps: Omit<TokenizedInputBaseProps<Item>, \"helpers\">;\n};\n\nexport function useTokenizedInput<Item>(\n props: TokenizedInputProps<Item>\n): useTokenizedInputResult<Item> {\n validateProps(props);\n\n const {\n inFormField,\n // @ts-ignore\n popoutMode,\n // @ts-ignore\n popoutActions,\n // @ts-ignore\n setIsPoppedOut,\n // @ts-ignore\n setManagedPopout,\n // @ts-ignore\n setIntendedHeight,\n a11yProps: {\n \"aria-labelledby\": ariaLabelledBy,\n disabled: formFieldDisabled,\n } = {},\n } = useFormFieldProps(); // FIXME: FormField Props\n\n const density = useDensity();\n\n const {\n delimiter = \",\",\n initialSelectedItems = [],\n itemToString = defaultItemToString,\n stringToItem = (_, value) => value.trim(),\n disabled = formFieldDisabled,\n disableAddOnBlur,\n onFocus,\n onBlur,\n onClick,\n onExpand,\n onCollapse,\n onKeyUp,\n onKeyDown,\n onInputSelect,\n onInputChange,\n onInputFocus,\n onInputBlur,\n onClear,\n id: idProp,\n value: valueProp,\n expanded: expandedProp,\n selectedItems: selectedItemsProp,\n onChange: onChangeProp,\n \"aria-label\": ariaLabel,\n ...restProps\n } = props;\n\n const id = useId(idProp);\n\n const [value, setValue, isInputControlled] = useControlled<\n string | undefined\n >({\n controlled: valueProp,\n default: \"\",\n name: \"TokenizedInput\",\n state: \"value\",\n });\n\n const [\n // TODO: Check whether defaultValue of [] changes the logic\n selectedItems = [],\n setSelectedItems,\n isSelectionControlled,\n ] = useControlled<Item[] | undefined>({\n controlled: selectedItemsProp,\n default: initialSelectedItems,\n name: \"TokenizedInput\",\n state: \"selectedItems\",\n });\n\n const [expanded, setExpanded, isExpandedControlled] = useControlled<boolean>({\n controlled: expandedProp,\n default: false,\n name: \"TokenizedInput\",\n state: \"expanded\",\n });\n\n const [activeIndices, setActiveIndices] = useState<number[]>([]);\n const [highlightedIndex, setHighlightedIndex] = useState<number | undefined>(\n undefined\n );\n const [focused, setFocusedState] = useState(false);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const blurTimeout = useRef<number | null>(null);\n const preventBlurOnCopy = useRef(false);\n const hasActiveItems = Boolean(activeIndices.length);\n\n const delimiters = ([] as string[]).concat(delimiter);\n const primaryDelimiter = delimiters[0];\n const delimiterRegex = new RegExp(\n delimiters.map(escapeRegExp).join(\"|\"),\n \"gi\"\n );\n\n const onChange = useEventCallback((selectedItems: Item[] | undefined) => {\n if (onChangeProp) {\n onChangeProp(selectedItems);\n }\n });\n\n const cancelBlur = useCallback(() => {\n if (blurTimeout.current) {\n clearTimeout(blurTimeout.current);\n }\n blurTimeout.current = null;\n }, []);\n\n const focusInput = useCallback(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n\n if (popoutMode && setIsPoppedOut) {\n setIsPoppedOut(true);\n }\n }\n }, [popoutMode, setIsPoppedOut]);\n\n useEffect(\n () => () => {\n cancelBlur();\n },\n [cancelBlur]\n );\n\n useEffect(() => {\n if (expanded) {\n focusInput();\n }\n }, [expanded, focusInput]);\n\n useEffect(() => {\n if (popoutMode && setManagedPopout) {\n setManagedPopout(true);\n\n setIntendedHeight(SINGLE_LINE_HEIGHT_MAP[density]);\n }\n }, [density, popoutMode, setIntendedHeight, setManagedPopout]);\n\n const updateInputValue = (newValue: string | undefined) => {\n if (!isInputControlled) {\n setValue(newValue);\n }\n };\n\n const updateSelectedItems = useCallback(\n (action: SetStateAction<Item[] | undefined>) => {\n if (!isSelectionControlled) {\n setSelectedItems((prevSelectedItems?: Item[]) => {\n const newItems =\n typeof action === \"function\" ? action(prevSelectedItems) : action;\n\n if (newItems !== prevSelectedItems) {\n onChange(newItems);\n }\n\n return newItems;\n });\n } else {\n onChange(typeof action === \"function\" ? action(selectedItems) : action);\n }\n },\n [isSelectionControlled, setSelectedItems, onChange, selectedItems]\n );\n\n const updateExpanded = (newExpanded: boolean) => {\n if (!isExpandedControlled) {\n setExpanded(newExpanded);\n }\n\n if (newExpanded) {\n onExpand && onExpand();\n } else {\n onCollapse && onCollapse();\n }\n\n if (popoutMode && popoutActions) {\n popoutActions.refresh();\n }\n };\n\n const setFocused = (newState: boolean) => {\n setFocusedState(newState);\n };\n\n const resetInput = () => {\n updateInputValue(\"\");\n setHighlightedIndex(undefined);\n setActiveIndices([]);\n };\n\n const removeItems = useCallback(\n (itemIndices: number[]) => {\n updateSelectedItems(\n (prevSelectedItems) =>\n prevSelectedItems &&\n (prevSelectedItems.length === 0\n ? prevSelectedItems\n : prevSelectedItems.filter(\n (_, index) => itemIndices.indexOf(index) === -1\n ))\n );\n },\n [updateSelectedItems]\n );\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n event.stopPropagation();\n\n // The input will lose focus when building the text to copy in a temporary\n // DOM node. This is particularly visible in a slower browser, i.e. IE 11.\n // This is to prevent a blur in that scenario.\n if (preventBlurOnCopy.current) {\n preventBlurOnCopy.current = false;\n setActiveIndices(\n Array.from(\n { length: selectedItems ? selectedItems.length : 0 },\n (_, index) => index\n )\n );\n return;\n }\n\n setFocused(true);\n\n if (onInputFocus) {\n onInputFocus(event);\n }\n\n if (blurTimeout.current !== null) {\n cancelBlur();\n } else {\n updateExpanded(true);\n\n if (onFocus) {\n onFocus(event);\n }\n }\n };\n\n const handleInputBlur = (event: FocusEvent<HTMLInputElement>) => {\n event.stopPropagation();\n\n setFocused(false);\n setHighlightedIndex(undefined);\n setActiveIndices([]);\n\n if (onInputBlur) {\n onInputBlur(event);\n }\n\n handleBlur(event);\n };\n\n const handleBlur = (\n event: FocusEvent<HTMLInputElement | HTMLButtonElement>\n ) => {\n if (preventBlurOnCopy.current) {\n return focusInput();\n }\n\n event.persist();\n\n blurTimeout.current = setTimeout(() => {\n blurTimeout.current = null;\n updateExpanded(false);\n\n if (!disableAddOnBlur) {\n handleAddItems(value, true);\n }\n\n if (onBlur) {\n onBlur(event);\n }\n\n if (popoutMode && setIsPoppedOut) {\n setIsPoppedOut(false);\n }\n }, BLUR_TIMEOUT) as unknown as number;\n };\n\n const handleClick = (event: SyntheticEvent<HTMLElement>) => {\n updateExpanded(true);\n setActiveIndices([]);\n focusInput();\n\n if (onClick) {\n onClick(event);\n }\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n setHighlightedIndex(undefined);\n\n if (onInputChange) {\n onInputChange(event);\n }\n\n const newValue = event.target.value;\n\n if (delimiterRegex.test(newValue)) {\n // Process value with delimiters\n handleAddItems(newValue);\n } else {\n // Just update input value if there is no delimiter\n updateInputValue(newValue);\n }\n };\n\n const handleAddItems = (\n newValue: string | undefined,\n appendOnly?: boolean\n ) => {\n if (!newValue || newValue.length === 0) {\n return;\n }\n\n resetInput();\n\n const newItems = newValue\n .split(delimiterRegex)\n .reduce<Item[]>((values, part) => {\n const newItem = stringToItem(\n hasActiveItems ? values : selectedItems.concat(values),\n part\n );\n return isValidItem<Item>(newItem) ? values.concat(newItem) : values;\n }, []);\n\n if (newItems.length) {\n updateSelectedItems((prevSelectedItems = []) =>\n hasActiveItems && !appendOnly\n ? newItems\n : prevSelectedItems.concat(newItems)\n );\n }\n };\n\n const handleRemoveItem = useCallback(\n (itemIndex?: number) => {\n focusInput();\n if (itemIndex) {\n removeItems([itemIndex]);\n }\n },\n [focusInput, removeItems]\n );\n\n const handleClear = (event: ChangeEvent<HTMLInputElement>) => {\n updateSelectedItems([]);\n resetInput();\n focusInput();\n\n if (onClear) {\n onClear(event);\n }\n\n if (popoutMode && popoutActions) {\n popoutActions.refresh();\n }\n };\n\n const cursorAtInputStart = () =>\n getCursorPosition(inputRef) === 0 && Boolean(selectedItems.length);\n\n const highlightAtPillGroupEnd = () =>\n highlightedIndex === selectedItems.length - 1;\n\n const pillGroupKeyDownHandlers: {\n [key: string]: KeyboardEventHandler<HTMLInputElement>;\n } = {\n ArrowLeft: (event) => {\n event.preventDefault();\n setHighlightedIndex((prevHighlightedIndex) =>\n prevHighlightedIndex == null\n ? selectedItems.length - 1\n : Math.max(0, prevHighlightedIndex - 1)\n );\n },\n ArrowRight: (event) => {\n if (highlightAtPillGroupEnd()) {\n return setHighlightedIndex(undefined);\n }\n\n event.preventDefault();\n setHighlightedIndex((prevHighlightedIndex) =>\n prevHighlightedIndex == null\n ? prevHighlightedIndex\n : Math.min(selectedItems.length - 1, prevHighlightedIndex + 1)\n );\n },\n Backspace: (event) => {\n event.preventDefault();\n handleRemoveItem(highlightedIndex);\n setHighlightedIndex((prevHighlightedIndex) =>\n prevHighlightedIndex == null\n ? prevHighlightedIndex\n : Math.max(0, prevHighlightedIndex - 1)\n );\n },\n Home: (event) => {\n event.preventDefault();\n setHighlightedIndex(0);\n },\n End: (event) => {\n event.preventDefault();\n setHighlightedIndex(selectedItems.length - 1);\n },\n Enter: (event) => {\n event.preventDefault();\n handleRemoveItem(highlightedIndex);\n },\n Delete: (event) => {\n event.preventDefault();\n handleRemoveItem(highlightedIndex);\n },\n \" \": (event) => {\n event.preventDefault();\n handleRemoveItem(highlightedIndex);\n },\n };\n\n const inputKeyDownHandlers: {\n [key: string]: KeyboardEventHandler<HTMLInputElement>;\n } = {\n ArrowLeft: (event) => {\n if (cursorAtInputStart()) {\n event.preventDefault();\n setHighlightedIndex(selectedItems.length - 1);\n }\n },\n Backspace: () => {\n if (hasActiveItems) {\n removeItems(activeIndices);\n } else if (cursorAtInputStart()) {\n setHighlightedIndex(selectedItems.length - 1);\n }\n },\n Delete: () => {\n if (hasActiveItems) {\n removeItems(activeIndices);\n }\n },\n Enter: (event) => {\n event.preventDefault();\n\n if (hasActiveItems) {\n removeItems(activeIndices);\n } else {\n handleAddItems(value);\n }\n },\n };\n\n const handleCtrlModifierKeyDown: InputHTMLAttributes<HTMLInputElement>[\"onKeyDown\"] =\n (event) => {\n const win = ownerWindow(event.target as HTMLElement);\n const supportClipboard = win.navigator && win.navigator.clipboard;\n\n switch (event.key.toUpperCase()) {\n case \"A\":\n // Select all\n setHighlightedIndex(undefined);\n setActiveIndices(\n Array.from({ length: selectedItems.length }, (_, index) => index)\n );\n break;\n case \"C\":\n // Copy\n copy(\n activeIndices\n .map((index) => itemToString(selectedItems[index]))\n .concat(value != null ? String(value).trim() : \"\")\n .filter(Boolean)\n .join(primaryDelimiter)\n )\n .then((result) => {\n preventBlurOnCopy.current = !supportClipboard;\n return result;\n })\n .catch((error) => {\n console.error(error);\n });\n break;\n case \"V\":\n // Paste - do nothing and let handleChange deal with it\n break;\n case \"ARROWLEFT\":\n pillGroupKeyDownHandlers.ArrowLeft(event);\n break;\n case \"ARROWRIGHT\":\n pillGroupKeyDownHandlers.ArrowRight(event);\n break;\n case \"BACKSPACE\":\n if (cursorAtInputStart()) {\n handleRemoveItem(selectedItems.length - 1);\n }\n break;\n case \"CONTROL\":\n case \"META\":\n // Do nothing\n break;\n default:\n // Otherwise, reset active items\n setActiveIndices([]);\n }\n };\n\n const handleCommonKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n const eventKey = event.key.toUpperCase();\n\n if (eventKey === \"ESCAPE\") {\n event.preventDefault();\n resetInput();\n } else if (eventKey === \"TAB\" && !disableAddOnBlur) {\n // Pressing Tab adds a new value\n handleAddItems(value);\n }\n };\n\n const handleKeyDown: InputHTMLAttributes<HTMLInputElement>[\"onKeyDown\"] = (\n event\n ) => {\n if (onKeyDown) {\n onKeyDown(event);\n }\n if (event.defaultPrevented) {\n return;\n }\n if (\n event.ctrlKey ||\n event.metaKey ||\n [\"CONTROL\", \"META\"].indexOf(event.key.toUpperCase()) !== -1\n ) {\n handleCtrlModifierKeyDown(event);\n } else {\n let handler;\n\n if (highlightedIndex == null) {\n handler = inputKeyDownHandlers[event.key];\n setActiveIndices([]);\n } else {\n handler = pillGroupKeyDownHandlers[event.key];\n }\n\n if (handler != null) {\n handler(event);\n } else {\n handleCommonKeyDown(event);\n }\n }\n\n if (popoutMode && popoutActions) {\n popoutActions.refresh();\n }\n };\n\n const state: TokenizedInputState<Item> = {\n value,\n selectedItems,\n activeIndices,\n highlightedIndex,\n expanded,\n focused: !inFormField && focused,\n };\n\n const eventHandlers = {\n // onFocus is a focus on the expand button\n // It can also be triggered by a focus on the input\n onFocus,\n // onBlur is a blur from the expand button when it's collapsed\n // It can also be triggered by the clear button\n onBlur: expanded ? handleBlur : onBlur,\n onClick: handleClick,\n onInputSelect,\n onInputChange: handleInputChange,\n onInputFocus: handleInputFocus,\n onInputBlur: handleInputBlur,\n onKeyDown: handleKeyDown,\n onRemoveItem: handleRemoveItem,\n onClear: handleClear,\n };\n\n return {\n inputRef,\n state,\n helpers: {\n cancelBlur,\n setValue,\n setSelectedItems,\n setHighlightedIndex,\n setFocused,\n updateExpanded,\n },\n inputProps: {\n id,\n itemToString,\n disabled,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n ...state,\n ...restProps,\n ...(disabled ? {} : eventHandlers),\n },\n };\n}\n\nconst validateProps = function validateProps<Item>(\n props: TokenizedInputProps<Item>\n) {\n if (process.env.NODE_ENV !== \"production\") {\n const { delimiter } = props;\n\n const invalidDelimiter = Array.isArray(delimiter)\n ? delimiter.every(isChar)\n : isChar(delimiter);\n\n useEffect(() => {\n console.warn(\n \"TokenizedInput delimiter should be a single character or an array of single characters\"\n );\n }, [invalidDelimiter]);\n }\n};\n\nconst isChar = (value: unknown) =>\n typeof value === \"string\" && value.length === 1;\n"],"names":["useFormFieldProps","useDensity","defaultItemToString","value","useId","useControlled","useState","useRef","escapeRegExp","useEventCallback","selectedItems","useCallback","useEffect","getCursorPosition","ownerWindow","copy","validateProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTokenizedInput.js","sources":["../src/tokenized-input/useTokenizedInput.tsx"],"sourcesContent":["//TODO remove when popout code has been migrated\n/* eslint-disable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access */\nimport { ownerWindow, useControlled, useDensity, useId } from \"@salt-ds/core\";\nimport copy from \"clipboard-copy\";\nimport {\n ChangeEvent,\n FocusEvent,\n InputHTMLAttributes,\n KeyboardEvent,\n KeyboardEventHandler,\n Ref,\n SetStateAction,\n SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { escapeRegExp, useEventCallback } from \"../utils\";\nimport { defaultItemToString } from \"./internal/defaultItemToString\";\nimport { getCursorPosition } from \"./internal/getCursorPosition\";\nimport { TokenizedInputProps } from \"./TokenizedInput\";\nimport { TokenizedInputBaseProps } from \"./TokenizedInputBase\";\nimport { useFormFieldProps } from \"../form-field-context\";\n\nexport interface TokenizedInputState<Item> {\n activeIndices: Array<number>;\n expanded: boolean | undefined;\n focused: boolean;\n highlightedIndex: number | undefined;\n selectedItems: Array<Item>;\n value: string | undefined;\n}\n\nexport interface TokenizedInputHelpers<Item> {\n cancelBlur: () => void;\n setFocused: (expanded: boolean) => void;\n setHighlightedIndex: (value?: number) => void;\n setValue: (value: string) => void;\n setSelectedItems: (selectedItems: Array<Item>) => void;\n updateExpanded: (expanded: boolean) => void;\n}\n\n// Timeout to accommodate blur from the input and a click inside of the container\nconst BLUR_TIMEOUT = 200;\n\n/**\n * Map of the height of TokenizedInput in different density.\n * We have to keep a map of this as we can't always measure the height of the input in it's\n * collapsed state, e.g. in a controlled 'expanded' state.\n */\nconst SINGLE_LINE_HEIGHT_MAP = {\n touch: 45,\n low: 36,\n medium: 28,\n high: 23,\n};\n\nfunction isValidItem<Item>(data: unknown): data is Item {\n return (\n (typeof data === \"string\" && Boolean(data.length)) ||\n (typeof data !== \"string\" && data != null)\n );\n}\n\ntype useTokenizedInputResult<Item> = {\n /**\n * Used to do auto focus. It should be set to the actual input node.\n */\n inputRef: Ref<HTMLInputElement>;\n /**\n * The tokenized input state\n */\n state: TokenizedInputState<Item>;\n /**\n * Utility functions for modifying tokenized input state\n */\n helpers: TokenizedInputHelpers<Item>;\n /**\n * Properties applied to a basic tokenized input component\n */\n inputProps: Omit<TokenizedInputBaseProps<Item>, \"helpers\">;\n};\n\nexport function useTokenizedInput<Item>(\n props: TokenizedInputProps<Item>\n): useTokenizedInputResult<Item> {\n validateProps(props);\n\n const {\n inFormField,\n // @ts-ignore\n popoutMode,\n // @ts-ignore\n popoutActions,\n // @ts-ignore\n setIsPoppedOut,\n // @ts-ignore\n setManagedPopout,\n // @ts-ignore\n setIntendedHeight,\n a11yProps: {\n \"aria-labelledby\": ariaLabelledBy,\n disabled: formFieldDisabled,\n } = {},\n } = useFormFieldProps(); // FIXME: FormField Props\n\n const density = useDensity();\n\n const {\n delimiter = \",\",\n initialSelectedItems = [],\n itemToString = defaultItemToString,\n stringToItem = (_, value) => value.trim(),\n disabled = formFieldDisabled,\n disableAddOnBlur,\n onFocus,\n onBlur,\n onClick,\n onExpand,\n onCollapse,\n onKeyUp,\n onKeyDown,\n onInputSelect,\n onInputChange,\n onInputFocus,\n onInputBlur,\n onClear,\n id: idProp,\n value: valueProp,\n expanded: expandedProp,\n selectedItems: selectedItemsProp,\n onChange: onChangeProp,\n \"aria-label\": ariaLabel,\n ...restProps\n } = props;\n\n const id = useId(idProp);\n\n const [value, setValue, isInputControlled] = useControlled<\n string | undefined\n >({\n controlled: valueProp,\n default: \"\",\n name: \"TokenizedInput\",\n state: \"value\",\n });\n\n const [\n // TODO: Check whether defaultValue of [] changes the logic\n selectedItems = [],\n setSelectedItems,\n isSelectionControlled,\n ] = useControlled<Item[] | undefined>({\n controlled: selectedItemsProp,\n default: initialSelectedItems,\n name: \"TokenizedInput\",\n state: \"selectedItems\",\n });\n\n const [expanded, setExpanded, isExpandedControlled] = useControlled<boolean>({\n controlled: expandedProp,\n default: false,\n name: \"TokenizedInput\",\n state: \"expanded\",\n });\n\n const [activeIndices, setActiveIndices] = useState<number[]>([]);\n const [highlightedIndex, setHighlightedIndex] = useState<number | undefined>(\n undefined\n );\n const [focused, setFocusedState] = useState(false);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const blurTimeout = useRef<number | null>(null);\n const preventBlurOnCopy = useRef(false);\n const hasActiveItems = Boolean(activeIndices.length);\n\n const delimiters = ([] as string[]).concat(delimiter);\n const primaryDelimiter = delimiters[0];\n const delimiterRegex = new RegExp(\n delimiters.map(escapeRegExp).join(\"|\"),\n \"gi\"\n );\n\n const onChange = useEventCallback((selectedItems: Item[] | undefined) => {\n if (onChangeProp) {\n onChangeProp(selectedItems);\n }\n });\n\n const cancelBlur = useCallback(() => {\n if (blurTimeout.current) {\n clearTimeout(blurTimeout.current);\n }\n blurTimeout.current = null;\n }, []);\n\n const focusInput = useCallback(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n\n if (popoutMode && setIsPoppedOut) {\n setIsPoppedOut(true);\n }\n }\n }, [popoutMode, setIsPoppedOut]);\n\n useEffect(\n () => () => {\n cancelBlur();\n },\n [cancelBlur]\n );\n\n useEffect(() => {\n if (expanded) {\n focusInput();\n }\n }, [expanded, focusInput]);\n\n useEffect(() => {\n if (popoutMode && setManagedPopout) {\n setManagedPopout(true);\n\n setIntendedHeight(SINGLE_LINE_HEIGHT_MAP[density]);\n }\n }, [density, popoutMode, setIntendedHeight, setManagedPopout]);\n\n const updateInputValue = (newValue: string | undefined) => {\n if (!isInputControlled) {\n setValue(newValue);\n }\n };\n\n const updateSelectedItems = useCallback(\n (action: SetStateAction<Item[] | undefined>) => {\n if (!isSelectionControlled) {\n setSelectedItems((prevSelectedItems?: Item[]) => {\n const newItems =\n typeof action === \"function\" ? action(prevSelectedItems) : action;\n\n if (newItems !== prevSelectedItems) {\n onChange(newItems);\n }\n\n return newItems;\n });\n } else {\n onChange(typeof action === \"function\" ? action(selectedItems) : action);\n }\n },\n [isSelectionControlled, setSelectedItems, onChange, selectedItems]\n );\n\n const updateExpanded = (newExpanded: boolean) => {\n if (!isExpandedControlled) {\n setExpanded(newExpanded);\n }\n\n if (newExpanded) {\n onExpand && onExpand();\n } else {\n onCollapse && onCollapse();\n }\n\n if (popoutMode && popoutActions) {\n popoutActions.refresh();\n }\n };\n\n const setFocused = (newState: boolean) => {\n setFocusedState(newState);\n };\n\n const resetInput = () => {\n updateInputValue(\"\");\n setHighlightedIndex(undefined);\n setActiveIndices([]);\n };\n\n const removeItems = useCallback(\n (itemIndices: number[]) => {\n updateSelectedItems(\n (prevSelectedItems) =>\n prevSelectedItems &&\n (prevSelectedItems.length === 0\n ? prevSelectedItems\n : prevSelectedItems.filter(\n (_, index) => itemIndices.indexOf(index) === -1\n ))\n );\n },\n [updateSelectedItems]\n );\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n event.stopPropagation();\n\n // The input will lose focus when building the text to copy in a temporary\n // DOM node. This is particularly visible in a slower browser, i.e. IE 11.\n // This is to prevent a blur in that scenario.\n if (preventBlurOnCopy.current) {\n preventBlurOnCopy.current = false;\n setActiveIndices(\n Array.from(\n { length: selectedItems ? selectedItems.length : 0 },\n (_, index) => index\n )\n );\n return;\n }\n\n setFocused(true);\n\n if (onInputFocus) {\n onInputFocus(event);\n }\n\n if (blurTimeout.current !== null) {\n cancelBlur();\n } else {\n updateExpanded(true);\n\n if (onFocus) {\n onFocus(event);\n }\n }\n };\n\n const handleInputBlur = (event: FocusEvent<HTMLInputElement>) => {\n event.stopPropagation();\n\n setFocused(false);\n setHighlightedIndex(undefined);\n setActiveIndices([]);\n\n if (onInputBlur) {\n onInputBlur(event);\n }\n\n handleBlur(event);\n };\n\n const handleBlur = (\n event: FocusEvent<HTMLInputElement | HTMLButtonElement>\n ) => {\n if (preventBlurOnCopy.current) {\n return focusInput();\n }\n\n event.persist();\n\n blurTimeout.current = setTimeout(() => {\n blurTimeout.current = null;\n updateExpanded(false);\n\n if (!disableAddOnBlur) {\n handleAddItems(value, true);\n }\n\n if (onBlur) {\n onBlur(event);\n }\n\n if (popoutMode && setIsPoppedOut) {\n setIsPoppedOut(false);\n }\n }, BLUR_TIMEOUT) as unknown as number;\n };\n\n const handleClick = (event: SyntheticEvent<HTMLElement>) => {\n updateExpanded(true);\n setActiveIndices([]);\n focusInput();\n\n if (onClick) {\n onClick(event);\n }\n };\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n setHighlightedIndex(undefined);\n\n if (onInputChange) {\n onInputChange(event);\n }\n\n const newValue = event.target.value;\n\n if (delimiterRegex.test(newValue)) {\n // Process value with delimiters\n handleAddItems(newValue);\n } else {\n // Just update input value if there is no delimiter\n updateInputValue(newValue);\n }\n };\n\n const handleAddItems = (\n newValue: string | undefined,\n appendOnly?: boolean\n ) => {\n if (!newValue || newValue.length === 0) {\n return;\n }\n\n resetInput();\n\n const newItems = newValue\n .split(delimiterRegex)\n .reduce<Item[]>((values, part) => {\n const newItem = stringToItem(\n hasActiveItems ? values : selectedItems.concat(values),\n part\n );\n return isValidItem<Item>(newItem) ? values.concat(newItem) : values;\n }, []);\n\n if (newItems.length) {\n updateSelectedItems((prevSelectedItems = []) =>\n hasActiveItems && !appendOnly\n ? newItems\n : prevSelectedItems.concat(newItems)\n );\n }\n };\n\n const handleRemoveItem = useCallback(\n (itemIndex?: number) => {\n focusInput();\n if (itemIndex) {\n removeItems([itemIndex]);\n }\n },\n [focusInput, removeItems]\n );\n\n const handleClear = (event: ChangeEvent<HTMLInputElement>) => {\n updateSelectedItems([]);\n resetInput();\n focusInput();\n\n if (onClear) {\n onClear(event);\n }\n\n if (popoutMode && popoutActions) {\n popoutActions.refresh();\n }\n };\n\n const cursorAtInputStart = () =>\n getCursorPosition(inputRef) === 0 && Boolean(selectedItems.length);\n\n const highlightAtPillGroupEnd = () =>\n highlightedIndex === selectedItems.length - 1;\n\n const pillGroupKeyDownHandlers: {\n [key: string]: KeyboardEventHandler<HTMLInputElement>;\n } = {\n ArrowLeft: (event) => {\n event.preventDefault();\n setHighlightedIndex((prevHighlightedIndex) =>\n prevHighlightedIndex == null\n ? selectedItems.length - 1\n : Math.max(0, prevHighlightedIndex - 1)\n );\n },\n ArrowRight: (event) => {\n if (highlightAtPillGroupEnd()) {\n return setHighlightedIndex(undefined);\n }\n\n event.preventDefault();\n setHighlightedIndex((prevHighlightedIndex) =>\n prevHighlightedIndex == null\n ? prevHighlightedIndex\n : Math.min(selectedItems.length - 1, prevHighlightedIndex + 1)\n );\n },\n Backspace: (event) => {\n event.preventDefault();\n handleRemoveItem(highlightedIndex);\n setHighlightedIndex((prevHighlightedIndex) =>\n prevHighlightedIndex == null\n ? prevHighlightedIndex\n : Math.max(0, prevHighlightedIndex - 1)\n );\n },\n Home: (event) => {\n event.preventDefault();\n setHighlightedIndex(0);\n },\n End: (event) => {\n event.preventDefault();\n setHighlightedIndex(selectedItems.length - 1);\n },\n Enter: (event) => {\n event.preventDefault();\n handleRemoveItem(highlightedIndex);\n },\n Delete: (event) => {\n event.preventDefault();\n handleRemoveItem(highlightedIndex);\n },\n \" \": (event) => {\n event.preventDefault();\n handleRemoveItem(highlightedIndex);\n },\n };\n\n const inputKeyDownHandlers: {\n [key: string]: KeyboardEventHandler<HTMLInputElement>;\n } = {\n ArrowLeft: (event) => {\n if (cursorAtInputStart()) {\n event.preventDefault();\n setHighlightedIndex(selectedItems.length - 1);\n }\n },\n Backspace: () => {\n if (hasActiveItems) {\n removeItems(activeIndices);\n } else if (cursorAtInputStart()) {\n setHighlightedIndex(selectedItems.length - 1);\n }\n },\n Delete: () => {\n if (hasActiveItems) {\n removeItems(activeIndices);\n }\n },\n Enter: (event) => {\n event.preventDefault();\n\n if (hasActiveItems) {\n removeItems(activeIndices);\n } else {\n handleAddItems(value);\n }\n },\n };\n\n const handleCtrlModifierKeyDown: InputHTMLAttributes<HTMLInputElement>[\"onKeyDown\"] =\n (event) => {\n const win = ownerWindow(event.target as HTMLElement);\n const supportClipboard = win.navigator && win.navigator.clipboard;\n\n switch (event.key.toUpperCase()) {\n case \"A\":\n // Select all\n setHighlightedIndex(undefined);\n setActiveIndices(\n Array.from({ length: selectedItems.length }, (_, index) => index)\n );\n break;\n case \"C\":\n // Copy\n copy(\n activeIndices\n .map((index) => itemToString(selectedItems[index]))\n .concat(value != null ? String(value).trim() : \"\")\n .filter(Boolean)\n .join(primaryDelimiter)\n )\n .then((result) => {\n preventBlurOnCopy.current = !supportClipboard;\n return result;\n })\n .catch((error) => {\n console.error(error);\n });\n break;\n case \"V\":\n // Paste - do nothing and let handleChange deal with it\n break;\n case \"ARROWLEFT\":\n pillGroupKeyDownHandlers.ArrowLeft(event);\n break;\n case \"ARROWRIGHT\":\n pillGroupKeyDownHandlers.ArrowRight(event);\n break;\n case \"BACKSPACE\":\n if (cursorAtInputStart()) {\n handleRemoveItem(selectedItems.length - 1);\n }\n break;\n case \"CONTROL\":\n case \"META\":\n // Do nothing\n break;\n default:\n // Otherwise, reset active items\n setActiveIndices([]);\n }\n };\n\n const handleCommonKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n const eventKey = event.key.toUpperCase();\n\n if (eventKey === \"ESCAPE\") {\n event.preventDefault();\n resetInput();\n } else if (eventKey === \"TAB\" && !disableAddOnBlur) {\n // Pressing Tab adds a new value\n handleAddItems(value);\n }\n };\n\n const handleKeyDown: InputHTMLAttributes<HTMLInputElement>[\"onKeyDown\"] = (\n event\n ) => {\n if (onKeyDown) {\n onKeyDown(event);\n }\n if (event.defaultPrevented) {\n return;\n }\n if (\n event.ctrlKey ||\n event.metaKey ||\n [\"CONTROL\", \"META\"].indexOf(event.key.toUpperCase()) !== -1\n ) {\n handleCtrlModifierKeyDown(event);\n } else {\n let handler;\n\n if (highlightedIndex == null) {\n handler = inputKeyDownHandlers[event.key];\n setActiveIndices([]);\n } else {\n handler = pillGroupKeyDownHandlers[event.key];\n }\n\n if (handler != null) {\n handler(event);\n } else {\n handleCommonKeyDown(event);\n }\n }\n\n if (popoutMode && popoutActions) {\n popoutActions.refresh();\n }\n };\n\n const state: TokenizedInputState<Item> = {\n value,\n selectedItems,\n activeIndices,\n highlightedIndex,\n expanded,\n focused: !inFormField && focused,\n };\n\n const eventHandlers = {\n // onFocus is a focus on the expand button\n // It can also be triggered by a focus on the input\n onFocus,\n // onBlur is a blur from the expand button when it's collapsed\n // It can also be triggered by the clear button\n onBlur: expanded ? handleBlur : onBlur,\n onClick: handleClick,\n onInputSelect,\n onInputChange: handleInputChange,\n onInputFocus: handleInputFocus,\n onInputBlur: handleInputBlur,\n onKeyDown: handleKeyDown,\n onRemoveItem: handleRemoveItem,\n onClear: handleClear,\n };\n\n return {\n inputRef,\n state,\n helpers: {\n cancelBlur,\n setValue,\n setSelectedItems,\n setHighlightedIndex,\n setFocused,\n updateExpanded,\n },\n inputProps: {\n id,\n itemToString,\n disabled,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n ...state,\n ...restProps,\n ...(disabled ? {} : eventHandlers),\n },\n };\n}\n\nconst validateProps = function validateProps<Item>(\n props: TokenizedInputProps<Item>\n) {\n if (process.env.NODE_ENV !== \"production\") {\n const { delimiter } = props;\n\n const invalidDelimiter = Array.isArray(delimiter)\n ? delimiter.every(isChar)\n : isChar(delimiter);\n\n useEffect(() => {\n console.warn(\n \"TokenizedInput delimiter should be a single character or an array of single characters\"\n );\n }, [invalidDelimiter]);\n }\n};\n\nconst isChar = (value: unknown) =>\n typeof value === \"string\" && value.length === 1;\n"],"names":["useFormFieldProps","useDensity","defaultItemToString","value","useId","useControlled","useState","useRef","escapeRegExp","useEventCallback","selectedItems","useCallback","useEffect","getCursorPosition","ownerWindow","copy","validateProps"],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ var OverflowPanel = require('./overflow-panel/OverflowPanel.js');
|
|
|
10
10
|
var OverflowSeparator = require('./overflow-panel/OverflowSeparator.js');
|
|
11
11
|
var overflowUtils = require('../responsive/overflowUtils.js');
|
|
12
12
|
require('../responsive/useResizeObserver.js');
|
|
13
|
+
require('../utils/useFloatingUI.js');
|
|
13
14
|
var useOverflowCollectionItems = require('../responsive/useOverflowCollectionItems.js');
|
|
14
15
|
var useOverflowLayout = require('../responsive/useOverflowLayout.js');
|
|
15
16
|
var renderToolbarItems = require('./internal/renderToolbarItems.js');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","sources":["../src/toolbar/Toolbar.tsx"],"sourcesContent":["import { useForkRef, useIdMemo } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n cloneElement,\n forwardRef,\n ReactElement,\n useRef,\n} from \"react\";\n\nimport { OverflowPanel } from \"./overflow-panel/OverflowPanel\";\nimport { OverflowSeparator } from \"./overflow-panel/OverflowSeparator\";\n\nimport {\n isOverflowed,\n useOverflowCollectionItems,\n useOverflowLayout,\n} from \"../responsive\";\nimport { renderToolbarItems } from \"./internal/renderToolbarItems\";\nimport { ToolbarProps } from \"./ToolbarProps\";\nimport { Tooltray } from \"./Tooltray\";\nimport { TooltrayProps } from \"./TooltrayProps\";\n\nimport \"./Toolbar.css\";\n\nconst classBase = \"saltToolbar\";\n\n/**\n * The core Toolbar implementation, without the external wrapper provided by Toolbar.js\n */\nexport const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(\n function Toolbar(props, ref) {\n const {\n TooltipComponent,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n children,\n className,\n id: idProp,\n overflowButtonIcon,\n overflowButtonLabel,\n overflowButtonPlacement = \"end\",\n responsive = true,\n disabled = false,\n orientation = \"horizontal\",\n ...restProp\n } = props;\n\n const toolbarId = useIdMemo(idProp);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const setContainerRef = useForkRef(ref, containerRef);\n\n const collectionHook = useOverflowCollectionItems({\n children,\n id: toolbarId,\n orientation,\n label: \"Toolbar\",\n });\n\n const [innerContainerRef] = useOverflowLayout({\n collectionHook,\n id: toolbarId,\n orientation,\n label: \"Toolbar\",\n });\n\n const overflowedItems = collectionHook.data.filter(isOverflowed);\n\n const overflowMenuItems = overflowedItems.reduce<ReactElement[]>(\n (items, item, i, arr) => {\n const { element, id } = item;\n if (element.type === Tooltray) {\n const tooltrayProps = element.props as TooltrayProps;\n const nestedElements = tooltrayProps.children as ReactElement[];\n items.push(\n ...Children.map(nestedElements, (el) =>\n cloneElement(el, {\n \"data-is-inside-panel\": true,\n key: id,\n })\n )\n );\n if (i < arr.length - 1) {\n items.push(<OverflowSeparator key={`separator-${i}`} />);\n }\n } else {\n items.push(\n cloneElement(element, {\n key: id,\n \"data-is-inside-panel\": true,\n })\n );\n }\n return items;\n },\n [] as ReactElement[]\n );\n\n const overflowIndicator = collectionHook.data.find(\n (i) => i.isOverflowIndicator\n );\n\n const overflowPanel = overflowIndicator ? (\n <OverflowPanel\n className={clsx(\"saltToolbarField\")}\n data-index={collectionHook.data.length}\n data-overflow-indicator\n data-priority={1}\n id={overflowIndicator.id}\n triggerButtonIcon={overflowButtonIcon}\n triggerButtonLabel={overflowButtonLabel}\n >\n {overflowMenuItems}\n </OverflowPanel>\n ) : null;\n\n //TODO when we drive this from the overflowItems, the overflowIndicator will\n // be an overflowItem\n return (\n <div\n aria-label={ariaLabel}\n // Using `classnames` to join string together. User may want to provide\n // custom ids (e.g. id from counter label), so the element is labelled by\n // multiple items\n aria-labelledby={clsx(toolbarId, ariaLabelledBy)}\n aria-orientation={orientation}\n className={clsx(classBase, className, {\n [`${classBase}-disabled`]: disabled,\n // TODO whats this for ?\n [`${classBase}-nonResponsive`]: !responsive,\n })}\n id={toolbarId}\n ref={setContainerRef}\n role=\"toolbar\"\n {...restProp}\n >\n <div\n className=\"Responsive-inner\"\n ref={innerContainerRef}\n data-collapsing={collectionHook.data.some((item) => item.collapsing)}\n >\n {overflowButtonPlacement === \"start\" && overflowPanel}\n {renderToolbarItems(collectionHook, overflowedItems, orientation)}\n {overflowButtonPlacement === \"end\" && overflowPanel}\n </div>\n </div>\n );\n }\n);\n"],"names":["forwardRef","Toolbar","useIdMemo","useRef","useForkRef","useOverflowCollectionItems","useOverflowLayout","isOverflowed","Tooltray","Children","cloneElement","jsx","OverflowSeparator","OverflowPanel","clsx","jsxs","renderToolbarItems"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sources":["../src/toolbar/Toolbar.tsx"],"sourcesContent":["import { useForkRef, useIdMemo } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n cloneElement,\n forwardRef,\n ReactElement,\n useRef,\n} from \"react\";\n\nimport { OverflowPanel } from \"./overflow-panel/OverflowPanel\";\nimport { OverflowSeparator } from \"./overflow-panel/OverflowSeparator\";\n\nimport {\n isOverflowed,\n useOverflowCollectionItems,\n useOverflowLayout,\n} from \"../responsive\";\nimport { renderToolbarItems } from \"./internal/renderToolbarItems\";\nimport { ToolbarProps } from \"./ToolbarProps\";\nimport { Tooltray } from \"./Tooltray\";\nimport { TooltrayProps } from \"./TooltrayProps\";\n\nimport \"./Toolbar.css\";\n\nconst classBase = \"saltToolbar\";\n\n/**\n * The core Toolbar implementation, without the external wrapper provided by Toolbar.js\n */\nexport const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(\n function Toolbar(props, ref) {\n const {\n TooltipComponent,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n children,\n className,\n id: idProp,\n overflowButtonIcon,\n overflowButtonLabel,\n overflowButtonPlacement = \"end\",\n responsive = true,\n disabled = false,\n orientation = \"horizontal\",\n ...restProp\n } = props;\n\n const toolbarId = useIdMemo(idProp);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const setContainerRef = useForkRef(ref, containerRef);\n\n const collectionHook = useOverflowCollectionItems({\n children,\n id: toolbarId,\n orientation,\n label: \"Toolbar\",\n });\n\n const [innerContainerRef] = useOverflowLayout({\n collectionHook,\n id: toolbarId,\n orientation,\n label: \"Toolbar\",\n });\n\n const overflowedItems = collectionHook.data.filter(isOverflowed);\n\n const overflowMenuItems = overflowedItems.reduce<ReactElement[]>(\n (items, item, i, arr) => {\n const { element, id } = item;\n if (element.type === Tooltray) {\n const tooltrayProps = element.props as TooltrayProps;\n const nestedElements = tooltrayProps.children as ReactElement[];\n items.push(\n ...Children.map(nestedElements, (el) =>\n cloneElement(el, {\n \"data-is-inside-panel\": true,\n key: id,\n })\n )\n );\n if (i < arr.length - 1) {\n items.push(<OverflowSeparator key={`separator-${i}`} />);\n }\n } else {\n items.push(\n cloneElement(element, {\n key: id,\n \"data-is-inside-panel\": true,\n })\n );\n }\n return items;\n },\n [] as ReactElement[]\n );\n\n const overflowIndicator = collectionHook.data.find(\n (i) => i.isOverflowIndicator\n );\n\n const overflowPanel = overflowIndicator ? (\n <OverflowPanel\n className={clsx(\"saltToolbarField\")}\n data-index={collectionHook.data.length}\n data-overflow-indicator\n data-priority={1}\n id={overflowIndicator.id}\n triggerButtonIcon={overflowButtonIcon}\n triggerButtonLabel={overflowButtonLabel}\n >\n {overflowMenuItems}\n </OverflowPanel>\n ) : null;\n\n //TODO when we drive this from the overflowItems, the overflowIndicator will\n // be an overflowItem\n return (\n <div\n aria-label={ariaLabel}\n // Using `classnames` to join string together. User may want to provide\n // custom ids (e.g. id from counter label), so the element is labelled by\n // multiple items\n aria-labelledby={clsx(toolbarId, ariaLabelledBy)}\n aria-orientation={orientation}\n className={clsx(classBase, className, {\n [`${classBase}-disabled`]: disabled,\n // TODO whats this for ?\n [`${classBase}-nonResponsive`]: !responsive,\n })}\n id={toolbarId}\n ref={setContainerRef}\n role=\"toolbar\"\n {...restProp}\n >\n <div\n className=\"Responsive-inner\"\n ref={innerContainerRef}\n data-collapsing={collectionHook.data.some((item) => item.collapsing)}\n >\n {overflowButtonPlacement === \"start\" && overflowPanel}\n {renderToolbarItems(collectionHook, overflowedItems, orientation)}\n {overflowButtonPlacement === \"end\" && overflowPanel}\n </div>\n </div>\n );\n }\n);\n"],"names":["forwardRef","Toolbar","useIdMemo","useRef","useForkRef","useOverflowCollectionItems","useOverflowLayout","isOverflowed","Tooltray","Children","cloneElement","jsx","OverflowSeparator","OverflowPanel","clsx","jsxs","renderToolbarItems"],"mappings":";;;;;;;;;;;;;;;;;;;AAyBA,MAAM,SAAY,GAAA,aAAA,CAAA;AAKX,MAAM,OAAU,GAAAA,gBAAA;AAAA,EACrB,SAASC,QAAQ,CAAA,KAAA,EAAO,GAAK,EAAA;AAC3B,IAAM,MAAA;AAAA,MACJ,gBAAA;AAAA,MACA,YAAc,EAAA,SAAA;AAAA,MACd,iBAAmB,EAAA,cAAA;AAAA,MACnB,QAAA;AAAA,MACA,SAAA;AAAA,MACA,EAAI,EAAA,MAAA;AAAA,MACJ,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,uBAA0B,GAAA,KAAA;AAAA,MAC1B,UAAa,GAAA,IAAA;AAAA,MACb,QAAW,GAAA,KAAA;AAAA,MACX,WAAc,GAAA,YAAA;AAAA,MACX,GAAA,QAAA;AAAA,KACD,GAAA,KAAA,CAAA;AAEJ,IAAM,MAAA,SAAA,GAAYC,eAAU,MAAM,CAAA,CAAA;AAClC,IAAM,MAAA,YAAA,GAAeC,aAAuB,IAAI,CAAA,CAAA;AAEhD,IAAM,MAAA,eAAA,GAAkBC,eAAW,CAAA,GAAA,EAAK,YAAY,CAAA,CAAA;AAEpD,IAAA,MAAM,iBAAiBC,qDAA2B,CAAA;AAAA,MAChD,QAAA;AAAA,MACA,EAAI,EAAA,SAAA;AAAA,MACJ,WAAA;AAAA,MACA,KAAO,EAAA,SAAA;AAAA,KACR,CAAA,CAAA;AAED,IAAM,MAAA,CAAC,iBAAiB,CAAA,GAAIC,mCAAkB,CAAA;AAAA,MAC5C,cAAA;AAAA,MACA,EAAI,EAAA,SAAA;AAAA,MACJ,WAAA;AAAA,MACA,KAAO,EAAA,SAAA;AAAA,KACR,CAAA,CAAA;AAED,IAAA,MAAM,eAAkB,GAAA,cAAA,CAAe,IAAK,CAAA,MAAA,CAAOC,0BAAY,CAAA,CAAA;AAE/D,IAAA,MAAM,oBAAoB,eAAgB,CAAA,MAAA;AAAA,MACxC,CAAC,KAAA,EAAO,IAAM,EAAA,CAAA,EAAG,GAAQ,KAAA;AACvB,QAAM,MAAA,EAAE,OAAS,EAAA,EAAA,EAAO,GAAA,IAAA,CAAA;AACxB,QAAI,IAAA,OAAA,CAAQ,SAASC,iBAAU,EAAA;AAC7B,UAAA,MAAM,gBAAgB,OAAQ,CAAA,KAAA,CAAA;AAC9B,UAAA,MAAM,iBAAiB,aAAc,CAAA,QAAA,CAAA;AACrC,UAAM,KAAA,CAAA,IAAA;AAAA,YACJ,GAAGC,cAAS,CAAA,GAAA;AAAA,cAAI,cAAA;AAAA,cAAgB,CAAC,EAC/B,KAAAC,kBAAA,CAAa,EAAI,EAAA;AAAA,gBACf,sBAAwB,EAAA,IAAA;AAAA,gBACxB,GAAK,EAAA,EAAA;AAAA,eACN,CAAA;AAAA,aACH;AAAA,WACF,CAAA;AACA,UAAI,IAAA,CAAA,GAAI,GAAI,CAAA,MAAA,GAAS,CAAG,EAAA;AACtB,YAAA,KAAA,CAAM,IAAK,iBAAAC,cAAA,CAACC,mCAAuB,EAAA,EAAA,EAAA,CAAA,UAAA,EAAa,GAAK,CAAE,CAAA,CAAA;AAAA,WACzD;AAAA,SACK,MAAA;AACL,UAAM,KAAA,CAAA,IAAA;AAAA,YACJF,mBAAa,OAAS,EAAA;AAAA,cACpB,GAAK,EAAA,EAAA;AAAA,cACL,sBAAwB,EAAA,IAAA;AAAA,aACzB,CAAA;AAAA,WACH,CAAA;AAAA,SACF;AACA,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,MACA,EAAC;AAAA,KACH,CAAA;AAEA,IAAM,MAAA,iBAAA,GAAoB,eAAe,IAAK,CAAA,IAAA;AAAA,MAC5C,CAAC,MAAM,CAAE,CAAA,mBAAA;AAAA,KACX,CAAA;AAEA,IAAM,MAAA,aAAA,GAAgB,oCACnBC,cAAA,CAAAE,2BAAA,EAAA;AAAA,MACC,SAAA,EAAWC,UAAK,kBAAkB,CAAA;AAAA,MAClC,YAAA,EAAY,eAAe,IAAK,CAAA,MAAA;AAAA,MAChC,yBAAuB,EAAA,IAAA;AAAA,MACvB,eAAe,EAAA,CAAA;AAAA,MACf,IAAI,iBAAkB,CAAA,EAAA;AAAA,MACtB,iBAAmB,EAAA,kBAAA;AAAA,MACnB,kBAAoB,EAAA,mBAAA;AAAA,MAEnB,QAAA,EAAA,iBAAA;AAAA,KACH,CACE,GAAA,IAAA,CAAA;AAIJ,IAAA,uBACGH,cAAA,CAAA,KAAA,EAAA;AAAA,MACC,YAAY,EAAA,SAAA;AAAA,MAIZ,iBAAA,EAAiBG,SAAK,CAAA,SAAA,EAAW,cAAc,CAAA;AAAA,MAC/C,kBAAkB,EAAA,WAAA;AAAA,MAClB,SAAA,EAAWA,SAAK,CAAA,SAAA,EAAW,SAAW,EAAA;AAAA,QACpC,CAAC,GAAG,SAAuB,CAAA,SAAA,CAAA,GAAA,QAAA;AAAA,QAE3B,CAAC,CAAG,EAAA,SAAA,CAAA,cAAA,CAAA,GAA4B,CAAC,UAAA;AAAA,OAClC,CAAA;AAAA,MACD,EAAI,EAAA,SAAA;AAAA,MACJ,GAAK,EAAA,eAAA;AAAA,MACL,IAAK,EAAA,SAAA;AAAA,MACJ,GAAG,QAAA;AAAA,MAEJ,QAAC,kBAAAC,eAAA,CAAA,KAAA,EAAA;AAAA,QACC,SAAU,EAAA,kBAAA;AAAA,QACV,GAAK,EAAA,iBAAA;AAAA,QACL,mBAAiB,cAAe,CAAA,IAAA,CAAK,KAAK,CAAC,IAAA,KAAS,KAAK,UAAU,CAAA;AAAA,QAElE,QAAA,EAAA;AAAA,UAAA,uBAAA,KAA4B,OAAW,IAAA,aAAA;AAAA,UACvCC,qCAAA,CAAmB,cAAgB,EAAA,eAAA,EAAiB,WAAW,CAAA;AAAA,UAC/D,4BAA4B,KAAS,IAAA,aAAA;AAAA,SAAA;AAAA,OACxC,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
|
|
@@ -9,6 +9,7 @@ var Tooltray = require('../Tooltray.js');
|
|
|
9
9
|
require('@salt-ds/core');
|
|
10
10
|
var overflowUtils = require('../../responsive/overflowUtils.js');
|
|
11
11
|
require('../../responsive/useResizeObserver.js');
|
|
12
|
+
require('../../utils/useFloatingUI.js');
|
|
12
13
|
var utils = require('../../responsive/utils.js');
|
|
13
14
|
|
|
14
15
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderToolbarItems.js","sources":["../src/toolbar/internal/renderToolbarItems.tsx"],"sourcesContent":["import React, { HTMLAttributes, ReactElement } from \"react\";\n\nimport { ToolbarAlignmentProps } from \"../ToolbarProps\";\nimport { ToolbarField, ToolbarFieldProps } from \"../toolbar-field\";\n\nimport { Tooltray } from \"../Tooltray\";\n\nimport {\n isCollapsedOrCollapsing,\n liftResponsivePropsToFormField,\n orientationType,\n OverflowCollectionHookResult,\n OverflowItem,\n} from \"../../responsive\";\n\n// These are the props we use for item alignment, either from individual element\n// declarations - e.g Tooltray (alignLeft etc) or generic data- attributes\ninterface ToolbarElementProps\n extends ToolbarAlignmentProps,\n HTMLAttributes<HTMLDivElement> {\n \"data-align-center\"?: boolean;\n \"data-align-end\"?: boolean;\n \"data-align-start\"?: boolean;\n \"data-priority\"?: number;\n}\n\nexport const renderToolbarItems = (\n collectionHook: OverflowCollectionHookResult,\n overflowedItems: OverflowItem[] = [],\n orientation: orientationType\n): JSX.Element[] => {\n let centerAlign = false;\n let rightAlign = false;\n\n const items = collectionHook.data;\n const collapseItems = items.filter(isCollapsedOrCollapsing);\n\n return items\n .filter((item) => !item.isOverflowIndicator)\n .map((item: OverflowItem, index) => {\n const props = item.element.props as ToolbarElementProps;\n const overflowed =\n overflowedItems.findIndex((item) => item.index === index) === -1\n ? undefined\n : true;\n const collapseItem = collapseItems.find((item) => item.index === index);\n const collapsed = collapseItem?.collapsed || undefined;\n const collapsing = collapseItem?.collapsing || undefined;\n\n const {\n alignCenter: alignCenterProp,\n alignEnd: alignEndProp,\n alignStart: alignStartProp,\n \"data-align-center\": alignCenter = alignCenterProp,\n \"data-align-end\": alignEnd = alignEndProp,\n \"data-align-start\": alignStart = alignStartProp,\n } = props;\n\n let dataPadStart = false;\n let dataPadEnd = false;\n if (alignCenter && !centerAlign) {\n centerAlign = true;\n dataPadStart = true;\n } else if (centerAlign && !alignCenter) {\n rightAlign = true;\n dataPadStart = true;\n } else if (alignEnd && !rightAlign) {\n rightAlign = true;\n dataPadStart = true;\n } else if (alignStart) {\n dataPadEnd = true;\n }\n\n const toolbarItemProps = {\n id: item.id,\n key: item.id,\n \"data-index\": index,\n \"data-priority\": props[\"data-priority\"] ?? 2,\n \"data-pad-start\": dataPadStart || undefined,\n \"data-pad-end\": dataPadEnd || undefined,\n \"data-collapsed\": collapsed,\n \"data-collapsing\": collapsing,\n \"data-overflowed\": overflowed,\n orientation,\n };\n\n if (item.element.type === Tooltray) {\n return React.cloneElement(item.element, toolbarItemProps);\n } else {\n switch (item.element.type) {\n case ToolbarField:\n const props = item.element.props as ToolbarFieldProps;\n return React.cloneElement(item.element, {\n ...toolbarItemProps,\n children: React.cloneElement(props.children as ReactElement, {\n // Inject an id that nested Control can use to query status via context\n id: `toolbar-control-${item.id}`,\n }),\n } as ToolbarFieldProps);\n default:\n const [responsiveProps, componentProps] =\n liftResponsivePropsToFormField(item.element.props);\n\n return (\n <ToolbarField {...responsiveProps} {...toolbarItemProps}>\n {React.cloneElement(item.element, {\n ...componentProps,\n // Inject an id that nested Control can use to query status via context\n id: `toolbar-control-${item.id}`,\n })}\n </ToolbarField>\n );\n }\n }\n });\n};\n"],"names":["isCollapsedOrCollapsing","item","Tooltray","React","ToolbarField","props","liftResponsivePropsToFormField","jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderToolbarItems.js","sources":["../src/toolbar/internal/renderToolbarItems.tsx"],"sourcesContent":["import React, { HTMLAttributes, ReactElement } from \"react\";\n\nimport { ToolbarAlignmentProps } from \"../ToolbarProps\";\nimport { ToolbarField, ToolbarFieldProps } from \"../toolbar-field\";\n\nimport { Tooltray } from \"../Tooltray\";\n\nimport {\n isCollapsedOrCollapsing,\n liftResponsivePropsToFormField,\n orientationType,\n OverflowCollectionHookResult,\n OverflowItem,\n} from \"../../responsive\";\n\n// These are the props we use for item alignment, either from individual element\n// declarations - e.g Tooltray (alignLeft etc) or generic data- attributes\ninterface ToolbarElementProps\n extends ToolbarAlignmentProps,\n HTMLAttributes<HTMLDivElement> {\n \"data-align-center\"?: boolean;\n \"data-align-end\"?: boolean;\n \"data-align-start\"?: boolean;\n \"data-priority\"?: number;\n}\n\nexport const renderToolbarItems = (\n collectionHook: OverflowCollectionHookResult,\n overflowedItems: OverflowItem[] = [],\n orientation: orientationType\n): JSX.Element[] => {\n let centerAlign = false;\n let rightAlign = false;\n\n const items = collectionHook.data;\n const collapseItems = items.filter(isCollapsedOrCollapsing);\n\n return items\n .filter((item) => !item.isOverflowIndicator)\n .map((item: OverflowItem, index) => {\n const props = item.element.props as ToolbarElementProps;\n const overflowed =\n overflowedItems.findIndex((item) => item.index === index) === -1\n ? undefined\n : true;\n const collapseItem = collapseItems.find((item) => item.index === index);\n const collapsed = collapseItem?.collapsed || undefined;\n const collapsing = collapseItem?.collapsing || undefined;\n\n const {\n alignCenter: alignCenterProp,\n alignEnd: alignEndProp,\n alignStart: alignStartProp,\n \"data-align-center\": alignCenter = alignCenterProp,\n \"data-align-end\": alignEnd = alignEndProp,\n \"data-align-start\": alignStart = alignStartProp,\n } = props;\n\n let dataPadStart = false;\n let dataPadEnd = false;\n if (alignCenter && !centerAlign) {\n centerAlign = true;\n dataPadStart = true;\n } else if (centerAlign && !alignCenter) {\n rightAlign = true;\n dataPadStart = true;\n } else if (alignEnd && !rightAlign) {\n rightAlign = true;\n dataPadStart = true;\n } else if (alignStart) {\n dataPadEnd = true;\n }\n\n const toolbarItemProps = {\n id: item.id,\n key: item.id,\n \"data-index\": index,\n \"data-priority\": props[\"data-priority\"] ?? 2,\n \"data-pad-start\": dataPadStart || undefined,\n \"data-pad-end\": dataPadEnd || undefined,\n \"data-collapsed\": collapsed,\n \"data-collapsing\": collapsing,\n \"data-overflowed\": overflowed,\n orientation,\n };\n\n if (item.element.type === Tooltray) {\n return React.cloneElement(item.element, toolbarItemProps);\n } else {\n switch (item.element.type) {\n case ToolbarField:\n const props = item.element.props as ToolbarFieldProps;\n return React.cloneElement(item.element, {\n ...toolbarItemProps,\n children: React.cloneElement(props.children as ReactElement, {\n // Inject an id that nested Control can use to query status via context\n id: `toolbar-control-${item.id}`,\n }),\n } as ToolbarFieldProps);\n default:\n const [responsiveProps, componentProps] =\n liftResponsivePropsToFormField(item.element.props);\n\n return (\n <ToolbarField {...responsiveProps} {...toolbarItemProps}>\n {React.cloneElement(item.element, {\n ...componentProps,\n // Inject an id that nested Control can use to query status via context\n id: `toolbar-control-${item.id}`,\n })}\n </ToolbarField>\n );\n }\n }\n });\n};\n"],"names":["isCollapsedOrCollapsing","item","Tooltray","React","ToolbarField","props","liftResponsivePropsToFormField","jsx"],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ require('../../common-hooks/keyUtils.js');
|
|
|
14
14
|
var useCollectionItems = require('../../common-hooks/useCollectionItems.js');
|
|
15
15
|
var useKeyboardNavigationPanel = require('../../common-hooks/useKeyboardNavigationPanel.js');
|
|
16
16
|
require('../../responsive/useResizeObserver.js');
|
|
17
|
+
require('../../utils/useFloatingUI.js');
|
|
17
18
|
var DropdownBase = require('../../dropdown/DropdownBase.js');
|
|
18
19
|
require('../../dropdown/DropdownButton.js');
|
|
19
20
|
require('../../dropdown/Dropdown.js');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OverflowPanel.js","sources":["../src/toolbar/overflow-panel/OverflowPanel.tsx"],"sourcesContent":["import {\n Button,\n makePrefixer,\n useControlled,\n useIdMemo as useId,\n} from \"@salt-ds/core\";\nimport { OverflowMenuIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport React, {\n ForwardedRef,\n forwardRef,\n MouseEvent,\n ReactElement,\n useCallback,\n useRef,\n} from \"react\";\nimport { ToolbarField, ToolbarFieldProps } from \"../toolbar-field\";\nimport { OverflowSeparator } from \"./OverflowSeparator\";\n\nimport {\n useCollectionItems,\n useKeyboardNavigationPanel,\n} from \"../../common-hooks\";\n\nimport { DropdownBase, DropdownBaseProps } from \"../../dropdown\";\n\nimport \"./OverflowPanel.css\";\n\nconst withBaseName = makePrefixer(\"saltOverflowPanel\");\n\nexport interface DropdownPanelProps extends DropdownBaseProps {\n /**\n * Trigger button icon\n */\n triggerButtonIcon?: JSX.Element;\n /**\n * Trigger button text\n */\n triggerButtonLabel?: string;\n}\n\nexport const OverflowPanel = forwardRef(function DropdownPanel(\n {\n children,\n className,\n defaultIsOpen,\n isOpen: isOpenProp,\n onOpenChange,\n triggerButtonIcon,\n triggerButtonLabel,\n ...props\n }: DropdownPanelProps,\n forwardedRef?: ForwardedRef<HTMLDivElement>\n) {\n const id = useId();\n const collectionHook = useCollectionItems<ReactElement>({\n id,\n children,\n });\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [isOpen, setIsOpen] = useControlled<boolean>({\n controlled: isOpenProp,\n default: defaultIsOpen ?? false,\n name: \"DropdownPanel\",\n });\n\n const { highlightedIndex: highlightedIdx, ...keyboardHook } =\n useKeyboardNavigationPanel({\n cycleFocus: true,\n defaultHighlightedIndex: 0,\n focusOnHighlight: true,\n indexPositions: collectionHook.data,\n });\n\n const focusTrigger = useCallback(() => {\n if (triggerRef.current) {\n triggerRef.current.focus();\n }\n }, []);\n\n const setPanelRef = useCallback((el: HTMLElement | null) => el?.focus(), []);\n\n const handleItemClick = (evt: MouseEvent) => {\n // if (sourceItem.props[\"data-close-on-click\"] !== false) closeMenu();\n setIsOpen(false);\n focusTrigger();\n };\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open);\n onOpenChange?.(open);\n };\n\n const getTriggerButtonIcon = () =>\n triggerButtonIcon ?? triggerButtonLabel === undefined ? (\n <OverflowMenuIcon />\n ) : undefined;\n\n return (\n <DropdownBase\n {...props}\n className={clsx(withBaseName(), className)}\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n placement=\"bottom-end\"\n ref={forwardedRef}\n >\n <Button variant=\"secondary\" ref={triggerRef}>\n {getTriggerButtonIcon()}\n {triggerButtonLabel}\n </Button>\n <div\n className={withBaseName(\"content\")}\n ref={setPanelRef}\n tabIndex={-1}\n {...keyboardHook.listProps}\n >\n {collectionHook.data.map((item) => {\n const { type } = item.value as ReactElement;\n if (type === OverflowSeparator) {\n return item.value;\n } else {\n const formFieldProps = {\n id: item.id,\n inOverflowPanel: true,\n key: item.id,\n onClick: handleItemClick,\n } as ToolbarFieldProps;\n\n if (type === ToolbarField) {\n return React.cloneElement(\n item.value as ReactElement,\n formFieldProps\n );\n } else {\n return (\n <ToolbarField {...formFieldProps}>{item.value}</ToolbarField>\n );\n }\n }\n })}\n </div>\n </DropdownBase>\n );\n});\n"],"names":["makePrefixer","forwardRef","useId","useCollectionItems","useRef","useControlled","useKeyboardNavigationPanel","useCallback","jsx","OverflowMenuIcon","jsxs","DropdownBase","clsx","Button","OverflowSeparator","ToolbarField","React"],"mappings":"
|
|
1
|
+
{"version":3,"file":"OverflowPanel.js","sources":["../src/toolbar/overflow-panel/OverflowPanel.tsx"],"sourcesContent":["import {\n Button,\n makePrefixer,\n useControlled,\n useIdMemo as useId,\n} from \"@salt-ds/core\";\nimport { OverflowMenuIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport React, {\n ForwardedRef,\n forwardRef,\n MouseEvent,\n ReactElement,\n useCallback,\n useRef,\n} from \"react\";\nimport { ToolbarField, ToolbarFieldProps } from \"../toolbar-field\";\nimport { OverflowSeparator } from \"./OverflowSeparator\";\n\nimport {\n useCollectionItems,\n useKeyboardNavigationPanel,\n} from \"../../common-hooks\";\n\nimport { DropdownBase, DropdownBaseProps } from \"../../dropdown\";\n\nimport \"./OverflowPanel.css\";\n\nconst withBaseName = makePrefixer(\"saltOverflowPanel\");\n\nexport interface DropdownPanelProps extends DropdownBaseProps {\n /**\n * Trigger button icon\n */\n triggerButtonIcon?: JSX.Element;\n /**\n * Trigger button text\n */\n triggerButtonLabel?: string;\n}\n\nexport const OverflowPanel = forwardRef(function DropdownPanel(\n {\n children,\n className,\n defaultIsOpen,\n isOpen: isOpenProp,\n onOpenChange,\n triggerButtonIcon,\n triggerButtonLabel,\n ...props\n }: DropdownPanelProps,\n forwardedRef?: ForwardedRef<HTMLDivElement>\n) {\n const id = useId();\n const collectionHook = useCollectionItems<ReactElement>({\n id,\n children,\n });\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [isOpen, setIsOpen] = useControlled<boolean>({\n controlled: isOpenProp,\n default: defaultIsOpen ?? false,\n name: \"DropdownPanel\",\n });\n\n const { highlightedIndex: highlightedIdx, ...keyboardHook } =\n useKeyboardNavigationPanel({\n cycleFocus: true,\n defaultHighlightedIndex: 0,\n focusOnHighlight: true,\n indexPositions: collectionHook.data,\n });\n\n const focusTrigger = useCallback(() => {\n if (triggerRef.current) {\n triggerRef.current.focus();\n }\n }, []);\n\n const setPanelRef = useCallback((el: HTMLElement | null) => el?.focus(), []);\n\n const handleItemClick = (evt: MouseEvent) => {\n // if (sourceItem.props[\"data-close-on-click\"] !== false) closeMenu();\n setIsOpen(false);\n focusTrigger();\n };\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open);\n onOpenChange?.(open);\n };\n\n const getTriggerButtonIcon = () =>\n triggerButtonIcon ?? triggerButtonLabel === undefined ? (\n <OverflowMenuIcon />\n ) : undefined;\n\n return (\n <DropdownBase\n {...props}\n className={clsx(withBaseName(), className)}\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n placement=\"bottom-end\"\n ref={forwardedRef}\n >\n <Button variant=\"secondary\" ref={triggerRef}>\n {getTriggerButtonIcon()}\n {triggerButtonLabel}\n </Button>\n <div\n className={withBaseName(\"content\")}\n ref={setPanelRef}\n tabIndex={-1}\n {...keyboardHook.listProps}\n >\n {collectionHook.data.map((item) => {\n const { type } = item.value as ReactElement;\n if (type === OverflowSeparator) {\n return item.value;\n } else {\n const formFieldProps = {\n id: item.id,\n inOverflowPanel: true,\n key: item.id,\n onClick: handleItemClick,\n } as ToolbarFieldProps;\n\n if (type === ToolbarField) {\n return React.cloneElement(\n item.value as ReactElement,\n formFieldProps\n );\n } else {\n return (\n <ToolbarField {...formFieldProps}>{item.value}</ToolbarField>\n );\n }\n }\n })}\n </div>\n </DropdownBase>\n );\n});\n"],"names":["makePrefixer","forwardRef","useId","useCollectionItems","useRef","useControlled","useKeyboardNavigationPanel","useCallback","jsx","OverflowMenuIcon","jsxs","DropdownBase","clsx","Button","OverflowSeparator","ToolbarField","React"],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ var listDomUtils = require('../common-hooks/list-dom-utils.js');
|
|
|
14
14
|
var useCollectionItems = require('../common-hooks/useCollectionItems.js');
|
|
15
15
|
var useSelection = require('../common-hooks/useSelection.js');
|
|
16
16
|
require('../responsive/useResizeObserver.js');
|
|
17
|
+
require('../utils/useFloatingUI.js');
|
|
17
18
|
var isSelected = require('../common-hooks/utils/isSelected.js');
|
|
18
19
|
var useTree = require('./useTree.js');
|
|
19
20
|
var TreeNode = require('./TreeNode.js');
|