@vuu-ui/vuu-ui-controls 0.9.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/calendar/Calendar.js.map +1 -1
- package/cjs/calendar/internal/CalendarCarousel.js.map +1 -1
- package/cjs/calendar/internal/CalendarContext.js.map +1 -1
- package/cjs/calendar/internal/CalendarDay.js.map +1 -1
- package/cjs/calendar/internal/CalendarMonth.js.map +1 -1
- package/cjs/calendar/internal/CalendarNavigation.js.map +1 -1
- package/cjs/calendar/internal/CalendarWeekHeader.js.map +1 -1
- package/cjs/calendar/internal/useFocusManagement.js.map +1 -1
- package/cjs/calendar/internal/utils.js.map +1 -1
- package/cjs/calendar/useCalendar.js.map +1 -1
- package/cjs/calendar/useCalendarDay.js.map +1 -1
- package/cjs/calendar/useSelection.js.map +1 -1
- package/cjs/column-picker/ColumnPicker.js.map +1 -1
- package/cjs/column-picker/ColumnSearch.js.map +1 -1
- package/cjs/common-hooks/collectionProvider.js.map +1 -1
- package/cjs/common-hooks/itemToString.js.map +1 -1
- package/cjs/common-hooks/selectionTypes.js.map +1 -1
- package/cjs/common-hooks/use-resize-observer.js.map +1 -1
- package/cjs/common-hooks/useCollectionItems.js.map +1 -1
- package/cjs/common-hooks/useControlled.js.map +1 -1
- package/cjs/common-hooks/useSelection.js.map +1 -1
- package/cjs/cycle-state-button/CycleStateButton.js.map +1 -1
- package/cjs/date-input/DateInput.js.map +1 -1
- package/cjs/date-picker/DatePicker.js.map +1 -1
- package/cjs/date-picker/DatePickerContext.js.map +1 -1
- package/cjs/date-picker/DatePickerPanel.js.map +1 -1
- package/cjs/drag-drop/DragDropProvider.js.map +1 -1
- package/cjs/drag-drop/DragDropState.js.map +1 -1
- package/cjs/drag-drop/Draggable.js +0 -5
- package/cjs/drag-drop/Draggable.js.map +1 -1
- package/cjs/drag-drop/dragDropTypes.js.map +1 -1
- package/cjs/drag-drop/drop-target-utils.js.map +1 -1
- package/cjs/drag-drop/useAutoScroll.js.map +1 -1
- package/cjs/drag-drop/useDragDisplacers.js.map +1 -1
- package/cjs/drag-drop/useDragDrop.js.map +1 -1
- package/cjs/drag-drop/useDragDropCopy.js.map +1 -1
- package/cjs/drag-drop/useDragDropIndicator.js.map +1 -1
- package/cjs/drag-drop/useDragDropNaturalMovement.js.map +1 -1
- package/cjs/drag-drop/useDropIndicator.js.map +1 -1
- package/cjs/drag-drop/useGlobalDragDrop.js.map +1 -1
- package/cjs/editable/useEditableText.js.map +1 -1
- package/cjs/editable-label/EditableLabel.css.js +1 -1
- package/cjs/editable-label/EditableLabel.js.map +1 -1
- package/cjs/expando-input/ExpandoInput.js +1 -1
- package/cjs/expando-input/ExpandoInput.js.map +1 -1
- package/cjs/icon-button/Icon.js.map +1 -1
- package/cjs/icon-button/IconButton.js.map +1 -1
- package/cjs/icon-button/ToggleIconButton.css.js +1 -1
- package/cjs/icon-button/ToggleIconButton.js.map +1 -1
- package/cjs/index.js +14 -5
- package/cjs/index.js.map +1 -1
- package/cjs/instrument-picker/TablePicker.js.map +1 -1
- package/cjs/instrument-picker/useTablePicker.js.map +1 -1
- package/cjs/list/Highlighter.js.map +1 -1
- package/cjs/list/List.js.map +1 -1
- package/cjs/list/ListItem.js.map +1 -1
- package/cjs/list/RadioIcon.js.map +1 -1
- package/cjs/list/common-hooks/keyUtils.js.map +1 -1
- package/cjs/list/common-hooks/list-dom-utils.js.map +1 -1
- package/cjs/list/common-hooks/useCollapsibleGroups.js.map +1 -1
- package/cjs/list/common-hooks/useImperativeScrollingAPI.js.map +1 -1
- package/cjs/list/common-hooks/useKeyboardNavigation.js.map +1 -1
- package/cjs/list/common-hooks/useTypeahead.js.map +1 -1
- package/cjs/list/common-hooks/useViewportTracking.js.map +1 -1
- package/cjs/list/common-hooks/utils/collection-item-utils.js.map +1 -1
- package/cjs/list/common-hooks/utils/filter-utils.js.map +1 -1
- package/cjs/list/common-hooks/utils/isSelected.js.map +1 -1
- package/cjs/list/useList.js.map +1 -1
- package/cjs/list/useListDrop.js.map +1 -1
- package/cjs/list/useListHeight.js.map +1 -1
- package/cjs/list/useScrollPosition.js.map +1 -1
- package/cjs/measured-container/MeasuredContainer.js +1 -0
- package/cjs/measured-container/MeasuredContainer.js.map +1 -1
- package/cjs/measured-container/useMeasuredContainer.js +4 -1
- package/cjs/measured-container/useMeasuredContainer.js.map +1 -1
- package/cjs/measured-container/useResizeObserver.js.map +1 -1
- package/cjs/overflow-container/OverflowContainer.js.map +1 -1
- package/cjs/overflow-container/overflow-utils.js.map +1 -1
- package/cjs/overflow-container/useOverflowContainer.js.map +1 -1
- package/cjs/price-ticker/PriceTicker.js.map +1 -1
- package/cjs/split-button/SplitButton.css.js +1 -1
- package/cjs/split-button/SplitButton.js.map +1 -1
- package/cjs/split-button/SplitStateButton.css.js +1 -1
- package/cjs/split-button/SplitStateButton.js.map +1 -1
- package/cjs/split-button/useSplitButton.js.map +1 -1
- package/cjs/table-search/SearchCell.css.js +1 -1
- package/cjs/table-search/SearchCell.js +8 -3
- package/cjs/table-search/SearchCell.js.map +1 -1
- package/cjs/table-search/TableSearch.js +11 -18
- package/cjs/table-search/TableSearch.js.map +1 -1
- package/cjs/table-search/useTableSearch.js +1 -1
- package/cjs/table-search/useTableSearch.js.map +1 -1
- package/cjs/tabs-next/TabBar.css.js +6 -0
- package/cjs/tabs-next/TabBar.css.js.map +1 -0
- package/cjs/tabs-next/TabBar.js +41 -0
- package/cjs/tabs-next/TabBar.js.map +1 -0
- package/cjs/tabs-next/TabListNext.css.js +6 -0
- package/cjs/tabs-next/TabListNext.css.js.map +1 -0
- package/cjs/tabs-next/TabListNext.js +124 -0
- package/cjs/tabs-next/TabListNext.js.map +1 -0
- package/cjs/tabs-next/TabNext.css.js +6 -0
- package/cjs/tabs-next/TabNext.css.js.map +1 -0
- package/cjs/tabs-next/TabNext.js +110 -0
- package/cjs/tabs-next/TabNext.js.map +1 -0
- package/cjs/tabs-next/TabNextAction.js +35 -0
- package/cjs/tabs-next/TabNextAction.js.map +1 -0
- package/cjs/tabs-next/TabNextContext.js +23 -0
- package/cjs/tabs-next/TabNextContext.js.map +1 -0
- package/cjs/tabs-next/TabNextPanel.css.js +6 -0
- package/cjs/tabs-next/TabNextPanel.css.js.map +1 -0
- package/cjs/tabs-next/TabNextPanel.js +77 -0
- package/cjs/tabs-next/TabNextPanel.js.map +1 -0
- package/cjs/tabs-next/TabNextTrigger.css.js +6 -0
- package/cjs/tabs-next/TabNextTrigger.css.js.map +1 -0
- package/cjs/tabs-next/TabNextTrigger.js +74 -0
- package/cjs/tabs-next/TabNextTrigger.js.map +1 -0
- package/cjs/tabs-next/TabOverflowList.css.js +6 -0
- package/cjs/tabs-next/TabOverflowList.css.js.map +1 -0
- package/cjs/tabs-next/TabOverflowList.js +130 -0
- package/cjs/tabs-next/TabOverflowList.js.map +1 -0
- package/cjs/tabs-next/TabsNext.js +174 -0
- package/cjs/tabs-next/TabsNext.js.map +1 -0
- package/cjs/tabs-next/TabsNextContext.js +33 -0
- package/cjs/tabs-next/TabsNextContext.js.map +1 -0
- package/cjs/tabs-next/hooks/useCollection.js +91 -0
- package/cjs/tabs-next/hooks/useCollection.js.map +1 -0
- package/cjs/tabs-next/hooks/useFocusOutside.js +24 -0
- package/cjs/tabs-next/hooks/useFocusOutside.js.map +1 -0
- package/cjs/tabs-next/hooks/useOverflow.js +138 -0
- package/cjs/tabs-next/hooks/useOverflow.js.map +1 -0
- package/cjs/tabstrip/Tab.js.map +1 -1
- package/cjs/tabstrip/TabMenu.js.map +1 -1
- package/cjs/tabstrip/TabMenuOptions.js.map +1 -1
- package/cjs/tabstrip/Tabstrip.css.js +1 -1
- package/cjs/tabstrip/Tabstrip.js.map +1 -1
- package/cjs/tabstrip/tabstrip-dom-utils.js.map +1 -1
- package/cjs/tabstrip/useAnimatedSelectionThumb.js.map +1 -1
- package/cjs/tabstrip/useKeyboardNavigation.js.map +1 -1
- package/cjs/tabstrip/useSelection.js.map +1 -1
- package/cjs/tabstrip/useTabstrip.js.map +1 -1
- package/cjs/toolbar/Toolbar.js.map +1 -1
- package/cjs/toolbar/toolbar-dom-utils.js.map +1 -1
- package/cjs/toolbar/useKeyboardNavigation.js.map +1 -1
- package/cjs/toolbar/useSelection.js.map +1 -1
- package/cjs/toolbar/useToolbar.js.map +1 -1
- package/cjs/utils/escapeRegExp.js.map +1 -1
- package/cjs/utils/forwardCallbackProps.js.map +1 -1
- package/cjs/utils/isOverflowElement.js.map +1 -1
- package/cjs/vuu-date-picker/VuuDatePicker.js.map +1 -1
- package/cjs/vuu-input/VuuInput.js.map +1 -1
- package/cjs/vuu-typeahead-input/VuuTypeaheadInput.js.map +1 -1
- package/cjs/vuu-typeahead-input/useVuuTypeaheadInput.js.map +1 -1
- package/esm/calendar/Calendar.js.map +1 -1
- package/esm/calendar/internal/CalendarCarousel.js.map +1 -1
- package/esm/calendar/internal/CalendarContext.js.map +1 -1
- package/esm/calendar/internal/CalendarDay.js.map +1 -1
- package/esm/calendar/internal/CalendarMonth.js.map +1 -1
- package/esm/calendar/internal/CalendarNavigation.js.map +1 -1
- package/esm/calendar/internal/CalendarWeekHeader.js.map +1 -1
- package/esm/calendar/internal/useFocusManagement.js.map +1 -1
- package/esm/calendar/internal/utils.js.map +1 -1
- package/esm/calendar/useCalendar.js.map +1 -1
- package/esm/calendar/useCalendarDay.js.map +1 -1
- package/esm/calendar/useSelection.js.map +1 -1
- package/esm/column-picker/ColumnPicker.js.map +1 -1
- package/esm/column-picker/ColumnSearch.js.map +1 -1
- package/esm/common-hooks/collectionProvider.js.map +1 -1
- package/esm/common-hooks/itemToString.js.map +1 -1
- package/esm/common-hooks/selectionTypes.js.map +1 -1
- package/esm/common-hooks/use-resize-observer.js.map +1 -1
- package/esm/common-hooks/useCollectionItems.js.map +1 -1
- package/esm/common-hooks/useControlled.js.map +1 -1
- package/esm/common-hooks/useSelection.js.map +1 -1
- package/esm/cycle-state-button/CycleStateButton.js.map +1 -1
- package/esm/date-input/DateInput.js.map +1 -1
- package/esm/date-picker/DatePicker.js.map +1 -1
- package/esm/date-picker/DatePickerContext.js.map +1 -1
- package/esm/date-picker/DatePickerPanel.js.map +1 -1
- package/esm/drag-drop/DragDropProvider.js.map +1 -1
- package/esm/drag-drop/DragDropState.js.map +1 -1
- package/esm/drag-drop/Draggable.js +0 -5
- package/esm/drag-drop/Draggable.js.map +1 -1
- package/esm/drag-drop/dragDropTypes.js.map +1 -1
- package/esm/drag-drop/drop-target-utils.js.map +1 -1
- package/esm/drag-drop/useAutoScroll.js.map +1 -1
- package/esm/drag-drop/useDragDisplacers.js.map +1 -1
- package/esm/drag-drop/useDragDrop.js +1 -1
- package/esm/drag-drop/useDragDrop.js.map +1 -1
- package/esm/drag-drop/useDragDropCopy.js.map +1 -1
- package/esm/drag-drop/useDragDropIndicator.js +1 -1
- package/esm/drag-drop/useDragDropIndicator.js.map +1 -1
- package/esm/drag-drop/useDragDropNaturalMovement.js +1 -1
- package/esm/drag-drop/useDragDropNaturalMovement.js.map +1 -1
- package/esm/drag-drop/useDropIndicator.js.map +1 -1
- package/esm/drag-drop/useGlobalDragDrop.js.map +1 -1
- package/esm/editable/useEditableText.js.map +1 -1
- package/esm/editable-label/EditableLabel.css.js +1 -1
- package/esm/editable-label/EditableLabel.js.map +1 -1
- package/esm/expando-input/ExpandoInput.js +1 -1
- package/esm/expando-input/ExpandoInput.js.map +1 -1
- package/esm/icon-button/Icon.js.map +1 -1
- package/esm/icon-button/IconButton.js.map +1 -1
- package/esm/icon-button/ToggleIconButton.css.js +1 -1
- package/esm/icon-button/ToggleIconButton.js.map +1 -1
- package/esm/index.js +7 -2
- package/esm/index.js.map +1 -1
- package/esm/instrument-picker/TablePicker.js.map +1 -1
- package/esm/instrument-picker/useTablePicker.js.map +1 -1
- package/esm/list/Highlighter.js.map +1 -1
- package/esm/list/List.js.map +1 -1
- package/esm/list/ListItem.js.map +1 -1
- package/esm/list/RadioIcon.js.map +1 -1
- package/esm/list/common-hooks/keyUtils.js.map +1 -1
- package/esm/list/common-hooks/list-dom-utils.js.map +1 -1
- package/esm/list/common-hooks/useCollapsibleGroups.js.map +1 -1
- package/esm/list/common-hooks/useImperativeScrollingAPI.js.map +1 -1
- package/esm/list/common-hooks/useKeyboardNavigation.js.map +1 -1
- package/esm/list/common-hooks/useTypeahead.js.map +1 -1
- package/esm/list/common-hooks/useViewportTracking.js.map +1 -1
- package/esm/list/common-hooks/utils/collection-item-utils.js.map +1 -1
- package/esm/list/common-hooks/utils/filter-utils.js.map +1 -1
- package/esm/list/common-hooks/utils/isSelected.js.map +1 -1
- package/esm/list/useList.js.map +1 -1
- package/esm/list/useListDrop.js.map +1 -1
- package/esm/list/useListHeight.js.map +1 -1
- package/esm/list/useScrollPosition.js.map +1 -1
- package/esm/measured-container/MeasuredContainer.js +1 -0
- package/esm/measured-container/MeasuredContainer.js.map +1 -1
- package/esm/measured-container/useMeasuredContainer.js +4 -1
- package/esm/measured-container/useMeasuredContainer.js.map +1 -1
- package/esm/measured-container/useResizeObserver.js.map +1 -1
- package/esm/overflow-container/OverflowContainer.js.map +1 -1
- package/esm/overflow-container/overflow-utils.js.map +1 -1
- package/esm/overflow-container/useOverflowContainer.js.map +1 -1
- package/esm/price-ticker/PriceTicker.js.map +1 -1
- package/esm/split-button/SplitButton.css.js +1 -1
- package/esm/split-button/SplitButton.js.map +1 -1
- package/esm/split-button/SplitStateButton.css.js +1 -1
- package/esm/split-button/SplitStateButton.js.map +1 -1
- package/esm/split-button/useSplitButton.js.map +1 -1
- package/esm/table-search/SearchCell.css.js +1 -1
- package/esm/table-search/SearchCell.js +8 -3
- package/esm/table-search/SearchCell.js.map +1 -1
- package/esm/table-search/TableSearch.js +12 -19
- package/esm/table-search/TableSearch.js.map +1 -1
- package/esm/table-search/useTableSearch.js +1 -1
- package/esm/table-search/useTableSearch.js.map +1 -1
- package/esm/tabs-next/TabBar.css.js +4 -0
- package/esm/tabs-next/TabBar.css.js.map +1 -0
- package/esm/tabs-next/TabBar.js +39 -0
- package/esm/tabs-next/TabBar.js.map +1 -0
- package/esm/tabs-next/TabListNext.css.js +4 -0
- package/esm/tabs-next/TabListNext.css.js.map +1 -0
- package/esm/tabs-next/TabListNext.js +122 -0
- package/esm/tabs-next/TabListNext.js.map +1 -0
- package/esm/tabs-next/TabNext.css.js +4 -0
- package/esm/tabs-next/TabNext.css.js.map +1 -0
- package/esm/tabs-next/TabNext.js +108 -0
- package/esm/tabs-next/TabNext.js.map +1 -0
- package/esm/tabs-next/TabNextAction.js +33 -0
- package/esm/tabs-next/TabNextAction.js.map +1 -0
- package/esm/tabs-next/TabNextContext.js +20 -0
- package/esm/tabs-next/TabNextContext.js.map +1 -0
- package/esm/tabs-next/TabNextPanel.css.js +4 -0
- package/esm/tabs-next/TabNextPanel.css.js.map +1 -0
- package/esm/tabs-next/TabNextPanel.js +75 -0
- package/esm/tabs-next/TabNextPanel.js.map +1 -0
- package/esm/tabs-next/TabNextTrigger.css.js +4 -0
- package/esm/tabs-next/TabNextTrigger.css.js.map +1 -0
- package/esm/tabs-next/TabNextTrigger.js +72 -0
- package/esm/tabs-next/TabNextTrigger.js.map +1 -0
- package/esm/tabs-next/TabOverflowList.css.js +4 -0
- package/esm/tabs-next/TabOverflowList.css.js.map +1 -0
- package/esm/tabs-next/TabOverflowList.js +128 -0
- package/esm/tabs-next/TabOverflowList.js.map +1 -0
- package/esm/tabs-next/TabsNext.js +172 -0
- package/esm/tabs-next/TabsNext.js.map +1 -0
- package/esm/tabs-next/TabsNextContext.js +30 -0
- package/esm/tabs-next/TabsNextContext.js.map +1 -0
- package/esm/tabs-next/hooks/useCollection.js +89 -0
- package/esm/tabs-next/hooks/useCollection.js.map +1 -0
- package/esm/tabs-next/hooks/useFocusOutside.js +22 -0
- package/esm/tabs-next/hooks/useFocusOutside.js.map +1 -0
- package/esm/tabs-next/hooks/useOverflow.js +136 -0
- package/esm/tabs-next/hooks/useOverflow.js.map +1 -0
- package/esm/tabstrip/Tab.js.map +1 -1
- package/esm/tabstrip/TabMenu.js.map +1 -1
- package/esm/tabstrip/TabMenuOptions.js.map +1 -1
- package/esm/tabstrip/Tabstrip.css.js +1 -1
- package/esm/tabstrip/Tabstrip.js.map +1 -1
- package/esm/tabstrip/tabstrip-dom-utils.js.map +1 -1
- package/esm/tabstrip/useAnimatedSelectionThumb.js.map +1 -1
- package/esm/tabstrip/useKeyboardNavigation.js.map +1 -1
- package/esm/tabstrip/useSelection.js.map +1 -1
- package/esm/tabstrip/useTabstrip.js.map +1 -1
- package/esm/toolbar/Toolbar.js.map +1 -1
- package/esm/toolbar/toolbar-dom-utils.js.map +1 -1
- package/esm/toolbar/useKeyboardNavigation.js.map +1 -1
- package/esm/toolbar/useSelection.js.map +1 -1
- package/esm/toolbar/useToolbar.js.map +1 -1
- package/esm/utils/escapeRegExp.js.map +1 -1
- package/esm/utils/forwardCallbackProps.js.map +1 -1
- package/esm/utils/isOverflowElement.js.map +1 -1
- package/esm/vuu-date-picker/VuuDatePicker.js.map +1 -1
- package/esm/vuu-input/VuuInput.js.map +1 -1
- package/esm/vuu-typeahead-input/VuuTypeaheadInput.js.map +1 -1
- package/esm/vuu-typeahead-input/useVuuTypeaheadInput.js.map +1 -1
- package/package.json +15 -14
- package/types/calendar/Calendar.d.ts +0 -1
- package/types/calendar/internal/CalendarCarousel.d.ts +0 -1
- package/types/calendar/internal/CalendarContext.d.ts +0 -1
- package/types/calendar/internal/CalendarWeekHeader.d.ts +1 -1
- package/types/calendar/useCalendar.d.ts +4 -4
- package/types/calendar/useCalendarDay.d.ts +2 -2
- package/types/column-picker/ColumnPicker.d.ts +0 -1
- package/types/common-hooks/collectionProvider.d.ts +1 -1
- package/types/common-hooks/selectionTypes.d.ts +1 -1
- package/types/cycle-state-button/CycleStateButton.d.ts +2 -2
- package/types/date-picker/DatePickerContext.d.ts +0 -1
- package/types/drag-drop/DragDropProvider.d.ts +1 -1
- package/types/drag-drop/DropIndicator.d.ts +1 -2
- package/types/drag-drop/drop-target-utils.d.ts +24 -20
- package/types/drag-drop/useAutoScroll.d.ts +4 -4
- package/types/drag-drop/useGlobalDragDrop.d.ts +0 -1
- package/types/expando-input/ExpandoInput.d.ts +2 -2
- package/types/icon-button/Icon.d.ts +1 -1
- package/types/icon-button/IconButton.d.ts +0 -1
- package/types/icon-button/ToggleIconButton.d.ts +1 -2
- package/types/index.d.ts +1 -1
- package/types/instrument-picker/SearchCell.d.ts +1 -2
- package/types/instrument-picker/TablePicker.d.ts +1 -1
- package/types/instrument-picker/useTablePicker.d.ts +3 -10
- package/types/list/ChevronIcon.d.ts +1 -1
- package/types/list/ListItem.d.ts +1 -1
- package/types/list/RadioIcon.d.ts +1 -2
- package/types/list/common-hooks/useTypeahead.d.ts +0 -1
- package/types/measured-container/MeasuredContainer.d.ts +1 -1
- package/types/overflow-container/useOverflowContainer.d.ts +4 -5
- package/types/price-ticker/PriceTicker.d.ts +1 -1
- package/types/split-button/SplitStateButton.d.ts +0 -1
- package/types/split-button/useSplitButton.d.ts +71 -60
- package/types/table-search/SearchCell.d.ts +1 -2
- package/types/table-search/TableSearch.d.ts +2 -4
- package/types/table-search/useTableSearch.d.ts +4 -2
- package/types/tabs-next/TabBar.d.ts +12 -0
- package/types/tabs-next/TabListNext.d.ts +12 -0
- package/types/tabs-next/TabNext.d.ts +12 -0
- package/types/tabs-next/TabNextAction.d.ts +5 -0
- package/types/tabs-next/TabNextContext.d.ts +12 -0
- package/types/tabs-next/TabNextPanel.d.ts +8 -0
- package/types/tabs-next/TabNextTrigger.d.ts +5 -0
- package/types/tabs-next/TabOverflowList.d.ts +11 -0
- package/types/tabs-next/TabsNext.d.ts +17 -0
- package/types/tabs-next/TabsNextContext.d.ts +21 -0
- package/types/tabs-next/hooks/useCollection.d.ts +18 -0
- package/types/tabs-next/hooks/useFocusOutside.d.ts +2 -0
- package/types/tabs-next/hooks/useOverflow.d.ts +11 -0
- package/types/tabs-next/index.d.ts +7 -0
- package/types/tabstrip/Tab.d.ts +23 -22
- package/types/tabstrip/TabMenu.d.ts +1 -2
- package/types/tabstrip/Tabstrip.d.ts +1 -2
- package/types/tabstrip/useSelection.d.ts +3 -3
- package/types/tabstrip/useTabstrip.d.ts +5 -5
- package/types/toolbar/Toolbar.d.ts +1 -2
- package/types/toolbar/useToolbar.d.ts +1 -1
- package/types/vuu-date-picker/VuuDatePicker.d.ts +4 -6
- package/types/vuu-input/VuuInput.d.ts +1 -1
- package/types/vuu-typeahead-input/VuuTypeaheadInput.d.ts +1 -2
- package/cjs/tree/Tree.css.js +0 -6
- package/cjs/tree/Tree.css.js.map +0 -1
- package/cjs/tree/Tree.js +0 -179
- package/cjs/tree/Tree.js.map +0 -1
- package/cjs/tree/hierarchical-data-utils.js +0 -72
- package/cjs/tree/hierarchical-data-utils.js.map +0 -1
- package/cjs/tree/key-code.js +0 -62
- package/cjs/tree/key-code.js.map +0 -1
- package/cjs/tree/list-dom-utils.js +0 -19
- package/cjs/tree/list-dom-utils.js.map +0 -1
- package/cjs/tree/treeTypeUtils.js +0 -6
- package/cjs/tree/treeTypeUtils.js.map +0 -1
- package/cjs/tree/use-collapsible-groups.js +0 -85
- package/cjs/tree/use-collapsible-groups.js.map +0 -1
- package/cjs/tree/use-hierarchical-data.js +0 -51
- package/cjs/tree/use-hierarchical-data.js.map +0 -1
- package/cjs/tree/use-items-with-ids.js +0 -100
- package/cjs/tree/use-items-with-ids.js.map +0 -1
- package/cjs/tree/use-keyboard-navigation.js +0 -144
- package/cjs/tree/use-keyboard-navigation.js.map +0 -1
- package/cjs/tree/use-selection.js +0 -154
- package/cjs/tree/use-selection.js.map +0 -1
- package/cjs/tree/use-tree-keyboard-navigation.js +0 -41
- package/cjs/tree/use-tree-keyboard-navigation.js.map +0 -1
- package/cjs/tree/use-viewport-tracking.js +0 -76
- package/cjs/tree/use-viewport-tracking.js.map +0 -1
- package/cjs/tree/useTree.js +0 -106
- package/cjs/tree/useTree.js.map +0 -1
- package/esm/tree/Tree.css.js +0 -4
- package/esm/tree/Tree.css.js.map +0 -1
- package/esm/tree/Tree.js +0 -176
- package/esm/tree/Tree.js.map +0 -1
- package/esm/tree/hierarchical-data-utils.js +0 -65
- package/esm/tree/hierarchical-data-utils.js.map +0 -1
- package/esm/tree/key-code.js +0 -54
- package/esm/tree/key-code.js.map +0 -1
- package/esm/tree/list-dom-utils.js +0 -15
- package/esm/tree/list-dom-utils.js.map +0 -1
- package/esm/tree/treeTypeUtils.js +0 -4
- package/esm/tree/treeTypeUtils.js.map +0 -1
- package/esm/tree/use-collapsible-groups.js +0 -83
- package/esm/tree/use-collapsible-groups.js.map +0 -1
- package/esm/tree/use-hierarchical-data.js +0 -49
- package/esm/tree/use-hierarchical-data.js.map +0 -1
- package/esm/tree/use-items-with-ids.js +0 -98
- package/esm/tree/use-items-with-ids.js.map +0 -1
- package/esm/tree/use-keyboard-navigation.js +0 -142
- package/esm/tree/use-keyboard-navigation.js.map +0 -1
- package/esm/tree/use-selection.js +0 -147
- package/esm/tree/use-selection.js.map +0 -1
- package/esm/tree/use-tree-keyboard-navigation.js +0 -39
- package/esm/tree/use-tree-keyboard-navigation.js.map +0 -1
- package/esm/tree/use-viewport-tracking.js +0 -74
- package/esm/tree/use-viewport-tracking.js.map +0 -1
- package/esm/tree/useTree.js +0 -104
- package/esm/tree/useTree.js.map +0 -1
- package/types/tree/Tree.d.ts +0 -19
- package/types/tree/hierarchical-data-utils.d.ts +0 -8
- package/types/tree/index.d.ts +0 -3
- package/types/tree/key-code.d.ts +0 -11
- package/types/tree/list-dom-utils.d.ts +0 -6
- package/types/tree/treeTypeUtils.d.ts +0 -2
- package/types/tree/use-collapsible-groups.d.ts +0 -18
- package/types/tree/use-hierarchical-data.d.ts +0 -6
- package/types/tree/use-items-with-ids.d.ts +0 -8
- package/types/tree/use-keyboard-navigation.d.ts +0 -26
- package/types/tree/use-selection.d.ts +0 -31
- package/types/tree/use-tree-keyboard-navigation.d.ts +0 -12
- package/types/tree/use-viewport-tracking.d.ts +0 -2
- package/types/tree/useTree.d.ts +0 -30
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@salt-ds/core');
|
|
5
|
+
var styles = require('@salt-ds/styles');
|
|
6
|
+
var window = require('@salt-ds/window');
|
|
7
|
+
var cx = require('clsx');
|
|
8
|
+
var React = require('react');
|
|
9
|
+
var TabNext$1 = require('./TabNext.css.js');
|
|
10
|
+
var TabNextContext = require('./TabNextContext.js');
|
|
11
|
+
var TabsNextContext = require('./TabsNextContext.js');
|
|
12
|
+
|
|
13
|
+
const withBaseName = core.makePrefixer("saltTabNext");
|
|
14
|
+
const TabNext = React.forwardRef(
|
|
15
|
+
function Tab(props, ref) {
|
|
16
|
+
const {
|
|
17
|
+
"aria-labelledby": ariaLabelledBy,
|
|
18
|
+
children,
|
|
19
|
+
className,
|
|
20
|
+
disabled: disabledProp,
|
|
21
|
+
onBlur,
|
|
22
|
+
onMouseDown,
|
|
23
|
+
onFocus,
|
|
24
|
+
onFocusCapture,
|
|
25
|
+
value,
|
|
26
|
+
id: idProp,
|
|
27
|
+
...rest
|
|
28
|
+
} = props;
|
|
29
|
+
const targetWindow = window.useWindow();
|
|
30
|
+
styles.useComponentCssInjection({
|
|
31
|
+
testId: "salt-tab-next",
|
|
32
|
+
css: TabNext$1,
|
|
33
|
+
window: targetWindow
|
|
34
|
+
});
|
|
35
|
+
const { selected, activeTab } = TabsNextContext.useTabsNext();
|
|
36
|
+
const disabled = !!disabledProp;
|
|
37
|
+
const id = core.useId(idProp);
|
|
38
|
+
const wasMouseDown = React.useRef(false);
|
|
39
|
+
const [focusVisible, setFocusVisible] = React.useState(false);
|
|
40
|
+
const [focused, setFocused] = React.useState(false);
|
|
41
|
+
const handleFocusCapture = (event) => {
|
|
42
|
+
onFocusCapture?.(event);
|
|
43
|
+
if (value && id) {
|
|
44
|
+
activeTab.current = { value, id };
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const handleFocus = (event) => {
|
|
48
|
+
onFocus?.(event);
|
|
49
|
+
setFocused(true);
|
|
50
|
+
if (!wasMouseDown.current && event.target.getAttribute("role") === "tab") {
|
|
51
|
+
setFocusVisible(true);
|
|
52
|
+
}
|
|
53
|
+
wasMouseDown.current = false;
|
|
54
|
+
};
|
|
55
|
+
const handleBlur = (event) => {
|
|
56
|
+
onBlur?.(event);
|
|
57
|
+
setFocused(false);
|
|
58
|
+
setFocusVisible(false);
|
|
59
|
+
};
|
|
60
|
+
const handleMouseDown = (event) => {
|
|
61
|
+
onMouseDown?.(event);
|
|
62
|
+
wasMouseDown.current = true;
|
|
63
|
+
};
|
|
64
|
+
const [actions, setActions] = React.useState([]);
|
|
65
|
+
const registerAction = React.useCallback((id2) => {
|
|
66
|
+
setActions((old) => old.concat(id2));
|
|
67
|
+
return () => {
|
|
68
|
+
setActions((old) => old.filter((action) => action !== id2));
|
|
69
|
+
};
|
|
70
|
+
}, []);
|
|
71
|
+
const context = React.useMemo(
|
|
72
|
+
() => ({
|
|
73
|
+
tabId: id,
|
|
74
|
+
selected: selected === value,
|
|
75
|
+
focused,
|
|
76
|
+
value,
|
|
77
|
+
disabled,
|
|
78
|
+
actions,
|
|
79
|
+
registerAction
|
|
80
|
+
}),
|
|
81
|
+
[id, selected, value, focused, disabled, actions, registerAction]
|
|
82
|
+
);
|
|
83
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TabNextContext.TabNextContext.Provider, { value: context, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
84
|
+
"div",
|
|
85
|
+
{
|
|
86
|
+
className: cx.clsx(
|
|
87
|
+
withBaseName(),
|
|
88
|
+
{
|
|
89
|
+
[withBaseName("selected")]: selected === value,
|
|
90
|
+
[withBaseName("disabled")]: disabled,
|
|
91
|
+
[withBaseName("focusVisible")]: focusVisible
|
|
92
|
+
},
|
|
93
|
+
className
|
|
94
|
+
),
|
|
95
|
+
"data-overflowitem": "true",
|
|
96
|
+
ref,
|
|
97
|
+
onMouseDown: handleMouseDown,
|
|
98
|
+
onFocusCapture: handleFocusCapture,
|
|
99
|
+
onFocus: handleFocus,
|
|
100
|
+
onBlur: handleBlur,
|
|
101
|
+
role: "presentation",
|
|
102
|
+
...rest,
|
|
103
|
+
children
|
|
104
|
+
}
|
|
105
|
+
) });
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
exports.TabNext = TabNext;
|
|
110
|
+
//# sourceMappingURL=TabNext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabNext.js","sources":["../../src/tabs-next/TabNext.tsx"],"sourcesContent":["import { makePrefixer, useId } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type MouseEvent,\n type ReactElement,\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport tabCss from \"./TabNext.css\";\nimport { TabNextContext } from \"./TabNextContext\";\nimport { useTabsNext } from \"./TabsNextContext\";\n\nconst withBaseName = makePrefixer(\"saltTabNext\");\n\nexport interface TabNextProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * If `true`, the tab will be disabled.\n */\n disabled?: boolean;\n /**\n * The value of the tab.\n */\n value: string;\n}\n\nexport const TabNext = forwardRef<HTMLDivElement, TabNextProps>(\n function Tab(props, ref): ReactElement<TabNextProps> {\n const {\n \"aria-labelledby\": ariaLabelledBy,\n children,\n className,\n disabled: disabledProp,\n onBlur,\n onMouseDown,\n onFocus,\n onFocusCapture,\n value,\n id: idProp,\n ...rest\n } = props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tab-next\",\n css: tabCss,\n window: targetWindow,\n });\n\n const { selected, activeTab } = useTabsNext();\n\n const disabled = !!disabledProp;\n\n const id = useId(idProp);\n\n const wasMouseDown = useRef(false);\n const [focusVisible, setFocusVisible] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const handleFocusCapture = (event: FocusEvent<HTMLDivElement>) => {\n onFocusCapture?.(event);\n if (value && id) {\n activeTab.current = { value, id };\n }\n };\n\n const handleFocus = (event: FocusEvent<HTMLDivElement>) => {\n onFocus?.(event);\n\n setFocused(true);\n\n if (\n !wasMouseDown.current &&\n event.target.getAttribute(\"role\") === \"tab\"\n ) {\n setFocusVisible(true);\n }\n\n wasMouseDown.current = false;\n };\n\n const handleBlur = (event: FocusEvent<HTMLDivElement>) => {\n onBlur?.(event);\n setFocused(false);\n setFocusVisible(false);\n };\n\n const handleMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n onMouseDown?.(event);\n wasMouseDown.current = true;\n };\n\n const [actions, setActions] = useState<string[]>([]);\n\n const registerAction = useCallback((id: string) => {\n setActions((old) => old.concat(id));\n\n return () => {\n setActions((old) => old.filter((action) => action !== id));\n };\n }, []);\n\n const context = useMemo(\n () => ({\n tabId: id,\n selected: selected === value,\n focused,\n value,\n disabled,\n actions,\n registerAction,\n }),\n [id, selected, value, focused, disabled, actions, registerAction],\n );\n\n return (\n <TabNextContext.Provider value={context}>\n <div\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"selected\")]: selected === value,\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"focusVisible\")]: focusVisible,\n },\n className,\n )}\n data-overflowitem=\"true\"\n ref={ref}\n onMouseDown={handleMouseDown}\n onFocusCapture={handleFocusCapture}\n onFocus={handleFocus}\n onBlur={handleBlur}\n role=\"presentation\"\n {...rest}\n >\n {children}\n </div>\n </TabNextContext.Provider>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","useWindow","useComponentCssInjection","tabCss","useTabsNext","useId","useRef","useState","useCallback","id","useMemo","jsx","TabNextContext","clsx"],"mappings":";;;;;;;;;;;;AAoBA,MAAM,YAAA,GAAeA,kBAAa,aAAa,CAAA;AAaxC,MAAM,OAAU,GAAAC,gBAAA;AAAA,EACrB,SAAS,GAAI,CAAA,KAAA,EAAO,GAAiC,EAAA;AACnD,IAAM,MAAA;AAAA,MACJ,iBAAmB,EAAA,cAAA;AAAA,MACnB,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAU,EAAA,YAAA;AAAA,MACV,MAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAA;AAAA,MACA,KAAA;AAAA,MACA,EAAI,EAAA,MAAA;AAAA,MACJ,GAAG;AAAA,KACD,GAAA,KAAA;AACJ,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,eAAA;AAAA,MACR,GAAK,EAAAC,SAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAA,MAAM,EAAE,QAAA,EAAU,SAAU,EAAA,GAAIC,2BAAY,EAAA;AAE5C,IAAM,MAAA,QAAA,GAAW,CAAC,CAAC,YAAA;AAEnB,IAAM,MAAA,EAAA,GAAKC,WAAM,MAAM,CAAA;AAEvB,IAAM,MAAA,YAAA,GAAeC,aAAO,KAAK,CAAA;AACjC,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,eAAS,KAAK,CAAA;AACtD,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE5C,IAAM,MAAA,kBAAA,GAAqB,CAAC,KAAsC,KAAA;AAChE,MAAA,cAAA,GAAiB,KAAK,CAAA;AACtB,MAAA,IAAI,SAAS,EAAI,EAAA;AACf,QAAU,SAAA,CAAA,OAAA,GAAU,EAAE,KAAA,EAAO,EAAG,EAAA;AAAA;AAClC,KACF;AAEA,IAAM,MAAA,WAAA,GAAc,CAAC,KAAsC,KAAA;AACzD,MAAA,OAAA,GAAU,KAAK,CAAA;AAEf,MAAA,UAAA,CAAW,IAAI,CAAA;AAEf,MACE,IAAA,CAAC,aAAa,OACd,IAAA,KAAA,CAAM,OAAO,YAAa,CAAA,MAAM,MAAM,KACtC,EAAA;AACA,QAAA,eAAA,CAAgB,IAAI,CAAA;AAAA;AAGtB,MAAA,YAAA,CAAa,OAAU,GAAA,KAAA;AAAA,KACzB;AAEA,IAAM,MAAA,UAAA,GAAa,CAAC,KAAsC,KAAA;AACxD,MAAA,MAAA,GAAS,KAAK,CAAA;AACd,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,KACvB;AAEA,IAAM,MAAA,eAAA,GAAkB,CAAC,KAAsC,KAAA;AAC7D,MAAA,WAAA,GAAc,KAAK,CAAA;AACnB,MAAA,YAAA,CAAa,OAAU,GAAA,IAAA;AAAA,KACzB;AAEA,IAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAAA,cAAA,CAAmB,EAAE,CAAA;AAEnD,IAAM,MAAA,cAAA,GAAiBC,iBAAY,CAAA,CAACC,GAAe,KAAA;AACjD,MAAA,UAAA,CAAW,CAAC,GAAA,KAAQ,GAAI,CAAA,MAAA,CAAOA,GAAE,CAAC,CAAA;AAElC,MAAA,OAAO,MAAM;AACX,QAAW,UAAA,CAAA,CAAC,QAAQ,GAAI,CAAA,MAAA,CAAO,CAAC,MAAW,KAAA,MAAA,KAAWA,GAAE,CAAC,CAAA;AAAA,OAC3D;AAAA,KACF,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,OAAU,GAAAC,aAAA;AAAA,MACd,OAAO;AAAA,QACL,KAAO,EAAA,EAAA;AAAA,QACP,UAAU,QAAa,KAAA,KAAA;AAAA,QACvB,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF,CAAA;AAAA,MACA,CAAC,EAAI,EAAA,QAAA,EAAU,OAAO,OAAS,EAAA,QAAA,EAAU,SAAS,cAAc;AAAA,KAClE;AAEA,IAAA,uBACGC,cAAA,CAAAC,6BAAA,CAAe,QAAf,EAAA,EAAwB,OAAO,OAC9B,EAAA,QAAA,kBAAAD,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAAE,OAAA;AAAA,UACT,YAAa,EAAA;AAAA,UACb;AAAA,YACE,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAa,KAAA,KAAA;AAAA,YACzC,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,cAAc,CAAC,GAAG;AAAA,WAClC;AAAA,UACA;AAAA,SACF;AAAA,QACA,mBAAkB,EAAA,MAAA;AAAA,QAClB,GAAA;AAAA,QACA,WAAa,EAAA,eAAA;AAAA,QACb,cAAgB,EAAA,kBAAA;AAAA,QAChB,OAAS,EAAA,WAAA;AAAA,QACT,MAAQ,EAAA,UAAA;AAAA,QACR,IAAK,EAAA,cAAA;AAAA,QACJ,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KAEL,EAAA,CAAA;AAAA;AAGN;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@salt-ds/core');
|
|
5
|
+
var cx = require('clsx');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var TabNextContext = require('./TabNextContext.js');
|
|
8
|
+
|
|
9
|
+
const TabNextAction = React.forwardRef(
|
|
10
|
+
function TabNextAction2(props, ref) {
|
|
11
|
+
const { "aria-labelledby": ariaLabelledBy, id: idProp, ...rest } = props;
|
|
12
|
+
const id = core.useId(idProp);
|
|
13
|
+
const { focused, selected, tabId, registerAction } = TabNextContext.useTabNext();
|
|
14
|
+
core.useIsomorphicLayoutEffect(() => {
|
|
15
|
+
if (id) {
|
|
16
|
+
return registerAction(id);
|
|
17
|
+
}
|
|
18
|
+
}, [registerAction, id]);
|
|
19
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
20
|
+
core.Button,
|
|
21
|
+
{
|
|
22
|
+
id,
|
|
23
|
+
"aria-labelledby": cx.clsx(ariaLabelledBy, tabId, id),
|
|
24
|
+
tabIndex: focused || selected ? void 0 : -1,
|
|
25
|
+
appearance: "transparent",
|
|
26
|
+
sentiment: "neutral",
|
|
27
|
+
ref,
|
|
28
|
+
...rest
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
exports.TabNextAction = TabNextAction;
|
|
35
|
+
//# sourceMappingURL=TabNextAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabNextAction.js","sources":["../../src/tabs-next/TabNextAction.tsx"],"sourcesContent":["import {\n Button,\n type ButtonProps,\n useId,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { useTabNext } from \"./TabNextContext\";\n\nexport interface TabNextActionProps extends ButtonProps {\n debugLabel?: string;\n}\n\nexport const TabNextAction = forwardRef<HTMLButtonElement, TabNextActionProps>(\n function TabNextAction(props, ref) {\n const { \"aria-labelledby\": ariaLabelledBy, id: idProp, ...rest } = props;\n\n const id = useId(idProp);\n const { focused, selected, tabId, registerAction } = useTabNext();\n\n useIsomorphicLayoutEffect(() => {\n if (id) {\n return registerAction(id);\n }\n }, [registerAction, id]);\n\n return (\n <Button\n id={id}\n aria-labelledby={clsx(ariaLabelledBy, tabId, id)}\n tabIndex={focused || selected ? undefined : -1}\n appearance=\"transparent\"\n sentiment=\"neutral\"\n ref={ref}\n {...rest}\n />\n );\n },\n);\n"],"names":["forwardRef","TabNextAction","useId","useTabNext","useIsomorphicLayoutEffect","jsx","Button","clsx"],"mappings":";;;;;;;;AAcO,MAAM,aAAgB,GAAAA,gBAAA;AAAA,EAC3B,SAASC,cAAc,CAAA,KAAA,EAAO,GAAK,EAAA;AACjC,IAAA,MAAM,EAAE,iBAAmB,EAAA,cAAA,EAAgB,IAAI,MAAQ,EAAA,GAAG,MAAS,GAAA,KAAA;AAEnE,IAAM,MAAA,EAAA,GAAKC,WAAM,MAAM,CAAA;AACvB,IAAA,MAAM,EAAE,OAAS,EAAA,QAAA,EAAU,KAAO,EAAA,cAAA,KAAmBC,yBAAW,EAAA;AAEhE,IAAAC,8BAAA,CAA0B,MAAM;AAC9B,MAAA,IAAI,EAAI,EAAA;AACN,QAAA,OAAO,eAAe,EAAE,CAAA;AAAA;AAC1B,KACC,EAAA,CAAC,cAAgB,EAAA,EAAE,CAAC,CAAA;AAEvB,IACE,uBAAAC,cAAA;AAAA,MAACC,WAAA;AAAA,MAAA;AAAA,QACC,EAAA;AAAA,QACA,iBAAiB,EAAAC,OAAA,CAAK,cAAgB,EAAA,KAAA,EAAO,EAAE,CAAA;AAAA,QAC/C,QAAA,EAAU,OAAW,IAAA,QAAA,GAAW,KAAY,CAAA,GAAA,CAAA,CAAA;AAAA,QAC5C,UAAW,EAAA,aAAA;AAAA,QACX,SAAU,EAAA,SAAA;AAAA,QACV,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA;AAGN;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@salt-ds/core');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
|
|
6
|
+
const TabNextContext = core.createContext(
|
|
7
|
+
"TabNextContext",
|
|
8
|
+
{
|
|
9
|
+
focused: false,
|
|
10
|
+
selected: false,
|
|
11
|
+
disabled: false,
|
|
12
|
+
value: "",
|
|
13
|
+
actions: [],
|
|
14
|
+
registerAction: () => () => void 0
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
function useTabNext() {
|
|
18
|
+
return React.useContext(TabNextContext);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
exports.TabNextContext = TabNextContext;
|
|
22
|
+
exports.useTabNext = useTabNext;
|
|
23
|
+
//# sourceMappingURL=TabNextContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabNextContext.js","sources":["../../src/tabs-next/TabNextContext.tsx"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { useContext } from \"react\";\n\ninterface TabNextContextValue {\n tabId?: string;\n focused: boolean;\n selected: boolean;\n value: string;\n disabled: boolean;\n actions: string[];\n registerAction: (id: string) => () => void;\n}\n\nexport const TabNextContext = createContext<TabNextContextValue>(\n \"TabNextContext\",\n {\n focused: false,\n selected: false,\n disabled: false,\n value: \"\",\n actions: [],\n registerAction: () => () => undefined,\n },\n);\n\nexport function useTabNext() {\n return useContext(TabNextContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAaO,MAAM,cAAiB,GAAAA,kBAAA;AAAA,EAC5B,gBAAA;AAAA,EACA;AAAA,IACE,OAAS,EAAA,KAAA;AAAA,IACT,QAAU,EAAA,KAAA;AAAA,IACV,QAAU,EAAA,KAAA;AAAA,IACV,KAAO,EAAA,EAAA;AAAA,IACP,SAAS,EAAC;AAAA,IACV,cAAA,EAAgB,MAAM,MAAM,KAAA;AAAA;AAEhC;AAEO,SAAS,UAAa,GAAA;AAC3B,EAAA,OAAOC,iBAAW,cAAc,CAAA;AAClC;;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tabPanelCss = ".saltTabNextPanel {\n height: 100%;\n width: 100%;\n}\n\n.saltTabNextPanel[hidden] {\n display: none;\n}\n\n.saltTabNextPanel:focus-visible {\n outline: var(--salt-focused-outline);\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = tabPanelCss;
|
|
6
|
+
//# sourceMappingURL=TabNextPanel.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabNextPanel.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@salt-ds/core');
|
|
5
|
+
var styles = require('@salt-ds/styles');
|
|
6
|
+
var window = require('@salt-ds/window');
|
|
7
|
+
var cx = require('clsx');
|
|
8
|
+
var React = require('react');
|
|
9
|
+
var tabbable = require('tabbable');
|
|
10
|
+
var TabNextPanel$1 = require('./TabNextPanel.css.js');
|
|
11
|
+
var TabsNextContext = require('./TabsNextContext.js');
|
|
12
|
+
|
|
13
|
+
const withBaseName = core.makePrefixer("saltTabNextPanel");
|
|
14
|
+
const TabNextPanel = React.forwardRef(
|
|
15
|
+
function TabNextPanel2(props, ref) {
|
|
16
|
+
const { className, children, id: idProp, value, ...rest } = props;
|
|
17
|
+
const targetWindow = window.useWindow();
|
|
18
|
+
styles.useComponentCssInjection({
|
|
19
|
+
testId: "salt-tab-next-panel",
|
|
20
|
+
css: TabNextPanel$1,
|
|
21
|
+
window: targetWindow
|
|
22
|
+
});
|
|
23
|
+
const id = core.useId(idProp);
|
|
24
|
+
const { registerPanel, getTabId, selected } = TabsNextContext.useTabsNext();
|
|
25
|
+
const panelRef = React.useRef(null);
|
|
26
|
+
const handleRef = core.useForkRef(panelRef, ref);
|
|
27
|
+
core.useIsomorphicLayoutEffect(() => {
|
|
28
|
+
if (value && id) {
|
|
29
|
+
return registerPanel(id, value);
|
|
30
|
+
}
|
|
31
|
+
}, [value, id, registerPanel]);
|
|
32
|
+
const [hasFocusableChildren, setHasFocusableChildren] = React.useState(false);
|
|
33
|
+
React.useEffect(() => {
|
|
34
|
+
if (!panelRef.current) return;
|
|
35
|
+
const detectFocusableChildren = () => {
|
|
36
|
+
requestAnimationFrame(() => {
|
|
37
|
+
if (!panelRef.current) return;
|
|
38
|
+
const elements = tabbable.tabbable(panelRef.current);
|
|
39
|
+
setHasFocusableChildren(elements.length > 0);
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
const observer = new MutationObserver(() => {
|
|
43
|
+
detectFocusableChildren();
|
|
44
|
+
});
|
|
45
|
+
requestAnimationFrame(() => {
|
|
46
|
+
detectFocusableChildren();
|
|
47
|
+
});
|
|
48
|
+
observer.observe(panelRef.current, {
|
|
49
|
+
childList: true,
|
|
50
|
+
subtree: true,
|
|
51
|
+
attributes: true
|
|
52
|
+
});
|
|
53
|
+
return () => {
|
|
54
|
+
observer.disconnect();
|
|
55
|
+
};
|
|
56
|
+
}, []);
|
|
57
|
+
const hidden = selected !== value;
|
|
58
|
+
const tabId = getTabId(value);
|
|
59
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
60
|
+
"div",
|
|
61
|
+
{
|
|
62
|
+
id,
|
|
63
|
+
ref: handleRef,
|
|
64
|
+
role: "tabpanel",
|
|
65
|
+
"aria-labelledby": tabId,
|
|
66
|
+
className: cx.clsx(withBaseName(), className),
|
|
67
|
+
hidden: hidden || void 0,
|
|
68
|
+
tabIndex: hidden || hasFocusableChildren ? void 0 : 0,
|
|
69
|
+
...rest,
|
|
70
|
+
children
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
exports.TabNextPanel = TabNextPanel;
|
|
77
|
+
//# sourceMappingURL=TabNextPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabNextPanel.js","sources":["../../src/tabs-next/TabNextPanel.tsx"],"sourcesContent":["import {\n makePrefixer,\n useForkRef,\n useId,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { tabbable } from \"tabbable\";\nimport tabPanelCss from \"./TabNextPanel.css\";\nimport { useTabsNext } from \"./TabsNextContext\";\n\nexport interface TabNextPanelProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * The value of the panel, this should map to the corresponding tab.\n */\n value: string;\n}\n\nconst withBaseName = makePrefixer(\"saltTabNextPanel\");\n\nexport const TabNextPanel = forwardRef<HTMLDivElement, TabNextPanelProps>(\n function TabNextPanel(props, ref) {\n const { className, children, id: idProp, value, ...rest } = props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tab-next-panel\",\n css: tabPanelCss,\n window: targetWindow,\n });\n const id = useId(idProp);\n const { registerPanel, getTabId, selected } = useTabsNext();\n\n const panelRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(panelRef, ref);\n\n useIsomorphicLayoutEffect(() => {\n if (value && id) {\n return registerPanel(id, value);\n }\n }, [value, id, registerPanel]);\n\n const [hasFocusableChildren, setHasFocusableChildren] = useState(false);\n useEffect(() => {\n if (!panelRef.current) return;\n\n const detectFocusableChildren = () => {\n requestAnimationFrame(() => {\n if (!panelRef.current) return;\n const elements = tabbable(panelRef.current);\n setHasFocusableChildren(elements.length > 0);\n });\n };\n\n const observer = new MutationObserver(() => {\n detectFocusableChildren();\n });\n\n requestAnimationFrame(() => {\n detectFocusableChildren();\n });\n\n observer.observe(panelRef.current, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const hidden = selected !== value;\n const tabId = getTabId(value);\n\n return (\n <div\n id={id}\n ref={handleRef}\n role=\"tabpanel\"\n aria-labelledby={tabId}\n className={clsx(withBaseName(), className)}\n hidden={hidden || undefined}\n tabIndex={hidden || hasFocusableChildren ? undefined : 0}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","TabNextPanel","useWindow","useComponentCssInjection","tabPanelCss","useId","useTabsNext","useRef","useForkRef","useIsomorphicLayoutEffect","useState","useEffect","tabbable","jsx","clsx"],"mappings":";;;;;;;;;;;;AA2BA,MAAM,YAAA,GAAeA,kBAAa,kBAAkB,CAAA;AAE7C,MAAM,YAAe,GAAAC,gBAAA;AAAA,EAC1B,SAASC,aAAa,CAAA,KAAA,EAAO,GAAK,EAAA;AAChC,IAAM,MAAA,EAAE,WAAW,QAAU,EAAA,EAAA,EAAI,QAAQ,KAAO,EAAA,GAAG,MAAS,GAAA,KAAA;AAC5D,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,qBAAA;AAAA,MACR,GAAK,EAAAC,cAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AACD,IAAM,MAAA,EAAA,GAAKC,WAAM,MAAM,CAAA;AACvB,IAAA,MAAM,EAAE,aAAA,EAAe,QAAU,EAAA,QAAA,KAAaC,2BAAY,EAAA;AAE1D,IAAM,MAAA,QAAA,GAAWC,aAAuB,IAAI,CAAA;AAC5C,IAAM,MAAA,SAAA,GAAYC,eAAW,CAAA,QAAA,EAAU,GAAG,CAAA;AAE1C,IAAAC,8BAAA,CAA0B,MAAM;AAC9B,MAAA,IAAI,SAAS,EAAI,EAAA;AACf,QAAO,OAAA,aAAA,CAAc,IAAI,KAAK,CAAA;AAAA;AAChC,KACC,EAAA,CAAC,KAAO,EAAA,EAAA,EAAI,aAAa,CAAC,CAAA;AAE7B,IAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIC,eAAS,KAAK,CAAA;AACtE,IAAAC,eAAA,CAAU,MAAM;AACd,MAAI,IAAA,CAAC,SAAS,OAAS,EAAA;AAEvB,MAAA,MAAM,0BAA0B,MAAM;AACpC,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAI,IAAA,CAAC,SAAS,OAAS,EAAA;AACvB,UAAM,MAAA,QAAA,GAAWC,iBAAS,CAAA,QAAA,CAAS,OAAO,CAAA;AAC1C,UAAwB,uBAAA,CAAA,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,SAC5C,CAAA;AAAA,OACH;AAEA,MAAM,MAAA,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AAC1C,QAAwB,uBAAA,EAAA;AAAA,OACzB,CAAA;AAED,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAwB,uBAAA,EAAA;AAAA,OACzB,CAAA;AAED,MAAS,QAAA,CAAA,OAAA,CAAQ,SAAS,OAAS,EAAA;AAAA,QACjC,SAAW,EAAA,IAAA;AAAA,QACX,OAAS,EAAA,IAAA;AAAA,QACT,UAAY,EAAA;AAAA,OACb,CAAA;AAED,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,UAAW,EAAA;AAAA,OACtB;AAAA,KACF,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,SAAS,QAAa,KAAA,KAAA;AAC5B,IAAM,MAAA,KAAA,GAAQ,SAAS,KAAK,CAAA;AAE5B,IACE,uBAAAC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,EAAA;AAAA,QACA,GAAK,EAAA,SAAA;AAAA,QACL,IAAK,EAAA,UAAA;AAAA,QACL,iBAAiB,EAAA,KAAA;AAAA,QACjB,SAAW,EAAAC,OAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,QACzC,QAAQ,MAAU,IAAA,KAAA,CAAA;AAAA,QAClB,QAAA,EAAU,MAAU,IAAA,oBAAA,GAAuB,KAAY,CAAA,GAAA,CAAA;AAAA,QACtD,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA;AAGN;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tabTriggerCss = ".saltTabNextTrigger {\n all: unset;\n display: flex;\n gap: var(--salt-spacing-100);\n align-items: center;\n justify-content: center;\n flex: 1;\n}\n\n/* The action should be triggered by clicking anywhere on the tab. */\n.saltTabNextTrigger::before {\n content: \"\";\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = tabTriggerCss;
|
|
6
|
+
//# sourceMappingURL=TabNextTrigger.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabNextTrigger.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@salt-ds/core');
|
|
5
|
+
var styles = require('@salt-ds/styles');
|
|
6
|
+
var window = require('@salt-ds/window');
|
|
7
|
+
var cx = require('clsx');
|
|
8
|
+
var React = require('react');
|
|
9
|
+
var TabNextContext = require('./TabNextContext.js');
|
|
10
|
+
var TabNextTrigger$1 = require('./TabNextTrigger.css.js');
|
|
11
|
+
var TabsNextContext = require('./TabsNextContext.js');
|
|
12
|
+
|
|
13
|
+
const withBaseName = core.makePrefixer("saltTabNextTrigger");
|
|
14
|
+
function getAriaDescription(count) {
|
|
15
|
+
if (count < 1) {
|
|
16
|
+
return void 0;
|
|
17
|
+
}
|
|
18
|
+
if (count === 1) {
|
|
19
|
+
return "1 action available";
|
|
20
|
+
}
|
|
21
|
+
return `${count} actions available`;
|
|
22
|
+
}
|
|
23
|
+
const TabNextTrigger = React.forwardRef(function TabNextTrigger2(props, ref) {
|
|
24
|
+
const { children, id: idProp, onClick, onKeyDown, ...rest } = props;
|
|
25
|
+
const targetWindow = window.useWindow();
|
|
26
|
+
styles.useComponentCssInjection({
|
|
27
|
+
testId: "salt-tab-next-trigger",
|
|
28
|
+
css: TabNextTrigger$1,
|
|
29
|
+
window: targetWindow
|
|
30
|
+
});
|
|
31
|
+
const { setSelected, registerTab, getPanelId } = TabsNextContext.useTabsNext();
|
|
32
|
+
const { selected, value, focused, disabled, tabId, actions } = TabNextContext.useTabNext();
|
|
33
|
+
const tabRef = React.useRef(null);
|
|
34
|
+
const id = tabId;
|
|
35
|
+
core.useIsomorphicLayoutEffect(() => {
|
|
36
|
+
if (value && id && tabRef.current) {
|
|
37
|
+
return registerTab({ id, value, element: tabRef.current });
|
|
38
|
+
}
|
|
39
|
+
}, [value, id, registerTab]);
|
|
40
|
+
const handleClick = (event) => {
|
|
41
|
+
setSelected(event, value);
|
|
42
|
+
};
|
|
43
|
+
const handleKeyDown = (event) => {
|
|
44
|
+
onKeyDown?.(event);
|
|
45
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
46
|
+
setSelected(event, value);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const handleRef = core.useForkRef(tabRef, ref);
|
|
50
|
+
const panelId = getPanelId(value);
|
|
51
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
52
|
+
"button",
|
|
53
|
+
{
|
|
54
|
+
"aria-selected": selected,
|
|
55
|
+
"aria-disabled": disabled,
|
|
56
|
+
"aria-controls": panelId,
|
|
57
|
+
"aria-actions": cx.clsx(actions) || void 0,
|
|
58
|
+
"aria-description": getAriaDescription(actions.length),
|
|
59
|
+
tabIndex: focused || selected ? void 0 : -1,
|
|
60
|
+
role: "tab",
|
|
61
|
+
type: "button",
|
|
62
|
+
onClick: !disabled ? handleClick : void 0,
|
|
63
|
+
onKeyDown: !disabled ? handleKeyDown : void 0,
|
|
64
|
+
className: withBaseName(),
|
|
65
|
+
id,
|
|
66
|
+
ref: handleRef,
|
|
67
|
+
...rest,
|
|
68
|
+
children
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
exports.TabNextTrigger = TabNextTrigger;
|
|
74
|
+
//# sourceMappingURL=TabNextTrigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabNextTrigger.js","sources":["../../src/tabs-next/TabNextTrigger.tsx"],"sourcesContent":["import {\n makePrefixer,\n useForkRef,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type MouseEvent,\n forwardRef,\n useRef,\n} from \"react\";\nimport { useTabNext } from \"./TabNextContext\";\nimport tabTriggerCss from \"./TabNextTrigger.css\";\nimport { useTabsNext } from \"./TabsNextContext\";\n\nexport interface TabNextTriggerProps\n extends ComponentPropsWithoutRef<\"button\"> {\n debugLabel?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltTabNextTrigger\");\n\nfunction getAriaDescription(count: number) {\n if (count < 1) {\n return undefined;\n }\n\n if (count === 1) {\n return \"1 action available\";\n }\n\n return `${count} actions available`;\n}\n\nexport const TabNextTrigger = forwardRef<\n HTMLButtonElement,\n TabNextTriggerProps\n>(function TabNextTrigger(props, ref) {\n const { children, id: idProp, onClick, onKeyDown, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tab-next-trigger\",\n css: tabTriggerCss,\n window: targetWindow,\n });\n\n const { setSelected, registerTab, getPanelId } = useTabsNext();\n const { selected, value, focused, disabled, tabId, actions } = useTabNext();\n\n const tabRef = useRef<HTMLButtonElement>(null);\n\n const id = tabId;\n\n useIsomorphicLayoutEffect(() => {\n if (value && id && tabRef.current) {\n return registerTab({ id, value, element: tabRef.current });\n }\n }, [value, id, registerTab]);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n setSelected(event, value);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n\n if (event.key === \"Enter\" || event.key === \" \") {\n setSelected(event, value);\n }\n };\n\n const handleRef = useForkRef<HTMLButtonElement>(tabRef, ref);\n const panelId = getPanelId(value);\n\n return (\n <button\n aria-selected={selected}\n aria-disabled={disabled}\n aria-controls={panelId}\n // eslint-disable-next-line react/no-unknown-property\n aria-actions={clsx(actions) || undefined}\n aria-description={getAriaDescription(actions.length)}\n tabIndex={focused || selected ? undefined : -1}\n role=\"tab\"\n type=\"button\"\n onClick={!disabled ? handleClick : undefined}\n onKeyDown={!disabled ? handleKeyDown : undefined}\n className={withBaseName()}\n id={id}\n ref={handleRef}\n {...rest}\n >\n {children}\n </button>\n );\n});\n"],"names":["makePrefixer","forwardRef","TabNextTrigger","useWindow","useComponentCssInjection","tabTriggerCss","useTabsNext","useTabNext","useRef","useIsomorphicLayoutEffect","useForkRef","jsx","clsx"],"mappings":";;;;;;;;;;;;AAwBA,MAAM,YAAA,GAAeA,kBAAa,oBAAoB,CAAA;AAEtD,SAAS,mBAAmB,KAAe,EAAA;AACzC,EAAA,IAAI,QAAQ,CAAG,EAAA;AACb,IAAO,OAAA,KAAA,CAAA;AAAA;AAGT,EAAA,IAAI,UAAU,CAAG,EAAA;AACf,IAAO,OAAA,oBAAA;AAAA;AAGT,EAAA,OAAO,GAAG,KAAK,CAAA,kBAAA,CAAA;AACjB;AAEO,MAAM,cAAiB,GAAAC,gBAAA,CAG5B,SAASC,eAAAA,CAAe,OAAO,GAAK,EAAA;AACpC,EAAM,MAAA,EAAE,UAAU,EAAI,EAAA,MAAA,EAAQ,SAAS,SAAW,EAAA,GAAG,MAAS,GAAA,KAAA;AAE9D,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,uBAAA;AAAA,IACR,GAAK,EAAAC,gBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,WAAA,EAAa,WAAa,EAAA,UAAA,KAAeC,2BAAY,EAAA;AAC7D,EAAM,MAAA,EAAE,UAAU,KAAO,EAAA,OAAA,EAAS,UAAU,KAAO,EAAA,OAAA,KAAYC,yBAAW,EAAA;AAE1E,EAAM,MAAA,MAAA,GAASC,aAA0B,IAAI,CAAA;AAE7C,EAAA,MAAM,EAAK,GAAA,KAAA;AAEX,EAAAC,8BAAA,CAA0B,MAAM;AAC9B,IAAI,IAAA,KAAA,IAAS,EAAM,IAAA,MAAA,CAAO,OAAS,EAAA;AACjC,MAAA,OAAO,YAAY,EAAE,EAAA,EAAI,OAAO,OAAS,EAAA,MAAA,CAAO,SAAS,CAAA;AAAA;AAC3D,GACC,EAAA,CAAC,KAAO,EAAA,EAAA,EAAI,WAAW,CAAC,CAAA;AAE3B,EAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AAC5D,IAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,GAC1B;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,KAA4C,KAAA;AACjE,IAAA,SAAA,GAAY,KAAK,CAAA;AAEjB,IAAA,IAAI,KAAM,CAAA,GAAA,KAAQ,OAAW,IAAA,KAAA,CAAM,QAAQ,GAAK,EAAA;AAC9C,MAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA;AAC1B,GACF;AAEA,EAAM,MAAA,SAAA,GAAYC,eAA8B,CAAA,MAAA,EAAQ,GAAG,CAAA;AAC3D,EAAM,MAAA,OAAA,GAAU,WAAW,KAAK,CAAA;AAEhC,EACE,uBAAAC,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,eAAe,EAAA,QAAA;AAAA,MACf,eAAe,EAAA,QAAA;AAAA,MACf,eAAe,EAAA,OAAA;AAAA,MAEf,cAAA,EAAcC,OAAK,CAAA,OAAO,CAAK,IAAA,KAAA,CAAA;AAAA,MAC/B,kBAAA,EAAkB,kBAAmB,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MACnD,QAAA,EAAU,OAAW,IAAA,QAAA,GAAW,KAAY,CAAA,GAAA,CAAA,CAAA;AAAA,MAC5C,IAAK,EAAA,KAAA;AAAA,MACL,IAAK,EAAA,QAAA;AAAA,MACL,OAAA,EAAS,CAAC,QAAA,GAAW,WAAc,GAAA,KAAA,CAAA;AAAA,MACnC,SAAA,EAAW,CAAC,QAAA,GAAW,aAAgB,GAAA,KAAA,CAAA;AAAA,MACvC,WAAW,YAAa,EAAA;AAAA,MACxB,EAAA;AAAA,MACA,GAAK,EAAA,SAAA;AAAA,MACJ,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tabOverflowListCss = ".saltTabOverflow {\n position: relative;\n}\n\n.saltTabOverflow-list {\n background: var(--salt-container-primary-background);\n border: var(--salt-size-border) var(--salt-selectable-borderStyle-selected) var(--salt-selectable-borderColor-selected);\n overflow: hidden;\n overflow-y: auto;\n position: absolute;\n z-index: var(--salt-zIndex-flyover);\n box-shadow: var(--salt-overlayable-shadow-popout);\n box-sizing: border-box;\n border-radius: var(--salt-palette-corner, 0);\n}\n\n.saltTabOverflow-listContainer {\n display: flex;\n flex-direction: column;\n gap: var(--salt-size-border);\n max-height: inherit;\n min-height: inherit;\n}\n\n.saltTabOverflow-list[data-hidden=\"true\"] {\n opacity: 0;\n pointer-events: none;\n}\n\n.saltTabOverflow-list .saltTabNext {\n color: var(--salt-content-primary-foreground);\n background: var(--salt-selectable-background);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n padding-left: var(--salt-spacing-100);\n padding-right: var(--salt-spacing-100);\n display: flex;\n gap: var(--salt-spacing-100);\n position: relative;\n align-items: center;\n cursor: var(--salt-selectable-cursor-hover);\n box-sizing: border-box;\n flex-shrink: 0;\n justify-content: flex-start;\n}\n\n.saltTabOverflow-list .saltTabNext .saltTabNextTrigger {\n justify-content: start;\n}\n\n.saltTabOverflow-list .saltTabNext::after {\n display: none;\n}\n\n.saltTabOverflow-list .saltTabNext[aria-disabled=\"true\"] {\n color: var(--salt-content-primary-foreground-disabled);\n cursor: var(--salt-selectable-cursor-disabled);\n}\n\n.saltTabOverflow-list .saltTabNext-focusVisible {\n outline: var(--salt-focused-outline);\n outline-offset: calc(var(--salt-size-border) * -2);\n}\n\n.saltTabOverflow-list .saltTabNext:hover {\n background: var(--salt-selectable-background-hover);\n}\n\n.saltTabOverflow-list .saltTabNext:active {\n background: var(--salt-selectable-background-selected);\n box-shadow: 0 calc(var(--salt-size-border) * -1) 0 0 var(--salt-selectable-borderColor-selected), 0 var(--salt-size-border) 0 0 var(--salt-selectable-borderColor-selected);\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = tabOverflowListCss;
|
|
6
|
+
//# sourceMappingURL=TabOverflowList.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabOverflowList.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('@floating-ui/react');
|
|
5
|
+
var core = require('@salt-ds/core');
|
|
6
|
+
var styles = require('@salt-ds/styles');
|
|
7
|
+
var window = require('@salt-ds/window');
|
|
8
|
+
var React = require('react');
|
|
9
|
+
var TabOverflowList$1 = require('./TabOverflowList.css.js');
|
|
10
|
+
var useFocusOutside = require('./hooks/useFocusOutside.js');
|
|
11
|
+
|
|
12
|
+
const withBaseName = core.makePrefixer("saltTabOverflow");
|
|
13
|
+
const TabOverflowList = React.forwardRef(
|
|
14
|
+
function TabOverflowList2(props, ref) {
|
|
15
|
+
const {
|
|
16
|
+
buttonRef,
|
|
17
|
+
tabstripRef,
|
|
18
|
+
children,
|
|
19
|
+
isMeasuring,
|
|
20
|
+
open,
|
|
21
|
+
setOpen,
|
|
22
|
+
...rest
|
|
23
|
+
} = props;
|
|
24
|
+
const targetWindow = window.useWindow();
|
|
25
|
+
styles.useComponentCssInjection({
|
|
26
|
+
testId: "salt-tabs-next-overflow-list",
|
|
27
|
+
css: TabOverflowList$1,
|
|
28
|
+
window: targetWindow
|
|
29
|
+
});
|
|
30
|
+
const { OverflowIcon } = core.useIcon();
|
|
31
|
+
const { refs, x, y, strategy, context } = core.useFloatingUI({
|
|
32
|
+
open,
|
|
33
|
+
onOpenChange(open2, _, reason) {
|
|
34
|
+
if (reason === "escape-key") {
|
|
35
|
+
queueMicrotask(() => {
|
|
36
|
+
const allTabs = tabstripRef.current?.querySelectorAll(
|
|
37
|
+
'[role="tab"]:not([aria-hidden])'
|
|
38
|
+
) ?? [];
|
|
39
|
+
const numberOfTabsInOverflow = listRef.current?.querySelectorAll('[role="tab"]').length ?? 0;
|
|
40
|
+
allTabs[allTabs.length - numberOfTabsInOverflow - 1]?.focus({
|
|
41
|
+
preventScroll: true
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
setOpen(open2);
|
|
46
|
+
},
|
|
47
|
+
placement: "bottom-start",
|
|
48
|
+
middleware: [
|
|
49
|
+
react.offset(1),
|
|
50
|
+
react.size({
|
|
51
|
+
apply({ elements, availableHeight }) {
|
|
52
|
+
Object.assign(elements.floating.style, {
|
|
53
|
+
maxHeight: `max(calc((var(--salt-size-base) + var(--salt-spacing-100)) * 5), calc(${availableHeight}px - var(--salt-spacing-100)))`
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
});
|
|
59
|
+
const { getFloatingProps } = react.useInteractions([react.useDismiss(context)]);
|
|
60
|
+
const rootRef = React.useRef(null);
|
|
61
|
+
const handleRootRef = core.useForkRef(rootRef, ref);
|
|
62
|
+
const listRef = React.useRef(null);
|
|
63
|
+
const handleListRef = core.useForkRef(listRef, refs.setFloating);
|
|
64
|
+
const handleFocusOutside = React.useCallback(() => {
|
|
65
|
+
setOpen(false);
|
|
66
|
+
}, [setOpen]);
|
|
67
|
+
useFocusOutside.useFocusOutside(
|
|
68
|
+
rootRef,
|
|
69
|
+
handleFocusOutside,
|
|
70
|
+
open,
|
|
71
|
+
"[data-floating-ui-portal]"
|
|
72
|
+
);
|
|
73
|
+
const handleClick = () => {
|
|
74
|
+
if (!open) {
|
|
75
|
+
listRef.current?.querySelectorAll('[role="tab"]')[0]?.focus({ preventScroll: true });
|
|
76
|
+
} else {
|
|
77
|
+
setOpen(false);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const handleFocus = () => {
|
|
81
|
+
setOpen(true);
|
|
82
|
+
};
|
|
83
|
+
const handleButtonRef = core.useForkRef(
|
|
84
|
+
buttonRef,
|
|
85
|
+
refs.setReference
|
|
86
|
+
);
|
|
87
|
+
const listId = core.useId();
|
|
88
|
+
const childCount = React.Children.count(children);
|
|
89
|
+
if (childCount === 0 && !isMeasuring) return null;
|
|
90
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: withBaseName(), ref: handleRootRef, children: [
|
|
91
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
92
|
+
core.Button,
|
|
93
|
+
{
|
|
94
|
+
"data-overflowbutton": true,
|
|
95
|
+
tabIndex: -1,
|
|
96
|
+
appearance: "transparent",
|
|
97
|
+
sentiment: "neutral",
|
|
98
|
+
onClick: handleClick,
|
|
99
|
+
ref: handleButtonRef,
|
|
100
|
+
"aria-label": `Overflow menu. ${childCount} tabs hidden`,
|
|
101
|
+
"aria-expanded": open,
|
|
102
|
+
"aria-controls": listId,
|
|
103
|
+
"aria-hidden": "true",
|
|
104
|
+
role: "tab",
|
|
105
|
+
"aria-haspopup": true,
|
|
106
|
+
...rest,
|
|
107
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(OverflowIcon, { "aria-hidden": true })
|
|
108
|
+
}
|
|
109
|
+
),
|
|
110
|
+
/* @__PURE__ */ jsxRuntime.jsx(react.FloatingTree, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
+
"div",
|
|
112
|
+
{
|
|
113
|
+
ref: handleListRef,
|
|
114
|
+
...getFloatingProps({
|
|
115
|
+
onFocus: handleFocus,
|
|
116
|
+
role: "presentation"
|
|
117
|
+
}),
|
|
118
|
+
className: withBaseName("list"),
|
|
119
|
+
"data-hidden": !open,
|
|
120
|
+
style: open ? { left: x ?? 0, top: y ?? 0, position: strategy } : void 0,
|
|
121
|
+
id: listId,
|
|
122
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("listContainer"), children })
|
|
123
|
+
}
|
|
124
|
+
) })
|
|
125
|
+
] });
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
exports.TabOverflowList = TabOverflowList;
|
|
130
|
+
//# sourceMappingURL=TabOverflowList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabOverflowList.js","sources":["../../src/tabs-next/TabOverflowList.tsx"],"sourcesContent":["import {\n FloatingTree,\n offset,\n size,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport {\n Button,\n makePrefixer,\n useFloatingUI,\n useForkRef,\n useIcon,\n useId,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n Children,\n type ComponentPropsWithoutRef,\n type Dispatch,\n type ReactNode,\n type Ref,\n type RefObject,\n type SetStateAction,\n forwardRef,\n useCallback,\n useRef,\n} from \"react\";\nimport tabOverflowListCss from \"./TabOverflowList.css\";\nimport { useFocusOutside } from \"./hooks/useFocusOutside\";\n\ninterface TabOverflowListProps extends ComponentPropsWithoutRef<\"button\"> {\n buttonRef?: Ref<HTMLButtonElement>;\n tabstripRef: RefObject<HTMLDivElement>;\n children?: ReactNode;\n isMeasuring?: boolean;\n open: boolean;\n setOpen: Dispatch<SetStateAction<boolean>>;\n}\n\nconst withBaseName = makePrefixer(\"saltTabOverflow\");\n\nexport const TabOverflowList = forwardRef<HTMLDivElement, TabOverflowListProps>(\n function TabOverflowList(props, ref) {\n const {\n buttonRef,\n tabstripRef,\n children,\n isMeasuring,\n open,\n setOpen,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tabs-next-overflow-list\",\n css: tabOverflowListCss,\n window: targetWindow,\n });\n\n const { OverflowIcon } = useIcon();\n\n const { refs, x, y, strategy, context } = useFloatingUI({\n open: open,\n onOpenChange(open, _, reason) {\n if (reason === \"escape-key\") {\n queueMicrotask(() => {\n const allTabs =\n tabstripRef.current?.querySelectorAll<HTMLElement>(\n '[role=\"tab\"]:not([aria-hidden])',\n ) ?? [];\n const numberOfTabsInOverflow =\n listRef.current?.querySelectorAll<HTMLElement>('[role=\"tab\"]')\n .length ?? 0;\n\n allTabs[allTabs.length - numberOfTabsInOverflow - 1]?.focus({\n preventScroll: true,\n });\n });\n }\n\n setOpen(open);\n },\n placement: \"bottom-start\",\n middleware: [\n offset(1),\n size({\n apply({ elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n maxHeight: `max(calc((var(--salt-size-base) + var(--salt-spacing-100)) * 5), calc(${availableHeight}px - var(--salt-spacing-100)))`,\n });\n },\n }),\n ],\n });\n\n const { getFloatingProps } = useInteractions([useDismiss(context)]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const handleRootRef = useForkRef(rootRef, ref);\n const listRef = useRef<HTMLDivElement>(null);\n const handleListRef = useForkRef<HTMLDivElement>(listRef, refs.setFloating);\n\n const handleFocusOutside = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n useFocusOutside(\n rootRef,\n handleFocusOutside,\n open,\n \"[data-floating-ui-portal]\",\n );\n\n const handleClick = () => {\n if (!open) {\n listRef.current\n ?.querySelectorAll<HTMLElement>('[role=\"tab\"]')[0]\n ?.focus({ preventScroll: true });\n } else {\n setOpen(false);\n }\n };\n\n const handleFocus = () => {\n setOpen(true);\n };\n\n const handleButtonRef = useForkRef<HTMLButtonElement>(\n buttonRef,\n refs.setReference,\n );\n\n const listId = useId();\n\n const childCount = Children.count(children);\n if (childCount === 0 && !isMeasuring) return null;\n\n return (\n <div className={withBaseName()} ref={handleRootRef}>\n <Button\n data-overflowbutton\n tabIndex={-1}\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleClick}\n ref={handleButtonRef}\n aria-label={`Overflow menu. ${childCount} tabs hidden`}\n aria-expanded={open}\n aria-controls={listId}\n aria-hidden=\"true\"\n role=\"tab\"\n aria-haspopup\n {...rest}\n >\n <OverflowIcon aria-hidden />\n </Button>\n <FloatingTree>\n <div\n ref={handleListRef}\n {...getFloatingProps({\n onFocus: handleFocus,\n role: \"presentation\",\n })}\n className={withBaseName(\"list\")}\n data-hidden={!open}\n style={\n open\n ? { left: x ?? 0, top: y ?? 0, position: strategy }\n : undefined\n }\n id={listId}\n >\n <div className={withBaseName(\"listContainer\")}>{children}</div>\n </div>\n </FloatingTree>\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","TabOverflowList","useWindow","useComponentCssInjection","tabOverflowListCss","useIcon","useFloatingUI","open","offset","size","useInteractions","useDismiss","useRef","useForkRef","useCallback","useFocusOutside","useId","Children","jsx","Button","FloatingTree"],"mappings":";;;;;;;;;;;AAyCA,MAAM,YAAA,GAAeA,kBAAa,iBAAiB,CAAA;AAE5C,MAAM,eAAkB,GAAAC,gBAAA;AAAA,EAC7B,SAASC,gBAAgB,CAAA,KAAA,EAAO,GAAK,EAAA;AACnC,IAAM,MAAA;AAAA,MACJ,SAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAG;AAAA,KACD,GAAA,KAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,8BAAA;AAAA,MACR,GAAK,EAAAC,iBAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAM,MAAA,EAAE,YAAa,EAAA,GAAIC,YAAQ,EAAA;AAEjC,IAAA,MAAM,EAAE,IAAM,EAAA,CAAA,EAAG,GAAG,QAAU,EAAA,OAAA,KAAYC,kBAAc,CAAA;AAAA,MACtD,IAAA;AAAA,MACA,YAAA,CAAaC,KAAM,EAAA,CAAA,EAAG,MAAQ,EAAA;AAC5B,QAAA,IAAI,WAAW,YAAc,EAAA;AAC3B,UAAA,cAAA,CAAe,MAAM;AACnB,YAAM,MAAA,OAAA,GACJ,YAAY,OAAS,EAAA,gBAAA;AAAA,cACnB;AAAA,iBACG,EAAC;AACR,YAAA,MAAM,yBACJ,OAAQ,CAAA,OAAA,EAAS,gBAA8B,CAAA,cAAc,EAC1D,MAAU,IAAA,CAAA;AAEf,YAAA,OAAA,CAAQ,OAAQ,CAAA,MAAA,GAAS,sBAAyB,GAAA,CAAC,GAAG,KAAM,CAAA;AAAA,cAC1D,aAAe,EAAA;AAAA,aAChB,CAAA;AAAA,WACF,CAAA;AAAA;AAGH,QAAA,OAAA,CAAQA,KAAI,CAAA;AAAA,OACd;AAAA,MACA,SAAW,EAAA,cAAA;AAAA,MACX,UAAY,EAAA;AAAA,QACVC,aAAO,CAAC,CAAA;AAAA,QACRC,UAAK,CAAA;AAAA,UACH,KAAM,CAAA,EAAE,QAAU,EAAA,eAAA,EAAmB,EAAA;AACnC,YAAO,MAAA,CAAA,MAAA,CAAO,QAAS,CAAA,QAAA,CAAS,KAAO,EAAA;AAAA,cACrC,SAAA,EAAW,yEAAyE,eAAe,CAAA,8BAAA;AAAA,aACpG,CAAA;AAAA;AACH,SACD;AAAA;AACH,KACD,CAAA;AAED,IAAM,MAAA,EAAE,kBAAqB,GAAAC,qBAAA,CAAgB,CAACC,gBAAW,CAAA,OAAO,CAAC,CAAC,CAAA;AAElE,IAAM,MAAA,OAAA,GAAUC,aAAuB,IAAI,CAAA;AAC3C,IAAM,MAAA,aAAA,GAAgBC,eAAW,CAAA,OAAA,EAAS,GAAG,CAAA;AAC7C,IAAM,MAAA,OAAA,GAAUD,aAAuB,IAAI,CAAA;AAC3C,IAAA,MAAM,aAAgB,GAAAC,eAAA,CAA2B,OAAS,EAAA,IAAA,CAAK,WAAW,CAAA;AAE1E,IAAM,MAAA,kBAAA,GAAqBC,kBAAY,MAAM;AAC3C,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,KACf,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAAC,+BAAA;AAAA,MACE,OAAA;AAAA,MACA,kBAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,IAAI,CAAC,IAAM,EAAA;AACT,QAAQ,OAAA,CAAA,OAAA,EACJ,gBAA8B,CAAA,cAAc,CAAE,CAAA,CAAC,GAC/C,KAAM,CAAA,EAAE,aAAe,EAAA,IAAA,EAAM,CAAA;AAAA,OAC5B,MAAA;AACL,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA;AACf,KACF;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,KACd;AAEA,IAAA,MAAM,eAAkB,GAAAF,eAAA;AAAA,MACtB,SAAA;AAAA,MACA,IAAK,CAAA;AAAA,KACP;AAEA,IAAA,MAAM,SAASG,UAAM,EAAA;AAErB,IAAM,MAAA,UAAA,GAAaC,cAAS,CAAA,KAAA,CAAM,QAAQ,CAAA;AAC1C,IAAA,IAAI,UAAe,KAAA,CAAA,IAAK,CAAC,WAAA,EAAoB,OAAA,IAAA;AAE7C,IAAA,uCACG,KAAI,EAAA,EAAA,SAAA,EAAW,YAAa,EAAA,EAAG,KAAK,aACnC,EAAA,QAAA,EAAA;AAAA,sBAAAC,cAAA;AAAA,QAACC,WAAA;AAAA,QAAA;AAAA,UACC,qBAAmB,EAAA,IAAA;AAAA,UACnB,QAAU,EAAA,CAAA,CAAA;AAAA,UACV,UAAW,EAAA,aAAA;AAAA,UACX,SAAU,EAAA,SAAA;AAAA,UACV,OAAS,EAAA,WAAA;AAAA,UACT,GAAK,EAAA,eAAA;AAAA,UACL,YAAA,EAAY,kBAAkB,UAAU,CAAA,YAAA,CAAA;AAAA,UACxC,eAAe,EAAA,IAAA;AAAA,UACf,eAAe,EAAA,MAAA;AAAA,UACf,aAAY,EAAA,MAAA;AAAA,UACZ,IAAK,EAAA,KAAA;AAAA,UACL,eAAa,EAAA,IAAA;AAAA,UACZ,GAAG,IAAA;AAAA,UAEJ,QAAA,kBAAAD,cAAA,CAAC,YAAa,EAAA,EAAA,aAAA,EAAW,IAAC,EAAA;AAAA;AAAA,OAC5B;AAAA,qCACCE,kBACC,EAAA,EAAA,QAAA,kBAAAF,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAK,EAAA,aAAA;AAAA,UACJ,GAAG,gBAAiB,CAAA;AAAA,YACnB,OAAS,EAAA,WAAA;AAAA,YACT,IAAM,EAAA;AAAA,WACP,CAAA;AAAA,UACD,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,UAC9B,eAAa,CAAC,IAAA;AAAA,UACd,KAAA,EACE,IACI,GAAA,EAAE,IAAM,EAAA,CAAA,IAAK,CAAG,EAAA,GAAA,EAAK,CAAK,IAAA,CAAA,EAAG,QAAU,EAAA,QAAA,EACvC,GAAA,KAAA,CAAA;AAAA,UAEN,EAAI,EAAA,MAAA;AAAA,UAEJ,yCAAC,KAAI,EAAA,EAAA,SAAA,EAAW,YAAa,CAAA,eAAe,GAAI,QAAS,EAAA;AAAA;AAAA,OAE7D,EAAA;AAAA,KACF,EAAA,CAAA;AAAA;AAGN;;;;"}
|