@vuu-ui/vuu-ui-controls 0.0.26
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/LICENSE +201 -0
- package/README.md +0 -0
- package/cjs/calendar/Calendar.css.js +6 -0
- package/cjs/calendar/Calendar.css.js.map +1 -0
- package/cjs/calendar/Calendar.js +74 -0
- package/cjs/calendar/Calendar.js.map +1 -0
- package/cjs/calendar/internal/CalendarCarousel.css.js +6 -0
- package/cjs/calendar/internal/CalendarCarousel.css.js.map +1 -0
- package/cjs/calendar/internal/CalendarCarousel.js +97 -0
- package/cjs/calendar/internal/CalendarCarousel.js.map +1 -0
- package/cjs/calendar/internal/CalendarContext.js +19 -0
- package/cjs/calendar/internal/CalendarContext.js.map +1 -0
- package/cjs/calendar/internal/CalendarDay.css.js +6 -0
- package/cjs/calendar/internal/CalendarDay.css.js.map +1 -0
- package/cjs/calendar/internal/CalendarDay.js +83 -0
- package/cjs/calendar/internal/CalendarDay.js.map +1 -0
- package/cjs/calendar/internal/CalendarMonth.css.js +6 -0
- package/cjs/calendar/internal/CalendarMonth.css.js.map +1 -0
- package/cjs/calendar/internal/CalendarMonth.js +73 -0
- package/cjs/calendar/internal/CalendarMonth.js.map +1 -0
- package/cjs/calendar/internal/CalendarNavigation.css.js +6 -0
- package/cjs/calendar/internal/CalendarNavigation.css.js.map +1 -0
- package/cjs/calendar/internal/CalendarNavigation.js +250 -0
- package/cjs/calendar/internal/CalendarNavigation.js.map +1 -0
- package/cjs/calendar/internal/CalendarWeekHeader.css.js +6 -0
- package/cjs/calendar/internal/CalendarWeekHeader.css.js.map +1 -0
- package/cjs/calendar/internal/CalendarWeekHeader.js +43 -0
- package/cjs/calendar/internal/CalendarWeekHeader.js.map +1 -0
- package/cjs/calendar/internal/useFocusManagement.js +63 -0
- package/cjs/calendar/internal/useFocusManagement.js.map +1 -0
- package/cjs/calendar/internal/utils.js +63 -0
- package/cjs/calendar/internal/utils.js.map +1 -0
- package/cjs/calendar/useCalendar.js +131 -0
- package/cjs/calendar/useCalendar.js.map +1 -0
- package/cjs/calendar/useCalendarDay.js +70 -0
- package/cjs/calendar/useCalendarDay.js.map +1 -0
- package/cjs/calendar/useSelection.js +242 -0
- package/cjs/calendar/useSelection.js.map +1 -0
- package/cjs/combo-box/ComboBox.js +191 -0
- package/cjs/combo-box/ComboBox.js.map +1 -0
- package/cjs/combo-box/useCombobox.js +358 -0
- package/cjs/combo-box/useCombobox.js.map +1 -0
- package/cjs/common-hooks/collectionProvider.js +24 -0
- package/cjs/common-hooks/collectionProvider.js.map +1 -0
- package/cjs/common-hooks/isPlainObject.js +6 -0
- package/cjs/common-hooks/isPlainObject.js.map +1 -0
- package/cjs/common-hooks/itemToString.js +24 -0
- package/cjs/common-hooks/itemToString.js.map +1 -0
- package/cjs/common-hooks/selectionTypes.js +18 -0
- package/cjs/common-hooks/selectionTypes.js.map +1 -0
- package/cjs/common-hooks/use-resize-observer.js +123 -0
- package/cjs/common-hooks/use-resize-observer.js.map +1 -0
- package/cjs/common-hooks/useCollectionItems.js +309 -0
- package/cjs/common-hooks/useCollectionItems.js.map +1 -0
- package/cjs/common-hooks/useControlled.js +58 -0
- package/cjs/common-hooks/useControlled.js.map +1 -0
- package/cjs/common-hooks/useSelection.js +212 -0
- package/cjs/common-hooks/useSelection.js.map +1 -0
- package/cjs/common-hooks/useStateRef.js +23 -0
- package/cjs/common-hooks/useStateRef.js.map +1 -0
- package/cjs/cycle-state-button/CycleStateButton.js +54 -0
- package/cjs/cycle-state-button/CycleStateButton.js.map +1 -0
- package/cjs/date-input/DateInput.css.js +6 -0
- package/cjs/date-input/DateInput.css.js.map +1 -0
- package/cjs/date-input/DateInput.js +90 -0
- package/cjs/date-input/DateInput.js.map +1 -0
- package/cjs/date-input/DateRangeInput.js +77 -0
- package/cjs/date-input/DateRangeInput.js.map +1 -0
- package/cjs/date-input/useDatePicker.js +20 -0
- package/cjs/date-input/useDatePicker.js.map +1 -0
- package/cjs/date-popup/DatePopup.js +90 -0
- package/cjs/date-popup/DatePopup.js.map +1 -0
- package/cjs/date-popup/useDatePopup.js +77 -0
- package/cjs/date-popup/useDatePopup.js.map +1 -0
- package/cjs/drag-drop/DragDropProvider.js +145 -0
- package/cjs/drag-drop/DragDropProvider.js.map +1 -0
- package/cjs/drag-drop/DragDropState.js +29 -0
- package/cjs/drag-drop/DragDropState.js.map +1 -0
- package/cjs/drag-drop/Draggable.css.js +6 -0
- package/cjs/drag-drop/Draggable.css.js.map +1 -0
- package/cjs/drag-drop/Draggable.js +95 -0
- package/cjs/drag-drop/Draggable.js.map +1 -0
- package/cjs/drag-drop/dragDropTypes.js +8 -0
- package/cjs/drag-drop/dragDropTypes.js.map +1 -0
- package/cjs/drag-drop/drop-target-utils.js +245 -0
- package/cjs/drag-drop/drop-target-utils.js.map +1 -0
- package/cjs/drag-drop/useAutoScroll.js +71 -0
- package/cjs/drag-drop/useAutoScroll.js.map +1 -0
- package/cjs/drag-drop/useDragDisplacers.js +160 -0
- package/cjs/drag-drop/useDragDisplacers.js.map +1 -0
- package/cjs/drag-drop/useDragDrop.js +499 -0
- package/cjs/drag-drop/useDragDrop.js.map +1 -0
- package/cjs/drag-drop/useDragDropCopy.js +34 -0
- package/cjs/drag-drop/useDragDropCopy.js.map +1 -0
- package/cjs/drag-drop/useDragDropIndicator.js +251 -0
- package/cjs/drag-drop/useDragDropIndicator.js.map +1 -0
- package/cjs/drag-drop/useDragDropNaturalMovement.js +264 -0
- package/cjs/drag-drop/useDragDropNaturalMovement.js.map +1 -0
- package/cjs/drag-drop/useDropIndicator.js +27 -0
- package/cjs/drag-drop/useDropIndicator.js.map +1 -0
- package/cjs/drag-drop/useGlobalDragDrop.js +89 -0
- package/cjs/drag-drop/useGlobalDragDrop.js.map +1 -0
- package/cjs/dropdown/Dropdown.css.js +6 -0
- package/cjs/dropdown/Dropdown.css.js.map +1 -0
- package/cjs/dropdown/Dropdown.js +150 -0
- package/cjs/dropdown/Dropdown.js.map +1 -0
- package/cjs/dropdown/DropdownBase.js +121 -0
- package/cjs/dropdown/DropdownBase.js.map +1 -0
- package/cjs/dropdown/DropdownButton.css.js +6 -0
- package/cjs/dropdown/DropdownButton.css.js.map +1 -0
- package/cjs/dropdown/DropdownButton.js +72 -0
- package/cjs/dropdown/DropdownButton.js.map +1 -0
- package/cjs/dropdown/useClickAway.js +67 -0
- package/cjs/dropdown/useClickAway.js.map +1 -0
- package/cjs/dropdown/useDropdown.js +115 -0
- package/cjs/dropdown/useDropdown.js.map +1 -0
- package/cjs/dropdown/useDropdownBase.js +169 -0
- package/cjs/dropdown/useDropdownBase.js.map +1 -0
- package/cjs/editable/editable-utils.js +37 -0
- package/cjs/editable/editable-utils.js.map +1 -0
- package/cjs/editable/useEditableText.js +106 -0
- package/cjs/editable/useEditableText.js.map +1 -0
- package/cjs/editable-label/EditableLabel.css.js +6 -0
- package/cjs/editable-label/EditableLabel.css.js.map +1 -0
- package/cjs/editable-label/EditableLabel.js +138 -0
- package/cjs/editable-label/EditableLabel.js.map +1 -0
- package/cjs/expando-input/ExpandoInput.css.js +6 -0
- package/cjs/expando-input/ExpandoInput.css.js.map +1 -0
- package/cjs/expando-input/ExpandoInput.js +53 -0
- package/cjs/expando-input/ExpandoInput.js.map +1 -0
- package/cjs/icon-button/Icon.css.js +6 -0
- package/cjs/icon-button/Icon.css.js.map +1 -0
- package/cjs/icon-button/Icon.js +37 -0
- package/cjs/icon-button/Icon.js.map +1 -0
- package/cjs/icon-button/IconButton.css.js +6 -0
- package/cjs/icon-button/IconButton.css.js.map +1 -0
- package/cjs/icon-button/IconButton.js +26 -0
- package/cjs/icon-button/IconButton.js.map +1 -0
- package/cjs/index.js +231 -0
- package/cjs/index.js.map +1 -0
- package/cjs/inputs/Checkbox.css.js +6 -0
- package/cjs/inputs/Checkbox.css.js.map +1 -0
- package/cjs/inputs/Checkbox.js +32 -0
- package/cjs/inputs/Checkbox.js.map +1 -0
- package/cjs/inputs/RadioButton.css.js +6 -0
- package/cjs/inputs/RadioButton.css.js.map +1 -0
- package/cjs/inputs/RadioButton.js +39 -0
- package/cjs/inputs/RadioButton.js.map +1 -0
- package/cjs/instrument-picker/InstrumentPicker.css.js +6 -0
- package/cjs/instrument-picker/InstrumentPicker.css.js.map +1 -0
- package/cjs/instrument-picker/InstrumentPicker.js +113 -0
- package/cjs/instrument-picker/InstrumentPicker.js.map +1 -0
- package/cjs/instrument-picker/SearchCell.css.js +6 -0
- package/cjs/instrument-picker/SearchCell.css.js.map +1 -0
- package/cjs/instrument-picker/SearchCell.js +33 -0
- package/cjs/instrument-picker/SearchCell.js.map +1 -0
- package/cjs/instrument-picker/useInstrumentPicker.js +87 -0
- package/cjs/instrument-picker/useInstrumentPicker.js.map +1 -0
- package/cjs/instrument-search/InstrumentSearch.css.js +6 -0
- package/cjs/instrument-search/InstrumentSearch.css.js.map +1 -0
- package/cjs/instrument-search/InstrumentSearch.js +96 -0
- package/cjs/instrument-search/InstrumentSearch.js.map +1 -0
- package/cjs/instrument-search/SearchCell.css.js +6 -0
- package/cjs/instrument-search/SearchCell.css.js.map +1 -0
- package/cjs/instrument-search/SearchCell.js +33 -0
- package/cjs/instrument-search/SearchCell.js.map +1 -0
- package/cjs/instrument-search/useInstrumentSearch.js +39 -0
- package/cjs/instrument-search/useInstrumentSearch.js.map +1 -0
- package/cjs/list/CheckboxIcon.css.js +6 -0
- package/cjs/list/CheckboxIcon.css.js.map +1 -0
- package/cjs/list/CheckboxIcon.js +33 -0
- package/cjs/list/CheckboxIcon.js.map +1 -0
- package/cjs/list/ChevronIcon.css.js +6 -0
- package/cjs/list/ChevronIcon.css.js.map +1 -0
- package/cjs/list/ChevronIcon.js +22 -0
- package/cjs/list/ChevronIcon.js.map +1 -0
- package/cjs/list/Highlighter.css.js +6 -0
- package/cjs/list/Highlighter.css.js.map +1 -0
- package/cjs/list/Highlighter.js +36 -0
- package/cjs/list/Highlighter.js.map +1 -0
- package/cjs/list/List.css.js +6 -0
- package/cjs/list/List.css.js.map +1 -0
- package/cjs/list/List.js +317 -0
- package/cjs/list/List.js.map +1 -0
- package/cjs/list/ListItem.css.js +6 -0
- package/cjs/list/ListItem.css.js.map +1 -0
- package/cjs/list/ListItem.js +84 -0
- package/cjs/list/ListItem.js.map +1 -0
- package/cjs/list/ListItemGroup.js +6 -0
- package/cjs/list/ListItemGroup.js.map +1 -0
- package/cjs/list/ListItemHeader.js +6 -0
- package/cjs/list/ListItemHeader.js.map +1 -0
- package/cjs/list/RadioIcon.css.js +6 -0
- package/cjs/list/RadioIcon.css.js.map +1 -0
- package/cjs/list/RadioIcon.js +27 -0
- package/cjs/list/RadioIcon.js.map +1 -0
- package/cjs/list/common-hooks/keyUtils.js +78 -0
- package/cjs/list/common-hooks/keyUtils.js.map +1 -0
- package/cjs/list/common-hooks/list-dom-utils.js +25 -0
- package/cjs/list/common-hooks/list-dom-utils.js.map +1 -0
- package/cjs/list/common-hooks/useCollapsibleGroups.js +82 -0
- package/cjs/list/common-hooks/useCollapsibleGroups.js.map +1 -0
- package/cjs/list/common-hooks/useImperativeScrollingAPI.js +52 -0
- package/cjs/list/common-hooks/useImperativeScrollingAPI.js.map +1 -0
- package/cjs/list/common-hooks/useKeyboardNavigation.js +289 -0
- package/cjs/list/common-hooks/useKeyboardNavigation.js.map +1 -0
- package/cjs/list/common-hooks/useTypeahead.js +74 -0
- package/cjs/list/common-hooks/useTypeahead.js.map +1 -0
- package/cjs/list/common-hooks/useViewportTracking.js +133 -0
- package/cjs/list/common-hooks/useViewportTracking.js.map +1 -0
- package/cjs/list/common-hooks/utils/collection-item-utils.js +181 -0
- package/cjs/list/common-hooks/utils/collection-item-utils.js.map +1 -0
- package/cjs/list/common-hooks/utils/filter-utils.js +11 -0
- package/cjs/list/common-hooks/utils/filter-utils.js.map +1 -0
- package/cjs/list/common-hooks/utils/isSelected.js +9 -0
- package/cjs/list/common-hooks/utils/isSelected.js.map +1 -0
- package/cjs/list/useList.js +278 -0
- package/cjs/list/useList.js.map +1 -0
- package/cjs/list/useListDrop.js +92 -0
- package/cjs/list/useListDrop.js.map +1 -0
- package/cjs/list/useListHeight.js +77 -0
- package/cjs/list/useListHeight.js.map +1 -0
- package/cjs/list/useScrollPosition.js +74 -0
- package/cjs/list/useScrollPosition.js.map +1 -0
- package/cjs/measured-container/MeasuredContainer.css.js +6 -0
- package/cjs/measured-container/MeasuredContainer.css.js.map +1 -0
- package/cjs/measured-container/MeasuredContainer.js +69 -0
- package/cjs/measured-container/MeasuredContainer.js.map +1 -0
- package/cjs/measured-container/useMeasuredContainer.js +127 -0
- package/cjs/measured-container/useMeasuredContainer.js.map +1 -0
- package/cjs/measured-container/useResizeObserver.js +130 -0
- package/cjs/measured-container/useResizeObserver.js.map +1 -0
- package/cjs/overflow-container/OverflowContainer.css.js +6 -0
- package/cjs/overflow-container/OverflowContainer.css.js.map +1 -0
- package/cjs/overflow-container/OverflowContainer.js +142 -0
- package/cjs/overflow-container/OverflowContainer.js.map +1 -0
- package/cjs/overflow-container/overflow-utils.js +286 -0
- package/cjs/overflow-container/overflow-utils.js.map +1 -0
- package/cjs/overflow-container/useOverflowContainer.js +143 -0
- package/cjs/overflow-container/useOverflowContainer.js.map +1 -0
- package/cjs/price-ticker/PriceTicker.css.js +6 -0
- package/cjs/price-ticker/PriceTicker.css.js.map +1 -0
- package/cjs/price-ticker/PriceTicker.js +50 -0
- package/cjs/price-ticker/PriceTicker.js.map +1 -0
- package/cjs/split-button/SplitButton.css.js +6 -0
- package/cjs/split-button/SplitButton.css.js.map +1 -0
- package/cjs/split-button/SplitButton.js +81 -0
- package/cjs/split-button/SplitButton.js.map +1 -0
- package/cjs/split-button/SplitStateButton.css.js +6 -0
- package/cjs/split-button/SplitStateButton.css.js.map +1 -0
- package/cjs/split-button/SplitStateButton.js +31 -0
- package/cjs/split-button/SplitStateButton.js.map +1 -0
- package/cjs/split-button/useSplitButton.js +84 -0
- package/cjs/split-button/useSplitButton.js.map +1 -0
- package/cjs/tabstrip/Tab.css.js +6 -0
- package/cjs/tabstrip/Tab.css.js.map +1 -0
- package/cjs/tabstrip/Tab.js +151 -0
- package/cjs/tabstrip/Tab.js.map +1 -0
- package/cjs/tabstrip/TabMenu.css.js +6 -0
- package/cjs/tabstrip/TabMenu.css.js.map +1 -0
- package/cjs/tabstrip/TabMenu.js +72 -0
- package/cjs/tabstrip/TabMenu.js.map +1 -0
- package/cjs/tabstrip/TabMenuOptions.js +20 -0
- package/cjs/tabstrip/TabMenuOptions.js.map +1 -0
- package/cjs/tabstrip/Tabstrip.css.js +6 -0
- package/cjs/tabstrip/Tabstrip.css.js.map +1 -0
- package/cjs/tabstrip/Tabstrip.js +156 -0
- package/cjs/tabstrip/Tabstrip.js.map +1 -0
- package/cjs/tabstrip/tabstrip-dom-utils.js +19 -0
- package/cjs/tabstrip/tabstrip-dom-utils.js.map +1 -0
- package/cjs/tabstrip/useAnimatedSelectionThumb.js +85 -0
- package/cjs/tabstrip/useAnimatedSelectionThumb.js.map +1 -0
- package/cjs/tabstrip/useKeyboardNavigation.js +243 -0
- package/cjs/tabstrip/useKeyboardNavigation.js.map +1 -0
- package/cjs/tabstrip/useSelection.js +60 -0
- package/cjs/tabstrip/useSelection.js.map +1 -0
- package/cjs/tabstrip/useTabstrip.js +261 -0
- package/cjs/tabstrip/useTabstrip.js.map +1 -0
- package/cjs/toolbar/Toolbar.css.js +6 -0
- package/cjs/toolbar/Toolbar.css.js.map +1 -0
- package/cjs/toolbar/Toolbar.js +90 -0
- package/cjs/toolbar/Toolbar.js.map +1 -0
- package/cjs/toolbar/toolbar-dom-utils.js +18 -0
- package/cjs/toolbar/toolbar-dom-utils.js.map +1 -0
- package/cjs/toolbar/useKeyboardNavigation.js +305 -0
- package/cjs/toolbar/useKeyboardNavigation.js.map +1 -0
- package/cjs/toolbar/useSelection.js +94 -0
- package/cjs/toolbar/useSelection.js.map +1 -0
- package/cjs/toolbar/useToolbar.js +100 -0
- package/cjs/toolbar/useToolbar.js.map +1 -0
- package/cjs/tree/Tree.css.js +6 -0
- package/cjs/tree/Tree.css.js.map +1 -0
- package/cjs/tree/Tree.js +179 -0
- package/cjs/tree/Tree.js.map +1 -0
- package/cjs/tree/hierarchical-data-utils.js +72 -0
- package/cjs/tree/hierarchical-data-utils.js.map +1 -0
- package/cjs/tree/key-code.js +62 -0
- package/cjs/tree/key-code.js.map +1 -0
- package/cjs/tree/list-dom-utils.js +19 -0
- package/cjs/tree/list-dom-utils.js.map +1 -0
- package/cjs/tree/treeTypeUtils.js +6 -0
- package/cjs/tree/treeTypeUtils.js.map +1 -0
- package/cjs/tree/use-collapsible-groups.js +85 -0
- package/cjs/tree/use-collapsible-groups.js.map +1 -0
- package/cjs/tree/use-hierarchical-data.js +51 -0
- package/cjs/tree/use-hierarchical-data.js.map +1 -0
- package/cjs/tree/use-items-with-ids.js +100 -0
- package/cjs/tree/use-items-with-ids.js.map +1 -0
- package/cjs/tree/use-keyboard-navigation.js +144 -0
- package/cjs/tree/use-keyboard-navigation.js.map +1 -0
- package/cjs/tree/use-selection.js +154 -0
- package/cjs/tree/use-selection.js.map +1 -0
- package/cjs/tree/use-tree-keyboard-navigation.js +41 -0
- package/cjs/tree/use-tree-keyboard-navigation.js.map +1 -0
- package/cjs/tree/use-viewport-tracking.js +76 -0
- package/cjs/tree/use-viewport-tracking.js.map +1 -0
- package/cjs/tree/useTree.js +106 -0
- package/cjs/tree/useTree.js.map +1 -0
- package/cjs/utils/escapeRegExp.js +9 -0
- package/cjs/utils/escapeRegExp.js.map +1 -0
- package/cjs/utils/forwardCallbackProps.js +22 -0
- package/cjs/utils/forwardCallbackProps.js.map +1 -0
- package/cjs/utils/isOverflowElement.js +8 -0
- package/cjs/utils/isOverflowElement.js.map +1 -0
- package/cjs/vuu-input/VuuInput.css.js +6 -0
- package/cjs/vuu-input/VuuInput.css.js.map +1 -0
- package/cjs/vuu-input/VuuInput.js +105 -0
- package/cjs/vuu-input/VuuInput.js.map +1 -0
- package/esm/calendar/Calendar.css.js +4 -0
- package/esm/calendar/Calendar.css.js.map +1 -0
- package/esm/calendar/Calendar.js +72 -0
- package/esm/calendar/Calendar.js.map +1 -0
- package/esm/calendar/internal/CalendarCarousel.css.js +4 -0
- package/esm/calendar/internal/CalendarCarousel.css.js.map +1 -0
- package/esm/calendar/internal/CalendarCarousel.js +95 -0
- package/esm/calendar/internal/CalendarCarousel.js.map +1 -0
- package/esm/calendar/internal/CalendarContext.js +16 -0
- package/esm/calendar/internal/CalendarContext.js.map +1 -0
- package/esm/calendar/internal/CalendarDay.css.js +4 -0
- package/esm/calendar/internal/CalendarDay.css.js.map +1 -0
- package/esm/calendar/internal/CalendarDay.js +81 -0
- package/esm/calendar/internal/CalendarDay.js.map +1 -0
- package/esm/calendar/internal/CalendarMonth.css.js +4 -0
- package/esm/calendar/internal/CalendarMonth.css.js.map +1 -0
- package/esm/calendar/internal/CalendarMonth.js +71 -0
- package/esm/calendar/internal/CalendarMonth.js.map +1 -0
- package/esm/calendar/internal/CalendarNavigation.css.js +4 -0
- package/esm/calendar/internal/CalendarNavigation.css.js.map +1 -0
- package/esm/calendar/internal/CalendarNavigation.js +248 -0
- package/esm/calendar/internal/CalendarNavigation.js.map +1 -0
- package/esm/calendar/internal/CalendarWeekHeader.css.js +4 -0
- package/esm/calendar/internal/CalendarWeekHeader.css.js.map +1 -0
- package/esm/calendar/internal/CalendarWeekHeader.js +41 -0
- package/esm/calendar/internal/CalendarWeekHeader.js.map +1 -0
- package/esm/calendar/internal/useFocusManagement.js +61 -0
- package/esm/calendar/internal/useFocusManagement.js.map +1 -0
- package/esm/calendar/internal/utils.js +55 -0
- package/esm/calendar/internal/utils.js.map +1 -0
- package/esm/calendar/useCalendar.js +129 -0
- package/esm/calendar/useCalendar.js.map +1 -0
- package/esm/calendar/useCalendarDay.js +68 -0
- package/esm/calendar/useCalendarDay.js.map +1 -0
- package/esm/calendar/useSelection.js +239 -0
- package/esm/calendar/useSelection.js.map +1 -0
- package/esm/combo-box/ComboBox.js +189 -0
- package/esm/combo-box/ComboBox.js.map +1 -0
- package/esm/combo-box/useCombobox.js +356 -0
- package/esm/combo-box/useCombobox.js.map +1 -0
- package/esm/common-hooks/collectionProvider.js +20 -0
- package/esm/common-hooks/collectionProvider.js.map +1 -0
- package/esm/common-hooks/isPlainObject.js +4 -0
- package/esm/common-hooks/isPlainObject.js.map +1 -0
- package/esm/common-hooks/itemToString.js +22 -0
- package/esm/common-hooks/itemToString.js.map +1 -0
- package/esm/common-hooks/selectionTypes.js +10 -0
- package/esm/common-hooks/selectionTypes.js.map +1 -0
- package/esm/common-hooks/use-resize-observer.js +118 -0
- package/esm/common-hooks/use-resize-observer.js.map +1 -0
- package/esm/common-hooks/useCollectionItems.js +307 -0
- package/esm/common-hooks/useCollectionItems.js.map +1 -0
- package/esm/common-hooks/useControlled.js +56 -0
- package/esm/common-hooks/useControlled.js.map +1 -0
- package/esm/common-hooks/useSelection.js +205 -0
- package/esm/common-hooks/useSelection.js.map +1 -0
- package/esm/common-hooks/useStateRef.js +21 -0
- package/esm/common-hooks/useStateRef.js.map +1 -0
- package/esm/cycle-state-button/CycleStateButton.js +52 -0
- package/esm/cycle-state-button/CycleStateButton.js.map +1 -0
- package/esm/date-input/DateInput.css.js +4 -0
- package/esm/date-input/DateInput.css.js.map +1 -0
- package/esm/date-input/DateInput.js +88 -0
- package/esm/date-input/DateInput.js.map +1 -0
- package/esm/date-input/DateRangeInput.js +75 -0
- package/esm/date-input/DateRangeInput.js.map +1 -0
- package/esm/date-input/useDatePicker.js +18 -0
- package/esm/date-input/useDatePicker.js.map +1 -0
- package/esm/date-popup/DatePopup.js +88 -0
- package/esm/date-popup/DatePopup.js.map +1 -0
- package/esm/date-popup/useDatePopup.js +75 -0
- package/esm/date-popup/useDatePopup.js.map +1 -0
- package/esm/drag-drop/DragDropProvider.js +142 -0
- package/esm/drag-drop/DragDropProvider.js.map +1 -0
- package/esm/drag-drop/DragDropState.js +27 -0
- package/esm/drag-drop/DragDropState.js.map +1 -0
- package/esm/drag-drop/Draggable.css.js +4 -0
- package/esm/drag-drop/Draggable.css.js.map +1 -0
- package/esm/drag-drop/Draggable.js +90 -0
- package/esm/drag-drop/Draggable.js.map +1 -0
- package/esm/drag-drop/dragDropTypes.js +5 -0
- package/esm/drag-drop/dragDropTypes.js.map +1 -0
- package/esm/drag-drop/drop-target-utils.js +228 -0
- package/esm/drag-drop/drop-target-utils.js.map +1 -0
- package/esm/drag-drop/useAutoScroll.js +69 -0
- package/esm/drag-drop/useAutoScroll.js.map +1 -0
- package/esm/drag-drop/useDragDisplacers.js +158 -0
- package/esm/drag-drop/useDragDisplacers.js.map +1 -0
- package/esm/drag-drop/useDragDrop.js +497 -0
- package/esm/drag-drop/useDragDrop.js.map +1 -0
- package/esm/drag-drop/useDragDropCopy.js +31 -0
- package/esm/drag-drop/useDragDropCopy.js.map +1 -0
- package/esm/drag-drop/useDragDropIndicator.js +249 -0
- package/esm/drag-drop/useDragDropIndicator.js.map +1 -0
- package/esm/drag-drop/useDragDropNaturalMovement.js +262 -0
- package/esm/drag-drop/useDragDropNaturalMovement.js.map +1 -0
- package/esm/drag-drop/useDropIndicator.js +25 -0
- package/esm/drag-drop/useDropIndicator.js.map +1 -0
- package/esm/drag-drop/useGlobalDragDrop.js +87 -0
- package/esm/drag-drop/useGlobalDragDrop.js.map +1 -0
- package/esm/dropdown/Dropdown.css.js +4 -0
- package/esm/dropdown/Dropdown.css.js.map +1 -0
- package/esm/dropdown/Dropdown.js +148 -0
- package/esm/dropdown/Dropdown.js.map +1 -0
- package/esm/dropdown/DropdownBase.js +119 -0
- package/esm/dropdown/DropdownBase.js.map +1 -0
- package/esm/dropdown/DropdownButton.css.js +4 -0
- package/esm/dropdown/DropdownButton.css.js.map +1 -0
- package/esm/dropdown/DropdownButton.js +70 -0
- package/esm/dropdown/DropdownButton.js.map +1 -0
- package/esm/dropdown/useClickAway.js +64 -0
- package/esm/dropdown/useClickAway.js.map +1 -0
- package/esm/dropdown/useDropdown.js +113 -0
- package/esm/dropdown/useDropdown.js.map +1 -0
- package/esm/dropdown/useDropdownBase.js +167 -0
- package/esm/dropdown/useDropdownBase.js.map +1 -0
- package/esm/editable/editable-utils.js +35 -0
- package/esm/editable/editable-utils.js.map +1 -0
- package/esm/editable/useEditableText.js +103 -0
- package/esm/editable/useEditableText.js.map +1 -0
- package/esm/editable-label/EditableLabel.css.js +4 -0
- package/esm/editable-label/EditableLabel.css.js.map +1 -0
- package/esm/editable-label/EditableLabel.js +135 -0
- package/esm/editable-label/EditableLabel.js.map +1 -0
- package/esm/expando-input/ExpandoInput.css.js +4 -0
- package/esm/expando-input/ExpandoInput.css.js.map +1 -0
- package/esm/expando-input/ExpandoInput.js +51 -0
- package/esm/expando-input/ExpandoInput.js.map +1 -0
- package/esm/icon-button/Icon.css.js +4 -0
- package/esm/icon-button/Icon.css.js.map +1 -0
- package/esm/icon-button/Icon.js +35 -0
- package/esm/icon-button/Icon.js.map +1 -0
- package/esm/icon-button/IconButton.css.js +4 -0
- package/esm/icon-button/IconButton.css.js.map +1 -0
- package/esm/icon-button/IconButton.js +24 -0
- package/esm/icon-button/IconButton.js.map +1 -0
- package/esm/index.js +73 -0
- package/esm/index.js.map +1 -0
- package/esm/inputs/Checkbox.css.js +4 -0
- package/esm/inputs/Checkbox.css.js.map +1 -0
- package/esm/inputs/Checkbox.js +30 -0
- package/esm/inputs/Checkbox.js.map +1 -0
- package/esm/inputs/RadioButton.css.js +4 -0
- package/esm/inputs/RadioButton.css.js.map +1 -0
- package/esm/inputs/RadioButton.js +37 -0
- package/esm/inputs/RadioButton.js.map +1 -0
- package/esm/instrument-picker/InstrumentPicker.css.js +4 -0
- package/esm/instrument-picker/InstrumentPicker.css.js.map +1 -0
- package/esm/instrument-picker/InstrumentPicker.js +111 -0
- package/esm/instrument-picker/InstrumentPicker.js.map +1 -0
- package/esm/instrument-picker/SearchCell.css.js +4 -0
- package/esm/instrument-picker/SearchCell.css.js.map +1 -0
- package/esm/instrument-picker/SearchCell.js +31 -0
- package/esm/instrument-picker/SearchCell.js.map +1 -0
- package/esm/instrument-picker/useInstrumentPicker.js +85 -0
- package/esm/instrument-picker/useInstrumentPicker.js.map +1 -0
- package/esm/instrument-search/InstrumentSearch.css.js +4 -0
- package/esm/instrument-search/InstrumentSearch.css.js.map +1 -0
- package/esm/instrument-search/InstrumentSearch.js +94 -0
- package/esm/instrument-search/InstrumentSearch.js.map +1 -0
- package/esm/instrument-search/SearchCell.css.js +4 -0
- package/esm/instrument-search/SearchCell.css.js.map +1 -0
- package/esm/instrument-search/SearchCell.js +31 -0
- package/esm/instrument-search/SearchCell.js.map +1 -0
- package/esm/instrument-search/useInstrumentSearch.js +37 -0
- package/esm/instrument-search/useInstrumentSearch.js.map +1 -0
- package/esm/list/CheckboxIcon.css.js +4 -0
- package/esm/list/CheckboxIcon.css.js.map +1 -0
- package/esm/list/CheckboxIcon.js +31 -0
- package/esm/list/CheckboxIcon.js.map +1 -0
- package/esm/list/ChevronIcon.css.js +4 -0
- package/esm/list/ChevronIcon.css.js.map +1 -0
- package/esm/list/ChevronIcon.js +20 -0
- package/esm/list/ChevronIcon.js.map +1 -0
- package/esm/list/Highlighter.css.js +4 -0
- package/esm/list/Highlighter.css.js.map +1 -0
- package/esm/list/Highlighter.js +34 -0
- package/esm/list/Highlighter.js.map +1 -0
- package/esm/list/List.css.js +4 -0
- package/esm/list/List.css.js.map +1 -0
- package/esm/list/List.js +315 -0
- package/esm/list/List.js.map +1 -0
- package/esm/list/ListItem.css.js +4 -0
- package/esm/list/ListItem.css.js.map +1 -0
- package/esm/list/ListItem.js +81 -0
- package/esm/list/ListItem.js.map +1 -0
- package/esm/list/ListItemGroup.js +4 -0
- package/esm/list/ListItemGroup.js.map +1 -0
- package/esm/list/ListItemHeader.js +4 -0
- package/esm/list/ListItemHeader.js.map +1 -0
- package/esm/list/RadioIcon.css.js +4 -0
- package/esm/list/RadioIcon.css.js.map +1 -0
- package/esm/list/RadioIcon.js +25 -0
- package/esm/list/RadioIcon.js.map +1 -0
- package/esm/list/common-hooks/keyUtils.js +64 -0
- package/esm/list/common-hooks/keyUtils.js.map +1 -0
- package/esm/list/common-hooks/list-dom-utils.js +19 -0
- package/esm/list/common-hooks/list-dom-utils.js.map +1 -0
- package/esm/list/common-hooks/useCollapsibleGroups.js +80 -0
- package/esm/list/common-hooks/useCollapsibleGroups.js.map +1 -0
- package/esm/list/common-hooks/useImperativeScrollingAPI.js +50 -0
- package/esm/list/common-hooks/useImperativeScrollingAPI.js.map +1 -0
- package/esm/list/common-hooks/useKeyboardNavigation.js +286 -0
- package/esm/list/common-hooks/useKeyboardNavigation.js.map +1 -0
- package/esm/list/common-hooks/useTypeahead.js +72 -0
- package/esm/list/common-hooks/useTypeahead.js.map +1 -0
- package/esm/list/common-hooks/useViewportTracking.js +131 -0
- package/esm/list/common-hooks/useViewportTracking.js.map +1 -0
- package/esm/list/common-hooks/utils/collection-item-utils.js +167 -0
- package/esm/list/common-hooks/utils/collection-item-utils.js.map +1 -0
- package/esm/list/common-hooks/utils/filter-utils.js +8 -0
- package/esm/list/common-hooks/utils/filter-utils.js.map +1 -0
- package/esm/list/common-hooks/utils/isSelected.js +7 -0
- package/esm/list/common-hooks/utils/isSelected.js.map +1 -0
- package/esm/list/useList.js +276 -0
- package/esm/list/useList.js.map +1 -0
- package/esm/list/useListDrop.js +90 -0
- package/esm/list/useListDrop.js.map +1 -0
- package/esm/list/useListHeight.js +75 -0
- package/esm/list/useListHeight.js.map +1 -0
- package/esm/list/useScrollPosition.js +72 -0
- package/esm/list/useScrollPosition.js.map +1 -0
- package/esm/measured-container/MeasuredContainer.css.js +4 -0
- package/esm/measured-container/MeasuredContainer.css.js.map +1 -0
- package/esm/measured-container/MeasuredContainer.js +67 -0
- package/esm/measured-container/MeasuredContainer.js.map +1 -0
- package/esm/measured-container/useMeasuredContainer.js +125 -0
- package/esm/measured-container/useMeasuredContainer.js.map +1 -0
- package/esm/measured-container/useResizeObserver.js +128 -0
- package/esm/measured-container/useResizeObserver.js.map +1 -0
- package/esm/overflow-container/OverflowContainer.css.js +4 -0
- package/esm/overflow-container/OverflowContainer.css.js.map +1 -0
- package/esm/overflow-container/OverflowContainer.js +140 -0
- package/esm/overflow-container/OverflowContainer.js.map +1 -0
- package/esm/overflow-container/overflow-utils.js +272 -0
- package/esm/overflow-container/overflow-utils.js.map +1 -0
- package/esm/overflow-container/useOverflowContainer.js +141 -0
- package/esm/overflow-container/useOverflowContainer.js.map +1 -0
- package/esm/price-ticker/PriceTicker.css.js +4 -0
- package/esm/price-ticker/PriceTicker.css.js.map +1 -0
- package/esm/price-ticker/PriceTicker.js +48 -0
- package/esm/price-ticker/PriceTicker.js.map +1 -0
- package/esm/split-button/SplitButton.css.js +4 -0
- package/esm/split-button/SplitButton.css.js.map +1 -0
- package/esm/split-button/SplitButton.js +79 -0
- package/esm/split-button/SplitButton.js.map +1 -0
- package/esm/split-button/SplitStateButton.css.js +4 -0
- package/esm/split-button/SplitStateButton.css.js.map +1 -0
- package/esm/split-button/SplitStateButton.js +29 -0
- package/esm/split-button/SplitStateButton.js.map +1 -0
- package/esm/split-button/useSplitButton.js +82 -0
- package/esm/split-button/useSplitButton.js.map +1 -0
- package/esm/tabstrip/Tab.css.js +4 -0
- package/esm/tabstrip/Tab.css.js.map +1 -0
- package/esm/tabstrip/Tab.js +149 -0
- package/esm/tabstrip/Tab.js.map +1 -0
- package/esm/tabstrip/TabMenu.css.js +4 -0
- package/esm/tabstrip/TabMenu.css.js.map +1 -0
- package/esm/tabstrip/TabMenu.js +70 -0
- package/esm/tabstrip/TabMenu.js.map +1 -0
- package/esm/tabstrip/TabMenuOptions.js +16 -0
- package/esm/tabstrip/TabMenuOptions.js.map +1 -0
- package/esm/tabstrip/Tabstrip.css.js +4 -0
- package/esm/tabstrip/Tabstrip.css.js.map +1 -0
- package/esm/tabstrip/Tabstrip.js +154 -0
- package/esm/tabstrip/Tabstrip.js.map +1 -0
- package/esm/tabstrip/tabstrip-dom-utils.js +16 -0
- package/esm/tabstrip/tabstrip-dom-utils.js.map +1 -0
- package/esm/tabstrip/useAnimatedSelectionThumb.js +83 -0
- package/esm/tabstrip/useAnimatedSelectionThumb.js.map +1 -0
- package/esm/tabstrip/useKeyboardNavigation.js +241 -0
- package/esm/tabstrip/useKeyboardNavigation.js.map +1 -0
- package/esm/tabstrip/useSelection.js +58 -0
- package/esm/tabstrip/useSelection.js.map +1 -0
- package/esm/tabstrip/useTabstrip.js +259 -0
- package/esm/tabstrip/useTabstrip.js.map +1 -0
- package/esm/toolbar/Toolbar.css.js +4 -0
- package/esm/toolbar/Toolbar.css.js.map +1 -0
- package/esm/toolbar/Toolbar.js +88 -0
- package/esm/toolbar/Toolbar.js.map +1 -0
- package/esm/toolbar/toolbar-dom-utils.js +15 -0
- package/esm/toolbar/toolbar-dom-utils.js.map +1 -0
- package/esm/toolbar/useKeyboardNavigation.js +303 -0
- package/esm/toolbar/useKeyboardNavigation.js.map +1 -0
- package/esm/toolbar/useSelection.js +92 -0
- package/esm/toolbar/useSelection.js.map +1 -0
- package/esm/toolbar/useToolbar.js +98 -0
- package/esm/toolbar/useToolbar.js.map +1 -0
- package/esm/tree/Tree.css.js +4 -0
- package/esm/tree/Tree.css.js.map +1 -0
- package/esm/tree/Tree.js +176 -0
- package/esm/tree/Tree.js.map +1 -0
- package/esm/tree/hierarchical-data-utils.js +65 -0
- package/esm/tree/hierarchical-data-utils.js.map +1 -0
- package/esm/tree/key-code.js +54 -0
- package/esm/tree/key-code.js.map +1 -0
- package/esm/tree/list-dom-utils.js +15 -0
- package/esm/tree/list-dom-utils.js.map +1 -0
- package/esm/tree/treeTypeUtils.js +4 -0
- package/esm/tree/treeTypeUtils.js.map +1 -0
- package/esm/tree/use-collapsible-groups.js +83 -0
- package/esm/tree/use-collapsible-groups.js.map +1 -0
- package/esm/tree/use-hierarchical-data.js +49 -0
- package/esm/tree/use-hierarchical-data.js.map +1 -0
- package/esm/tree/use-items-with-ids.js +98 -0
- package/esm/tree/use-items-with-ids.js.map +1 -0
- package/esm/tree/use-keyboard-navigation.js +142 -0
- package/esm/tree/use-keyboard-navigation.js.map +1 -0
- package/esm/tree/use-selection.js +147 -0
- package/esm/tree/use-selection.js.map +1 -0
- package/esm/tree/use-tree-keyboard-navigation.js +39 -0
- package/esm/tree/use-tree-keyboard-navigation.js.map +1 -0
- package/esm/tree/use-viewport-tracking.js +74 -0
- package/esm/tree/use-viewport-tracking.js.map +1 -0
- package/esm/tree/useTree.js +104 -0
- package/esm/tree/useTree.js.map +1 -0
- package/esm/utils/escapeRegExp.js +7 -0
- package/esm/utils/escapeRegExp.js.map +1 -0
- package/esm/utils/forwardCallbackProps.js +20 -0
- package/esm/utils/forwardCallbackProps.js.map +1 -0
- package/esm/utils/isOverflowElement.js +6 -0
- package/esm/utils/isOverflowElement.js.map +1 -0
- package/esm/vuu-input/VuuInput.css.js +4 -0
- package/esm/vuu-input/VuuInput.css.js.map +1 -0
- package/esm/vuu-input/VuuInput.js +103 -0
- package/esm/vuu-input/VuuInput.js.map +1 -0
- package/package.json +45 -0
- package/types/calendar/Calendar.d.ts +12 -0
- package/types/calendar/index.d.ts +4 -0
- package/types/calendar/internal/CalendarCarousel.d.ts +4 -0
- package/types/calendar/internal/CalendarContext.d.ts +9 -0
- package/types/calendar/internal/CalendarDay.d.ts +14 -0
- package/types/calendar/internal/CalendarMonth.d.ts +11 -0
- package/types/calendar/internal/CalendarNavigation.d.ts +20 -0
- package/types/calendar/internal/CalendarWeekHeader.d.ts +5 -0
- package/types/calendar/internal/useFocusManagement.d.ts +9 -0
- package/types/calendar/internal/utils.d.ts +14 -0
- package/types/calendar/useCalendar.d.ts +57 -0
- package/types/calendar/useCalendarDay.d.ts +19 -0
- package/types/calendar/useSelection.d.ts +75 -0
- package/types/combo-box/ComboBox.d.ts +24 -0
- package/types/combo-box/index.d.ts +1 -0
- package/types/combo-box/useCombobox.d.ts +20 -0
- package/types/common-hooks/collectionProvider.d.ts +13 -0
- package/types/common-hooks/collectionTypes.d.ts +58 -0
- package/types/common-hooks/index.d.ts +9 -0
- package/types/common-hooks/isPlainObject.d.ts +1 -0
- package/types/common-hooks/itemToString.d.ts +2 -0
- package/types/common-hooks/navigationTypes.d.ts +36 -0
- package/types/common-hooks/selectionTypes.d.ts +70 -0
- package/types/common-hooks/use-resize-observer.d.ts +16 -0
- package/types/common-hooks/useCollectionItems.d.ts +2 -0
- package/types/common-hooks/useControlled.d.ts +24 -0
- package/types/common-hooks/useSelection.d.ts +8 -0
- package/types/common-hooks/useStateRef.d.ts +2 -0
- package/types/cycle-state-button/CycleStateButton.d.ts +12 -0
- package/types/cycle-state-button/index.d.ts +1 -0
- package/types/date-input/DateInput.d.ts +12 -0
- package/types/date-input/DateRangeInput.d.ts +11 -0
- package/types/date-input/index.d.ts +2 -0
- package/types/date-input/types.d.ts +16 -0
- package/types/date-input/useBaseDatePickerDropdown.d.ts +15 -0
- package/types/date-input/useDatePicker.d.ts +7 -0
- package/types/date-popup/DatePopup.d.ts +12 -0
- package/types/date-popup/index.d.ts +1 -0
- package/types/date-popup/useDatePopup.d.ts +20 -0
- package/types/drag-drop/DragDropProvider.d.ts +38 -0
- package/types/drag-drop/DragDropState.d.ts +15 -0
- package/types/drag-drop/Draggable.d.ts +13 -0
- package/types/drag-drop/DropIndicator.d.ts +6 -0
- package/types/drag-drop/dragDropTypes.d.ts +100 -0
- package/types/drag-drop/drop-target-utils.d.ts +78 -0
- package/types/drag-drop/index.d.ts +6 -0
- package/types/drag-drop/useAutoScroll.d.ts +11 -0
- package/types/drag-drop/useDragDisplacers.d.ts +17 -0
- package/types/drag-drop/useDragDrop.d.ts +2 -0
- package/types/drag-drop/useDragDropCopy.d.ts +6 -0
- package/types/drag-drop/useDragDropIndicator.d.ts +2 -0
- package/types/drag-drop/useDragDropNaturalMovement.d.ts +2 -0
- package/types/drag-drop/useDropIndicator.d.ts +8 -0
- package/types/drag-drop/useGlobalDragDrop.d.ts +12 -0
- package/types/drag-drop/useTransition.d.ts +3 -0
- package/types/dropdown/Dropdown.d.ts +10 -0
- package/types/dropdown/DropdownBase.d.ts +9 -0
- package/types/dropdown/DropdownButton.d.ts +41 -0
- package/types/dropdown/dropdownTypes.d.ts +51 -0
- package/types/dropdown/index.d.ts +5 -0
- package/types/dropdown/useClickAway.d.ts +10 -0
- package/types/dropdown/useDropdown.d.ts +13 -0
- package/types/dropdown/useDropdownBase.d.ts +2 -0
- package/types/editable/editable-utils.d.ts +2 -0
- package/types/editable/index.d.ts +2 -0
- package/types/editable/useEditableText.d.ts +19 -0
- package/types/editable-label/EditableLabel.d.ts +19 -0
- package/types/editable-label/index.d.ts +1 -0
- package/types/expando-input/ExpandoInput.d.ts +6 -0
- package/types/expando-input/index.d.ts +1 -0
- package/types/icon-button/Icon.d.ts +6 -0
- package/types/icon-button/IconButton.d.ts +7 -0
- package/types/icon-button/index.d.ts +2 -0
- package/types/index.d.ts +27 -0
- package/types/inputs/Checkbox.d.ts +9 -0
- package/types/inputs/RadioButton.d.ts +9 -0
- package/types/inputs/index.d.ts +2 -0
- package/types/instrument-picker/InstrumentPicker.d.ts +24 -0
- package/types/instrument-picker/SearchCell.d.ts +3 -0
- package/types/instrument-picker/index.d.ts +1 -0
- package/types/instrument-picker/moving-window.d.ts +14 -0
- package/types/instrument-picker/useDataSource.d.ts +6 -0
- package/types/instrument-picker/useInstrumentPicker.d.ts +28 -0
- package/types/instrument-search/InstrumentSearch.d.ts +11 -0
- package/types/instrument-search/SearchCell.d.ts +3 -0
- package/types/instrument-search/index.d.ts +1 -0
- package/types/instrument-search/moving-window.d.ts +14 -0
- package/types/instrument-search/useDataSource.d.ts +6 -0
- package/types/instrument-search/useInstrumentSearch.d.ts +13 -0
- package/types/list/CheckboxIcon.d.ts +6 -0
- package/types/list/ChevronIcon.d.ts +7 -0
- package/types/list/Highlighter.d.ts +6 -0
- package/types/list/List.d.ts +6 -0
- package/types/list/ListItem.d.ts +6 -0
- package/types/list/ListItemGroup.d.ts +6 -0
- package/types/list/ListItemHeader.d.ts +5 -0
- package/types/list/RadioIcon.d.ts +5 -0
- package/types/list/common-hooks/index.d.ts +10 -0
- package/types/list/common-hooks/keyUtils.d.ts +14 -0
- package/types/list/common-hooks/list-dom-utils.d.ts +5 -0
- package/types/list/common-hooks/useCollapsibleGroups.d.ts +14 -0
- package/types/list/common-hooks/useImperativeScrollingAPI.d.ts +14 -0
- package/types/list/common-hooks/useKeyboardNavigation.d.ts +3 -0
- package/types/list/common-hooks/useTypeahead.d.ts +15 -0
- package/types/list/common-hooks/useViewportTracking.d.ts +14 -0
- package/types/list/common-hooks/utils/collection-item-utils.d.ts +21 -0
- package/types/list/common-hooks/utils/filter-utils.d.ts +4 -0
- package/types/list/common-hooks/utils/index.d.ts +4 -0
- package/types/list/common-hooks/utils/isSelected.d.ts +2 -0
- package/types/list/index.d.ts +10 -0
- package/types/list/keyset.d.ts +9 -0
- package/types/list/listTypes.d.ts +200 -0
- package/types/list/useList.d.ts +3 -0
- package/types/list/useListDrop.d.ts +15 -0
- package/types/list/useListHeight.d.ts +19 -0
- package/types/list/useScrollPosition.d.ts +19 -0
- package/types/measured-container/MeasuredContainer.d.ts +14 -0
- package/types/measured-container/index.d.ts +2 -0
- package/types/measured-container/useMeasuredContainer.d.ts +22 -0
- package/types/measured-container/useResizeObserver.d.ts +15 -0
- package/types/overflow-container/OverflowContainer.d.ts +15 -0
- package/types/overflow-container/index.d.ts +2 -0
- package/types/overflow-container/overflow-utils.d.ts +48 -0
- package/types/overflow-container/useOverflowContainer.d.ts +20 -0
- package/types/price-ticker/PriceTicker.d.ts +7 -0
- package/types/price-ticker/index.d.ts +1 -0
- package/types/split-button/SplitButton.d.ts +11 -0
- package/types/split-button/SplitStateButton.d.ts +6 -0
- package/types/split-button/index.d.ts +2 -0
- package/types/split-button/useSplitButton.d.ts +288 -0
- package/types/tabstrip/Tab.d.ts +26 -0
- package/types/tabstrip/TabMenu.d.ts +19 -0
- package/types/tabstrip/TabMenuOptions.d.ts +10 -0
- package/types/tabstrip/TabsTypes.d.ts +127 -0
- package/types/tabstrip/Tabstrip.d.ts +3 -0
- package/types/tabstrip/index.d.ts +4 -0
- package/types/tabstrip/tabstrip-dom-utils.d.ts +2 -0
- package/types/tabstrip/useAnimatedSelectionThumb.d.ts +7 -0
- package/types/tabstrip/useKeyboardNavigation.d.ts +29 -0
- package/types/tabstrip/useSelection.d.ts +13 -0
- package/types/tabstrip/useTabstrip.d.ts +49 -0
- package/types/toolbar/Toolbar.d.ts +20 -0
- package/types/toolbar/index.d.ts +1 -0
- package/types/toolbar/toolbar-dom-utils.d.ts +3 -0
- package/types/toolbar/useKeyboardNavigation.d.ts +32 -0
- package/types/toolbar/useSelection.d.ts +22 -0
- package/types/toolbar/useToolbar.d.ts +28 -0
- package/types/tree/Tree.d.ts +19 -0
- package/types/tree/hierarchical-data-utils.d.ts +8 -0
- package/types/tree/index.d.ts +4 -0
- package/types/tree/key-code.d.ts +11 -0
- package/types/tree/list-dom-utils.d.ts +6 -0
- package/types/tree/treeTypeUtils.d.ts +2 -0
- package/types/tree/treeTypes.d.ts +17 -0
- package/types/tree/use-collapsible-groups.d.ts +18 -0
- package/types/tree/use-hierarchical-data.d.ts +6 -0
- package/types/tree/use-items-with-ids.d.ts +8 -0
- package/types/tree/use-keyboard-navigation.d.ts +26 -0
- package/types/tree/use-selection.d.ts +31 -0
- package/types/tree/use-tree-keyboard-navigation.d.ts +12 -0
- package/types/tree/use-viewport-tracking.d.ts +2 -0
- package/types/tree/useTree.d.ts +30 -0
- package/types/utils/escapeRegExp.d.ts +1 -0
- package/types/utils/forwardCallbackProps.d.ts +3 -0
- package/types/utils/index.d.ts +3 -0
- package/types/utils/isOverflowElement.d.ts +1 -0
- package/types/vuu-input/VuuInput.d.ts +16 -0
- package/types/vuu-input/index.d.ts +1 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useId, asReactElements } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import cx from 'clsx';
|
|
4
|
+
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
5
|
+
import { useWindow } from '@salt-ds/window';
|
|
6
|
+
import React, { useRef, useMemo } from 'react';
|
|
7
|
+
import { OverflowContainer } from '../overflow-container/OverflowContainer.js';
|
|
8
|
+
import { useToolbar } from './useToolbar.js';
|
|
9
|
+
import { forwardCallbackProps } from '../utils/forwardCallbackProps.js';
|
|
10
|
+
import toolbarCss from './Toolbar.css.js';
|
|
11
|
+
|
|
12
|
+
const classBase = "vuuToolbar";
|
|
13
|
+
const Toolbar = ({
|
|
14
|
+
activeItemIndex: activeItemIndexProp,
|
|
15
|
+
alignItems = "start",
|
|
16
|
+
defaultActiveItemIndex,
|
|
17
|
+
children,
|
|
18
|
+
className,
|
|
19
|
+
id: idProp,
|
|
20
|
+
onActiveChange,
|
|
21
|
+
onNavigateOutOfBounds,
|
|
22
|
+
orientation = "horizontal",
|
|
23
|
+
selectionStrategy = "none",
|
|
24
|
+
showSeparators = false,
|
|
25
|
+
...props
|
|
26
|
+
}) => {
|
|
27
|
+
const targetWindow = useWindow();
|
|
28
|
+
useComponentCssInjection({
|
|
29
|
+
testId: "vuu-toolbar",
|
|
30
|
+
css: toolbarCss,
|
|
31
|
+
window: targetWindow
|
|
32
|
+
});
|
|
33
|
+
const rootRef = useRef(null);
|
|
34
|
+
const {
|
|
35
|
+
activeItemIndex,
|
|
36
|
+
focusableIdx,
|
|
37
|
+
focusVisible,
|
|
38
|
+
itemProps,
|
|
39
|
+
...toolbarHook
|
|
40
|
+
} = useToolbar({
|
|
41
|
+
activeItemIndex: activeItemIndexProp,
|
|
42
|
+
defaultActiveItemIndex,
|
|
43
|
+
containerRef: rootRef,
|
|
44
|
+
onActiveChange,
|
|
45
|
+
onNavigateOutOfBounds,
|
|
46
|
+
orientation,
|
|
47
|
+
selectionStrategy
|
|
48
|
+
});
|
|
49
|
+
const id = useId(idProp);
|
|
50
|
+
const items = useMemo(
|
|
51
|
+
() => asReactElements(children).map((child, index) => {
|
|
52
|
+
const {
|
|
53
|
+
id: itemId = `${id}-tab-${index}`,
|
|
54
|
+
className: itemClassName,
|
|
55
|
+
...ownProps
|
|
56
|
+
} = child.props;
|
|
57
|
+
const selected = activeItemIndex.includes(index);
|
|
58
|
+
return React.cloneElement(child, {
|
|
59
|
+
...forwardCallbackProps(ownProps, itemProps),
|
|
60
|
+
className: cx("vuuToolbarItem", itemClassName),
|
|
61
|
+
"data-overflow-priority": selected ? "1" : void 0,
|
|
62
|
+
id: itemId,
|
|
63
|
+
key: index,
|
|
64
|
+
"aria-selected": selected,
|
|
65
|
+
tabIndex: focusableIdx === index ? 0 : -1
|
|
66
|
+
});
|
|
67
|
+
}),
|
|
68
|
+
[activeItemIndex, children, focusableIdx, id, itemProps]
|
|
69
|
+
);
|
|
70
|
+
return /* @__PURE__ */ jsx(
|
|
71
|
+
OverflowContainer,
|
|
72
|
+
{
|
|
73
|
+
...props,
|
|
74
|
+
...toolbarHook.containerProps,
|
|
75
|
+
className: cx(className, classBase, `${classBase}-${orientation}`, {
|
|
76
|
+
[`${classBase}-alignCenter`]: alignItems === "center",
|
|
77
|
+
[`${classBase}-alignEnd`]: alignItems === "end",
|
|
78
|
+
[`${classBase}-withSeparators`]: showSeparators
|
|
79
|
+
}),
|
|
80
|
+
...props,
|
|
81
|
+
ref: rootRef,
|
|
82
|
+
children: items
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export { Toolbar };
|
|
88
|
+
//# sourceMappingURL=Toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sources":["../../src/toolbar/Toolbar.tsx"],"sourcesContent":["import { asReactElements, useId } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport React, { useMemo, useRef } from \"react\";\nimport {\n OverflowContainer,\n OverflowContainerProps,\n} from \"../overflow-container\";\nimport { useToolbar } from \"./useToolbar\";\nimport { forwardCallbackProps } from \"../utils\";\n\nimport toolbarCss from \"./Toolbar.css\";\nimport {\n SelectionStrategy,\n SpecialKeyMultipleSelection,\n} from \"../common-hooks\";\n\nconst classBase = \"vuuToolbar\";\n\nexport type ActiveItemChangeHandler = (itemIndex: number[]) => void;\n\nexport type NavigationOutOfBoundsHandler = (direction: \"start\" | \"end\") => void;\nexport interface ToolbarProps extends OverflowContainerProps {\n activeItemIndex?: number[];\n alignItems?: \"start\" | \"center\" | \"end\";\n defaultActiveItemIndex?: number[];\n onActiveChange?: ActiveItemChangeHandler;\n /**\n * Indicates that user has used Arrow key navigation to move beyond the\n * last or before the first item. A higher level component may want to\n * use this to implement a seamless navigation across components.\n */\n onNavigateOutOfBounds?: NavigationOutOfBoundsHandler;\n selectionStrategy?: SelectionStrategy | SpecialKeyMultipleSelection;\n showSeparators?: boolean;\n}\n\nexport const Toolbar = ({\n activeItemIndex: activeItemIndexProp,\n alignItems = \"start\",\n defaultActiveItemIndex,\n children,\n className,\n id: idProp,\n onActiveChange,\n onNavigateOutOfBounds,\n orientation = \"horizontal\",\n selectionStrategy = \"none\",\n showSeparators = false,\n ...props\n}: ToolbarProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-toolbar\",\n css: toolbarCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const {\n activeItemIndex,\n focusableIdx,\n focusVisible,\n itemProps,\n ...toolbarHook\n } = useToolbar({\n activeItemIndex: activeItemIndexProp,\n defaultActiveItemIndex,\n containerRef: rootRef,\n onActiveChange,\n onNavigateOutOfBounds,\n orientation,\n selectionStrategy,\n });\n\n const id = useId(idProp);\n\n const items = useMemo(\n () =>\n asReactElements(children).map((child, index) => {\n const {\n id: itemId = `${id}-tab-${index}`,\n className: itemClassName,\n ...ownProps\n } = child.props;\n const selected = activeItemIndex.includes(index);\n return React.cloneElement(child, {\n ...forwardCallbackProps(ownProps, itemProps),\n className: cx(\"vuuToolbarItem\", itemClassName),\n \"data-overflow-priority\": selected ? \"1\" : undefined,\n id: itemId,\n key: index,\n \"aria-selected\": selected,\n tabIndex: focusableIdx === index ? 0 : -1,\n });\n }),\n [activeItemIndex, children, focusableIdx, id, itemProps]\n );\n\n return (\n <OverflowContainer\n {...props}\n {...toolbarHook.containerProps}\n className={cx(className, classBase, `${classBase}-${orientation}`, {\n [`${classBase}-alignCenter`]: alignItems === \"center\",\n [`${classBase}-alignEnd`]: alignItems === \"end\",\n [`${classBase}-withSeparators`]: showSeparators,\n })}\n {...props}\n ref={rootRef}\n >\n {items}\n </OverflowContainer>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getElementDataIndex } from '@vuu-ui/vuu-utils';
|
|
2
|
+
|
|
3
|
+
const getIndexOfItem = (container, query) => {
|
|
4
|
+
if (container) {
|
|
5
|
+
const targetTab = container.querySelector(
|
|
6
|
+
`[data-index]:has(${query})`
|
|
7
|
+
);
|
|
8
|
+
return getElementDataIndex(targetTab);
|
|
9
|
+
}
|
|
10
|
+
return -1;
|
|
11
|
+
};
|
|
12
|
+
const getIndexOfEditedItem = (container) => getIndexOfItem(container, ".vuuEditableLabel-editing");
|
|
13
|
+
|
|
14
|
+
export { getIndexOfEditedItem, getIndexOfItem };
|
|
15
|
+
//# sourceMappingURL=toolbar-dom-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbar-dom-utils.js","sources":["../../src/toolbar/toolbar-dom-utils.ts"],"sourcesContent":["import { getElementDataIndex } from \"@vuu-ui/vuu-utils\";\n\nexport const getIndexOfItem = (\n container: HTMLElement | null,\n query: string\n) => {\n if (container) {\n const targetTab = container.querySelector(\n `[data-index]:has(${query})`\n ) as HTMLElement;\n return getElementDataIndex(targetTab);\n }\n return -1;\n};\n\nexport const getIndexOfSelectedTab = (container: HTMLElement | null) =>\n getIndexOfItem(container, '[aria-selected=\"true\"]');\n\nexport const getIndexOfEditedItem = (container: HTMLElement | null) =>\n getIndexOfItem(container, \".vuuEditableLabel-editing\");\n"],"names":[],"mappings":";;AAEa,MAAA,cAAA,GAAiB,CAC5B,SAAA,EACA,KACG,KAAA;AACH,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,MAAM,YAAY,SAAU,CAAA,aAAA;AAAA,MAC1B,oBAAoB,KAAK,CAAA,CAAA,CAAA;AAAA,KAC3B,CAAA;AACA,IAAA,OAAO,oBAAoB,SAAS,CAAA,CAAA;AAAA,GACtC;AACA,EAAO,OAAA,CAAA,CAAA,CAAA;AACT,EAAA;AAKO,MAAM,oBAAuB,GAAA,CAAC,SACnC,KAAA,cAAA,CAAe,WAAW,2BAA2B;;;;"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { useControlled } from '@salt-ds/core';
|
|
2
|
+
import { dispatchMouseEvent, Home, End, ArrowLeft, ArrowRight, ArrowUp, ArrowDown, getFocusableElement, getElementDataIndex, getClosest } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import { useRef, useState, useCallback } from 'react';
|
|
4
|
+
import { getIndexOfEditedItem } from './toolbar-dom-utils.js';
|
|
5
|
+
|
|
6
|
+
const navigation = {
|
|
7
|
+
horizontal: {
|
|
8
|
+
[Home]: "start",
|
|
9
|
+
[End]: "end",
|
|
10
|
+
[ArrowLeft]: "bwd",
|
|
11
|
+
[ArrowRight]: "fwd"
|
|
12
|
+
},
|
|
13
|
+
vertical: {
|
|
14
|
+
[Home]: "start",
|
|
15
|
+
[End]: "end",
|
|
16
|
+
[ArrowUp]: "bwd",
|
|
17
|
+
[ArrowDown]: "fwd"
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const isOverflowIndicator = (el) => el !== null && el.dataset.index === "overflow";
|
|
21
|
+
const itemIsNotFocusable = (container, direction, indexCount, nextIdx, hasOverflowedItem) => {
|
|
22
|
+
if (container) {
|
|
23
|
+
const withinRangeBwd = direction === "bwd" && nextIdx > 0;
|
|
24
|
+
const withinRangeFwd = direction === "fwd" && nextIdx < indexCount;
|
|
25
|
+
const withinRange = withinRangeBwd || withinRangeFwd;
|
|
26
|
+
const nextElement = getElementByPosition(container, nextIdx, true);
|
|
27
|
+
const isOverflowedItem = hasOverflowedItem && !isNonWrappedElement(nextElement);
|
|
28
|
+
const isHiddenOverflowIndicator = !hasOverflowedItem && isOverflowIndicator(nextElement);
|
|
29
|
+
hasOverflowedItem && !isNonWrappedElement(nextElement);
|
|
30
|
+
return withinRange && (isOverflowedItem || isHiddenOverflowIndicator);
|
|
31
|
+
} else {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const isNavigationKey = (key, orientation = "horizontal") => navigation[orientation][key] !== void 0;
|
|
36
|
+
const isMenuActivationKey = (key) => key === ArrowDown;
|
|
37
|
+
function nextItemIdx(count, direction, idx) {
|
|
38
|
+
if (direction === "start") {
|
|
39
|
+
return 0;
|
|
40
|
+
} else if (direction === "end") {
|
|
41
|
+
return count - 1;
|
|
42
|
+
} else if (direction === "bwd") {
|
|
43
|
+
if (idx > 0) {
|
|
44
|
+
return idx - 1;
|
|
45
|
+
} else {
|
|
46
|
+
return idx;
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
if (idx === null) {
|
|
50
|
+
return 0;
|
|
51
|
+
} else if (idx === count - 1) {
|
|
52
|
+
return idx;
|
|
53
|
+
} else {
|
|
54
|
+
return idx + 1;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const isNonWrappedElement = (element) => element !== null && !element.classList.contains("wrapped");
|
|
59
|
+
const getToolbarItems = (container) => Array.from(container.querySelectorAll("[data-index]"));
|
|
60
|
+
const getIndexOfOverflowItem = (container) => {
|
|
61
|
+
if (container === null) {
|
|
62
|
+
return -1;
|
|
63
|
+
} else {
|
|
64
|
+
const targets = getToolbarItems(container);
|
|
65
|
+
const indexValues = targets.map((el) => el.dataset.index);
|
|
66
|
+
return indexValues.indexOf("overflow");
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const getElementByPosition = (container, index, includeOverflowInd = false) => {
|
|
70
|
+
if (container !== null) {
|
|
71
|
+
const targets = getToolbarItems(container);
|
|
72
|
+
const target = targets[index];
|
|
73
|
+
if (!includeOverflowInd && isOverflowIndicator(target)) {
|
|
74
|
+
return null;
|
|
75
|
+
} else {
|
|
76
|
+
return target;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
};
|
|
81
|
+
const useKeyboardNavigation = ({
|
|
82
|
+
containerRef,
|
|
83
|
+
defaultHighlightedIdx = -1,
|
|
84
|
+
highlightedIdx: highlightedIdxProp,
|
|
85
|
+
onNavigateOutOfBounds,
|
|
86
|
+
orientation
|
|
87
|
+
}) => {
|
|
88
|
+
const mouseClickPending = useRef(false);
|
|
89
|
+
const focusedRef = useRef(-1);
|
|
90
|
+
const [hasFocus, setHasFocus] = useState(false);
|
|
91
|
+
const [highlightedIdx, _setHighlightedIdx] = useControlled({
|
|
92
|
+
controlled: highlightedIdxProp,
|
|
93
|
+
default: defaultHighlightedIdx,
|
|
94
|
+
name: "UseKeyboardNavigation"
|
|
95
|
+
});
|
|
96
|
+
const setHighlightedIdx = useCallback(
|
|
97
|
+
(value) => {
|
|
98
|
+
_setHighlightedIdx(focusedRef.current = value);
|
|
99
|
+
},
|
|
100
|
+
[_setHighlightedIdx]
|
|
101
|
+
);
|
|
102
|
+
const keyboardNavigation = useRef(false);
|
|
103
|
+
const focusItem = useCallback(
|
|
104
|
+
(itemIndex, immediateFocus = false, withKeyboard, delay = 70) => {
|
|
105
|
+
console.log(`focus item ${itemIndex}`);
|
|
106
|
+
setHighlightedIdx(itemIndex);
|
|
107
|
+
if (withKeyboard === true && !keyboardNavigation.current) {
|
|
108
|
+
keyboardNavigation.current = true;
|
|
109
|
+
}
|
|
110
|
+
const setFocus = () => {
|
|
111
|
+
const element = getElementByPosition(
|
|
112
|
+
containerRef.current,
|
|
113
|
+
itemIndex,
|
|
114
|
+
true
|
|
115
|
+
);
|
|
116
|
+
if (element) {
|
|
117
|
+
const focussableElement = getFocusableElement(element);
|
|
118
|
+
focussableElement?.focus();
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
if (immediateFocus) {
|
|
122
|
+
setFocus();
|
|
123
|
+
} else {
|
|
124
|
+
setTimeout(setFocus, delay);
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
[containerRef, setHighlightedIdx]
|
|
128
|
+
);
|
|
129
|
+
const onFocus = (e) => {
|
|
130
|
+
if (focusedRef.current === -1) {
|
|
131
|
+
if (e.target.tabIndex === 0) {
|
|
132
|
+
const index = getElementDataIndex(getClosest(e.target, "index"));
|
|
133
|
+
setHighlightedIdx(index);
|
|
134
|
+
} else if (e.target.tabIndex === -1) ; else {
|
|
135
|
+
const index = getIndexOfEditedItem(containerRef.current);
|
|
136
|
+
if (index !== -1) {
|
|
137
|
+
requestAnimationFrame(() => {
|
|
138
|
+
setHighlightedIdx(index);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const getIndexCount = useCallback(
|
|
145
|
+
() => containerRef.current?.querySelectorAll(`[data-index]`).length ?? 0,
|
|
146
|
+
[containerRef]
|
|
147
|
+
);
|
|
148
|
+
const nextFocusableItemIdx = useCallback(
|
|
149
|
+
(direction = "fwd", idx) => {
|
|
150
|
+
const indexCount = getIndexCount();
|
|
151
|
+
const index = typeof idx === "number" ? idx : indexCount;
|
|
152
|
+
let nextIdx = nextItemIdx(indexCount, direction, index);
|
|
153
|
+
const nextDirection = direction === "start" ? "fwd" : direction === "end" ? "bwd" : direction;
|
|
154
|
+
const hasOverflowedItem = containerRef.current?.querySelector(
|
|
155
|
+
".vuuOverflowContainer-wrapContainer-overflowed"
|
|
156
|
+
) != null;
|
|
157
|
+
while (itemIsNotFocusable(
|
|
158
|
+
containerRef.current,
|
|
159
|
+
nextDirection,
|
|
160
|
+
indexCount,
|
|
161
|
+
nextIdx,
|
|
162
|
+
hasOverflowedItem
|
|
163
|
+
)) {
|
|
164
|
+
const newIdx = nextItemIdx(indexCount, nextDirection, nextIdx);
|
|
165
|
+
if (newIdx === nextIdx) {
|
|
166
|
+
return index;
|
|
167
|
+
} else {
|
|
168
|
+
nextIdx = newIdx;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return nextIdx;
|
|
172
|
+
},
|
|
173
|
+
[containerRef, getIndexCount]
|
|
174
|
+
);
|
|
175
|
+
const navigateChildItems = useCallback(
|
|
176
|
+
(e) => {
|
|
177
|
+
const direction = navigation[orientation][e.key];
|
|
178
|
+
const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);
|
|
179
|
+
console.log(`highlightedIdx = ${highlightedIdx}, nextIdx = ${nextIdx} `);
|
|
180
|
+
if (nextIdx !== highlightedIdx) {
|
|
181
|
+
const immediateFocus = true;
|
|
182
|
+
focusItem(nextIdx, immediateFocus);
|
|
183
|
+
} else {
|
|
184
|
+
onNavigateOutOfBounds?.(direction === "bwd" ? "start" : "end");
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
[
|
|
188
|
+
orientation,
|
|
189
|
+
nextFocusableItemIdx,
|
|
190
|
+
highlightedIdx,
|
|
191
|
+
focusItem,
|
|
192
|
+
onNavigateOutOfBounds
|
|
193
|
+
]
|
|
194
|
+
);
|
|
195
|
+
const highlightedItemHasMenu = useCallback(() => {
|
|
196
|
+
const el = getElementByPosition(containerRef.current, highlightedIdx);
|
|
197
|
+
if (el) {
|
|
198
|
+
return el.querySelector(".vuuPopupMenu") != null;
|
|
199
|
+
}
|
|
200
|
+
return false;
|
|
201
|
+
}, [containerRef, highlightedIdx]);
|
|
202
|
+
const highlightedItemInEditState = useCallback(() => {
|
|
203
|
+
const el = getElementByPosition(containerRef.current, highlightedIdx);
|
|
204
|
+
if (el) {
|
|
205
|
+
return el.querySelector(".vuuEditableLabel-input") != null;
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}, [containerRef, highlightedIdx]);
|
|
209
|
+
const activateItemMenu = useCallback(() => {
|
|
210
|
+
const el = getElementByPosition(containerRef.current, highlightedIdx);
|
|
211
|
+
const menuEl = el?.querySelector(".vuuPopupMenu");
|
|
212
|
+
if (menuEl) {
|
|
213
|
+
dispatchMouseEvent(menuEl, "click");
|
|
214
|
+
}
|
|
215
|
+
return false;
|
|
216
|
+
}, [containerRef, highlightedIdx]);
|
|
217
|
+
const handleKeyDown = useCallback(
|
|
218
|
+
(e) => {
|
|
219
|
+
if (getIndexCount() > 0 && isNavigationKey(e.key, orientation)) {
|
|
220
|
+
e.preventDefault();
|
|
221
|
+
if (keyboardNavigation.current) {
|
|
222
|
+
navigateChildItems(e);
|
|
223
|
+
} else {
|
|
224
|
+
keyboardNavigation.current = true;
|
|
225
|
+
navigateChildItems(e);
|
|
226
|
+
}
|
|
227
|
+
} else if (isMenuActivationKey(e.key) && highlightedItemHasMenu() && !highlightedItemInEditState()) {
|
|
228
|
+
activateItemMenu();
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
[
|
|
232
|
+
activateItemMenu,
|
|
233
|
+
getIndexCount,
|
|
234
|
+
highlightedItemHasMenu,
|
|
235
|
+
highlightedItemInEditState,
|
|
236
|
+
navigateChildItems,
|
|
237
|
+
orientation
|
|
238
|
+
]
|
|
239
|
+
);
|
|
240
|
+
const handleItemClick = (_, itemIndex) => {
|
|
241
|
+
setHighlightedIdx(itemIndex);
|
|
242
|
+
};
|
|
243
|
+
const handleFocus = useCallback(() => {
|
|
244
|
+
if (!hasFocus) {
|
|
245
|
+
setHasFocus(true);
|
|
246
|
+
if (!mouseClickPending.current) {
|
|
247
|
+
keyboardNavigation.current = true;
|
|
248
|
+
} else {
|
|
249
|
+
mouseClickPending.current = false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}, [hasFocus]);
|
|
253
|
+
const handleContainerMouseDown = useCallback(() => {
|
|
254
|
+
if (!hasFocus) {
|
|
255
|
+
mouseClickPending.current = true;
|
|
256
|
+
}
|
|
257
|
+
keyboardNavigation.current = false;
|
|
258
|
+
}, [hasFocus]);
|
|
259
|
+
const handleOverflowMenuClose = useCallback(
|
|
260
|
+
(closeReason) => {
|
|
261
|
+
if (closeReason?.type === "escape") {
|
|
262
|
+
const index = getIndexOfOverflowItem(containerRef.current);
|
|
263
|
+
if (index !== -1) {
|
|
264
|
+
focusItem(index);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
[containerRef, focusItem]
|
|
269
|
+
);
|
|
270
|
+
const containerProps = {
|
|
271
|
+
onBlur: (e) => {
|
|
272
|
+
const sourceTarget = e.target.closest(".vuuToolbar");
|
|
273
|
+
const destTarget = e.relatedTarget;
|
|
274
|
+
if (sourceTarget && !sourceTarget?.contains(destTarget)) {
|
|
275
|
+
setHighlightedIdx(-1);
|
|
276
|
+
setHasFocus(false);
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
onMouseDownCapture: handleContainerMouseDown,
|
|
280
|
+
onFocus: handleFocus,
|
|
281
|
+
onMouseLeave: () => {
|
|
282
|
+
keyboardNavigation.current = true;
|
|
283
|
+
setHighlightedIdx(-1);
|
|
284
|
+
mouseClickPending.current = false;
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
return {
|
|
288
|
+
containerProps,
|
|
289
|
+
focusVisible: keyboardNavigation.current ? highlightedIdx : -1,
|
|
290
|
+
focusIsWithinComponent: hasFocus,
|
|
291
|
+
highlightedIdx,
|
|
292
|
+
focusableIdx: 0,
|
|
293
|
+
focusItem,
|
|
294
|
+
onClick: handleItemClick,
|
|
295
|
+
onFocus,
|
|
296
|
+
onKeyDown: handleKeyDown,
|
|
297
|
+
onOverflowMenuClose: handleOverflowMenuClose,
|
|
298
|
+
setHighlightedIdx
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
export { useKeyboardNavigation };
|
|
303
|
+
//# sourceMappingURL=useKeyboardNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyboardNavigation.js","sources":["../../src/toolbar/useKeyboardNavigation.ts"],"sourcesContent":["import { useControlled } from \"@salt-ds/core\";\nimport {\n dispatchMouseEvent,\n getClosest,\n getElementDataIndex,\n getFocusableElement,\n orientationType,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n FocusEvent,\n FocusEventHandler,\n KeyboardEvent,\n MouseEvent as ReactMouseEvent,\n MouseEventHandler,\n RefObject,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n ArrowDown,\n ArrowUp,\n ArrowLeft,\n ArrowRight,\n Home,\n End,\n} from \"@vuu-ui/vuu-utils\";\nimport { getIndexOfEditedItem } from \"./toolbar-dom-utils\";\nimport { NavigationOutOfBoundsHandler } from \"./Toolbar\";\nimport { PopupCloseCallback } from \"@vuu-ui/vuu-popups\";\n\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 isOverflowIndicator = (el: HTMLElement | null) =>\n el !== null && el.dataset.index === \"overflow\";\n\nconst itemIsNotFocusable = (\n container: HTMLElement | null,\n direction: \"bwd\" | \"fwd\",\n indexCount: number,\n nextIdx: number,\n hasOverflowedItem: boolean\n) => {\n if (container) {\n const withinRangeBwd = direction === \"bwd\" && nextIdx > 0;\n const withinRangeFwd = direction === \"fwd\" && nextIdx < indexCount;\n const withinRange = withinRangeBwd || withinRangeFwd;\n const nextElement = getElementByPosition(container, nextIdx, true);\n const isOverflowedItem =\n hasOverflowedItem && !isNonWrappedElement(nextElement);\n const isHiddenOverflowIndicator =\n !hasOverflowedItem && isOverflowIndicator(nextElement);\n hasOverflowedItem && !isNonWrappedElement(nextElement);\n return withinRange && (isOverflowedItem || isHiddenOverflowIndicator);\n } else {\n return false;\n }\n};\n\nconst isNavigationKey = (\n key: string,\n orientation: orientationType = \"horizontal\"\n) => navigation[orientation][key] !== undefined;\n\nconst isMenuActivationKey = (key: string) => key === ArrowDown;\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 isNonWrappedElement = (element: HTMLElement | null) =>\n element !== null && !element.classList.contains(\"wrapped\");\n\nconst getToolbarItems = (container: HTMLElement) =>\n Array.from(container.querySelectorAll(\"[data-index]\")) as HTMLElement[];\n\nconst getIndexOfOverflowItem = (container: HTMLElement | null) => {\n if (container === null) {\n return -1;\n } else {\n const targets = getToolbarItems(container);\n const indexValues = targets.map((el) => el.dataset.index);\n return indexValues.indexOf(\"overflow\");\n }\n};\n\n// Get an OverflowItem based on data-index\nconst getElementByPosition = (\n container: HTMLElement | null,\n index: number,\n includeOverflowInd = false\n) => {\n if (container !== null) {\n const targets = getToolbarItems(container);\n const target = targets[index];\n if (!includeOverflowInd && isOverflowIndicator(target)) {\n return null;\n } else {\n return target;\n }\n }\n return null;\n};\n\nexport interface ContainerNavigationProps {\n onBlur: FocusEventHandler;\n onFocus: FocusEventHandler;\n onMouseDownCapture: MouseEventHandler;\n onMouseLeave: MouseEventHandler;\n}\n\ninterface ToolbarNavigationHookProps {\n containerRef: RefObject<HTMLElement>;\n defaultHighlightedIdx?: number;\n highlightedIdx?: number;\n onNavigateOutOfBounds?: NavigationOutOfBoundsHandler;\n orientation: orientationType;\n}\n\ninterface ToolbarNavigationHookResult {\n containerProps: ContainerNavigationProps;\n focusableIdx: number;\n highlightedIdx: number;\n focusItem: (\n itemIndex: number,\n immediateFocus?: boolean,\n withKeyboard?: boolean,\n delay?: number\n ) => void;\n focusVisible: number;\n focusIsWithinComponent: boolean;\n onClick: (evt: ReactMouseEvent, tabIndex: number) => void;\n onFocus: (evt: FocusEvent<HTMLElement>) => void;\n onKeyDown: (evt: KeyboardEvent) => void;\n onOverflowMenuClose?: PopupCloseCallback;\n setHighlightedIdx: (highlightedIndex: number) => void;\n}\n\nexport const useKeyboardNavigation = ({\n containerRef,\n defaultHighlightedIdx = -1,\n highlightedIdx: highlightedIdxProp,\n onNavigateOutOfBounds,\n orientation,\n}: ToolbarNavigationHookProps): ToolbarNavigationHookResult => {\n const mouseClickPending = useRef(false);\n /** tracks the highlighted index */\n const focusedRef = useRef<number>(-1);\n const [hasFocus, setHasFocus] = useState(false);\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 focusItem = useCallback(\n (\n itemIndex: number,\n immediateFocus = false,\n withKeyboard?: boolean,\n delay = 70\n ) => {\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 console.log(`focus item ${itemIndex}`);\n setHighlightedIdx(itemIndex);\n\n if (withKeyboard === true && !keyboardNavigation.current) {\n keyboardNavigation.current = true;\n }\n\n const setFocus = () => {\n const element = getElementByPosition(\n containerRef.current,\n itemIndex,\n true\n );\n if (element) {\n const focussableElement = getFocusableElement(element);\n focussableElement?.focus();\n }\n };\n if (immediateFocus) {\n setFocus();\n } else {\n setTimeout(setFocus, delay);\n }\n },\n [containerRef, 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 === 0) {\n // we are tabbing into the focusable item, by default the first\n // align highlighted index\n const index = getElementDataIndex(getClosest(e.target, \"index\"));\n setHighlightedIdx(index);\n } else 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 const index = getIndexOfEditedItem(containerRef.current);\n if (index !== -1) {\n requestAnimationFrame(() => {\n setHighlightedIdx(index);\n });\n }\n }\n }\n };\n\n const getIndexCount = useCallback(\n () => containerRef.current?.querySelectorAll(`[data-index]`).length ?? 0,\n [containerRef]\n );\n\n const nextFocusableItemIdx = useCallback(\n (direction: directionType = \"fwd\", idx?: number) => {\n const indexCount = getIndexCount();\n const index = typeof idx === \"number\" ? idx : indexCount;\n\n let nextIdx = nextItemIdx(indexCount, direction, index);\n const nextDirection =\n direction === \"start\" ? \"fwd\" : direction === \"end\" ? \"bwd\" : direction;\n\n const hasOverflowedItem =\n containerRef.current?.querySelector(\n \".vuuOverflowContainer-wrapContainer-overflowed\"\n ) != null;\n\n while (\n itemIsNotFocusable(\n containerRef.current,\n nextDirection,\n indexCount,\n nextIdx,\n hasOverflowedItem\n )\n ) {\n const newIdx = nextItemIdx(indexCount, nextDirection, nextIdx);\n if (newIdx === nextIdx) {\n // theres no further index and nextIndex is not focusable\n // so there are no further focusable items\n return index;\n } else {\n nextIdx = newIdx;\n }\n }\n return nextIdx;\n },\n [containerRef, getIndexCount]\n );\n\n const navigateChildItems = useCallback(\n (e: React.KeyboardEvent) => {\n const direction = navigation[orientation][e.key];\n const nextIdx = nextFocusableItemIdx(direction, highlightedIdx);\n console.log(`highlightedIdx = ${highlightedIdx}, nextIdx = ${nextIdx} `);\n if (nextIdx !== highlightedIdx) {\n const immediateFocus = true;\n focusItem(nextIdx, immediateFocus);\n } else {\n onNavigateOutOfBounds?.(direction === \"bwd\" ? \"start\" : \"end\");\n }\n },\n [\n orientation,\n nextFocusableItemIdx,\n highlightedIdx,\n focusItem,\n onNavigateOutOfBounds,\n ]\n );\n\n const highlightedItemHasMenu = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n if (el) {\n return el.querySelector(\".vuuPopupMenu\") != null;\n }\n return false;\n }, [containerRef, highlightedIdx]);\n\n const highlightedItemInEditState = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n if (el) {\n return el.querySelector(\".vuuEditableLabel-input\") != null;\n }\n return false;\n }, [containerRef, highlightedIdx]);\n\n const activateItemMenu = useCallback(() => {\n const el = getElementByPosition(containerRef.current, highlightedIdx);\n const menuEl = el?.querySelector(\".vuuPopupMenu\") as HTMLElement;\n if (menuEl) {\n dispatchMouseEvent(menuEl, \"click\");\n }\n return false;\n }, [containerRef, highlightedIdx]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (getIndexCount() > 0 && isNavigationKey(e.key, orientation)) {\n e.preventDefault();\n if (keyboardNavigation.current) {\n navigateChildItems(e);\n } else {\n keyboardNavigation.current = true;\n navigateChildItems(e);\n }\n } else if (\n isMenuActivationKey(e.key) &&\n highlightedItemHasMenu() &&\n !highlightedItemInEditState()\n ) {\n activateItemMenu();\n }\n },\n [\n activateItemMenu,\n getIndexCount,\n highlightedItemHasMenu,\n highlightedItemInEditState,\n navigateChildItems,\n orientation,\n ]\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 = (_: ReactMouseEvent, itemIndex: number) => {\n setHighlightedIdx(itemIndex);\n };\n\n const handleFocus = useCallback(() => {\n if (!hasFocus) {\n setHasFocus(true);\n if (!mouseClickPending.current) {\n keyboardNavigation.current = true;\n } else {\n mouseClickPending.current = false;\n }\n }\n }, [hasFocus]);\n\n const handleContainerMouseDown = useCallback(() => {\n if (!hasFocus) {\n mouseClickPending.current = true;\n }\n keyboardNavigation.current = false;\n }, [hasFocus]);\n\n const handleOverflowMenuClose = useCallback<PopupCloseCallback>(\n (closeReason) => {\n if (closeReason?.type === \"escape\") {\n const index = getIndexOfOverflowItem(containerRef.current);\n if (index !== -1) {\n focusItem(index);\n }\n }\n },\n [containerRef, focusItem]\n );\n\n const containerProps = {\n onBlur: (e: FocusEvent) => {\n const sourceTarget = (e.target as HTMLElement).closest(\".vuuToolbar\");\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 return {\n containerProps,\n focusVisible: keyboardNavigation.current ? highlightedIdx : -1,\n focusIsWithinComponent: hasFocus,\n highlightedIdx,\n focusableIdx: 0,\n focusItem,\n onClick: handleItemClick,\n onFocus,\n onKeyDown: handleKeyDown,\n onOverflowMenuClose: handleOverflowMenuClose,\n setHighlightedIdx,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import '../common-hooks/collectionProvider.js';
|
|
3
|
+
import '../common-hooks/use-resize-observer.js';
|
|
4
|
+
import { allowMultipleSelection, deselectionIsAllowed, selectionIsDisallowed } from '../common-hooks/selectionTypes.js';
|
|
5
|
+
import { useControlled } from '@salt-ds/core';
|
|
6
|
+
import { isSelectableElement, getClosestIndexItem } from '@vuu-ui/vuu-utils';
|
|
7
|
+
|
|
8
|
+
const defaultSelectionKeys = ["Enter", " "];
|
|
9
|
+
const NO_SELECTION_HANDLERS = {};
|
|
10
|
+
const useSelection = ({
|
|
11
|
+
defaultSelected,
|
|
12
|
+
highlightedIdx,
|
|
13
|
+
onSelectionChange,
|
|
14
|
+
selected: selectedProp,
|
|
15
|
+
selectionStrategy
|
|
16
|
+
}) => {
|
|
17
|
+
const [selected, setSelected, isControlled] = useControlled({
|
|
18
|
+
controlled: selectedProp,
|
|
19
|
+
default: defaultSelected ?? [],
|
|
20
|
+
name: "useSelection",
|
|
21
|
+
state: "selected"
|
|
22
|
+
});
|
|
23
|
+
const isSelectionEvent = useCallback(
|
|
24
|
+
(evt) => defaultSelectionKeys.includes(evt.key),
|
|
25
|
+
[]
|
|
26
|
+
);
|
|
27
|
+
const selectItem = useCallback(
|
|
28
|
+
(itemIndex, specialKey = false) => {
|
|
29
|
+
const newSelected = allowMultipleSelection(selectionStrategy, specialKey) ? selected.concat(itemIndex) : [itemIndex];
|
|
30
|
+
setSelected(newSelected);
|
|
31
|
+
onSelectionChange?.(newSelected);
|
|
32
|
+
},
|
|
33
|
+
[onSelectionChange, selected, selectionStrategy, setSelected]
|
|
34
|
+
);
|
|
35
|
+
const deselectItem = useCallback(
|
|
36
|
+
(itemIndex, specialKey = false) => {
|
|
37
|
+
const newSelected = selectionStrategy === "deselectable" || selectionStrategy === "multiple-special-key" && !specialKey ? [] : selected.filter((index) => index !== itemIndex);
|
|
38
|
+
setSelected(newSelected);
|
|
39
|
+
onSelectionChange?.(newSelected);
|
|
40
|
+
},
|
|
41
|
+
[onSelectionChange, selected, selectionStrategy, setSelected]
|
|
42
|
+
);
|
|
43
|
+
const handleKeyDown = useCallback(
|
|
44
|
+
(e) => {
|
|
45
|
+
if (isSelectionEvent(e) && isSelectableElement(e.target)) {
|
|
46
|
+
if (!selected.includes(highlightedIdx)) {
|
|
47
|
+
e.stopPropagation();
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
selectItem(highlightedIdx, e.shiftKey);
|
|
50
|
+
} else if (deselectionIsAllowed(selectionStrategy)) {
|
|
51
|
+
e.stopPropagation();
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
deselectItem(highlightedIdx, e.shiftKey);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
[
|
|
58
|
+
isSelectionEvent,
|
|
59
|
+
selected,
|
|
60
|
+
highlightedIdx,
|
|
61
|
+
selectionStrategy,
|
|
62
|
+
selectItem,
|
|
63
|
+
deselectItem
|
|
64
|
+
]
|
|
65
|
+
);
|
|
66
|
+
const handleClick = useCallback(
|
|
67
|
+
(e, itemIndex) => {
|
|
68
|
+
const element = getClosestIndexItem(e.target);
|
|
69
|
+
if (isSelectableElement(element)) {
|
|
70
|
+
if (!selected.includes(itemIndex)) {
|
|
71
|
+
selectItem(itemIndex, e.shiftKey);
|
|
72
|
+
} else if (deselectionIsAllowed(selectionStrategy)) {
|
|
73
|
+
deselectItem(itemIndex, e.shiftKey);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
[deselectItem, selectItem, selected, selectionStrategy]
|
|
78
|
+
);
|
|
79
|
+
const itemHandlers = selectionIsDisallowed(selectionStrategy) ? NO_SELECTION_HANDLERS : {
|
|
80
|
+
onClick: handleClick,
|
|
81
|
+
onKeyDown: handleKeyDown
|
|
82
|
+
};
|
|
83
|
+
return {
|
|
84
|
+
activateItem: selectItem,
|
|
85
|
+
itemHandlers,
|
|
86
|
+
isControlled,
|
|
87
|
+
selected
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export { useSelection };
|
|
92
|
+
//# sourceMappingURL=useSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSelection.js","sources":["../../src/toolbar/useSelection.ts"],"sourcesContent":["import { KeyboardEvent, MouseEvent, RefObject, useCallback } from \"react\";\nimport {\n SelectionStrategy,\n SpecialKeyMultipleSelection,\n allowMultipleSelection,\n deselectionIsAllowed,\n selectionIsDisallowed,\n} from \"../common-hooks\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { getClosestIndexItem, isSelectableElement } from \"@vuu-ui/vuu-utils\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport interface SelectionHookProps {\n containerRef: RefObject<HTMLElement>;\n defaultSelected?: number[];\n highlightedIdx: number;\n itemQuery: string;\n onSelectionChange?: (selectedIndices: number[]) => void;\n selected?: number[];\n selectionStrategy: SelectionStrategy | SpecialKeyMultipleSelection;\n}\n\nexport interface ItemHandlers {\n onClick?: (e: MouseEvent, itemIndex: number) => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n}\n\nconst NO_SELECTION_HANDLERS: ItemHandlers = {};\n\nexport interface SelectionHookResult {\n activateItem: (tabIndex: number) => void;\n itemHandlers: ItemHandlers;\n isControlled: boolean;\n selected: number[];\n}\n\n// TODO use SelectionProps\nexport const useSelection = ({\n defaultSelected,\n highlightedIdx,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n}: SelectionHookProps): SelectionHookResult => {\n const [selected, setSelected, isControlled] = useControlled({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"useSelection\",\n state: \"selected\",\n });\n\n // const isSelectableElement = useMemo(\n // () =>\n // (el: HTMLElement): boolean =>\n // el && el.matches(`[class*=\"${itemQuery} \"]`),\n // [itemQuery]\n // );\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => defaultSelectionKeys.includes(evt.key),\n []\n );\n\n const selectItem = useCallback(\n (itemIndex: number, specialKey = false) => {\n const newSelected = allowMultipleSelection(selectionStrategy, specialKey)\n ? selected.concat(itemIndex)\n : [itemIndex];\n\n setSelected(newSelected);\n onSelectionChange?.(newSelected);\n },\n [onSelectionChange, selected, selectionStrategy, setSelected]\n );\n\n const deselectItem = useCallback(\n (itemIndex: number, specialKey = false) => {\n const newSelected =\n selectionStrategy === \"deselectable\" ||\n (selectionStrategy === \"multiple-special-key\" && !specialKey)\n ? []\n : selected.filter((index) => index !== itemIndex);\n setSelected(newSelected);\n onSelectionChange?.(newSelected);\n },\n [onSelectionChange, selected, selectionStrategy, setSelected]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isSelectionEvent(e) && isSelectableElement(e.target as HTMLElement)) {\n if (!selected.includes(highlightedIdx)) {\n e.stopPropagation();\n e.preventDefault();\n selectItem(highlightedIdx, e.shiftKey);\n } else if (deselectionIsAllowed(selectionStrategy)) {\n e.stopPropagation();\n e.preventDefault();\n deselectItem(highlightedIdx, e.shiftKey);\n }\n }\n },\n [\n isSelectionEvent,\n selected,\n highlightedIdx,\n selectionStrategy,\n selectItem,\n deselectItem,\n ]\n );\n\n const handleClick = useCallback(\n (e: MouseEvent, itemIndex: number) => {\n const element = getClosestIndexItem(e.target as HTMLElement);\n if (isSelectableElement(element)) {\n if (!selected.includes(itemIndex)) {\n selectItem(itemIndex, e.shiftKey);\n } else if (deselectionIsAllowed(selectionStrategy)) {\n deselectItem(itemIndex, e.shiftKey);\n }\n }\n },\n [deselectItem, selectItem, selected, selectionStrategy]\n );\n\n const itemHandlers = selectionIsDisallowed(selectionStrategy)\n ? NO_SELECTION_HANDLERS\n : {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n };\n\n return {\n activateItem: selectItem,\n itemHandlers,\n isControlled,\n selected,\n };\n};\n"],"names":[],"mappings":"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"}
|