@vuu-ui/vuu-ui-controls 0.13.13 → 0.13.15
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/selectionTypes.js.map +1 -1
- package/cjs/common-hooks/use-resize-observer.js.map +1 -1
- package/cjs/common-hooks/useControlled.js.map +1 -1
- package/cjs/context-panel-provider/ContextPanelProvider.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.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 +9 -4
- package/cjs/editable/useEditableText.js.map +1 -1
- package/cjs/editable-label/EditableLabel.js.map +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.js.map +1 -1
- package/cjs/instrument-picker/TablePicker.js.map +1 -1
- package/cjs/instrument-picker/useTablePicker.js.map +1 -1
- package/cjs/measured-container/MeasuredContainer.js.map +1 -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/sortable-list/SortableList.js.map +1 -1
- package/cjs/split-button/SplitButton.js.map +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.js.map +1 -1
- package/cjs/table-search/TableSearch.js.map +1 -1
- package/cjs/table-search/useTableSearch.js.map +1 -1
- package/cjs/tabs-next/TabBar.js.map +1 -1
- package/cjs/tabs-next/TabListNext.js.map +1 -1
- package/cjs/tabs-next/TabNext.js.map +1 -1
- package/cjs/tabs-next/TabNextAction.js.map +1 -1
- package/cjs/tabs-next/TabNextContext.js.map +1 -1
- package/cjs/tabs-next/TabNextPanel.js.map +1 -1
- package/cjs/tabs-next/TabNextTrigger.js.map +1 -1
- package/cjs/tabs-next/TabOverflowList.js.map +1 -1
- package/cjs/tabs-next/TabsNext.js.map +1 -1
- package/cjs/tabs-next/TabsNextContext.js.map +1 -1
- package/cjs/tabs-next/hooks/useCollection.js.map +1 -1
- package/cjs/tabs-next/hooks/useFocusOutside.js.map +1 -1
- package/cjs/tabs-next/hooks/useOverflow.js.map +1 -1
- 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.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/utils/isPlainObject.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/selectionTypes.js.map +1 -1
- package/esm/common-hooks/use-resize-observer.js.map +1 -1
- package/esm/common-hooks/useControlled.js.map +1 -1
- package/esm/context-panel-provider/ContextPanelProvider.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.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.map +1 -1
- package/esm/drag-drop/useDragDropCopy.js.map +1 -1
- package/esm/drag-drop/useDragDropIndicator.js.map +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 +10 -5
- package/esm/editable/useEditableText.js.map +1 -1
- package/esm/editable-label/EditableLabel.js.map +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.js.map +1 -1
- package/esm/instrument-picker/TablePicker.js.map +1 -1
- package/esm/instrument-picker/useTablePicker.js.map +1 -1
- package/esm/measured-container/MeasuredContainer.js.map +1 -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/sortable-list/SortableList.js.map +1 -1
- package/esm/split-button/SplitButton.js.map +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.js.map +1 -1
- package/esm/table-search/TableSearch.js.map +1 -1
- package/esm/table-search/useTableSearch.js.map +1 -1
- package/esm/tabs-next/TabBar.js.map +1 -1
- package/esm/tabs-next/TabListNext.js.map +1 -1
- package/esm/tabs-next/TabNext.js.map +1 -1
- package/esm/tabs-next/TabNextAction.js.map +1 -1
- package/esm/tabs-next/TabNextContext.js.map +1 -1
- package/esm/tabs-next/TabNextPanel.js.map +1 -1
- package/esm/tabs-next/TabNextTrigger.js.map +1 -1
- package/esm/tabs-next/TabOverflowList.js.map +1 -1
- package/esm/tabs-next/TabsNext.js.map +1 -1
- package/esm/tabs-next/TabsNextContext.js.map +1 -1
- package/esm/tabs-next/hooks/useCollection.js.map +1 -1
- package/esm/tabs-next/hooks/useFocusOutside.js.map +1 -1
- package/esm/tabs-next/hooks/useOverflow.js.map +1 -1
- 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.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/utils/isPlainObject.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 +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","sources":["../../src/date-picker/DatePicker.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type SyntheticEvent,\n forwardRef,\n useRef,\n useState,\n} from \"react\";\n\nimport { flip, offset, useDismiss, useInteractions } from \"@floating-ui/react\";\nimport {\n type DateValue,\n getLocalTimeZone,\n today,\n} from \"@internationalized/date\";\nimport {\n Button,\n makePrefixer,\n useControlled,\n useFloatingUI,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport { CalendarIcon } from \"@salt-ds/icons\";\nimport {\n type CalendarProps,\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { DateInput, type DateInputProps } from \"../date-input\";\nimport { DatePickerContext } from \"./DatePickerContext\";\nimport { DatePickerPanel } from \"./DatePickerPanel\";\n\nconst withBaseName = makePrefixer(\"saltDatePicker\");\n\nexport interface DatePickerProps<SelectionVariantType>\n extends DateInputProps<SelectionVariantType> {\n /**\n * Selection variant. Defaults to single select.\n */\n selectionVariant?: \"default\" | \"range\";\n /**\n * If `true`, the component will be disabled.\n */\n disabled?: boolean;\n /**\n * The selected date value. Use when the component is controlled.\n * Can be a single date or an object with start and end dates for range selection.\n */\n selectedDate?: SelectionVariantType;\n /**\n * The default date value. Use when the component is not controlled.\n * Can be a single date or an object with start and end dates for range selection.\n */\n defaultSelectedDate?: SelectionVariantType;\n /**\n * Props to be passed to the Calendar component.\n */\n CalendarProps?: Partial<\n Omit<\n CalendarProps,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"onSelectedDateChange\"\n >\n >;\n /**\n * Function to format the input value.\n */\n dateFormatter?: (input: DateValue | undefined) => string;\n /**\n * Callback function triggered when open state changes.\n */\n onOpenChange?: (newOpen: boolean) => void;\n /**\n * Display or hide the component.\n */\n open?: boolean;\n /**\n * The default open value. Use when the component is not controlled.\n */\n defaultOpen?: boolean;\n /**\n * Helper text to display in the panel\n */\n helperText?: string;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Callback fired when the selected date change.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n /**\n * Callback fired when the input value change.\n */\n onChange?: SelectionVariantType extends SingleSelectionValueType\n ? (\n event: ChangeEvent<HTMLInputElement>,\n selectedDateInputValue?: string,\n ) => void\n : (\n event: ChangeEvent<HTMLInputElement>,\n startDateInputValue?: string,\n endDateInputValue?: string,\n ) => void;\n /**\n * Number of Calendars to be shown if selectionVariant is range.\n * 2 is the default value.\n */\n visibleMonths?: 1 | 2;\n}\n\nexport const DatePicker = forwardRef<\n HTMLDivElement,\n DatePickerProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DatePicker(\n {\n selectionVariant = \"default\",\n disabled = false,\n placeholder = \"dd mmm yyyy\",\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n dateFormatter,\n CalendarProps,\n className,\n id: idProp,\n open: openProp,\n defaultOpen,\n onOpenChange: onOpenChangeProp,\n helperText,\n readOnly: readOnlyProp,\n validationStatus,\n onSelectionChange,\n onChange,\n visibleMonths = 2,\n bordered,\n ...rest\n },\n ref,\n) {\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: Boolean(defaultOpen),\n name: \"openPanel\",\n state: \"openPanel\",\n });\n\n const [selectedDate, setSelectedDate] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const id = useId(idProp);\n\n const [startVisibleMonth, setStartVisibleMonth] = useState<\n DateValue | undefined\n >(\n (isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate?.startDate\n : selectedDate) ?? today(getLocalTimeZone()),\n );\n\n const [endVisibleMonth, setEndVisibleMonth] = useState<DateValue | undefined>(\n (isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate.startDate?.add({ months: 1 })\n : selectedDate) ?? today(getLocalTimeZone()).add({ months: 1 }),\n );\n\n const onOpenChange = (newState: boolean) => {\n setOpen(newState);\n startInputRef?.current?.focus();\n onOpenChangeProp?.(newState);\n };\n\n const { x, y, strategy, elements, floating, reference, context } =\n useFloatingUI({\n open: open,\n onOpenChange: onOpenChange,\n placement: \"bottom-start\",\n middleware: [offset(1), flip({ fallbackStrategy: \"initialPlacement\" })],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useDismiss(context),\n ]);\n const { disabled: formFieldDisabled, readOnly: formFieldReadOnly } =\n useFormFieldProps();\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n\n const getPanelPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.offsetWidth,\n height: elements.floating?.offsetHeight,\n });\n\n const panelRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const inputRef = useForkRef<HTMLDivElement>(ref, reference);\n const floatingRef = useForkRef<HTMLDivElement>(panelRef, floating);\n\n // Handlers\n const handleSelect = (\n event: SyntheticEvent,\n selectedDate?: DateValue | { startDate?: DateValue; endDate?: DateValue },\n ) => {\n if (selectionVariant === \"default\" && selectedDate) {\n startInputRef?.current?.focus();\n }\n\n if (\n isRangeOrOffsetSelectionWithStartDate(selectedDate) &&\n selectedDate.endDate\n ) {\n endInputRef?.current?.focus();\n }\n onSelectionChange?.(event, selectedDate);\n };\n const handleCalendarButton = () => {\n startInputRef?.current?.focus();\n const newState = !open;\n setOpen(newState);\n onOpenChangeProp?.(newState);\n };\n\n // Context\n const datePickerContextValue = {\n openState: open,\n setOpen,\n disabled,\n selectedDate,\n setSelectedDate,\n defaultSelectedDate,\n startVisibleMonth,\n setStartVisibleMonth,\n endVisibleMonth,\n setEndVisibleMonth,\n selectionVariant,\n context,\n getPanelPosition,\n };\n\n const calendarId = `${id}-calendar`;\n\n return (\n <DatePickerContext.Provider value={datePickerContextValue}>\n <DateInput\n aria-owns={calendarId}\n validationStatus={validationStatus}\n bordered={bordered}\n className={clsx(withBaseName(), className)}\n id={id}\n ref={inputRef}\n {...getReferenceProps()}\n startInputRef={startInputRef}\n endInputRef={endInputRef}\n placeholder={placeholder}\n dateFormatter={dateFormatter}\n readOnly={isReadOnly}\n onSelectionChange={onSelectionChange}\n onChange={onChange}\n endAdornment={\n <Button\n variant=\"secondary\"\n onClick={handleCalendarButton}\n disabled={disabled || isReadOnly || formFieldDisabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon aria-hidden />\n </Button>\n }\n {...rest}\n />\n <DatePickerPanel\n ref={floatingRef}\n {...getFloatingProps()}\n onSelect={handleSelect}\n CalendarProps={{\n ...CalendarProps,\n borderedDropdown: bordered,\n id: calendarId,\n }}\n helperText={helperText}\n visibleMonths={visibleMonths}\n />\n </DatePickerContext.Provider>\n );\n});\n"],"names":["DatePicker","selectedDate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../../../../packages/vuu-ui-controls/src/date-picker/DatePicker.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type SyntheticEvent,\n forwardRef,\n useRef,\n useState,\n} from \"react\";\n\nimport { flip, offset, useDismiss, useInteractions } from \"@floating-ui/react\";\nimport {\n type DateValue,\n getLocalTimeZone,\n today,\n} from \"@internationalized/date\";\nimport {\n Button,\n makePrefixer,\n useControlled,\n useFloatingUI,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport { CalendarIcon } from \"@salt-ds/icons\";\nimport {\n type CalendarProps,\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { DateInput, type DateInputProps } from \"../date-input\";\nimport { DatePickerContext } from \"./DatePickerContext\";\nimport { DatePickerPanel } from \"./DatePickerPanel\";\n\nconst withBaseName = makePrefixer(\"saltDatePicker\");\n\nexport interface DatePickerProps<SelectionVariantType>\n extends DateInputProps<SelectionVariantType> {\n /**\n * Selection variant. Defaults to single select.\n */\n selectionVariant?: \"default\" | \"range\";\n /**\n * If `true`, the component will be disabled.\n */\n disabled?: boolean;\n /**\n * The selected date value. Use when the component is controlled.\n * Can be a single date or an object with start and end dates for range selection.\n */\n selectedDate?: SelectionVariantType;\n /**\n * The default date value. Use when the component is not controlled.\n * Can be a single date or an object with start and end dates for range selection.\n */\n defaultSelectedDate?: SelectionVariantType;\n /**\n * Props to be passed to the Calendar component.\n */\n CalendarProps?: Partial<\n Omit<\n CalendarProps,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"onSelectedDateChange\"\n >\n >;\n /**\n * Function to format the input value.\n */\n dateFormatter?: (input: DateValue | undefined) => string;\n /**\n * Callback function triggered when open state changes.\n */\n onOpenChange?: (newOpen: boolean) => void;\n /**\n * Display or hide the component.\n */\n open?: boolean;\n /**\n * The default open value. Use when the component is not controlled.\n */\n defaultOpen?: boolean;\n /**\n * Helper text to display in the panel\n */\n helperText?: string;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Callback fired when the selected date change.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n /**\n * Callback fired when the input value change.\n */\n onChange?: SelectionVariantType extends SingleSelectionValueType\n ? (\n event: ChangeEvent<HTMLInputElement>,\n selectedDateInputValue?: string,\n ) => void\n : (\n event: ChangeEvent<HTMLInputElement>,\n startDateInputValue?: string,\n endDateInputValue?: string,\n ) => void;\n /**\n * Number of Calendars to be shown if selectionVariant is range.\n * 2 is the default value.\n */\n visibleMonths?: 1 | 2;\n}\n\nexport const DatePicker = forwardRef<\n HTMLDivElement,\n DatePickerProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DatePicker(\n {\n selectionVariant = \"default\",\n disabled = false,\n placeholder = \"dd mmm yyyy\",\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n dateFormatter,\n CalendarProps,\n className,\n id: idProp,\n open: openProp,\n defaultOpen,\n onOpenChange: onOpenChangeProp,\n helperText,\n readOnly: readOnlyProp,\n validationStatus,\n onSelectionChange,\n onChange,\n visibleMonths = 2,\n bordered,\n ...rest\n },\n ref,\n) {\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: Boolean(defaultOpen),\n name: \"openPanel\",\n state: \"openPanel\",\n });\n\n const [selectedDate, setSelectedDate] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const id = useId(idProp);\n\n const [startVisibleMonth, setStartVisibleMonth] = useState<\n DateValue | undefined\n >(\n (isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate?.startDate\n : selectedDate) ?? today(getLocalTimeZone()),\n );\n\n const [endVisibleMonth, setEndVisibleMonth] = useState<DateValue | undefined>(\n (isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ? selectedDate.startDate?.add({ months: 1 })\n : selectedDate) ?? today(getLocalTimeZone()).add({ months: 1 }),\n );\n\n const onOpenChange = (newState: boolean) => {\n setOpen(newState);\n startInputRef?.current?.focus();\n onOpenChangeProp?.(newState);\n };\n\n const { x, y, strategy, elements, floating, reference, context } =\n useFloatingUI({\n open: open,\n onOpenChange: onOpenChange,\n placement: \"bottom-start\",\n middleware: [offset(1), flip({ fallbackStrategy: \"initialPlacement\" })],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useDismiss(context),\n ]);\n const { disabled: formFieldDisabled, readOnly: formFieldReadOnly } =\n useFormFieldProps();\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n\n const getPanelPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.offsetWidth,\n height: elements.floating?.offsetHeight,\n });\n\n const panelRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const inputRef = useForkRef<HTMLDivElement>(ref, reference);\n const floatingRef = useForkRef<HTMLDivElement>(panelRef, floating);\n\n // Handlers\n const handleSelect = (\n event: SyntheticEvent,\n selectedDate?: DateValue | { startDate?: DateValue; endDate?: DateValue },\n ) => {\n if (selectionVariant === \"default\" && selectedDate) {\n startInputRef?.current?.focus();\n }\n\n if (\n isRangeOrOffsetSelectionWithStartDate(selectedDate) &&\n selectedDate.endDate\n ) {\n endInputRef?.current?.focus();\n }\n onSelectionChange?.(event, selectedDate);\n };\n const handleCalendarButton = () => {\n startInputRef?.current?.focus();\n const newState = !open;\n setOpen(newState);\n onOpenChangeProp?.(newState);\n };\n\n // Context\n const datePickerContextValue = {\n openState: open,\n setOpen,\n disabled,\n selectedDate,\n setSelectedDate,\n defaultSelectedDate,\n startVisibleMonth,\n setStartVisibleMonth,\n endVisibleMonth,\n setEndVisibleMonth,\n selectionVariant,\n context,\n getPanelPosition,\n };\n\n const calendarId = `${id}-calendar`;\n\n return (\n <DatePickerContext.Provider value={datePickerContextValue}>\n <DateInput\n aria-owns={calendarId}\n validationStatus={validationStatus}\n bordered={bordered}\n className={clsx(withBaseName(), className)}\n id={id}\n ref={inputRef}\n {...getReferenceProps()}\n startInputRef={startInputRef}\n endInputRef={endInputRef}\n placeholder={placeholder}\n dateFormatter={dateFormatter}\n readOnly={isReadOnly}\n onSelectionChange={onSelectionChange}\n onChange={onChange}\n endAdornment={\n <Button\n variant=\"secondary\"\n onClick={handleCalendarButton}\n disabled={disabled || isReadOnly || formFieldDisabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon aria-hidden />\n </Button>\n }\n {...rest}\n />\n <DatePickerPanel\n ref={floatingRef}\n {...getFloatingProps()}\n onSelect={handleSelect}\n CalendarProps={{\n ...CalendarProps,\n borderedDropdown: bordered,\n id: calendarId,\n }}\n helperText={helperText}\n visibleMonths={visibleMonths}\n />\n </DatePickerContext.Provider>\n );\n});\n"],"names":["DatePicker","selectedDate"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerContext.js","sources":["
|
|
1
|
+
{"version":3,"file":"DatePickerContext.js","sources":["../../../../packages/vuu-ui-controls/src/date-picker/DatePickerContext.ts"],"sourcesContent":["import type { DateValue } from \"@internationalized/date\";\nimport { type UseFloatingUIReturn, createContext } from \"@salt-ds/core\";\nimport { useContext } from \"react\";\nimport type {\n RangeSelectionValueType,\n SingleSelectionValueType,\n} from \"../calendar\";\n\nexport interface DatePickerContextValue<SelectionVariantType>\n extends Partial<Pick<UseFloatingUIReturn, \"context\">> {\n openState: boolean;\n setOpen: (newOpen: boolean) => void;\n disabled: boolean;\n //\n selectedDate: SelectionVariantType | undefined;\n defaultSelectedDate: SelectionVariantType | undefined;\n setSelectedDate: (newStartDate: SelectionVariantType | undefined) => void;\n startVisibleMonth: DateValue | undefined;\n setStartVisibleMonth: (newStartDate: DateValue | undefined) => void;\n endVisibleMonth: DateValue | undefined;\n setEndVisibleMonth: (newStartDate: DateValue | undefined) => void;\n selectionVariant: \"default\" | \"range\";\n getPanelPosition: () => Record<string, unknown>;\n}\n\nexport const DatePickerContext = createContext<\n DatePickerContextValue<SingleSelectionValueType | RangeSelectionValueType>\n>(\"DatePickerContext\", {\n openState: false,\n setOpen: () => undefined,\n disabled: false,\n selectedDate: undefined,\n defaultSelectedDate: undefined,\n setSelectedDate: () => undefined,\n startVisibleMonth: undefined,\n setStartVisibleMonth: () => undefined,\n endVisibleMonth: undefined,\n setEndVisibleMonth: () => undefined,\n selectionVariant: \"default\",\n getPanelPosition: () => ({}),\n});\n\nexport function useDatePickerContext() {\n return useContext(DatePickerContext);\n}\n"],"names":[],"mappings":";;;AAyBa,MAAA,iBAAA,GAAoB,cAE/B,mBAAqB,EAAA;AAAA,EACrB,SAAW,EAAA,KAAA;AAAA,EACX,SAAS,MAAM,KAAA,CAAA;AAAA,EACf,QAAU,EAAA,KAAA;AAAA,EACV,YAAc,EAAA,KAAA,CAAA;AAAA,EACd,mBAAqB,EAAA,KAAA,CAAA;AAAA,EACrB,iBAAiB,MAAM,KAAA,CAAA;AAAA,EACvB,iBAAmB,EAAA,KAAA,CAAA;AAAA,EACnB,sBAAsB,MAAM,KAAA,CAAA;AAAA,EAC5B,eAAiB,EAAA,KAAA,CAAA;AAAA,EACjB,oBAAoB,MAAM,KAAA,CAAA;AAAA,EAC1B,gBAAkB,EAAA,SAAA;AAAA,EAClB,gBAAA,EAAkB,OAAO,EAAC;AAC5B,CAAC;AAEM,SAAS,oBAAuB,GAAA;AACrC,EAAA,OAAO,WAAW,iBAAiB,CAAA;AACrC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerPanel.js","sources":["../../src/date-picker/DatePickerPanel.tsx"],"sourcesContent":["import {\n type DateValue,\n endOfMonth,\n startOfMonth,\n} from \"@internationalized/date\";\nimport {\n FlexItem,\n FlexLayout,\n FormFieldContext,\n type FormFieldContextValue,\n FormFieldHelperText,\n StackLayout,\n makePrefixer,\n useFloatingComponent,\n useFormFieldProps,\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 SyntheticEvent,\n forwardRef,\n useEffect,\n useState,\n} from \"react\";\nimport {\n Calendar,\n type CalendarProps,\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n type UseRangeSelectionCalendarProps,\n type UseSingleSelectionCalendarProps,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport dateInputPanelCss from \"./DatePickerPanel.css\";\n\nexport interface DatePickerPanelProps<SelectionVariantType>\n extends ComponentPropsWithoutRef<\"div\"> {\n onSelect?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n helperText?: string;\n visibleMonths?: 1 | 2;\n CalendarProps?: Partial<\n Omit<\n CalendarProps,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"onSelectedDateChange\"\n >\n >;\n}\n\nconst withBaseName = makePrefixer(\"saltDatePickerPanel\");\n\nfunction getHoveredDate(\n date?: DateValue | null,\n compact?: boolean,\n hoveredDate?: DateValue | null,\n) {\n return date &&\n !compact &&\n hoveredDate &&\n hoveredDate.compare(endOfMonth(date)) > 0\n ? endOfMonth(date)\n : hoveredDate;\n}\n\nexport const DatePickerPanel = forwardRef<\n HTMLDivElement,\n DatePickerPanelProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DatePickerPanel(props, ref) {\n const {\n className,\n onSelect,\n helperText,\n CalendarProps,\n visibleMonths,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-picker-panel\",\n css: dateInputPanelCss,\n window: targetWindow,\n });\n\n const { Component: FloatingComponent } = useFloatingComponent();\n const [hoveredDate, setHoveredDate] = useState<DateValue | null>(null);\n\n const {\n openState,\n selectedDate,\n setSelectedDate,\n startVisibleMonth,\n setStartVisibleMonth,\n endVisibleMonth,\n setEndVisibleMonth,\n setOpen,\n context,\n getPanelPosition,\n selectionVariant,\n } = useDatePickerContext();\n\n const { a11yProps } = useFormFieldProps();\n const isRangePicker =\n isRangeOrOffsetSelectionWithStartDate(selectedDate) ||\n (selectionVariant === \"range\" && selectedDate === undefined);\n const compact = visibleMonths === 1;\n\n const setRangeDate: UseRangeSelectionCalendarProps[\"onSelectedDateChange\"] = (\n event,\n newDate,\n ) => {\n setSelectedDate(newDate);\n onSelect?.(event, newDate);\n if (newDate.startDate && newDate.endDate) {\n setOpen(false);\n }\n };\n const setSingleDate: UseSingleSelectionCalendarProps[\"onSelectedDateChange\"] =\n (event, newDate) => {\n setSelectedDate(newDate);\n onSelect?.(event, newDate);\n setOpen(false);\n };\n const handleHoveredDateChange: CalendarProps[\"onHoveredDateChange\"] = (\n _,\n newHoveredDate,\n ) => {\n setHoveredDate(newHoveredDate);\n };\n useEffect(() => {\n if (isRangePicker) {\n if (selectedDate?.startDate) {\n setStartVisibleMonth(selectedDate.startDate);\n setEndVisibleMonth(selectedDate.startDate.add({ months: 1 }));\n }\n } else {\n setStartVisibleMonth(selectedDate);\n }\n }, [selectedDate, setEndVisibleMonth, setStartVisibleMonth]);\n\n const firstCalendarProps: CalendarProps = isRangePicker\n ? {\n selectionVariant: \"range\",\n hoveredDate: getHoveredDate(\n selectedDate?.startDate,\n compact,\n hoveredDate,\n ),\n onHoveredDateChange: handleHoveredDateChange,\n selectedDate: selectedDate,\n onSelectedDateChange: setRangeDate,\n maxDate:\n !compact && selectedDate?.startDate\n ? endOfMonth(selectedDate?.startDate)\n : undefined,\n hideOutOfRangeDates: true,\n }\n : {\n selectionVariant: \"default\",\n selectedDate: selectedDate,\n onSelectedDateChange: setSingleDate,\n };\n return (\n <FloatingComponent\n open={openState}\n className={clsx(withBaseName(), className)}\n aria-modal=\"true\"\n ref={ref}\n focusManagerProps={\n context\n ? {\n context: context,\n initialFocus: 4,\n }\n : undefined\n }\n {...getPanelPosition()}\n {...a11yProps}\n {...rest}\n >\n <StackLayout separators gap={0} className={withBaseName(\"container\")}>\n {helperText && (\n <FlexItem className={withBaseName(\"header\")}>\n <FormFieldHelperText>{helperText}</FormFieldHelperText>\n </FlexItem>\n )}\n <FlexLayout>\n {/* Avoid Dropdowns in Calendar inheriting the FormField's state */}\n <FormFieldContext.Provider value={{} as FormFieldContextValue}>\n <Calendar\n visibleMonth={startVisibleMonth}\n onVisibleMonthChange={(_, month) => setStartVisibleMonth(month)}\n {...firstCalendarProps}\n {...CalendarProps}\n />\n {isRangePicker && !compact && (\n <Calendar\n selectionVariant=\"range\"\n hoveredDate={hoveredDate}\n onHoveredDateChange={handleHoveredDateChange}\n selectedDate={selectedDate}\n onSelectedDateChange={setRangeDate}\n visibleMonth={endVisibleMonth}\n onVisibleMonthChange={(_, month) => setEndVisibleMonth(month)}\n hideOutOfRangeDates\n minDate={\n selectedDate?.startDate\n ? startOfMonth(selectedDate?.startDate)?.add({\n months: 1,\n })\n : undefined\n }\n {...CalendarProps}\n />\n )}\n </FormFieldContext.Provider>\n </FlexLayout>\n </StackLayout>\n </FloatingComponent>\n );\n});\n"],"names":["DatePickerPanel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DatePickerPanel.js","sources":["../../../../packages/vuu-ui-controls/src/date-picker/DatePickerPanel.tsx"],"sourcesContent":["import {\n type DateValue,\n endOfMonth,\n startOfMonth,\n} from \"@internationalized/date\";\nimport {\n FlexItem,\n FlexLayout,\n FormFieldContext,\n type FormFieldContextValue,\n FormFieldHelperText,\n StackLayout,\n makePrefixer,\n useFloatingComponent,\n useFormFieldProps,\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 SyntheticEvent,\n forwardRef,\n useEffect,\n useState,\n} from \"react\";\nimport {\n Calendar,\n type CalendarProps,\n type RangeSelectionValueType,\n type SingleSelectionValueType,\n type UseRangeSelectionCalendarProps,\n type UseSingleSelectionCalendarProps,\n isRangeOrOffsetSelectionWithStartDate,\n} from \"../calendar\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport dateInputPanelCss from \"./DatePickerPanel.css\";\n\nexport interface DatePickerPanelProps<SelectionVariantType>\n extends ComponentPropsWithoutRef<\"div\"> {\n onSelect?: (\n event: SyntheticEvent,\n selectedDate?: SelectionVariantType,\n ) => void;\n helperText?: string;\n visibleMonths?: 1 | 2;\n CalendarProps?: Partial<\n Omit<\n CalendarProps,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"onSelectedDateChange\"\n >\n >;\n}\n\nconst withBaseName = makePrefixer(\"saltDatePickerPanel\");\n\nfunction getHoveredDate(\n date?: DateValue | null,\n compact?: boolean,\n hoveredDate?: DateValue | null,\n) {\n return date &&\n !compact &&\n hoveredDate &&\n hoveredDate.compare(endOfMonth(date)) > 0\n ? endOfMonth(date)\n : hoveredDate;\n}\n\nexport const DatePickerPanel = forwardRef<\n HTMLDivElement,\n DatePickerPanelProps<SingleSelectionValueType | RangeSelectionValueType>\n>(function DatePickerPanel(props, ref) {\n const {\n className,\n onSelect,\n helperText,\n CalendarProps,\n visibleMonths,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-picker-panel\",\n css: dateInputPanelCss,\n window: targetWindow,\n });\n\n const { Component: FloatingComponent } = useFloatingComponent();\n const [hoveredDate, setHoveredDate] = useState<DateValue | null>(null);\n\n const {\n openState,\n selectedDate,\n setSelectedDate,\n startVisibleMonth,\n setStartVisibleMonth,\n endVisibleMonth,\n setEndVisibleMonth,\n setOpen,\n context,\n getPanelPosition,\n selectionVariant,\n } = useDatePickerContext();\n\n const { a11yProps } = useFormFieldProps();\n const isRangePicker =\n isRangeOrOffsetSelectionWithStartDate(selectedDate) ||\n (selectionVariant === \"range\" && selectedDate === undefined);\n const compact = visibleMonths === 1;\n\n const setRangeDate: UseRangeSelectionCalendarProps[\"onSelectedDateChange\"] = (\n event,\n newDate,\n ) => {\n setSelectedDate(newDate);\n onSelect?.(event, newDate);\n if (newDate.startDate && newDate.endDate) {\n setOpen(false);\n }\n };\n const setSingleDate: UseSingleSelectionCalendarProps[\"onSelectedDateChange\"] =\n (event, newDate) => {\n setSelectedDate(newDate);\n onSelect?.(event, newDate);\n setOpen(false);\n };\n const handleHoveredDateChange: CalendarProps[\"onHoveredDateChange\"] = (\n _,\n newHoveredDate,\n ) => {\n setHoveredDate(newHoveredDate);\n };\n useEffect(() => {\n if (isRangePicker) {\n if (selectedDate?.startDate) {\n setStartVisibleMonth(selectedDate.startDate);\n setEndVisibleMonth(selectedDate.startDate.add({ months: 1 }));\n }\n } else {\n setStartVisibleMonth(selectedDate);\n }\n }, [selectedDate, setEndVisibleMonth, setStartVisibleMonth]);\n\n const firstCalendarProps: CalendarProps = isRangePicker\n ? {\n selectionVariant: \"range\",\n hoveredDate: getHoveredDate(\n selectedDate?.startDate,\n compact,\n hoveredDate,\n ),\n onHoveredDateChange: handleHoveredDateChange,\n selectedDate: selectedDate,\n onSelectedDateChange: setRangeDate,\n maxDate:\n !compact && selectedDate?.startDate\n ? endOfMonth(selectedDate?.startDate)\n : undefined,\n hideOutOfRangeDates: true,\n }\n : {\n selectionVariant: \"default\",\n selectedDate: selectedDate,\n onSelectedDateChange: setSingleDate,\n };\n return (\n <FloatingComponent\n open={openState}\n className={clsx(withBaseName(), className)}\n aria-modal=\"true\"\n ref={ref}\n focusManagerProps={\n context\n ? {\n context: context,\n initialFocus: 4,\n }\n : undefined\n }\n {...getPanelPosition()}\n {...a11yProps}\n {...rest}\n >\n <StackLayout separators gap={0} className={withBaseName(\"container\")}>\n {helperText && (\n <FlexItem className={withBaseName(\"header\")}>\n <FormFieldHelperText>{helperText}</FormFieldHelperText>\n </FlexItem>\n )}\n <FlexLayout>\n {/* Avoid Dropdowns in Calendar inheriting the FormField's state */}\n <FormFieldContext.Provider value={{} as FormFieldContextValue}>\n <Calendar\n visibleMonth={startVisibleMonth}\n onVisibleMonthChange={(_, month) => setStartVisibleMonth(month)}\n {...firstCalendarProps}\n {...CalendarProps}\n />\n {isRangePicker && !compact && (\n <Calendar\n selectionVariant=\"range\"\n hoveredDate={hoveredDate}\n onHoveredDateChange={handleHoveredDateChange}\n selectedDate={selectedDate}\n onSelectedDateChange={setRangeDate}\n visibleMonth={endVisibleMonth}\n onVisibleMonthChange={(_, month) => setEndVisibleMonth(month)}\n hideOutOfRangeDates\n minDate={\n selectedDate?.startDate\n ? startOfMonth(selectedDate?.startDate)?.add({\n months: 1,\n })\n : undefined\n }\n {...CalendarProps}\n />\n )}\n </FormFieldContext.Provider>\n </FlexLayout>\n </StackLayout>\n </FloatingComponent>\n );\n});\n"],"names":["DatePickerPanel"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragDropProvider.js","sources":["
|
|
1
|
+
{"version":3,"file":"DragDropProvider.js","sources":["../../../../packages/vuu-ui-controls/src/drag-drop/DragDropProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n} from \"react\";\nimport { DragDropState } from \"./DragDropState\";\nimport {\n GlobalDropHandler,\n ResumeDragHandler,\n useGlobalDragDrop,\n} from \"./useGlobalDragDrop\";\n\nconst NO_DRAG_CONTEXT = {\n isDragSource: undefined,\n isDropTarget: undefined,\n register: () => undefined,\n};\n\nconst unconfiguredRegistrationCall = () =>\n console.log(`have you forgotten to provide a DragDrop Provider ?`);\n\nexport type DragOutHandler = (\n id: string,\n dragDropState: DragDropState\n) => boolean;\n\nexport type DragDropRegistrationFn = (\n id: string,\n resumeDrag: ResumeDragHandler | false,\n onDrop?: GlobalDropHandler\n) => void;\n\nexport type EndOfDragOperationHandler = (id: string) => void;\n\nexport interface DragDropContextProps {\n dragSources?: Map<string, string[]>;\n dropTargets?: Map<string, string[]>;\n onDragOut?: DragOutHandler;\n onEndOfDragOperation?: EndOfDragOperationHandler;\n registerDragDropParty: DragDropRegistrationFn;\n}\n\nconst DragDropContext = createContext<DragDropContextProps>({\n registerDragDropParty: unconfiguredRegistrationCall,\n});\n\nexport type DragSources = {\n [key: string]: { dropTargets: string | string[]; payloadType?: string };\n};\nexport interface DragDropProviderProps {\n children: ReactNode;\n dragSources: DragSources;\n}\n\nexport type MeasuredTarget = {\n bottom: number;\n left: number;\n right: number;\n top: number;\n};\n\nconst measureDropTargets = (dropTargetIds: string[] = []) => {\n return dropTargetIds.reduce<Record<string, MeasuredTarget>>((map, id) => {\n const el = document.getElementById(id);\n if (el) {\n const { top, right, bottom, left } = el.getBoundingClientRect();\n map[id] = { top, right, bottom, left };\n }\n return map;\n }, {});\n};\n\nexport const DragDropProvider = ({\n children,\n dragSources: dragSourcesProp,\n}: DragDropProviderProps) => {\n const resumeDragHandlers = useMemo(\n () => new Map<string, ResumeDragHandler>(),\n []\n );\n const dropHandlers = useMemo(() => new Map<string, GlobalDropHandler>(), []);\n const handleDragOverDropTarget = useCallback(\n (dropTargetId: string, dragDropState: DragDropState) => {\n const resumeDrag = resumeDragHandlers.get(dropTargetId);\n if (resumeDrag) {\n return resumeDrag(dragDropState);\n } else {\n return false;\n }\n },\n [resumeDragHandlers]\n );\n\n const handleDrop = useCallback(\n (dropTargetId: string, dragDropState: DragDropState) => {\n const handleDrop = dropHandlers.get(dropTargetId);\n if (handleDrop) {\n handleDrop(dragDropState);\n }\n },\n [dropHandlers]\n );\n\n const { measuredDropTargetsRef, resumeDrag } = useGlobalDragDrop({\n onDragOverDropTarget: handleDragOverDropTarget,\n onDrop: handleDrop,\n });\n const [dragSources, dropTargets] = useMemo(() => {\n const sources = new Map<string, string[]>();\n // TODO do we need the targets ?\n const targets = new Map<string, string[]>();\n\n for (const [sourceId, { dropTargets }] of Object.entries(dragSourcesProp)) {\n const sourceEntry = sources.get(sourceId);\n const targetIds = Array.isArray(dropTargets)\n ? dropTargets\n : [dropTargets];\n if (sourceEntry) {\n sourceEntry.push(...targetIds);\n } else {\n sources.set(sourceId, targetIds);\n }\n for (const targetId of targetIds) {\n const targetEntry = targets.get(targetId);\n if (targetEntry) {\n targetEntry.push(sourceId);\n } else {\n targets.set(targetId, [sourceId]);\n }\n }\n }\n return [sources, targets];\n }, [dragSourcesProp]);\n\n const onDragOut = useCallback<DragOutHandler>(\n (id, dragDropState) => {\n // we call releaseItem if and when the dragged item is dropped onto a remote dropTarget\n measuredDropTargetsRef.current = measureDropTargets(dragSources.get(id));\n resumeDrag(dragDropState);\n return true;\n },\n [dragSources, measuredDropTargetsRef, resumeDrag]\n );\n\n const onEndOfDragOperation = useCallback<EndOfDragOperationHandler>((id) => {\n console.log(`end of drag operation, id= ${id}`);\n }, []);\n\n const registerDragDropParty = useCallback<DragDropRegistrationFn>(\n (id, resumeDrag, onDrop) => {\n if (resumeDrag) {\n resumeDragHandlers.set(id, resumeDrag);\n } else if (onDrop) {\n dropHandlers.set(id, onDrop);\n }\n },\n [dropHandlers, resumeDragHandlers]\n );\n\n const contextValue: DragDropContextProps = useMemo(\n () => ({\n dragSources,\n dropTargets,\n onDragOut,\n onEndOfDragOperation,\n registerDragDropParty,\n }),\n [\n dragSources,\n dropTargets,\n onDragOut,\n onEndOfDragOperation,\n registerDragDropParty,\n ]\n );\n\n return (\n <DragDropContext.Provider value={contextValue}>\n {children}\n </DragDropContext.Provider>\n );\n};\n\nexport interface DragDropProviderResult {\n isDragSource?: boolean;\n isDropTarget?: boolean;\n onDragOut?: DragOutHandler;\n onEndOfDragOperation?: (id: string) => void;\n register: DragDropRegistrationFn;\n}\n\nexport const useDragDropProvider = (id?: string): DragDropProviderResult => {\n const {\n dragSources,\n dropTargets,\n onDragOut,\n onEndOfDragOperation,\n registerDragDropParty,\n } = useContext(DragDropContext);\n if (id && (dragSources || dropTargets)) {\n const isDragSource = dragSources?.has(id) ?? false;\n const isDropTarget = dropTargets?.has(id) ?? false;\n\n return {\n isDragSource,\n isDropTarget,\n onDragOut,\n onEndOfDragOperation,\n register: registerDragDropParty,\n };\n } else {\n return NO_DRAG_CONTEXT;\n }\n};\n"],"names":["resumeDrag","handleDrop","dropTargets"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragDropState.js","sources":["
|
|
1
|
+
{"version":3,"file":"DragDropState.js","sources":["../../../../packages/vuu-ui-controls/src/drag-drop/DragDropState.ts"],"sourcesContent":["import { MouseOffset, MousePosition } from \"./dragDropTypes\";\n\nexport class DragDropState {\n /** Distance between start (top | left) of dragged element and point where user pressed to drag */\n readonly mouseOffset: MouseOffset;\n /** Element where the initial mousedown triggered the drag operation */\n readonly initialDragElement: HTMLElement;\n /** Element being dragged, (initial element cloned and rendered in portal). */\n draggableElement: HTMLElement | null = null;\n\n payload: unknown = null;\n\n constructor(mousePosition: MousePosition, dragElement: HTMLElement) {\n this.initialDragElement = dragElement;\n this.mouseOffset = this.getMouseOffset(mousePosition, dragElement);\n }\n\n /** Used to capture a ref to the Draggable ReactElement */\n setDraggable = (el: HTMLElement | null) => {\n this.draggableElement = el;\n };\n\n setPayload(payload: unknown) {\n this.payload = payload;\n }\n\n private getMouseOffset(\n mousePosition: MousePosition,\n dragElement: HTMLElement,\n ) {\n const { clientX, clientY } = mousePosition;\n const draggableRect = dragElement.getBoundingClientRect();\n\n return {\n x: clientX - draggableRect.left,\n y: clientY - draggableRect.top,\n };\n }\n}\n"],"names":[],"mappings":";;;AAEO,MAAM,aAAc,CAAA;AAAA,EAUzB,WAAA,CAAY,eAA8B,WAA0B,EAAA;AARpE;AAAA,IAAS,aAAA,CAAA,IAAA,EAAA,aAAA,CAAA;AAET;AAAA,IAAS,aAAA,CAAA,IAAA,EAAA,oBAAA,CAAA;AAET;AAAA,IAAuC,aAAA,CAAA,IAAA,EAAA,kBAAA,EAAA,IAAA,CAAA;AAEvC,IAAmB,aAAA,CAAA,IAAA,EAAA,SAAA,EAAA,IAAA,CAAA;AAQnB;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,EAAe,CAAC,EAA2B,KAAA;AACzC,MAAA,IAAA,CAAK,gBAAmB,GAAA,EAAA;AAAA,KAC1B,CAAA;AAPE,IAAA,IAAA,CAAK,kBAAqB,GAAA,WAAA;AAC1B,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAK,cAAe,CAAA,aAAA,EAAe,WAAW,CAAA;AAAA;AACnE,EAOA,WAAW,OAAkB,EAAA;AAC3B,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AAAA;AACjB,EAEQ,cAAA,CACN,eACA,WACA,EAAA;AACA,IAAM,MAAA,EAAE,OAAS,EAAA,OAAA,EAAY,GAAA,aAAA;AAC7B,IAAM,MAAA,aAAA,GAAgB,YAAY,qBAAsB,EAAA;AAExD,IAAO,OAAA;AAAA,MACL,CAAA,EAAG,UAAU,aAAc,CAAA,IAAA;AAAA,MAC3B,CAAA,EAAG,UAAU,aAAc,CAAA;AAAA,KAC7B;AAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Draggable.js","sources":["
|
|
1
|
+
{"version":3,"file":"Draggable.js","sources":["../../../../packages/vuu-ui-controls/src/drag-drop/Draggable.tsx"],"sourcesContent":["import { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n CSSProperties,\n forwardRef,\n HTMLAttributes,\n MutableRefObject,\n RefCallback,\n TransitionEventHandler,\n useCallback,\n useMemo,\n} from \"react\";\nimport { PopupComponent as Popup, Portal } from \"@vuu-ui/vuu-popups\";\n\nimport draggableCss from \"./Draggable.css\";\n\nconst makeClassNames = (classNames: string) =>\n classNames.split(\" \").map((className) => `vuuDraggable-${className}`);\n\nexport interface DraggableProps extends HTMLAttributes<HTMLDivElement> {\n wrapperClassName: string;\n element: HTMLElement;\n onDropped?: () => void;\n onTransitionEnd?: TransitionEventHandler;\n scale?: number;\n style: CSSProperties;\n}\n\nexport const Draggable = forwardRef<HTMLDivElement, DraggableProps>(\n function Draggable(\n { wrapperClassName, element, onDropped, onTransitionEnd, style, scale = 1 },\n forwardedRef,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-draggable\",\n css: draggableCss,\n window: targetWindow,\n });\n\n const handleVuuDrop = useCallback(() => {\n onDropped?.();\n }, [onDropped]);\n\n const callbackRef = useCallback<RefCallback<HTMLDivElement>>(\n (el: HTMLDivElement) => {\n if (el) {\n el.innerHTML = \"\";\n el.appendChild(element);\n if (scale !== 1) {\n el.style.transform = `scale(${scale},${scale})`;\n }\n el.addEventListener(\"vuu-dropped\", handleVuuDrop);\n }\n },\n [element, handleVuuDrop, scale],\n );\n const forkedRef = useForkRef<HTMLDivElement>(forwardedRef, callbackRef);\n\n const position = useMemo(\n () => ({\n left: 0,\n top: 0,\n }),\n [],\n );\n\n return (\n <Portal>\n <Popup\n anchorElement={{ current: document.body }}\n className=\"vuuPopup\"\n placement=\"absolute\"\n position={position}\n >\n <div\n className={cx(\"vuuDraggable\", ...makeClassNames(wrapperClassName))}\n ref={forkedRef}\n onTransitionEnd={onTransitionEnd}\n style={style}\n />\n </Popup>\n </Portal>\n );\n },\n);\n\n// const colors = [\"black\", \"red\", \"green\", \"yellow\"];\n// let color_idx = 0;\nexport const createDragSpacer = (\n transitioning?: MutableRefObject<boolean>,\n): HTMLElement => {\n // const idx = color_idx++ % 4;\n\n const spacer = document.createElement(\"div\");\n spacer.className = \"vuuDraggable-spacer\";\n if (transitioning) {\n spacer.addEventListener(\"transitionend\", () => {\n transitioning.current = false;\n });\n }\n return spacer;\n};\n\nexport const createDropIndicatorPosition = (): HTMLElement => {\n const spacer = document.createElement(\"div\");\n spacer.className = \"vuuDraggable-dropIndicatorPosition\";\n return spacer;\n};\n\nexport const createDropIndicator = (\n transitioning?: MutableRefObject<boolean>,\n): HTMLElement => {\n // const idx = color_idx++ % 4;\n const spacer = document.createElement(\"div\");\n spacer.className = \"vuuDraggable-dropIndicator\";\n if (transitioning) {\n spacer.addEventListener(\"transitionend\", () => {\n transitioning.current = false;\n });\n }\n return spacer;\n};\n"],"names":["Draggable","Popup"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dragDropTypes.js","sources":["
|
|
1
|
+
{"version":3,"file":"dragDropTypes.js","sources":["../../../../packages/vuu-ui-controls/src/drag-drop/dragDropTypes.ts"],"sourcesContent":["import { MouseEventHandler, ReactElement, RefObject } from \"react\";\nimport type { orientationType } from \"@vuu-ui/vuu-utils\";\nimport { DragDropState } from \"./DragDropState\";\n\n//-----------------------------------\n// From useScrollPosition in List\nexport type ViewportRange = {\n atEnd: boolean;\n atStart: boolean;\n from: number;\n to: number;\n};\n\n// From overflow types - probably don't need\ntype dimension = \"width\" | \"height\" | \"scrollWidth\" | \"scrollHeight\";\n\ntype dimensions = {\n size: dimension;\n depth: dimension;\n scrollDepth: dimension;\n};\n\nexport type dimensionsType = {\n horizontal: dimensions;\n vertical: dimensions;\n};\n\n//-----------------------------------\n\nexport type dragStrategy =\n | \"drop-indicator\"\n | \"natural-movement\"\n | \"drag-copy\"\n | \"drop-only\";\n\nexport type Direction = \"fwd\" | \"bwd\";\nexport const FWD: Direction = \"fwd\";\nexport const BWD: Direction = \"bwd\";\n\nexport interface MousePosition {\n clientX: number;\n clientY: number;\n}\n\nexport interface MouseOffset {\n x: number;\n y: number;\n}\n\nexport type Rect = {\n height: number;\n left: number;\n top: number;\n width: number;\n};\n\nexport interface DragHookResult {\n draggable?: ReactElement;\n dropIndicator?: ReactElement;\n draggedItemIndex?: number;\n isDragging: boolean;\n isScrolling: RefObject<boolean>;\n onMouseDown?: MouseEventHandler;\n revealOverflowedItems?: boolean;\n}\n\nexport interface InternalDragHookResult\n extends Omit<DragHookResult, \"isDragging\" | \"isScrolling\"> {\n beginDrag: (dragElement: HTMLElement) => void;\n drag: (dragPos: number, mouseMoveDirection: \"fwd\" | \"bwd\") => void;\n drop: () => DropOptions;\n handleScrollStart?: (scrollDirection: \"fwd\" | \"bwd\") => void;\n handleScrollStop?: (\n scrollDirection: \"fwd\" | \"bwd\",\n _scrollPos: number,\n atEnd: boolean,\n ) => void;\n /**\n * Draggable item has been dragged out of container. Remove any local drop\n * indicators. Dragged element itself should not yet be removed from DOM.\n */\n releaseDrag?: () => void;\n}\n\nexport interface DropOptions {\n fromIndex: number;\n toIndex: number;\n isExternal?: boolean;\n payload?: unknown;\n}\n\nexport type DragStartHandler = (dragDropState: DragDropState) => void;\n\nexport type DropHandler = (options: DropOptions) => void;\n\nexport interface DragDropProps {\n allowDragDrop?: boolean | dragStrategy;\n containerRef: RefObject<HTMLElement | null>;\n /** this is the className that will be assigned during drag to the dragged element */\n draggableClassName: string;\n extendedDropZone?: boolean;\n getDragPayload?: (dragElement: HTMLElement) => unknown;\n id?: string;\n isDragSource?: boolean;\n isDropTarget?: boolean;\n itemQuery?: string;\n onDragStart?: DragStartHandler;\n onDrop: DropHandler;\n onDropSettle?: (toIndex: number) => void;\n orientation: orientationType;\n /**\n * The scrolling container does not necessarily have to be a\n * descendant of the container, it may be an ancestor element;\n */\n scrollingContainerRef?: RefObject<HTMLElement | null>;\n // selected?: CollectionItem<unknown> | CollectionItem<unknown>[] | null;\n viewportRange?: ViewportRange;\n}\n\nexport type DragDropHook = (props: DragDropProps) => DragHookResult;\n\nexport interface InternalDragDropProps\n extends Omit<DragDropProps, \"draggableClassName\" | \"id\" | \"onDrop\"> {\n isDragSource?: boolean;\n isDropTarget?: boolean;\n selected?: unknown;\n}\n\nexport type DragDropContext = {\n dragElement: HTMLElement;\n dragPayload: unknown;\n mouseOffset: MouseOffset;\n};\n"],"names":[],"mappings":"AAoCO,MAAM,GAAiB,GAAA;AACvB,MAAM,GAAiB,GAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drop-target-utils.js","sources":["../../src/drag-drop/drop-target-utils.ts"],"sourcesContent":["import { orientationType } from \"@vuu-ui/vuu-utils\";\nimport { ViewportRange } from \"./dragDropTypes\";\nimport { Direction, Rect } from \"./dragDropTypes\";\n\nconst LEFT_RIGHT = [\"left\", \"right\"];\nconst TOP_BOTTOM = [\"top\", \"bottom\"];\n// duplicated in repsonsive\n\nexport const NOT_OVERFLOWED = \":not(.wrapped)\";\nexport const NOT_HIDDEN = ':not([aria-hidden=\"true\"])';\n\n// TODO figure out which of these attributes we no longer need\nexport type MeasuredDropTarget = {\n /** \n The index position currently occupied by this item. If draggable \n is dropped here, this will be the destination drop position.\n */\n currentIndex: number;\n element: HTMLElement;\n id: string;\n index: number;\n isDraggedItem: boolean;\n isExternal?: boolean;\n isLast?: boolean;\n isOverflowIndicator?: boolean;\n start: number;\n end: number;\n mid: number;\n size: number;\n};\n\nexport type targetType = {\n element: HTMLElement | null;\n index: number;\n isLast?: boolean;\n};\n\n/** clones and removes id */\nexport const cloneElement = <T extends HTMLElement>(element: T): T => {\n const dolly = element.cloneNode(true) as T;\n // TOSO should we care about nested id values - perhaps an additional param, defaulting to false ?\n dolly.removeAttribute(\"id\");\n // Set index to -1 in case a moueMove event as we wait for drop to take effect might set highlighted\n // index to wrong value (see useList) -1 will be ignored;\n dolly.dataset.index = \"-1\";\n return dolly;\n};\n\ntype MousePosKey = keyof Pick<MouseEvent, \"clientX\" | \"clientY\">;\ntype DOMRectKey = keyof Omit<DOMRect, \"toJSON\">;\ntype DOMRectDimensionKey = keyof Pick<DOMRect, \"width\" | \"height\">;\ntype Dimension = keyof Pick<DOMRect, \"width\" | \"height\">;\ntype ElementDimension = keyof Pick<\n HTMLElement,\n | \"scrollHeight\"\n | \"scrollWidth\"\n | \"clientHeight\"\n | \"clientWidth\"\n | \"scrollTop\"\n | \"scrollLeft\"\n>;\n\ntype ElementPosition = \"x\" | \"y\";\n\nexport const measureElementSizeAndPosition = (\n element: HTMLElement,\n dimension: Dimension = \"width\",\n includeAutoMargin = false,\n) => {\n const pos = dimension === \"width\" ? \"left\" : \"top\";\n const { [dimension]: size, [pos]: position } =\n element.getBoundingClientRect();\n const { padEnd = false, padStart = false } = element.dataset;\n const style = getComputedStyle(element);\n const [start, end] = dimension === \"width\" ? LEFT_RIGHT : TOP_BOTTOM;\n const marginStart =\n padStart && !includeAutoMargin\n ? 0\n : parseInt(style.getPropertyValue(`margin-${start}`), 10);\n const marginEnd =\n padEnd && !includeAutoMargin\n ? 0\n : parseInt(style.getPropertyValue(`margin-${end}`), 10);\n\n let minWidth = size;\n const flexShrink = parseInt(style.getPropertyValue(\"flex-shrink\"), 10);\n if (flexShrink > 0) {\n const flexBasis = parseInt(style.getPropertyValue(\"flex-basis\"), 10);\n if (!isNaN(flexBasis) && flexBasis > 0) {\n minWidth = flexBasis;\n }\n }\n return [position, marginStart + minWidth + marginEnd];\n};\n\nconst DIMENSIONS = {\n horizontal: {\n CLIENT_POS: \"clientX\" as MousePosKey,\n CLIENT_SIZE: \"clientWidth\" as ElementDimension,\n CONTRA: \"top\" as DOMRectKey,\n CONTRA_CLIENT_POS: \"clientY\" as MousePosKey,\n CONTRA_END: \"bottom\" as DOMRectDimensionKey,\n CONTRA_POS: \"y\" as ElementPosition,\n DIMENSION: \"width\" as DOMRectDimensionKey,\n END: \"right\" as DOMRectKey,\n POS: \"x\" as ElementPosition,\n SCROLL_POS: \"scrollLeft\" as ElementDimension,\n SCROLL_SIZE: \"scrollWidth\" as ElementDimension,\n START: \"left\" as DOMRectKey,\n },\n vertical: {\n CLIENT_POS: \"clientY\" as MousePosKey,\n CLIENT_SIZE: \"clientHeight\" as ElementDimension,\n CONTRA: \"left\" as DOMRectKey,\n CONTRA_CLIENT_POS: \"clientX\" as MousePosKey,\n CONTRA_END: \"right\" as DOMRectDimensionKey,\n CONTRA_POS: \"x\" as ElementPosition,\n DIMENSION: \"height\" as DOMRectDimensionKey,\n END: \"bottom\" as DOMRectKey,\n POS: \"y\" as ElementPosition,\n SCROLL_POS: \"scrollTop\" as ElementDimension,\n SCROLL_SIZE: \"scrollHeight\" as ElementDimension,\n START: \"top\" as DOMRectKey,\n },\n};\nexport const dimensions = (orientation: orientationType) =>\n DIMENSIONS[orientation];\n\nexport const getItemById = (\n measuredItems: MeasuredDropTarget[],\n id: string,\n) => {\n const result = measuredItems.find((item) => item.id === id);\n if (result) {\n return result;\n }\n // else {\n // throw Error(`measuredItems do not contain an item with id #${id}`);\n // }\n};\n\nexport const removeDraggedItem = (\n measuredItems: MeasuredDropTarget[],\n index: number,\n) => {\n measuredItems.splice(index, 1);\n for (let i = index; i < measuredItems.length; i++) {\n measuredItems[i].currentIndex -= 1;\n }\n};\n\nexport type dropZone = \"start\" | \"end\";\n\nexport const measureDropTargets = (\n container: HTMLElement,\n orientation: orientationType,\n itemQuery?: string,\n viewportRange?: ViewportRange,\n draggedItemId?: string,\n) => {\n const dragThresholds: MeasuredDropTarget[] = [];\n const { DIMENSION } = dimensions(orientation);\n const children = Array.from(\n itemQuery ? container.querySelectorAll(itemQuery) : container.children,\n );\n\n const itemCount = children.length;\n const start =\n typeof viewportRange?.from === \"number\"\n ? viewportRange.atEnd\n ? Math.max(0, viewportRange.from - 1)\n : viewportRange.from\n : 0;\n const end =\n typeof viewportRange?.to === \"number\"\n ? Math.min(viewportRange.to + 2, itemCount - 1)\n : itemCount - 1;\n for (let index = start; index <= end; index++) {\n const element = children[index] as HTMLElement;\n const [start, size] = measureElementSizeAndPosition(element, DIMENSION);\n const isLast = index === itemCount - 1;\n const id = element.id;\n\n dragThresholds.push({\n currentIndex: index,\n id,\n index,\n isDraggedItem: draggedItemId === id,\n isLast,\n isOverflowIndicator: element.dataset.index === \"overflow\",\n element: element as HTMLElement,\n start,\n end: start + size,\n size,\n mid: start + size / 2,\n });\n }\n return dragThresholds;\n};\n\nexport const getIndexOfDraggedItem = (dropTargets: MeasuredDropTarget[]) =>\n dropTargets.findIndex((d) => d.isDraggedItem);\n\n// As the draggedItem is moved, displacing existing items, mirror\n// the movements within the dropTargets collection\nexport const mutateDropTargetsSwitchDropTargetPosition = (\n dropTargets: MeasuredDropTarget[],\n direction: Direction,\n) => {\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const indexOfTarget =\n direction === \"fwd\" ? indexOfDraggedItem + 1 : indexOfDraggedItem - 1;\n\n if (indexOfTarget < 0 || indexOfTarget >= dropTargets.length) {\n throw Error(\"switchDropTargetPosition index out of range\");\n }\n\n const draggedItem = dropTargets.at(indexOfDraggedItem) as MeasuredDropTarget;\n const targetItem = dropTargets.at(indexOfTarget) as MeasuredDropTarget;\n\n const diff = targetItem.size - draggedItem.size;\n\n if (direction === \"fwd\") {\n const draggedStart = targetItem.start + diff;\n const draggedEnd = targetItem.end;\n\n const newDraggedItem = {\n ...draggedItem,\n start: draggedStart,\n mid: Math.floor(draggedStart + (draggedEnd - draggedStart) / 2),\n end: draggedEnd,\n } as MeasuredDropTarget;\n\n const targetStart = draggedItem.start;\n const targetEnd = draggedItem.end + diff;\n\n const newTargetItem = {\n ...targetItem,\n start: targetStart,\n mid: Math.floor(targetStart + (targetEnd - targetStart) / 2),\n end: targetEnd,\n } as MeasuredDropTarget;\n dropTargets.splice(indexOfDraggedItem, 2, newTargetItem, newDraggedItem);\n } else {\n const draggedStart = targetItem.start;\n const draggedEnd = targetItem.end - diff;\n\n const newDraggedItem = {\n ...draggedItem,\n start: draggedStart,\n mid: Math.floor(draggedStart + (draggedEnd - draggedStart) / 2),\n end: draggedEnd,\n } as MeasuredDropTarget;\n\n const targetStart = draggedItem.start - diff;\n const targetEnd = draggedItem.end;\n\n const newTargetItem = {\n ...targetItem,\n start: targetStart,\n mid: Math.floor(targetStart + (targetEnd - targetStart) / 2),\n end: targetEnd,\n } as MeasuredDropTarget;\n dropTargets.splice(indexOfTarget, 2, newDraggedItem, newTargetItem);\n }\n};\n\nexport const getNextDropTarget = (\n dropTargets: MeasuredDropTarget[],\n pos: number,\n draggedItemSize: number,\n mouseMoveDirection: Direction,\n): MeasuredDropTarget => {\n const len = dropTargets.length;\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n // draggedItem will be undefined if we are handling an external drag\n const draggedItem = dropTargets[indexOfDraggedItem];\n if (mouseMoveDirection === \"fwd\") {\n const leadingEdge = Math.round(pos + draggedItemSize);\n for (let index = len - 1; index >= 0; index--) {\n const dropTarget = dropTargets[index];\n if (leadingEdge > dropTarget.mid) {\n if (draggedItem && index < indexOfDraggedItem) {\n return draggedItem;\n } else {\n return dropTarget;\n }\n }\n }\n } else {\n const leadingEdge = Math.round(pos);\n for (let index = 0; index < len; index++) {\n const dropTarget = dropTargets[index];\n if (leadingEdge < dropTarget.mid) {\n if (index > indexOfDraggedItem) {\n return draggedItem;\n } else {\n return dropTarget;\n }\n }\n }\n }\n throw Error(\"no dropTarget identified\");\n};\n\n/**\n * An item within a scrollable container might have a width or height greater than that of\n * the container. If we drag such an item, we don't want the draggable to be larger than\n * the container.\n */\nexport function constrainRect(targetRect: Rect, constraintRect: Rect): Rect {\n const { height, left, top, width } = targetRect;\n const { height: constrainedHeight, width: constrainedWidth } = constraintRect;\n return {\n height: Math.min(height, constrainedHeight),\n left,\n top,\n width: Math.min(width, constrainedWidth),\n };\n}\n\nexport const dropTargetsDebugString = (dropTargets: MeasuredDropTarget[]) =>\n dropTargets\n .map(\n (d, i) =>\n `\\n${d.isDraggedItem ? \"*\" : \" \"}[${i}] width : ${Math.floor(\n d.size,\n )} ${Math.floor(d.start)} - ${Math.floor(d.end)} (mid ${Math.floor(\n d.mid,\n )}) ${d.element?.textContent} `,\n )\n .join(\"\");\n\nexport const getItemParentContainer = (\n container: HTMLElement | null,\n itemQuery: string,\n) => {\n const firstItem = container?.querySelector(\n `${itemQuery}:not([aria-hidden=\"true\"])`,\n );\n if (firstItem) {\n // generally, we expect the immediateParent to be a contentContainer, the\n // parent of that will be the scrollable container. This may or may not be\n // the outer container (likely not)\n return firstItem.parentElement;\n } else {\n return null;\n }\n};\n\nexport const getScrollableContainer = (\n container: HTMLElement | null,\n itemQuery: string,\n) => {\n const immediateParent = getItemParentContainer(container, itemQuery);\n if (immediateParent === container) {\n return container;\n } else {\n return immediateParent?.parentElement as HTMLElement;\n }\n};\n\nexport const isContainerScrollable = (\n scrollableContainer: HTMLElement | null,\n orientation: orientationType,\n) => {\n if (scrollableContainer === null) {\n return false;\n } else {\n const { SCROLL_SIZE, CLIENT_SIZE } = dimensions(orientation);\n const { [SCROLL_SIZE]: scrollSize, [CLIENT_SIZE]: clientSize } =\n scrollableContainer;\n return scrollSize > clientSize;\n }\n};\n"],"names":["start"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drop-target-utils.js","sources":["../../../../packages/vuu-ui-controls/src/drag-drop/drop-target-utils.ts"],"sourcesContent":["import { orientationType } from \"@vuu-ui/vuu-utils\";\nimport { ViewportRange } from \"./dragDropTypes\";\nimport { Direction, Rect } from \"./dragDropTypes\";\n\nconst LEFT_RIGHT = [\"left\", \"right\"];\nconst TOP_BOTTOM = [\"top\", \"bottom\"];\n// duplicated in repsonsive\n\nexport const NOT_OVERFLOWED = \":not(.wrapped)\";\nexport const NOT_HIDDEN = ':not([aria-hidden=\"true\"])';\n\n// TODO figure out which of these attributes we no longer need\nexport type MeasuredDropTarget = {\n /** \n The index position currently occupied by this item. If draggable \n is dropped here, this will be the destination drop position.\n */\n currentIndex: number;\n element: HTMLElement;\n id: string;\n index: number;\n isDraggedItem: boolean;\n isExternal?: boolean;\n isLast?: boolean;\n isOverflowIndicator?: boolean;\n start: number;\n end: number;\n mid: number;\n size: number;\n};\n\nexport type targetType = {\n element: HTMLElement | null;\n index: number;\n isLast?: boolean;\n};\n\n/** clones and removes id */\nexport const cloneElement = <T extends HTMLElement>(element: T): T => {\n const dolly = element.cloneNode(true) as T;\n // TOSO should we care about nested id values - perhaps an additional param, defaulting to false ?\n dolly.removeAttribute(\"id\");\n // Set index to -1 in case a moueMove event as we wait for drop to take effect might set highlighted\n // index to wrong value (see useList) -1 will be ignored;\n dolly.dataset.index = \"-1\";\n return dolly;\n};\n\ntype MousePosKey = keyof Pick<MouseEvent, \"clientX\" | \"clientY\">;\ntype DOMRectKey = keyof Omit<DOMRect, \"toJSON\">;\ntype DOMRectDimensionKey = keyof Pick<DOMRect, \"width\" | \"height\">;\ntype Dimension = keyof Pick<DOMRect, \"width\" | \"height\">;\ntype ElementDimension = keyof Pick<\n HTMLElement,\n | \"scrollHeight\"\n | \"scrollWidth\"\n | \"clientHeight\"\n | \"clientWidth\"\n | \"scrollTop\"\n | \"scrollLeft\"\n>;\n\ntype ElementPosition = \"x\" | \"y\";\n\nexport const measureElementSizeAndPosition = (\n element: HTMLElement,\n dimension: Dimension = \"width\",\n includeAutoMargin = false,\n) => {\n const pos = dimension === \"width\" ? \"left\" : \"top\";\n const { [dimension]: size, [pos]: position } =\n element.getBoundingClientRect();\n const { padEnd = false, padStart = false } = element.dataset;\n const style = getComputedStyle(element);\n const [start, end] = dimension === \"width\" ? LEFT_RIGHT : TOP_BOTTOM;\n const marginStart =\n padStart && !includeAutoMargin\n ? 0\n : parseInt(style.getPropertyValue(`margin-${start}`), 10);\n const marginEnd =\n padEnd && !includeAutoMargin\n ? 0\n : parseInt(style.getPropertyValue(`margin-${end}`), 10);\n\n let minWidth = size;\n const flexShrink = parseInt(style.getPropertyValue(\"flex-shrink\"), 10);\n if (flexShrink > 0) {\n const flexBasis = parseInt(style.getPropertyValue(\"flex-basis\"), 10);\n if (!isNaN(flexBasis) && flexBasis > 0) {\n minWidth = flexBasis;\n }\n }\n return [position, marginStart + minWidth + marginEnd];\n};\n\nconst DIMENSIONS = {\n horizontal: {\n CLIENT_POS: \"clientX\" as MousePosKey,\n CLIENT_SIZE: \"clientWidth\" as ElementDimension,\n CONTRA: \"top\" as DOMRectKey,\n CONTRA_CLIENT_POS: \"clientY\" as MousePosKey,\n CONTRA_END: \"bottom\" as DOMRectDimensionKey,\n CONTRA_POS: \"y\" as ElementPosition,\n DIMENSION: \"width\" as DOMRectDimensionKey,\n END: \"right\" as DOMRectKey,\n POS: \"x\" as ElementPosition,\n SCROLL_POS: \"scrollLeft\" as ElementDimension,\n SCROLL_SIZE: \"scrollWidth\" as ElementDimension,\n START: \"left\" as DOMRectKey,\n },\n vertical: {\n CLIENT_POS: \"clientY\" as MousePosKey,\n CLIENT_SIZE: \"clientHeight\" as ElementDimension,\n CONTRA: \"left\" as DOMRectKey,\n CONTRA_CLIENT_POS: \"clientX\" as MousePosKey,\n CONTRA_END: \"right\" as DOMRectDimensionKey,\n CONTRA_POS: \"x\" as ElementPosition,\n DIMENSION: \"height\" as DOMRectDimensionKey,\n END: \"bottom\" as DOMRectKey,\n POS: \"y\" as ElementPosition,\n SCROLL_POS: \"scrollTop\" as ElementDimension,\n SCROLL_SIZE: \"scrollHeight\" as ElementDimension,\n START: \"top\" as DOMRectKey,\n },\n};\nexport const dimensions = (orientation: orientationType) =>\n DIMENSIONS[orientation];\n\nexport const getItemById = (\n measuredItems: MeasuredDropTarget[],\n id: string,\n) => {\n const result = measuredItems.find((item) => item.id === id);\n if (result) {\n return result;\n }\n // else {\n // throw Error(`measuredItems do not contain an item with id #${id}`);\n // }\n};\n\nexport const removeDraggedItem = (\n measuredItems: MeasuredDropTarget[],\n index: number,\n) => {\n measuredItems.splice(index, 1);\n for (let i = index; i < measuredItems.length; i++) {\n measuredItems[i].currentIndex -= 1;\n }\n};\n\nexport type dropZone = \"start\" | \"end\";\n\nexport const measureDropTargets = (\n container: HTMLElement,\n orientation: orientationType,\n itemQuery?: string,\n viewportRange?: ViewportRange,\n draggedItemId?: string,\n) => {\n const dragThresholds: MeasuredDropTarget[] = [];\n const { DIMENSION } = dimensions(orientation);\n const children = Array.from(\n itemQuery ? container.querySelectorAll(itemQuery) : container.children,\n );\n\n const itemCount = children.length;\n const start =\n typeof viewportRange?.from === \"number\"\n ? viewportRange.atEnd\n ? Math.max(0, viewportRange.from - 1)\n : viewportRange.from\n : 0;\n const end =\n typeof viewportRange?.to === \"number\"\n ? Math.min(viewportRange.to + 2, itemCount - 1)\n : itemCount - 1;\n for (let index = start; index <= end; index++) {\n const element = children[index] as HTMLElement;\n const [start, size] = measureElementSizeAndPosition(element, DIMENSION);\n const isLast = index === itemCount - 1;\n const id = element.id;\n\n dragThresholds.push({\n currentIndex: index,\n id,\n index,\n isDraggedItem: draggedItemId === id,\n isLast,\n isOverflowIndicator: element.dataset.index === \"overflow\",\n element: element as HTMLElement,\n start,\n end: start + size,\n size,\n mid: start + size / 2,\n });\n }\n return dragThresholds;\n};\n\nexport const getIndexOfDraggedItem = (dropTargets: MeasuredDropTarget[]) =>\n dropTargets.findIndex((d) => d.isDraggedItem);\n\n// As the draggedItem is moved, displacing existing items, mirror\n// the movements within the dropTargets collection\nexport const mutateDropTargetsSwitchDropTargetPosition = (\n dropTargets: MeasuredDropTarget[],\n direction: Direction,\n) => {\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n const indexOfTarget =\n direction === \"fwd\" ? indexOfDraggedItem + 1 : indexOfDraggedItem - 1;\n\n if (indexOfTarget < 0 || indexOfTarget >= dropTargets.length) {\n throw Error(\"switchDropTargetPosition index out of range\");\n }\n\n const draggedItem = dropTargets.at(indexOfDraggedItem) as MeasuredDropTarget;\n const targetItem = dropTargets.at(indexOfTarget) as MeasuredDropTarget;\n\n const diff = targetItem.size - draggedItem.size;\n\n if (direction === \"fwd\") {\n const draggedStart = targetItem.start + diff;\n const draggedEnd = targetItem.end;\n\n const newDraggedItem = {\n ...draggedItem,\n start: draggedStart,\n mid: Math.floor(draggedStart + (draggedEnd - draggedStart) / 2),\n end: draggedEnd,\n } as MeasuredDropTarget;\n\n const targetStart = draggedItem.start;\n const targetEnd = draggedItem.end + diff;\n\n const newTargetItem = {\n ...targetItem,\n start: targetStart,\n mid: Math.floor(targetStart + (targetEnd - targetStart) / 2),\n end: targetEnd,\n } as MeasuredDropTarget;\n dropTargets.splice(indexOfDraggedItem, 2, newTargetItem, newDraggedItem);\n } else {\n const draggedStart = targetItem.start;\n const draggedEnd = targetItem.end - diff;\n\n const newDraggedItem = {\n ...draggedItem,\n start: draggedStart,\n mid: Math.floor(draggedStart + (draggedEnd - draggedStart) / 2),\n end: draggedEnd,\n } as MeasuredDropTarget;\n\n const targetStart = draggedItem.start - diff;\n const targetEnd = draggedItem.end;\n\n const newTargetItem = {\n ...targetItem,\n start: targetStart,\n mid: Math.floor(targetStart + (targetEnd - targetStart) / 2),\n end: targetEnd,\n } as MeasuredDropTarget;\n dropTargets.splice(indexOfTarget, 2, newDraggedItem, newTargetItem);\n }\n};\n\nexport const getNextDropTarget = (\n dropTargets: MeasuredDropTarget[],\n pos: number,\n draggedItemSize: number,\n mouseMoveDirection: Direction,\n): MeasuredDropTarget => {\n const len = dropTargets.length;\n const indexOfDraggedItem = getIndexOfDraggedItem(dropTargets);\n // draggedItem will be undefined if we are handling an external drag\n const draggedItem = dropTargets[indexOfDraggedItem];\n if (mouseMoveDirection === \"fwd\") {\n const leadingEdge = Math.round(pos + draggedItemSize);\n for (let index = len - 1; index >= 0; index--) {\n const dropTarget = dropTargets[index];\n if (leadingEdge > dropTarget.mid) {\n if (draggedItem && index < indexOfDraggedItem) {\n return draggedItem;\n } else {\n return dropTarget;\n }\n }\n }\n } else {\n const leadingEdge = Math.round(pos);\n for (let index = 0; index < len; index++) {\n const dropTarget = dropTargets[index];\n if (leadingEdge < dropTarget.mid) {\n if (index > indexOfDraggedItem) {\n return draggedItem;\n } else {\n return dropTarget;\n }\n }\n }\n }\n throw Error(\"no dropTarget identified\");\n};\n\n/**\n * An item within a scrollable container might have a width or height greater than that of\n * the container. If we drag such an item, we don't want the draggable to be larger than\n * the container.\n */\nexport function constrainRect(targetRect: Rect, constraintRect: Rect): Rect {\n const { height, left, top, width } = targetRect;\n const { height: constrainedHeight, width: constrainedWidth } = constraintRect;\n return {\n height: Math.min(height, constrainedHeight),\n left,\n top,\n width: Math.min(width, constrainedWidth),\n };\n}\n\nexport const dropTargetsDebugString = (dropTargets: MeasuredDropTarget[]) =>\n dropTargets\n .map(\n (d, i) =>\n `\\n${d.isDraggedItem ? \"*\" : \" \"}[${i}] width : ${Math.floor(\n d.size,\n )} ${Math.floor(d.start)} - ${Math.floor(d.end)} (mid ${Math.floor(\n d.mid,\n )}) ${d.element?.textContent} `,\n )\n .join(\"\");\n\nexport const getItemParentContainer = (\n container: HTMLElement | null,\n itemQuery: string,\n) => {\n const firstItem = container?.querySelector(\n `${itemQuery}:not([aria-hidden=\"true\"])`,\n );\n if (firstItem) {\n // generally, we expect the immediateParent to be a contentContainer, the\n // parent of that will be the scrollable container. This may or may not be\n // the outer container (likely not)\n return firstItem.parentElement;\n } else {\n return null;\n }\n};\n\nexport const getScrollableContainer = (\n container: HTMLElement | null,\n itemQuery: string,\n) => {\n const immediateParent = getItemParentContainer(container, itemQuery);\n if (immediateParent === container) {\n return container;\n } else {\n return immediateParent?.parentElement as HTMLElement;\n }\n};\n\nexport const isContainerScrollable = (\n scrollableContainer: HTMLElement | null,\n orientation: orientationType,\n) => {\n if (scrollableContainer === null) {\n return false;\n } else {\n const { SCROLL_SIZE, CLIENT_SIZE } = dimensions(orientation);\n const { [SCROLL_SIZE]: scrollSize, [CLIENT_SIZE]: clientSize } =\n scrollableContainer;\n return scrollSize > clientSize;\n }\n};\n"],"names":["start"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAutoScroll.js","sources":["
|
|
1
|
+
{"version":3,"file":"useAutoScroll.js","sources":["../../../../packages/vuu-ui-controls/src/drag-drop/useAutoScroll.ts"],"sourcesContent":["import { RefObject, useCallback, useRef } from \"react\";\nimport { dimensions } from \"./drop-target-utils\";\n\nexport type ScrollStopHandler = (\n scrollDirection: \"fwd\" | \"bwd\",\n scrollPos: number,\n atEnd: boolean,\n) => void;\n\nexport const useAutoScroll = ({\n containerRef,\n onScrollingStopped,\n orientation = \"vertical\",\n}: {\n containerRef: RefObject<HTMLElement | null>;\n onScrollingStopped?: ScrollStopHandler;\n orientation?: \"horizontal\" | \"vertical\";\n}) => {\n const scrollTimer = useRef<number | null>(null);\n const isScrolling = useRef(false);\n const scrollPosRef = useRef(0);\n const lastScrollDirectionRef = useRef<\"fwd\" | \"bwd\">(\"fwd\");\n\n const stopScrolling = useCallback(\n (atEnd = false) => {\n if (scrollTimer.current !== null) {\n clearTimeout(scrollTimer.current);\n scrollTimer.current = null;\n }\n isScrolling.current = false;\n onScrollingStopped?.(\n lastScrollDirectionRef.current,\n scrollPosRef.current,\n atEnd,\n );\n },\n [onScrollingStopped],\n );\n\n const startScrolling = useCallback(\n (direction: \"fwd\" | \"bwd\", scrollRate: number, scrollUnit = 100) => {\n const { current: container } = containerRef;\n if (container) {\n const { SCROLL_POS, SCROLL_SIZE, CLIENT_SIZE } =\n dimensions(orientation);\n const {\n [SCROLL_POS]: scrollPos,\n [SCROLL_SIZE]: scrollSize,\n [CLIENT_SIZE]: clientSize,\n } = container;\n const maxScroll =\n direction === \"fwd\" ? scrollSize - clientSize - scrollPos : scrollPos;\n const nextScroll = Math.min(maxScroll, scrollUnit);\n\n if (direction === \"fwd\") {\n lastScrollDirectionRef.current = \"fwd\";\n container[SCROLL_POS as \"scrollTop\" | \"scrollLeft\"] =\n scrollPosRef.current = scrollPos + nextScroll;\n } else {\n lastScrollDirectionRef.current = \"bwd\";\n container[SCROLL_POS as \"scrollTop\" | \"scrollLeft\"] =\n scrollPosRef.current = scrollPos - nextScroll;\n }\n\n if (nextScroll === maxScroll) {\n // delay this to allow any scroll listeners to do their work\n requestAnimationFrame(() => {\n stopScrolling(true);\n });\n } else {\n isScrolling.current = true;\n scrollTimer.current = window.setTimeout(() => {\n startScrolling(direction, scrollRate, scrollUnit);\n }, 100);\n }\n }\n },\n [containerRef, orientation, stopScrolling],\n );\n\n return {\n isScrolling,\n startScrolling,\n stopScrolling,\n };\n};\n"],"names":[],"mappings":";;;AASO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,WAAc,GAAA;AAChB,CAIM,KAAA;AACJ,EAAM,MAAA,WAAA,GAAc,OAAsB,IAAI,CAAA;AAC9C,EAAM,MAAA,WAAA,GAAc,OAAO,KAAK,CAAA;AAChC,EAAM,MAAA,YAAA,GAAe,OAAO,CAAC,CAAA;AAC7B,EAAM,MAAA,sBAAA,GAAyB,OAAsB,KAAK,CAAA;AAE1D,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,QAAQ,KAAU,KAAA;AACjB,MAAI,IAAA,WAAA,CAAY,YAAY,IAAM,EAAA;AAChC,QAAA,YAAA,CAAa,YAAY,OAAO,CAAA;AAChC,QAAA,WAAA,CAAY,OAAU,GAAA,IAAA;AAAA;AAExB,MAAA,WAAA,CAAY,OAAU,GAAA,KAAA;AACtB,MAAA,kBAAA;AAAA,QACE,sBAAuB,CAAA,OAAA;AAAA,QACvB,YAAa,CAAA,OAAA;AAAA,QACb;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,kBAAkB;AAAA,GACrB;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,SAAA,EAA0B,UAAoB,EAAA,UAAA,GAAa,GAAQ,KAAA;AAClE,MAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAc,GAAA,YAAA;AAC/B,MAAA,IAAI,SAAW,EAAA;AACb,QAAA,MAAM,EAAE,UAAY,EAAA,WAAA,EAAa,WAAY,EAAA,GAC3C,WAAW,WAAW,CAAA;AACxB,QAAM,MAAA;AAAA,UACJ,CAAC,UAAU,GAAG,SAAA;AAAA,UACd,CAAC,WAAW,GAAG,UAAA;AAAA,UACf,CAAC,WAAW,GAAG;AAAA,SACb,GAAA,SAAA;AACJ,QAAA,MAAM,SACJ,GAAA,SAAA,KAAc,KAAQ,GAAA,UAAA,GAAa,aAAa,SAAY,GAAA,SAAA;AAC9D,QAAA,MAAM,UAAa,GAAA,IAAA,CAAK,GAAI,CAAA,SAAA,EAAW,UAAU,CAAA;AAEjD,QAAA,IAAI,cAAc,KAAO,EAAA;AACvB,UAAA,sBAAA,CAAuB,OAAU,GAAA,KAAA;AACjC,UAAA,SAAA,CAAU,UAAwC,CAAA,GAChD,YAAa,CAAA,OAAA,GAAU,SAAY,GAAA,UAAA;AAAA,SAChC,MAAA;AACL,UAAA,sBAAA,CAAuB,OAAU,GAAA,KAAA;AACjC,UAAA,SAAA,CAAU,UAAwC,CAAA,GAChD,YAAa,CAAA,OAAA,GAAU,SAAY,GAAA,UAAA;AAAA;AAGvC,QAAA,IAAI,eAAe,SAAW,EAAA;AAE5B,UAAA,qBAAA,CAAsB,MAAM;AAC1B,YAAA,aAAA,CAAc,IAAI,CAAA;AAAA,WACnB,CAAA;AAAA,SACI,MAAA;AACL,UAAA,WAAA,CAAY,OAAU,GAAA,IAAA;AACtB,UAAY,WAAA,CAAA,OAAA,GAAU,MAAO,CAAA,UAAA,CAAW,MAAM;AAC5C,YAAe,cAAA,CAAA,SAAA,EAAW,YAAY,UAAU,CAAA;AAAA,aAC/C,GAAG,CAAA;AAAA;AACR;AACF,KACF;AAAA,IACA,CAAC,YAAc,EAAA,WAAA,EAAa,aAAa;AAAA,GAC3C;AAEA,EAAO,OAAA;AAAA,IACL,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDragDisplacers.js","sources":["../../src/drag-drop/useDragDisplacers.ts"],"sourcesContent":["import type { orientationType } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { Direction } from \"./dragDropTypes\";\nimport { createDragSpacer as createDragDisplacer } from \"./Draggable\";\nimport {\n MeasuredDropTarget,\n mutateDropTargetsSwitchDropTargetPosition,\n} from \"./drop-target-utils\";\n\nexport type DragDisplacersHookResult = {\n displaceItem: (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition?: boolean,\n direction?: Direction | \"static\",\n orientation?: \"horizontal\" | \"vertical\",\n ) => number;\n displaceLastItem: (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition?: boolean,\n direction?: Direction | \"static\",\n orientation?: \"horizontal\" | \"vertical\",\n ) => number;\n clearSpacers: (useAnimation?: boolean) => void;\n /** Insert the sized spacer at start or end of collection */\n setTerminalSpacer: (\n container: HTMLElement,\n position: \"start\" | \"end\",\n size: number,\n ) => void;\n};\n\nexport type DragDisplacersHook = (\n orientation: orientationType,\n) => DragDisplacersHookResult;\n/**\n * Manage a pair of displacer elements to smoothly display a moving gap between\n * list items of any kind. Designed to be used in a drag drop operation. The 'static'\n * direction option should be used at drag start or following scroll.\n */\nexport const useDragDisplacers: DragDisplacersHook = (\n orientation = \"horizontal\",\n) => {\n const animationFrame = useRef(0);\n const transitioning = useRef(false);\n\n const spacers = useMemo(\n // We only need to listen for transition end on one of the spacers\n () => [createDragDisplacer(transitioning), createDragDisplacer()],\n [],\n );\n\n const animateTransition = useCallback(\n (size: number, propertyName = \"width\") => {\n const [spacer1, spacer2] = spacers;\n animationFrame.current = requestAnimationFrame(() => {\n transitioning.current = true;\n spacer1.style.cssText = `${propertyName}: 0px`;\n spacer2.style.cssText = `${propertyName}: ${size}px`;\n spacers[0] = spacer2;\n spacers[1] = spacer1;\n });\n },\n [spacers],\n );\n\n const clearSpacers = useCallback(\n (useTransition = false) => {\n if (useTransition === true) {\n const [spacer] = spacers;\n const cleanup = () => {\n spacer.removeEventListener(\"transitionend\", cleanup);\n clearSpacers();\n };\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n spacer.addEventListener(\"transitionend\", cleanup);\n animateTransition(0, propertyName);\n } else {\n spacers.forEach((spacer) => spacer.remove());\n }\n },\n [animateTransition, orientation, spacers],\n );\n\n const setTerminalSpacer = useCallback(\n (container: HTMLElement, position: \"start\" | \"end\", size: number) => {\n clearSpacers();\n\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer] = spacers;\n spacer.style.cssText = `${propertyName}: ${size}px`;\n\n if (position === \"start\") {\n container.firstChild?.before(spacer);\n } else {\n container.lastChild?.after(spacer);\n }\n },\n [clearSpacers, orientation, spacers],\n );\n\n const cancelAnyPendingAnimation = useCallback(() => {\n if (animationFrame.current) {\n cancelAnimationFrame(animationFrame.current);\n animationFrame.current = 0;\n }\n }, []);\n\n const displaceItem = useCallback(\n (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition = false,\n direction: Direction | \"static\" = \"static\",\n ): number => {\n if (dropTarget) {\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer1, spacer2] = spacers;\n cancelAnyPendingAnimation();\n if (useTransition) {\n if (transitioning.current) {\n clearSpacers();\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n spacer2.style.cssText = `${propertyName}: 0px`;\n if (direction === \"fwd\") {\n dropTarget.element.before(spacer1);\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.after(spacer1);\n dropTarget.element.before(spacer2);\n }\n } else {\n if (direction === \"fwd\") {\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.before(spacer2);\n }\n }\n animateTransition(size, propertyName);\n } else if (direction === \"static\") {\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n dropTarget.element.before(spacer1);\n } else {\n throw Error(\n \"useDragDisplacers currently only supports noTransition for static displacement\",\n );\n }\n if (direction !== \"static\") {\n mutateDropTargetsSwitchDropTargetPosition(dropTargets, direction);\n }\n return direction === \"bwd\" ? dropTarget.index : dropTarget.index + 1;\n }\n return -1;\n },\n [\n animateTransition,\n cancelAnyPendingAnimation,\n clearSpacers,\n orientation,\n spacers,\n ],\n );\n const displaceLastItem = useCallback(\n (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition = false,\n direction: Direction | \"static\" = \"static\",\n ): number => {\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer1, spacer2] = spacers;\n\n cancelAnyPendingAnimation();\n\n if (useTransition) {\n if (transitioning.current) {\n clearSpacers();\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n spacer2.style.cssText = `${propertyName}: 0px`;\n dropTarget.element.before(spacer1);\n dropTarget.element.after(spacer2);\n } else {\n if (direction === \"fwd\") {\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.before(spacer2);\n }\n }\n animateTransition(size, propertyName);\n } else {\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n dropTarget.element.after(spacer1);\n }\n\n if (direction !== \"static\") {\n mutateDropTargetsSwitchDropTargetPosition(dropTargets, direction);\n }\n\n return dropTarget.index;\n },\n [\n animateTransition,\n cancelAnyPendingAnimation,\n clearSpacers,\n orientation,\n spacers,\n ],\n );\n\n return {\n displaceItem,\n displaceLastItem,\n clearSpacers,\n setTerminalSpacer,\n };\n};\n"],"names":["createDragDisplacer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useDragDisplacers.js","sources":["../../../../packages/vuu-ui-controls/src/drag-drop/useDragDisplacers.ts"],"sourcesContent":["import type { orientationType } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { Direction } from \"./dragDropTypes\";\nimport { createDragSpacer as createDragDisplacer } from \"./Draggable\";\nimport {\n MeasuredDropTarget,\n mutateDropTargetsSwitchDropTargetPosition,\n} from \"./drop-target-utils\";\n\nexport type DragDisplacersHookResult = {\n displaceItem: (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition?: boolean,\n direction?: Direction | \"static\",\n orientation?: \"horizontal\" | \"vertical\",\n ) => number;\n displaceLastItem: (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition?: boolean,\n direction?: Direction | \"static\",\n orientation?: \"horizontal\" | \"vertical\",\n ) => number;\n clearSpacers: (useAnimation?: boolean) => void;\n /** Insert the sized spacer at start or end of collection */\n setTerminalSpacer: (\n container: HTMLElement,\n position: \"start\" | \"end\",\n size: number,\n ) => void;\n};\n\nexport type DragDisplacersHook = (\n orientation: orientationType,\n) => DragDisplacersHookResult;\n/**\n * Manage a pair of displacer elements to smoothly display a moving gap between\n * list items of any kind. Designed to be used in a drag drop operation. The 'static'\n * direction option should be used at drag start or following scroll.\n */\nexport const useDragDisplacers: DragDisplacersHook = (\n orientation = \"horizontal\",\n) => {\n const animationFrame = useRef(0);\n const transitioning = useRef(false);\n\n const spacers = useMemo(\n // We only need to listen for transition end on one of the spacers\n () => [createDragDisplacer(transitioning), createDragDisplacer()],\n [],\n );\n\n const animateTransition = useCallback(\n (size: number, propertyName = \"width\") => {\n const [spacer1, spacer2] = spacers;\n animationFrame.current = requestAnimationFrame(() => {\n transitioning.current = true;\n spacer1.style.cssText = `${propertyName}: 0px`;\n spacer2.style.cssText = `${propertyName}: ${size}px`;\n spacers[0] = spacer2;\n spacers[1] = spacer1;\n });\n },\n [spacers],\n );\n\n const clearSpacers = useCallback(\n (useTransition = false) => {\n if (useTransition === true) {\n const [spacer] = spacers;\n const cleanup = () => {\n spacer.removeEventListener(\"transitionend\", cleanup);\n clearSpacers();\n };\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n spacer.addEventListener(\"transitionend\", cleanup);\n animateTransition(0, propertyName);\n } else {\n spacers.forEach((spacer) => spacer.remove());\n }\n },\n [animateTransition, orientation, spacers],\n );\n\n const setTerminalSpacer = useCallback(\n (container: HTMLElement, position: \"start\" | \"end\", size: number) => {\n clearSpacers();\n\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer] = spacers;\n spacer.style.cssText = `${propertyName}: ${size}px`;\n\n if (position === \"start\") {\n container.firstChild?.before(spacer);\n } else {\n container.lastChild?.after(spacer);\n }\n },\n [clearSpacers, orientation, spacers],\n );\n\n const cancelAnyPendingAnimation = useCallback(() => {\n if (animationFrame.current) {\n cancelAnimationFrame(animationFrame.current);\n animationFrame.current = 0;\n }\n }, []);\n\n const displaceItem = useCallback(\n (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition = false,\n direction: Direction | \"static\" = \"static\",\n ): number => {\n if (dropTarget) {\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer1, spacer2] = spacers;\n cancelAnyPendingAnimation();\n if (useTransition) {\n if (transitioning.current) {\n clearSpacers();\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n spacer2.style.cssText = `${propertyName}: 0px`;\n if (direction === \"fwd\") {\n dropTarget.element.before(spacer1);\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.after(spacer1);\n dropTarget.element.before(spacer2);\n }\n } else {\n if (direction === \"fwd\") {\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.before(spacer2);\n }\n }\n animateTransition(size, propertyName);\n } else if (direction === \"static\") {\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n dropTarget.element.before(spacer1);\n } else {\n throw Error(\n \"useDragDisplacers currently only supports noTransition for static displacement\",\n );\n }\n if (direction !== \"static\") {\n mutateDropTargetsSwitchDropTargetPosition(dropTargets, direction);\n }\n return direction === \"bwd\" ? dropTarget.index : dropTarget.index + 1;\n }\n return -1;\n },\n [\n animateTransition,\n cancelAnyPendingAnimation,\n clearSpacers,\n orientation,\n spacers,\n ],\n );\n const displaceLastItem = useCallback(\n (\n dropTargets: MeasuredDropTarget[],\n dropTarget: MeasuredDropTarget,\n size: number,\n useTransition = false,\n direction: Direction | \"static\" = \"static\",\n ): number => {\n const propertyName = orientation === \"horizontal\" ? \"width\" : \"height\";\n const [spacer1, spacer2] = spacers;\n\n cancelAnyPendingAnimation();\n\n if (useTransition) {\n if (transitioning.current) {\n clearSpacers();\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n spacer2.style.cssText = `${propertyName}: 0px`;\n dropTarget.element.before(spacer1);\n dropTarget.element.after(spacer2);\n } else {\n if (direction === \"fwd\") {\n dropTarget.element.after(spacer2);\n } else {\n dropTarget.element.before(spacer2);\n }\n }\n animateTransition(size, propertyName);\n } else {\n spacer1.style.cssText = `${propertyName}: ${size}px`;\n dropTarget.element.after(spacer1);\n }\n\n if (direction !== \"static\") {\n mutateDropTargetsSwitchDropTargetPosition(dropTargets, direction);\n }\n\n return dropTarget.index;\n },\n [\n animateTransition,\n cancelAnyPendingAnimation,\n clearSpacers,\n orientation,\n spacers,\n ],\n );\n\n return {\n displaceItem,\n displaceLastItem,\n clearSpacers,\n setTerminalSpacer,\n };\n};\n"],"names":["createDragDisplacer"],"mappings":"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"}
|