@vuu-ui/vuu-ui-controls 0.8.87 → 0.8.89

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.
Files changed (124) hide show
  1. package/cjs/common-hooks/useSelection.js.map +1 -1
  2. package/cjs/cycle-state-button/CycleStateButton.js.map +1 -1
  3. package/cjs/drag-drop/Draggable.js.map +1 -1
  4. package/cjs/drag-drop/dragDropTypes.js.map +1 -1
  5. package/cjs/drag-drop/drop-target-utils.js.map +1 -1
  6. package/cjs/drag-drop/useDragDisplacers.js.map +1 -1
  7. package/cjs/drag-drop/useDragDrop.js.map +1 -1
  8. package/cjs/drag-drop/useDragDropNaturalMovement.js.map +1 -1
  9. package/cjs/drag-drop/useGlobalDragDrop.js.map +1 -1
  10. package/cjs/dropdown-base/DropdownBase.js.map +1 -1
  11. package/cjs/dropdown-base/useClickAway.js.map +1 -1
  12. package/cjs/editable/editable-utils.js.map +1 -1
  13. package/cjs/editable/useEditableText.js.map +1 -1
  14. package/cjs/editable-label/EditableLabel.css.js +1 -1
  15. package/cjs/editable-label/EditableLabel.js +0 -1
  16. package/cjs/editable-label/EditableLabel.js.map +1 -1
  17. package/cjs/expando-input/ExpandoInput.css.js +1 -1
  18. package/cjs/instrument-picker/InstrumentPicker.js.map +1 -1
  19. package/cjs/instrument-picker/SearchCell.js.map +1 -1
  20. package/cjs/instrument-picker/useInstrumentPicker.js.map +1 -1
  21. package/cjs/instrument-search/InstrumentSearch.js.map +1 -1
  22. package/cjs/instrument-search/SearchCell.js.map +1 -1
  23. package/cjs/list/List.js.map +1 -1
  24. package/cjs/list/common-hooks/useKeyboardNavigation.js.map +1 -1
  25. package/cjs/list/useList.js.map +1 -1
  26. package/cjs/list/useListHeight.js.map +1 -1
  27. package/cjs/measured-container/useMeasuredContainer.js.map +1 -1
  28. package/cjs/overflow-container/OverflowContainer.js.map +1 -1
  29. package/cjs/overflow-container/overflow-utils.js.map +1 -1
  30. package/cjs/overflow-container/useOverflowContainer.js.map +1 -1
  31. package/cjs/price-ticker/PriceTicker.js.map +1 -1
  32. package/cjs/split-button/SplitButton.js.map +1 -1
  33. package/cjs/split-button/useSplitButton.js.map +1 -1
  34. package/cjs/tabstrip/Tab.css.js +1 -1
  35. package/cjs/tabstrip/Tab.js.map +1 -1
  36. package/cjs/tabstrip/TabMenu.js.map +1 -1
  37. package/cjs/tabstrip/TabMenuOptions.js.map +1 -1
  38. package/cjs/tabstrip/Tabstrip.js.map +1 -1
  39. package/cjs/tabstrip/tabstrip-dom-utils.js.map +1 -1
  40. package/cjs/tabstrip/useAnimatedSelectionThumb.js.map +1 -1
  41. package/cjs/tabstrip/useKeyboardNavigation.js.map +1 -1
  42. package/cjs/tabstrip/useTabstrip.js.map +1 -1
  43. package/cjs/toolbar/Toolbar.js.map +1 -1
  44. package/cjs/toolbar/toolbar-dom-utils.js.map +1 -1
  45. package/cjs/toolbar/useKeyboardNavigation.js.map +1 -1
  46. package/cjs/toolbar/useSelection.js.map +1 -1
  47. package/cjs/toolbar/useToolbar.js.map +1 -1
  48. package/cjs/vuu-date-picker/VuuDatePicker.js.map +1 -1
  49. package/cjs/vuu-input/VuuInput.js.map +1 -1
  50. package/cjs/vuu-typeahead-input/VuuTypeaheadInput.js.map +1 -1
  51. package/cjs/vuu-typeahead-input/useVuuTypeahead.js.map +1 -1
  52. package/esm/common-hooks/useSelection.js.map +1 -1
  53. package/esm/cycle-state-button/CycleStateButton.js.map +1 -1
  54. package/esm/drag-drop/Draggable.js.map +1 -1
  55. package/esm/drag-drop/dragDropTypes.js.map +1 -1
  56. package/esm/drag-drop/drop-target-utils.js.map +1 -1
  57. package/esm/drag-drop/useDragDisplacers.js.map +1 -1
  58. package/esm/drag-drop/useDragDrop.js.map +1 -1
  59. package/esm/drag-drop/useDragDropNaturalMovement.js.map +1 -1
  60. package/esm/drag-drop/useGlobalDragDrop.js.map +1 -1
  61. package/esm/dropdown-base/DropdownBase.js.map +1 -1
  62. package/esm/dropdown-base/useClickAway.js.map +1 -1
  63. package/esm/editable/editable-utils.js.map +1 -1
  64. package/esm/editable/useEditableText.js.map +1 -1
  65. package/esm/editable-label/EditableLabel.css.js +1 -1
  66. package/esm/editable-label/EditableLabel.js +0 -1
  67. package/esm/editable-label/EditableLabel.js.map +1 -1
  68. package/esm/expando-input/ExpandoInput.css.js +1 -1
  69. package/esm/instrument-picker/InstrumentPicker.js.map +1 -1
  70. package/esm/instrument-picker/SearchCell.js.map +1 -1
  71. package/esm/instrument-picker/useInstrumentPicker.js.map +1 -1
  72. package/esm/instrument-search/InstrumentSearch.js.map +1 -1
  73. package/esm/instrument-search/SearchCell.js.map +1 -1
  74. package/esm/list/List.js.map +1 -1
  75. package/esm/list/common-hooks/useKeyboardNavigation.js.map +1 -1
  76. package/esm/list/useList.js.map +1 -1
  77. package/esm/list/useListHeight.js.map +1 -1
  78. package/esm/measured-container/useMeasuredContainer.js.map +1 -1
  79. package/esm/overflow-container/OverflowContainer.js.map +1 -1
  80. package/esm/overflow-container/overflow-utils.js.map +1 -1
  81. package/esm/overflow-container/useOverflowContainer.js.map +1 -1
  82. package/esm/price-ticker/PriceTicker.js.map +1 -1
  83. package/esm/split-button/SplitButton.js.map +1 -1
  84. package/esm/split-button/useSplitButton.js.map +1 -1
  85. package/esm/tabstrip/Tab.css.js +1 -1
  86. package/esm/tabstrip/Tab.js.map +1 -1
  87. package/esm/tabstrip/TabMenu.js.map +1 -1
  88. package/esm/tabstrip/TabMenuOptions.js.map +1 -1
  89. package/esm/tabstrip/Tabstrip.js.map +1 -1
  90. package/esm/tabstrip/tabstrip-dom-utils.js.map +1 -1
  91. package/esm/tabstrip/useAnimatedSelectionThumb.js.map +1 -1
  92. package/esm/tabstrip/useKeyboardNavigation.js.map +1 -1
  93. package/esm/tabstrip/useTabstrip.js.map +1 -1
  94. package/esm/toolbar/Toolbar.js.map +1 -1
  95. package/esm/toolbar/toolbar-dom-utils.js.map +1 -1
  96. package/esm/toolbar/useKeyboardNavigation.js.map +1 -1
  97. package/esm/toolbar/useSelection.js.map +1 -1
  98. package/esm/toolbar/useToolbar.js.map +1 -1
  99. package/esm/vuu-date-picker/VuuDatePicker.js.map +1 -1
  100. package/esm/vuu-input/VuuInput.js.map +1 -1
  101. package/esm/vuu-typeahead-input/VuuTypeaheadInput.js.map +1 -1
  102. package/esm/vuu-typeahead-input/useVuuTypeahead.js.map +1 -1
  103. package/package.json +7 -7
  104. package/types/common-hooks/useSelection.d.ts +1 -1
  105. package/types/drag-drop/useDragDropNaturalMovement.d.ts +1 -1
  106. package/types/drag-drop/useGlobalDragDrop.d.ts +1 -1
  107. package/types/editable/useEditableText.d.ts +1 -1
  108. package/types/instrument-picker/SearchCell.d.ts +1 -1
  109. package/types/instrument-picker/useInstrumentPicker.d.ts +1 -1
  110. package/types/instrument-search/SearchCell.d.ts +1 -1
  111. package/types/list/common-hooks/useKeyboardNavigation.d.ts +1 -1
  112. package/types/list/useList.d.ts +1 -1
  113. package/types/list/useListHeight.d.ts +1 -1
  114. package/types/measured-container/useMeasuredContainer.d.ts +1 -1
  115. package/types/overflow-container/useOverflowContainer.d.ts +1 -1
  116. package/types/split-button/useSplitButton.d.ts +1 -1
  117. package/types/tabstrip/TabMenu.d.ts +1 -1
  118. package/types/tabstrip/useKeyboardNavigation.d.ts +1 -1
  119. package/types/tabstrip/useTabstrip.d.ts +1 -1
  120. package/types/toolbar/useKeyboardNavigation.d.ts +1 -1
  121. package/types/toolbar/useSelection.d.ts +1 -1
  122. package/types/toolbar/useToolbar.d.ts +1 -1
  123. package/types/vuu-typeahead-input/VuuTypeaheadInput.d.ts +1 -1
  124. package/types/vuu-typeahead-input/useVuuTypeahead.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useSelection.js","sources":["../../src/common-hooks/useSelection.ts"],"sourcesContent":["import {\n getElementByDataIndex,\n getElementDataIndex,\n isSelectableElement\n} from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useRef\n} from \"react\";\nimport {\n SelectionHookProps,\n SelectionHookResult,\n selectionIsDisallowed\n} from \"./selectionTypes\";\nimport { useControlled } from \"./useControlled\";\n\nexport const CHECKBOX = \"checkbox\";\n\nexport const GROUP_SELECTION_NONE = \"none\";\nexport const GROUP_SELECTION_SINGLE = \"single\";\nexport const GROUP_SELECTION_CASCADE = \"cascade\";\n\nexport type GroupSelectionMode = \"none\" | \"single\" | \"cascade\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport const groupSelectionEnabled = (\n groupSelection: GroupSelectionMode\n): boolean => groupSelection && groupSelection !== GROUP_SELECTION_NONE;\n\nexport const useSelection = ({\n containerRef,\n defaultSelected,\n disableSelection = false,\n // groupSelection = GROUP_SELECTION_NONE,\n highlightedIndex,\n itemQuery,\n onClick,\n // label,\n onSelect,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n selectionKeys = defaultSelectionKeys,\n tabToSelect\n}: SelectionHookProps): SelectionHookResult => {\n const isDeselectable = selectionStrategy === \"deselectable\";\n const isMultipleSelect = selectionStrategy === \"multiple\";\n const isExtendedSelect = selectionStrategy === \"extended\";\n const lastActive = useRef(-1);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => selectionKeys.includes(evt.key),\n [selectionKeys]\n );\n\n const [selected, setSelected] = useControlled<string[]>({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"UseSelection\",\n state: \"selected\"\n });\n\n const isItemSelected = useCallback(\n (itemId: string) => selected.includes(itemId),\n [selected]\n );\n\n const selectDeselectable = useCallback(\n (itemId: string) => (isItemSelected(itemId) ? [] : [itemId]),\n [isItemSelected]\n );\n const selectMultiple = useCallback(\n (itemId: string) => {\n const nextItems = isItemSelected(itemId)\n ? (selected as string[]).filter((i) => i !== itemId)\n : (selected as string[]).concat(itemId);\n nextItems.sort();\n return nextItems;\n },\n [isItemSelected, selected]\n );\n const selectRange = useCallback(\n (idx: number, preserveExistingSelection?: boolean) => {\n const currentSelection = preserveExistingSelection\n ? (selected as string[])\n : ([] as string[]);\n\n const [lastSelectedItemId] = (selected as string[]).slice(-1);\n const lastSelectedItemIndex = lastSelectedItemId\n ? getElementDataIndex(document.getElementById(lastSelectedItemId))\n : 0;\n\n const startRegion = Math.min(idx, lastSelectedItemIndex);\n const endRegion = Math.max(idx, lastSelectedItemIndex);\n\n const container = containerRef.current as HTMLElement;\n const allItems = Array.from(\n container.querySelectorAll(itemQuery)\n ) as HTMLElement[];\n const rangeSelection = allItems\n .slice(startRegion, endRegion + 1)\n .map((el) => el.id);\n // concat the current selection with a new selection and remove duplicates for overlaps\n const nextItems = [...new Set([...currentSelection, ...rangeSelection])];\n nextItems.sort();\n return nextItems;\n },\n [containerRef, itemQuery, selected]\n );\n\n const selectItemAtIndex = useCallback(\n (\n evt: SyntheticEvent,\n idx: number,\n rangeSelect: boolean,\n preserveExistingSelection?: boolean\n ) => {\n const { current: container } = containerRef;\n const { id } = getElementByDataIndex(container, idx, true);\n\n let newSelected;\n if (isMultipleSelect) {\n newSelected = selectMultiple(id);\n } else if (isExtendedSelect) {\n if (preserveExistingSelection && !rangeSelect) {\n newSelected = selectMultiple(id);\n } else if (rangeSelect) {\n newSelected = selectRange(idx, preserveExistingSelection);\n } else {\n newSelected = [id];\n }\n } else if (isDeselectable) {\n newSelected = selectDeselectable(id);\n } else {\n newSelected = [id];\n }\n\n if (newSelected !== selected) {\n setSelected(newSelected);\n }\n\n // We fire onSelect irrespective of whether selection changes\n onSelect?.(evt, id);\n\n if (newSelected !== selected) {\n if (onSelectionChange) {\n onSelectionChange(evt, newSelected);\n }\n }\n },\n [\n containerRef,\n isMultipleSelect,\n isExtendedSelect,\n isDeselectable,\n selected,\n onSelect,\n selectMultiple,\n selectRange,\n selectDeselectable,\n setSelected,\n onSelectionChange\n ]\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, highlightedIndex);\n if (isSelectableElement(element)) {\n if (isSelectionEvent(evt) || (tabToSelect && evt.key === \"Tab\")) {\n // We do not inhibit Tab behaviour, if we are selecting on Tab then we apply\n // selection as a side effect of the Tab, not as a replacement for Tabbing.\n if (evt.key !== \"Tab\") {\n evt.preventDefault();\n }\n selectItemAtIndex(\n evt,\n highlightedIndex,\n false,\n evt.ctrlKey || evt.metaKey\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIndex;\n }\n }\n }\n },\n [\n highlightedIndex,\n containerRef,\n isSelectionEvent,\n tabToSelect,\n selectItemAtIndex,\n isExtendedSelect\n ]\n );\n\n const handleKeyboardNavigation = useCallback(\n (evt: KeyboardEvent, currentIndex: number) => {\n if (isExtendedSelect && evt.shiftKey) {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, currentIndex);\n if (isSelectableElement(element)) {\n selectItemAtIndex(evt, currentIndex, true);\n }\n }\n },\n [isExtendedSelect, containerRef, selectItemAtIndex]\n );\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, highlightedIndex);\n if (!disableSelection && isSelectableElement(element)) {\n evt.preventDefault();\n evt.stopPropagation();\n selectItemAtIndex(\n evt,\n highlightedIndex,\n evt.shiftKey,\n evt.ctrlKey || evt.metaKey\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIndex;\n }\n }\n onClick?.(evt);\n },\n [\n containerRef,\n highlightedIndex,\n disableSelection,\n onClick,\n selectItemAtIndex,\n isExtendedSelect\n ]\n );\n\n const listHandlers = selectionIsDisallowed(selectionStrategy)\n ? {\n onClick\n }\n : {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyboardNavigation: handleKeyboardNavigation\n };\n\n return {\n listHandlers,\n selected,\n setSelected\n };\n};\n"],"names":["useRef","useCallback","useControlled","getElementDataIndex","getElementByDataIndex","isSelectableElement","selectionIsDisallowed"],"mappings":"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"}
1
+ {"version":3,"file":"useSelection.js","sources":["../../src/common-hooks/useSelection.ts"],"sourcesContent":["import {\n getElementByDataIndex,\n getElementDataIndex,\n isSelectableElement,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent,\n SyntheticEvent,\n useCallback,\n useRef,\n} from \"react\";\nimport {\n SelectionHookProps,\n SelectionHookResult,\n selectionIsDisallowed,\n} from \"./selectionTypes\";\nimport { useControlled } from \"./useControlled\";\n\nexport const CHECKBOX = \"checkbox\";\n\nexport const GROUP_SELECTION_NONE = \"none\";\nexport const GROUP_SELECTION_SINGLE = \"single\";\nexport const GROUP_SELECTION_CASCADE = \"cascade\";\n\nexport type GroupSelectionMode = \"none\" | \"single\" | \"cascade\";\n\nconst defaultSelectionKeys = [\"Enter\", \" \"];\n\nexport const groupSelectionEnabled = (\n groupSelection: GroupSelectionMode,\n): boolean => groupSelection && groupSelection !== GROUP_SELECTION_NONE;\n\nexport const useSelection = ({\n containerRef,\n defaultSelected,\n disableSelection = false,\n // groupSelection = GROUP_SELECTION_NONE,\n highlightedIndex,\n itemQuery,\n onClick,\n // label,\n onSelect,\n onSelectionChange,\n selected: selectedProp,\n selectionStrategy,\n selectionKeys = defaultSelectionKeys,\n tabToSelect,\n}: SelectionHookProps): SelectionHookResult => {\n const isDeselectable = selectionStrategy === \"deselectable\";\n const isMultipleSelect = selectionStrategy === \"multiple\";\n const isExtendedSelect = selectionStrategy === \"extended\";\n const lastActive = useRef(-1);\n\n const isSelectionEvent = useCallback(\n (evt: KeyboardEvent) => selectionKeys.includes(evt.key),\n [selectionKeys],\n );\n\n const [selected, setSelected] = useControlled<string[]>({\n controlled: selectedProp,\n default: defaultSelected ?? [],\n name: \"UseSelection\",\n state: \"selected\",\n });\n\n const isItemSelected = useCallback(\n (itemId: string) => selected.includes(itemId),\n [selected],\n );\n\n const selectDeselectable = useCallback(\n (itemId: string) => (isItemSelected(itemId) ? [] : [itemId]),\n [isItemSelected],\n );\n const selectMultiple = useCallback(\n (itemId: string) => {\n const nextItems = isItemSelected(itemId)\n ? (selected as string[]).filter((i) => i !== itemId)\n : (selected as string[]).concat(itemId);\n nextItems.sort();\n return nextItems;\n },\n [isItemSelected, selected],\n );\n const selectRange = useCallback(\n (idx: number, preserveExistingSelection?: boolean) => {\n const currentSelection = preserveExistingSelection\n ? (selected as string[])\n : ([] as string[]);\n\n const [lastSelectedItemId] = (selected as string[]).slice(-1);\n const lastSelectedItemIndex = lastSelectedItemId\n ? getElementDataIndex(document.getElementById(lastSelectedItemId))\n : 0;\n\n const startRegion = Math.min(idx, lastSelectedItemIndex);\n const endRegion = Math.max(idx, lastSelectedItemIndex);\n\n const container = containerRef.current as HTMLElement;\n const allItems = Array.from(\n container.querySelectorAll(itemQuery),\n ) as HTMLElement[];\n const rangeSelection = allItems\n .slice(startRegion, endRegion + 1)\n .map((el) => el.id);\n // concat the current selection with a new selection and remove duplicates for overlaps\n const nextItems = [...new Set([...currentSelection, ...rangeSelection])];\n nextItems.sort();\n return nextItems;\n },\n [containerRef, itemQuery, selected],\n );\n\n const selectItemAtIndex = useCallback(\n (\n evt: SyntheticEvent,\n idx: number,\n rangeSelect: boolean,\n preserveExistingSelection?: boolean,\n ) => {\n const { current: container } = containerRef;\n const { id } = getElementByDataIndex(container, idx, true);\n\n let newSelected;\n if (isMultipleSelect) {\n newSelected = selectMultiple(id);\n } else if (isExtendedSelect) {\n if (preserveExistingSelection && !rangeSelect) {\n newSelected = selectMultiple(id);\n } else if (rangeSelect) {\n newSelected = selectRange(idx, preserveExistingSelection);\n } else {\n newSelected = [id];\n }\n } else if (isDeselectable) {\n newSelected = selectDeselectable(id);\n } else {\n newSelected = [id];\n }\n\n if (newSelected !== selected) {\n setSelected(newSelected);\n }\n\n // We fire onSelect irrespective of whether selection changes\n onSelect?.(evt, id);\n\n if (newSelected !== selected) {\n if (onSelectionChange) {\n onSelectionChange(evt, newSelected);\n }\n }\n },\n [\n containerRef,\n isMultipleSelect,\n isExtendedSelect,\n isDeselectable,\n selected,\n onSelect,\n selectMultiple,\n selectRange,\n selectDeselectable,\n setSelected,\n onSelectionChange,\n ],\n );\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent) => {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, highlightedIndex);\n if (isSelectableElement(element)) {\n if (isSelectionEvent(evt) || (tabToSelect && evt.key === \"Tab\")) {\n // We do not inhibit Tab behaviour, if we are selecting on Tab then we apply\n // selection as a side effect of the Tab, not as a replacement for Tabbing.\n if (evt.key !== \"Tab\") {\n evt.preventDefault();\n }\n selectItemAtIndex(\n evt,\n highlightedIndex,\n false,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIndex;\n }\n }\n }\n },\n [\n highlightedIndex,\n containerRef,\n isSelectionEvent,\n tabToSelect,\n selectItemAtIndex,\n isExtendedSelect,\n ],\n );\n\n const handleKeyboardNavigation = useCallback(\n (evt: KeyboardEvent, currentIndex: number) => {\n if (isExtendedSelect && evt.shiftKey) {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, currentIndex);\n if (isSelectableElement(element)) {\n selectItemAtIndex(evt, currentIndex, true);\n }\n }\n },\n [isExtendedSelect, containerRef, selectItemAtIndex],\n );\n\n const handleClick = useCallback(\n (evt: MouseEvent) => {\n const { current: container } = containerRef;\n const element = getElementByDataIndex(container, highlightedIndex);\n if (!disableSelection && isSelectableElement(element)) {\n evt.preventDefault();\n evt.stopPropagation();\n selectItemAtIndex(\n evt,\n highlightedIndex,\n evt.shiftKey,\n evt.ctrlKey || evt.metaKey,\n );\n if (isExtendedSelect) {\n lastActive.current = highlightedIndex;\n }\n }\n onClick?.(evt);\n },\n [\n containerRef,\n highlightedIndex,\n disableSelection,\n onClick,\n selectItemAtIndex,\n isExtendedSelect,\n ],\n );\n\n const listHandlers = selectionIsDisallowed(selectionStrategy)\n ? {\n onClick,\n }\n : {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onKeyboardNavigation: handleKeyboardNavigation,\n };\n\n return {\n listHandlers,\n selected,\n setSelected,\n };\n};\n"],"names":["useRef","useCallback","useControlled","getElementDataIndex","getElementByDataIndex","isSelectableElement","selectionIsDisallowed"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CycleStateButton.js","sources":["../../src/cycle-state-button/CycleStateButton.tsx"],"sourcesContent":["import { Button, ButtonProps } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport type { CommitResponse } from \"@vuu-ui/vuu-table-types\";\nimport type {\n VuuColumnDataType,\n VuuRowDataItemType\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { ForwardedRef, forwardRef, SyntheticEvent, useCallback } from \"react\";\n\nconst classBase = \"vuuCycleStateButton\";\n\nexport type CycleStateCommitHandler = (\n evt: SyntheticEvent,\n value: VuuRowDataItemType\n) => CommitResponse;\n\nexport interface CycleStateButtonProps extends Omit<ButtonProps, \"onChange\"> {\n onChange?: (value: VuuRowDataItemType) => void;\n onCommit?: CycleStateCommitHandler;\n values: string[];\n value: string;\n}\n\nconst getNextValue = (value: string, valueList: string[]) => {\n const index = valueList\n .map((v) => v.toUpperCase())\n .indexOf(value.toUpperCase());\n if (index === valueList.length - 1) {\n return valueList[0];\n } else {\n return valueList[index + 1];\n }\n};\n\nexport const CycleStateButton = forwardRef(function CycleStateButton(\n {\n className,\n onChange,\n onCommit,\n value = \"\",\n values,\n ...buttonProps\n }: CycleStateButtonProps,\n forwardedRef: ForwardedRef<HTMLButtonElement>\n) {\n const handleClick = useCallback(\n (evt: SyntheticEvent<HTMLButtonElement>) => {\n const nextValue = getNextValue(value, values);\n onChange?.(nextValue);\n onCommit?.(evt, nextValue as VuuColumnDataType).then((response) => {\n if (response !== true) {\n console.error(response);\n }\n });\n },\n [onChange, onCommit, value, values]\n );\n\n return (\n <Button\n {...buttonProps}\n className={cx(\n classBase,\n className,\n `${classBase}-${value.toLowerCase()}`\n )}\n onClick={handleClick}\n ref={forwardedRef}\n >\n {value}\n </Button>\n );\n});\n"],"names":["forwardRef","CycleStateButton","useCallback","jsx","Button"],"mappings":";;;;;;;AASA,MAAM,SAAY,GAAA,qBAAA,CAAA;AAclB,MAAM,YAAA,GAAe,CAAC,KAAA,EAAe,SAAwB,KAAA;AAC3D,EAAA,MAAM,KAAQ,GAAA,SAAA,CACX,GAAI,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,WAAY,EAAC,CAC1B,CAAA,OAAA,CAAQ,KAAM,CAAA,WAAA,EAAa,CAAA,CAAA;AAC9B,EAAI,IAAA,KAAA,KAAU,SAAU,CAAA,MAAA,GAAS,CAAG,EAAA;AAClC,IAAA,OAAO,UAAU,CAAC,CAAA,CAAA;AAAA,GACb,MAAA;AACL,IAAO,OAAA,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAA;AAAA,GAC5B;AACF,CAAA,CAAA;AAEa,MAAA,gBAAA,GAAmBA,gBAAW,CAAA,SAASC,iBAClD,CAAA;AAAA,EACE,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAQ,GAAA,EAAA;AAAA,EACR,MAAA;AAAA,EACA,GAAG,WAAA;AACL,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,WAAc,GAAAC,iBAAA;AAAA,IAClB,CAAC,GAA2C,KAAA;AAC1C,MAAM,MAAA,SAAA,GAAY,YAAa,CAAA,KAAA,EAAO,MAAM,CAAA,CAAA;AAC5C,MAAA,QAAA,GAAW,SAAS,CAAA,CAAA;AACpB,MAAA,QAAA,GAAW,GAAK,EAAA,SAA8B,CAAE,CAAA,IAAA,CAAK,CAAC,QAAa,KAAA;AACjE,QAAA,IAAI,aAAa,IAAM,EAAA;AACrB,UAAA,OAAA,CAAQ,MAAM,QAAQ,CAAA,CAAA;AAAA,SACxB;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AAAA,IACA,CAAC,QAAA,EAAU,QAAU,EAAA,KAAA,EAAO,MAAM,CAAA;AAAA,GACpC,CAAA;AAEA,EACE,uBAAAC,cAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACJ,SAAW,EAAA,EAAA;AAAA,QACT,SAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAG,EAAA,SAAS,CAAI,CAAA,EAAA,KAAA,CAAM,aAAa,CAAA,CAAA;AAAA,OACrC;AAAA,MACA,OAAS,EAAA,WAAA;AAAA,MACT,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAA,EAAA,KAAA;AAAA,KAAA;AAAA,GACH,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"CycleStateButton.js","sources":["../../src/cycle-state-button/CycleStateButton.tsx"],"sourcesContent":["import { Button, ButtonProps } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport type { CommitResponse } from \"@vuu-ui/vuu-table-types\";\nimport type {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { ForwardedRef, forwardRef, SyntheticEvent, useCallback } from \"react\";\n\nconst classBase = \"vuuCycleStateButton\";\n\nexport type CycleStateCommitHandler = (\n evt: SyntheticEvent,\n value: VuuRowDataItemType,\n) => CommitResponse;\n\nexport interface CycleStateButtonProps extends Omit<ButtonProps, \"onChange\"> {\n onChange?: (value: VuuRowDataItemType) => void;\n onCommit?: CycleStateCommitHandler;\n values: string[];\n value: string;\n}\n\nconst getNextValue = (value: string, valueList: string[]) => {\n const index = valueList\n .map((v) => v.toUpperCase())\n .indexOf(value.toUpperCase());\n if (index === valueList.length - 1) {\n return valueList[0];\n } else {\n return valueList[index + 1];\n }\n};\n\nexport const CycleStateButton = forwardRef(function CycleStateButton(\n {\n className,\n onChange,\n onCommit,\n value = \"\",\n values,\n ...buttonProps\n }: CycleStateButtonProps,\n forwardedRef: ForwardedRef<HTMLButtonElement>,\n) {\n const handleClick = useCallback(\n (evt: SyntheticEvent<HTMLButtonElement>) => {\n const nextValue = getNextValue(value, values);\n onChange?.(nextValue);\n onCommit?.(evt, nextValue as VuuColumnDataType).then((response) => {\n if (response !== true) {\n console.error(response);\n }\n });\n },\n [onChange, onCommit, value, values],\n );\n\n return (\n <Button\n {...buttonProps}\n className={cx(\n classBase,\n className,\n `${classBase}-${value.toLowerCase()}`,\n )}\n onClick={handleClick}\n ref={forwardedRef}\n >\n {value}\n </Button>\n );\n});\n"],"names":["forwardRef","CycleStateButton","useCallback","jsx","Button"],"mappings":";;;;;;;AASA,MAAM,SAAY,GAAA,qBAAA,CAAA;AAclB,MAAM,YAAA,GAAe,CAAC,KAAA,EAAe,SAAwB,KAAA;AAC3D,EAAA,MAAM,KAAQ,GAAA,SAAA,CACX,GAAI,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,WAAY,EAAC,CAC1B,CAAA,OAAA,CAAQ,KAAM,CAAA,WAAA,EAAa,CAAA,CAAA;AAC9B,EAAI,IAAA,KAAA,KAAU,SAAU,CAAA,MAAA,GAAS,CAAG,EAAA;AAClC,IAAA,OAAO,UAAU,CAAC,CAAA,CAAA;AAAA,GACb,MAAA;AACL,IAAO,OAAA,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAA;AAAA,GAC5B;AACF,CAAA,CAAA;AAEa,MAAA,gBAAA,GAAmBA,gBAAW,CAAA,SAASC,iBAClD,CAAA;AAAA,EACE,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAQ,GAAA,EAAA;AAAA,EACR,MAAA;AAAA,EACA,GAAG,WAAA;AACL,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,WAAc,GAAAC,iBAAA;AAAA,IAClB,CAAC,GAA2C,KAAA;AAC1C,MAAM,MAAA,SAAA,GAAY,YAAa,CAAA,KAAA,EAAO,MAAM,CAAA,CAAA;AAC5C,MAAA,QAAA,GAAW,SAAS,CAAA,CAAA;AACpB,MAAA,QAAA,GAAW,GAAK,EAAA,SAA8B,CAAE,CAAA,IAAA,CAAK,CAAC,QAAa,KAAA;AACjE,QAAA,IAAI,aAAa,IAAM,EAAA;AACrB,UAAA,OAAA,CAAQ,MAAM,QAAQ,CAAA,CAAA;AAAA,SACxB;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AAAA,IACA,CAAC,QAAA,EAAU,QAAU,EAAA,KAAA,EAAO,MAAM,CAAA;AAAA,GACpC,CAAA;AAEA,EACE,uBAAAC,cAAA;AAAA,IAACC,WAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACJ,SAAW,EAAA,EAAA;AAAA,QACT,SAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAG,EAAA,SAAS,CAAI,CAAA,EAAA,KAAA,CAAM,aAAa,CAAA,CAAA;AAAA,OACrC;AAAA,MACA,OAAS,EAAA,WAAA;AAAA,MACT,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAA,EAAA,KAAA;AAAA,KAAA;AAAA,GACH,CAAA;AAEJ,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Draggable.js","sources":["../../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":["forwardRef","Draggable","useWindow","useComponentCssInjection","draggableCss","useCallback","useForkRef","useMemo","Portal","jsx","Popup"],"mappings":"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"}
1
+ {"version":3,"file":"Draggable.js","sources":["../../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":["forwardRef","Draggable","useWindow","useComponentCssInjection","draggableCss","useCallback","useForkRef","useMemo","Portal","jsx","Popup"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dragDropTypes.js","sources":["../../src/drag-drop/dragDropTypes.ts"],"sourcesContent":["import { MouseEventHandler, RefObject } from \"react\";\nimport { 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?: JSX.Element;\n dropIndicator?: JSX.Element;\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>;\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>;\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,MAAA;AACvB,MAAM,GAAiB,GAAA;;;;;"}
1
+ {"version":3,"file":"dragDropTypes.js","sources":["../../src/drag-drop/dragDropTypes.ts"],"sourcesContent":["import { MouseEventHandler, RefObject } from \"react\";\nimport { 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?: JSX.Element;\n dropIndicator?: JSX.Element;\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>;\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>;\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,MAAA;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":["../../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":"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":["useRef","useMemo","createDragDisplacer","useCallback","mutateDropTargetsSwitchDropTargetPosition"],"mappings":"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"}
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":["useRef","useMemo","createDragDisplacer","useCallback","mutateDropTargetsSwitchDropTargetPosition"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDragDrop.js","sources":["../../src/drag-drop/useDragDrop.tsx"],"sourcesContent":["import { dispatchCustomEvent } from \"@vuu-ui/vuu-utils\";\nimport {\n MouseEventHandler,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState\n} from \"react\";\nimport { useDragDropProvider } from \"./DragDropProvider\";\nimport { DragDropState } from \"./DragDropState\";\nimport {\n DragDropHook,\n DropHandler,\n InternalDragDropProps,\n InternalDragHookResult,\n MouseOffset,\n MousePosition\n} from \"./dragDropTypes\";\nimport { Draggable } from \"./Draggable\";\nimport {\n cloneElement,\n constrainRect,\n dimensions,\n getScrollableContainer,\n isContainerScrollable,\n NOT_OVERFLOWED\n} from \"./drop-target-utils\";\nimport { ScrollStopHandler, useAutoScroll } from \"./useAutoScroll\";\nimport { useDragDropCopy, NULL_DROP_OPTIONS } from \"./useDragDropCopy\";\nimport { useDragDropIndicator } from \"./useDragDropIndicator\";\nimport { useDragDropNaturalMovement } from \"./useDragDropNaturalMovement\";\nimport { ResumeDragHandler } from \"./useGlobalDragDrop\";\nimport { isOverflowElement } from \"../utils\";\n\nconst NULL_DRAG_DROP_RESULT = {\n beginDrag: () => undefined,\n drag: () => undefined,\n draggableRef: { current: null },\n drop: () => NULL_DROP_OPTIONS,\n isDragging: false,\n isScrolling: false,\n handleScrollStart: () => undefined,\n handleScrollStop: () => undefined,\n revealOverflowedItems: false\n};\n\ntype DraggableStatus = {\n draggable?: JSX.Element;\n draggedItemIndex: number;\n isDragging: boolean;\n};\n\ntype DragBoundary = {\n start: number;\n end: number;\n contraStart: number;\n contraEnd: number;\n};\n\nconst UNBOUNDED: DragBoundary = {\n start: 0,\n end: 1000,\n contraStart: 0,\n contraEnd: 1000\n};\n\ntype InternalHook = (props: InternalDragDropProps) => InternalDragHookResult;\nconst noDragDrop: InternalHook = () => NULL_DRAG_DROP_RESULT;\nconst dragThreshold = 3;\n\nconst getDraggableElement = (\n el: EventTarget | null,\n query: string\n): HTMLElement => (el as HTMLElement)?.closest(query) as HTMLElement;\n\nconst getLastElement = (\n container: HTMLElement,\n itemQuery: string\n): [HTMLElement, boolean] => {\n const fullItemQuery = `:is(${itemQuery}${NOT_OVERFLOWED},.vuuOverflowContainer-OverflowIndicator)`;\n const childElements = Array.from(container.querySelectorAll(fullItemQuery));\n const lastElement = childElements.pop() as HTMLElement;\n return [lastElement, isOverflowElement(lastElement)];\n};\n\nexport const useDragDrop: DragDropHook = ({\n allowDragDrop,\n containerRef,\n draggableClassName,\n getDragPayload,\n id,\n itemQuery = \"*\",\n onDragStart,\n onDrop,\n onDropSettle,\n orientation,\n scrollingContainerRef,\n ...dragDropProps\n}) => {\n const dragBoundaries = useRef<DragBoundary>({\n start: 0,\n end: 0,\n contraStart: 0,\n contraEnd: 0\n });\n const [draggableStatus, setDraggableStatus] = useState<DraggableStatus>({\n draggable: undefined,\n draggedItemIndex: -1,\n isDragging: false\n });\n\n const dragDropStateRef = useRef<DragDropState | null>(null);\n const mouseDownTimer = useRef<number | null>(null);\n /** do we actually have scrollable content */\n const isScrollableRef = useRef(false);\n\n /** save this on mousedown. We cannot rely on the target of mousemove being same element*/\n const mousedownElementRef = useRef<HTMLElement | null>(null);\n\n /** current mouse position */\n const mousePosRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** mouse position when mousedown initiated drag */\n const startPosRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** references the dragged Item during its final 'settling' phase post drop */\n const settlingItemRef = useRef<HTMLElement | null>(null);\n /** the container which will scroll if content overflows */\n const scrollableContainerRef = useRef<HTMLElement | null>(null);\n const dropPosRef = useRef(-1);\n const dropIndexRef = useRef(-1);\n\n const handleScrollStopRef = useRef<ScrollStopHandler>();\n\n const {\n isDragSource,\n isDropTarget,\n onDragOut,\n onEndOfDragOperation,\n register\n } = useDragDropProvider(id);\n\n type NativeMouseHandler = (evt: MouseEvent) => void;\n /** refs for drag handlers to avoid circular dependency issues */\n const dragMouseMoveHandlerRef = useRef<NativeMouseHandler>();\n const dragMouseUpHandlerRef = useRef<NativeMouseHandler>();\n\n const attachDragHandlers = useCallback(() => {\n const { current: dragMove } = dragMouseMoveHandlerRef;\n const { current: dragUp } = dragMouseUpHandlerRef;\n if (dragMove && dragUp) {\n // prettier-ignore\n document.addEventListener(\"mousemove\", dragMove, false);\n document.addEventListener(\"mouseup\", dragUp, false);\n }\n }, []);\n const removeDragHandlers = useCallback(() => {\n const { current: dragMove } = dragMouseMoveHandlerRef;\n const { current: dragUp } = dragMouseUpHandlerRef;\n if (dragMove && dragUp) {\n // prettier-ignore\n document.removeEventListener(\"mousemove\", dragMove, false);\n document.removeEventListener(\"mouseup\", dragUp, false);\n }\n }, []);\n\n /**\n * Establish the boundaries for the current drag operation. When dragging along\n * a single axis (eg list items within a list, tabs within a tabstrip), constrain\n * valid drag positions to the confines of the container. A sharp drag away from\n * the primary drag axis is interpreted as a request to drag an item out of the\n * container. This will be allowed if configured appropriately.\n */\n const setDragBoundaries = useCallback(\n (containerRect: DOMRect, draggableRect: DOMRect) => {\n const { current: container } = containerRef;\n if (container) {\n const [lastElement, lastItemIsOverflowIndicator] = getLastElement(\n container,\n itemQuery\n );\n const { CONTRA, CONTRA_END, DIMENSION, END, START } =\n dimensions(orientation);\n\n const draggableSize = draggableRect[DIMENSION];\n const { [START]: lastItemStart, [END]: lastItemEnd } =\n lastElement.getBoundingClientRect();\n\n dragBoundaries.current.start = containerRect[START];\n dragBoundaries.current.end = lastItemIsOverflowIndicator\n ? Math.max(lastItemStart, containerRect.right - draggableSize)\n : isScrollableRef.current\n ? containerRect[START] + containerRect[DIMENSION] - draggableSize\n : lastItemEnd - draggableSize;\n dragBoundaries.current.contraStart = containerRect[CONTRA];\n dragBoundaries.current.contraEnd = containerRect[CONTRA_END];\n }\n },\n [containerRef, itemQuery, orientation]\n );\n\n const terminateDrag = useCallback(() => {\n const { current: settlingItem } = settlingItemRef;\n settlingItemRef.current = null;\n\n const { current: toIndex } = dropIndexRef;\n const droppedItem = containerRef.current?.querySelector(\n `${itemQuery}[data-index=\"${toIndex}\"]`\n );\n if (droppedItem) {\n droppedItem.classList.remove(\"vuuDropTarget-settling\");\n }\n dropIndexRef.current = -1;\n onDropSettle?.(toIndex);\n setDraggableStatus((status) => ({\n ...status,\n draggable: undefined\n }));\n\n if (settlingItem) {\n dispatchCustomEvent(settlingItem, \"vuu-dropped\");\n }\n }, [containerRef, itemQuery, onDropSettle]);\n\n const getScrollDirection = useCallback(\n (mousePos: number) => {\n if (scrollableContainerRef.current && dragDropStateRef.current) {\n const { mouseOffset } = dragDropStateRef.current;\n\n const { POS, SCROLL_POS, SCROLL_SIZE, CLIENT_SIZE } =\n dimensions(orientation);\n const {\n [SCROLL_POS]: scrollPos,\n [SCROLL_SIZE]: scrollSize,\n [CLIENT_SIZE]: clientSize\n } = scrollableContainerRef.current;\n\n const maxScroll = scrollSize - clientSize;\n const canScrollFwd = scrollPos < maxScroll;\n const viewportEnd = dragBoundaries.current.end;\n const bwd =\n scrollPos > 0 &&\n mousePos - mouseOffset[POS] <= dragBoundaries.current.start;\n const fwd = canScrollFwd && mousePos - mouseOffset[POS] >= viewportEnd;\n\n return bwd ? \"bwd\" : fwd ? \"fwd\" : \"\";\n }\n },\n [scrollableContainerRef, orientation]\n );\n\n const useDragDropHook: InternalHook =\n allowDragDrop === true || allowDragDrop === \"natural-movement\"\n ? useDragDropNaturalMovement\n : allowDragDrop === \"drop-indicator\"\n ? useDragDropIndicator\n : allowDragDrop === \"drag-copy\"\n ? useDragDropCopy\n : noDragDrop;\n\n const onScrollingStopped = useCallback(\n (scrollDirection: \"fwd\" | \"bwd\", scrollPos: number, atEnd: boolean) => {\n handleScrollStopRef.current?.(scrollDirection, scrollPos, atEnd);\n },\n []\n );\n\n const { isScrolling, startScrolling, stopScrolling } = useAutoScroll({\n containerRef: scrollableContainerRef,\n onScrollingStopped,\n orientation\n });\n\n const handleDrop = useCallback<DropHandler>(\n (options) => {\n //TODO why do we need both this and dropIndexRef ?\n dropPosRef.current = options.toIndex;\n if (options.isExternal) {\n onDrop?.({\n ...options,\n payload: dragDropStateRef.current?.payload\n });\n } else {\n onDrop?.(options);\n }\n dropIndexRef.current = options.toIndex;\n if (id) {\n onEndOfDragOperation?.(id);\n }\n dragDropStateRef.current = null;\n },\n [id, onDrop, onEndOfDragOperation]\n );\n\n const {\n beginDrag,\n drag,\n drop,\n handleScrollStart,\n handleScrollStop,\n releaseDrag,\n ...dragResult\n } = useDragDropHook({\n ...dragDropProps,\n containerRef,\n isDragSource,\n isDropTarget,\n itemQuery,\n orientation\n });\n // To avoid circular ref between hooks\n handleScrollStopRef.current = handleScrollStop;\n\n const dragHandedOvertoProvider = useCallback(\n (dragDistance: number, clientContraPos: number) => {\n const { CONTRA_POS } = dimensions(orientation);\n const lastClientContraPos = mousePosRef.current[CONTRA_POS];\n\n const dragOutDistance = isDragSource\n ? Math.abs(lastClientContraPos - clientContraPos)\n : 0;\n\n if (allowDragDrop === true && !isDragSource && !isDropTarget) {\n //This is a simple internal drag\n return false;\n }\n\n // If isDropTarget is false, there are configured dropTargets in context\n // but this is not one, so drag will be handed straight over to DragProvider\n // (global drag). If isDropTarget is undefined, we have no DragProvider\n // so we are dealing with a simple local drag drop operation.\n const handoverToProvider =\n isDropTarget === false || dragOutDistance - dragDistance > 5;\n\n if (dragDropStateRef.current && handoverToProvider) {\n if (onDragOut?.(id as string, dragDropStateRef.current)) {\n // TODO create a cleanup function\n removeDragHandlers();\n releaseDrag?.();\n dragDropStateRef.current = null;\n }\n // remove the drag boundaries\n dragBoundaries.current = UNBOUNDED;\n return true;\n }\n },\n [\n allowDragDrop,\n id,\n isDragSource,\n isDropTarget,\n onDragOut,\n orientation,\n releaseDrag,\n removeDragHandlers\n ]\n );\n\n const dragMouseMoveHandler = useCallback(\n (evt: MouseEvent) => {\n const { CLIENT_POS, CONTRA_CLIENT_POS, POS } = dimensions(orientation);\n const { clientX, clientY } = evt;\n const { [CLIENT_POS]: clientPos, [CONTRA_CLIENT_POS]: clientContraPos } =\n evt;\n const lastClientPos = mousePosRef.current[POS];\n const dragDistance = Math.abs(lastClientPos - clientPos);\n const { current: dragDropState } = dragDropStateRef;\n const { current: boundary } = dragBoundaries;\n\n if (dragHandedOvertoProvider(dragDistance, clientContraPos)) {\n return;\n }\n\n mousePosRef.current.x = clientX;\n mousePosRef.current.y = clientY;\n\n if (dragDropState) {\n const { draggableElement, mouseOffset } = dragDropState;\n\n if (dragBoundaries.current === UNBOUNDED && draggableElement) {\n const dragPosX = mousePosRef.current.x - mouseOffset.x;\n const dragPosY = mousePosRef.current.y - mouseOffset.y;\n draggableElement.style.top = `${dragPosY}px`;\n draggableElement.style.left = `${dragPosX}px`;\n } else if (dragDistance > 0 && draggableElement) {\n const mouseMoveDirection = lastClientPos < clientPos ? \"fwd\" : \"bwd\";\n const scrollDirection = getScrollDirection(clientPos);\n const dragPos = mousePosRef.current[POS] - mouseOffset[POS];\n const START = orientation === \"horizontal\" ? \"left\" : \"top\";\n\n if (\n scrollDirection &&\n isScrollableRef.current &&\n !isScrolling.current\n ) {\n handleScrollStart?.(scrollDirection);\n startScrolling(scrollDirection, 1);\n\n if (scrollDirection === \"fwd\") {\n draggableElement.style[START] = `${boundary.end}px`;\n } else {\n draggableElement.style[START] = `${boundary.start}px`;\n }\n } else if (!scrollDirection && isScrolling.current) {\n stopScrolling();\n }\n\n if (!isScrolling.current) {\n const renderDragPos = Math.round(\n Math.max(boundary.start, Math.min(boundary.end, dragPos))\n );\n draggableElement.style[START] = `${renderDragPos}px`;\n drag(renderDragPos, mouseMoveDirection);\n }\n }\n }\n },\n [\n drag,\n dragHandedOvertoProvider,\n getScrollDirection,\n handleScrollStart,\n isScrolling,\n orientation,\n startScrolling,\n stopScrolling\n ]\n );\n const dragMouseUpHandler = useCallback(() => {\n removeDragHandlers();\n if (dragDropStateRef.current) {\n settlingItemRef.current = dragDropStateRef.current.draggableElement;\n }\n const dropOptions = drop();\n handleDrop(dropOptions);\n\n setDraggableStatus((status) => ({\n ...status,\n draggedItemIndex: -1,\n isDragging: false\n }));\n // TODO clear the dragDropState\n }, [drop, handleDrop, removeDragHandlers]);\n\n dragMouseMoveHandlerRef.current = dragMouseMoveHandler;\n dragMouseUpHandlerRef.current = dragMouseUpHandler;\n\n const resumeDrag = useCallback<ResumeDragHandler>(\n (dragDropState: DragDropState) => {\n dragDropStateRef.current = dragDropState;\n // Note this is using the draggable element rather than the original draggedElement\n const { draggableElement, mouseOffset } = dragDropState;\n const { current: container } = containerRef;\n\n if (container && draggableElement) {\n const containerRect = container.getBoundingClientRect();\n const draggableRect = draggableElement.getBoundingClientRect();\n setDragBoundaries(containerRect, draggableRect);\n\n mousePosRef.current.x = draggableRect.left + mouseOffset.x;\n mousePosRef.current.y = draggableRect.top + mouseOffset.y;\n\n // why doesn't this work if we use the initialDragEement\n beginDrag(draggableElement);\n\n attachDragHandlers();\n\n return true;\n } else {\n return false;\n }\n },\n [attachDragHandlers, beginDrag, containerRef, setDragBoundaries]\n );\n\n const dragStart = useCallback(\n (mousePosition: MousePosition) => {\n const { current: container } = containerRef;\n const { current: target } = mousedownElementRef;\n const dragElement = getDraggableElement(target, itemQuery);\n const scrollableContainer =\n scrollingContainerRef?.current ??\n getScrollableContainer(container, itemQuery);\n if (container && scrollableContainer && dragElement) {\n isScrollableRef.current = isContainerScrollable(\n scrollableContainer,\n orientation\n );\n scrollableContainerRef.current = scrollableContainer;\n\n const containerRect = scrollableContainer.getBoundingClientRect();\n const draggableRect = dragElement.getBoundingClientRect();\n\n const dragDropState = (dragDropStateRef.current = new DragDropState(\n mousePosition,\n dragElement\n ));\n\n setDragBoundaries(containerRect, draggableRect);\n\n beginDrag(dragElement);\n\n const {\n dataset: { index = \"-1\" }\n } = dragElement;\n\n setDraggableStatus({\n isDragging: true,\n draggable: (\n <Draggable\n element={cloneElement(dragElement)}\n onDropped={terminateDrag}\n onTransitionEnd={terminateDrag}\n ref={dragDropState.setDraggable}\n style={constrainRect(draggableRect, containerRect)}\n wrapperClassName={draggableClassName}\n />\n ),\n draggedItemIndex: parseInt(index)\n });\n\n onDragStart?.(dragDropState);\n attachDragHandlers();\n\n mousedownElementRef.current = null;\n }\n },\n [\n attachDragHandlers,\n beginDrag,\n containerRef,\n draggableClassName,\n itemQuery,\n onDragStart,\n orientation,\n scrollingContainerRef,\n setDragBoundaries,\n terminateDrag\n ]\n );\n\n const preDragMouseMoveHandler = useCallback(\n (evt: MouseEvent) => {\n const { current: mouseDownPosition } = startPosRef;\n const { CLIENT_POS, POS } = dimensions(orientation);\n const { [CLIENT_POS]: clientPos } = evt;\n const mouseMoveDistance = Math.abs(clientPos - mouseDownPosition[POS]);\n if (mouseMoveDistance > dragThreshold && containerRef.current) {\n if (mouseDownTimer.current) {\n window.clearTimeout(mouseDownTimer.current);\n mouseDownTimer.current = null;\n }\n document.removeEventListener(\"mousemove\", preDragMouseMoveHandler);\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n\n const mousePosition = {\n clientX: mouseDownPosition.x,\n clientY: mouseDownPosition.y\n };\n dragStart(mousePosition);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [containerRef, beginDrag, orientation]\n );\n\n const preDragMouseUpHandler = useCallback(() => {\n if (mouseDownTimer.current) {\n window.clearTimeout(mouseDownTimer.current);\n mouseDownTimer.current = null;\n }\n document.removeEventListener(\"mousemove\", preDragMouseMoveHandler, false);\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n }, [preDragMouseMoveHandler]);\n\n const mouseDownHandler: MouseEventHandler = useCallback(\n (evt) => {\n if (evt.button !== 0) {\n return;\n }\n // TODO runtime check here for valid drop targets ?\n const { current: container } = containerRef;\n // We don't want to prevent other handlers on this element from working\n // but we do want to stop a drag drop being initiated on a bubbled event.\n evt.stopPropagation();\n if (container && !evt.defaultPrevented) {\n const { clientX, clientY } = evt;\n mousePosRef.current.x = startPosRef.current.x = clientX;\n mousePosRef.current.y = startPosRef.current.y = clientY;\n mousedownElementRef.current = evt.target as HTMLElement;\n\n const mousePosition = {\n clientX,\n clientY\n };\n\n document.addEventListener(\"mousemove\", preDragMouseMoveHandler, false);\n document.addEventListener(\"mouseup\", preDragMouseUpHandler, false);\n\n evt.persist();\n\n mouseDownTimer.current = window.setTimeout(() => {\n document.removeEventListener(\n \"mousemove\",\n preDragMouseMoveHandler,\n false\n );\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n dragStart(mousePosition);\n }, 500);\n }\n },\n [containerRef, dragStart, preDragMouseMoveHandler, preDragMouseUpHandler]\n );\n\n const { current: settlingItem } = settlingItemRef;\n useLayoutEffect(() => {\n if (settlingItem && containerRef.current) {\n const dropPos = dropPosRef.current;\n const droppedItem = containerRef.current.querySelector(\n `${itemQuery}[data-index=\"${dropPos}\"]`\n );\n\n if (droppedItem) {\n droppedItem.classList.add(\"vuuDropTarget-settling\");\n requestAnimationFrame(() => {\n const { top: targetTop, left: targetLeft } =\n droppedItem.getBoundingClientRect();\n // If the droppedItem is already exactly in the drop position, we can just\n // terminate the drag here and now. Most likely, though, it is out by a few\n // pixels. We animate the dragged item into the final resting place before\n // terminating the drag.\n const style = getComputedStyle(settlingItem);\n const currentLeft = parseInt(style.getPropertyValue(\"left\"));\n const currentTop = parseInt(style.getPropertyValue(\"top\"));\n if (currentLeft !== targetLeft || currentTop !== targetTop) {\n settlingItem.classList.add(\"vuuDraggable-settling\");\n settlingItem.style.top = `${targetTop}px`;\n settlingItem.style.left = `${targetLeft}px`;\n } else {\n terminateDrag();\n }\n });\n } else {\n // didn't find the dragged item. This is currently happening\n // because of a quirk with last item when scrolling has taken\n // place. Take no chances, make sure we don't keep an orphaned draggable\n setDraggableStatus((status) => ({\n ...status,\n draggable: undefined\n }));\n }\n }\n }, [containerRef, itemQuery, settlingItem, terminateDrag]);\n\n useEffect(() => {\n if (id && (isDragSource || isDropTarget)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore TODO drah drop WIP\n register(id, allowDragDrop === \"drop-only\" ? false : resumeDrag, onDrop);\n }\n }, [\n allowDragDrop,\n id,\n isDragSource,\n isDropTarget,\n onDrop,\n register,\n resumeDrag\n ]);\n\n return {\n ...dragResult,\n ...draggableStatus,\n isScrolling,\n onMouseDown:\n allowDragDrop && allowDragDrop !== \"drop-only\"\n ? mouseDownHandler\n : undefined\n };\n};\n"],"names":["NULL_DROP_OPTIONS","NOT_OVERFLOWED","isOverflowElement","useRef","useState","useDragDropProvider","useCallback","dimensions","settlingItem","dispatchCustomEvent","useDragDropNaturalMovement","useDragDropIndicator","useDragDropCopy","useAutoScroll","getScrollableContainer","isContainerScrollable","DragDropState","jsx","Draggable","cloneElement","constrainRect","useLayoutEffect","useEffect"],"mappings":"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"}
1
+ {"version":3,"file":"useDragDrop.js","sources":["../../src/drag-drop/useDragDrop.tsx"],"sourcesContent":["import { dispatchCustomEvent } from \"@vuu-ui/vuu-utils\";\nimport {\n MouseEventHandler,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useDragDropProvider } from \"./DragDropProvider\";\nimport { DragDropState } from \"./DragDropState\";\nimport {\n DragDropHook,\n DropHandler,\n InternalDragDropProps,\n InternalDragHookResult,\n MouseOffset,\n MousePosition,\n} from \"./dragDropTypes\";\nimport { Draggable } from \"./Draggable\";\nimport {\n cloneElement,\n constrainRect,\n dimensions,\n getScrollableContainer,\n isContainerScrollable,\n NOT_OVERFLOWED,\n} from \"./drop-target-utils\";\nimport { ScrollStopHandler, useAutoScroll } from \"./useAutoScroll\";\nimport { useDragDropCopy, NULL_DROP_OPTIONS } from \"./useDragDropCopy\";\nimport { useDragDropIndicator } from \"./useDragDropIndicator\";\nimport { useDragDropNaturalMovement } from \"./useDragDropNaturalMovement\";\nimport { ResumeDragHandler } from \"./useGlobalDragDrop\";\nimport { isOverflowElement } from \"../utils\";\n\nconst NULL_DRAG_DROP_RESULT = {\n beginDrag: () => undefined,\n drag: () => undefined,\n draggableRef: { current: null },\n drop: () => NULL_DROP_OPTIONS,\n isDragging: false,\n isScrolling: false,\n handleScrollStart: () => undefined,\n handleScrollStop: () => undefined,\n revealOverflowedItems: false,\n};\n\ntype DraggableStatus = {\n draggable?: JSX.Element;\n draggedItemIndex: number;\n isDragging: boolean;\n};\n\ntype DragBoundary = {\n start: number;\n end: number;\n contraStart: number;\n contraEnd: number;\n};\n\nconst UNBOUNDED: DragBoundary = {\n start: 0,\n end: 1000,\n contraStart: 0,\n contraEnd: 1000,\n};\n\ntype InternalHook = (props: InternalDragDropProps) => InternalDragHookResult;\nconst noDragDrop: InternalHook = () => NULL_DRAG_DROP_RESULT;\nconst dragThreshold = 3;\n\nconst getDraggableElement = (\n el: EventTarget | null,\n query: string,\n): HTMLElement => (el as HTMLElement)?.closest(query) as HTMLElement;\n\nconst getLastElement = (\n container: HTMLElement,\n itemQuery: string,\n): [HTMLElement, boolean] => {\n const fullItemQuery = `:is(${itemQuery}${NOT_OVERFLOWED},.vuuOverflowContainer-OverflowIndicator)`;\n const childElements = Array.from(container.querySelectorAll(fullItemQuery));\n const lastElement = childElements.pop() as HTMLElement;\n return [lastElement, isOverflowElement(lastElement)];\n};\n\nexport const useDragDrop: DragDropHook = ({\n allowDragDrop,\n containerRef,\n draggableClassName,\n getDragPayload,\n id,\n itemQuery = \"*\",\n onDragStart,\n onDrop,\n onDropSettle,\n orientation,\n scrollingContainerRef,\n ...dragDropProps\n}) => {\n const dragBoundaries = useRef<DragBoundary>({\n start: 0,\n end: 0,\n contraStart: 0,\n contraEnd: 0,\n });\n const [draggableStatus, setDraggableStatus] = useState<DraggableStatus>({\n draggable: undefined,\n draggedItemIndex: -1,\n isDragging: false,\n });\n\n const dragDropStateRef = useRef<DragDropState | null>(null);\n const mouseDownTimer = useRef<number | null>(null);\n /** do we actually have scrollable content */\n const isScrollableRef = useRef(false);\n\n /** save this on mousedown. We cannot rely on the target of mousemove being same element*/\n const mousedownElementRef = useRef<HTMLElement | null>(null);\n\n /** current mouse position */\n const mousePosRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** mouse position when mousedown initiated drag */\n const startPosRef = useRef<MouseOffset>({ x: 0, y: 0 });\n /** references the dragged Item during its final 'settling' phase post drop */\n const settlingItemRef = useRef<HTMLElement | null>(null);\n /** the container which will scroll if content overflows */\n const scrollableContainerRef = useRef<HTMLElement | null>(null);\n const dropPosRef = useRef(-1);\n const dropIndexRef = useRef(-1);\n\n const handleScrollStopRef = useRef<ScrollStopHandler>();\n\n const {\n isDragSource,\n isDropTarget,\n onDragOut,\n onEndOfDragOperation,\n register,\n } = useDragDropProvider(id);\n\n type NativeMouseHandler = (evt: MouseEvent) => void;\n /** refs for drag handlers to avoid circular dependency issues */\n const dragMouseMoveHandlerRef = useRef<NativeMouseHandler>();\n const dragMouseUpHandlerRef = useRef<NativeMouseHandler>();\n\n const attachDragHandlers = useCallback(() => {\n const { current: dragMove } = dragMouseMoveHandlerRef;\n const { current: dragUp } = dragMouseUpHandlerRef;\n if (dragMove && dragUp) {\n // prettier-ignore\n document.addEventListener(\"mousemove\", dragMove, false);\n document.addEventListener(\"mouseup\", dragUp, false);\n }\n }, []);\n const removeDragHandlers = useCallback(() => {\n const { current: dragMove } = dragMouseMoveHandlerRef;\n const { current: dragUp } = dragMouseUpHandlerRef;\n if (dragMove && dragUp) {\n // prettier-ignore\n document.removeEventListener(\"mousemove\", dragMove, false);\n document.removeEventListener(\"mouseup\", dragUp, false);\n }\n }, []);\n\n /**\n * Establish the boundaries for the current drag operation. When dragging along\n * a single axis (eg list items within a list, tabs within a tabstrip), constrain\n * valid drag positions to the confines of the container. A sharp drag away from\n * the primary drag axis is interpreted as a request to drag an item out of the\n * container. This will be allowed if configured appropriately.\n */\n const setDragBoundaries = useCallback(\n (containerRect: DOMRect, draggableRect: DOMRect) => {\n const { current: container } = containerRef;\n if (container) {\n const [lastElement, lastItemIsOverflowIndicator] = getLastElement(\n container,\n itemQuery,\n );\n const { CONTRA, CONTRA_END, DIMENSION, END, START } =\n dimensions(orientation);\n\n const draggableSize = draggableRect[DIMENSION];\n const { [START]: lastItemStart, [END]: lastItemEnd } =\n lastElement.getBoundingClientRect();\n\n dragBoundaries.current.start = containerRect[START];\n dragBoundaries.current.end = lastItemIsOverflowIndicator\n ? Math.max(lastItemStart, containerRect.right - draggableSize)\n : isScrollableRef.current\n ? containerRect[START] + containerRect[DIMENSION] - draggableSize\n : lastItemEnd - draggableSize;\n dragBoundaries.current.contraStart = containerRect[CONTRA];\n dragBoundaries.current.contraEnd = containerRect[CONTRA_END];\n }\n },\n [containerRef, itemQuery, orientation],\n );\n\n const terminateDrag = useCallback(() => {\n const { current: settlingItem } = settlingItemRef;\n settlingItemRef.current = null;\n\n const { current: toIndex } = dropIndexRef;\n const droppedItem = containerRef.current?.querySelector(\n `${itemQuery}[data-index=\"${toIndex}\"]`,\n );\n if (droppedItem) {\n droppedItem.classList.remove(\"vuuDropTarget-settling\");\n }\n dropIndexRef.current = -1;\n onDropSettle?.(toIndex);\n setDraggableStatus((status) => ({\n ...status,\n draggable: undefined,\n }));\n\n if (settlingItem) {\n dispatchCustomEvent(settlingItem, \"vuu-dropped\");\n }\n }, [containerRef, itemQuery, onDropSettle]);\n\n const getScrollDirection = useCallback(\n (mousePos: number) => {\n if (scrollableContainerRef.current && dragDropStateRef.current) {\n const { mouseOffset } = dragDropStateRef.current;\n\n const { POS, SCROLL_POS, SCROLL_SIZE, CLIENT_SIZE } =\n dimensions(orientation);\n const {\n [SCROLL_POS]: scrollPos,\n [SCROLL_SIZE]: scrollSize,\n [CLIENT_SIZE]: clientSize,\n } = scrollableContainerRef.current;\n\n const maxScroll = scrollSize - clientSize;\n const canScrollFwd = scrollPos < maxScroll;\n const viewportEnd = dragBoundaries.current.end;\n const bwd =\n scrollPos > 0 &&\n mousePos - mouseOffset[POS] <= dragBoundaries.current.start;\n const fwd = canScrollFwd && mousePos - mouseOffset[POS] >= viewportEnd;\n\n return bwd ? \"bwd\" : fwd ? \"fwd\" : \"\";\n }\n },\n [scrollableContainerRef, orientation],\n );\n\n const useDragDropHook: InternalHook =\n allowDragDrop === true || allowDragDrop === \"natural-movement\"\n ? useDragDropNaturalMovement\n : allowDragDrop === \"drop-indicator\"\n ? useDragDropIndicator\n : allowDragDrop === \"drag-copy\"\n ? useDragDropCopy\n : noDragDrop;\n\n const onScrollingStopped = useCallback(\n (scrollDirection: \"fwd\" | \"bwd\", scrollPos: number, atEnd: boolean) => {\n handleScrollStopRef.current?.(scrollDirection, scrollPos, atEnd);\n },\n [],\n );\n\n const { isScrolling, startScrolling, stopScrolling } = useAutoScroll({\n containerRef: scrollableContainerRef,\n onScrollingStopped,\n orientation,\n });\n\n const handleDrop = useCallback<DropHandler>(\n (options) => {\n //TODO why do we need both this and dropIndexRef ?\n dropPosRef.current = options.toIndex;\n if (options.isExternal) {\n onDrop?.({\n ...options,\n payload: dragDropStateRef.current?.payload,\n });\n } else {\n onDrop?.(options);\n }\n dropIndexRef.current = options.toIndex;\n if (id) {\n onEndOfDragOperation?.(id);\n }\n dragDropStateRef.current = null;\n },\n [id, onDrop, onEndOfDragOperation],\n );\n\n const {\n beginDrag,\n drag,\n drop,\n handleScrollStart,\n handleScrollStop,\n releaseDrag,\n ...dragResult\n } = useDragDropHook({\n ...dragDropProps,\n containerRef,\n isDragSource,\n isDropTarget,\n itemQuery,\n orientation,\n });\n // To avoid circular ref between hooks\n handleScrollStopRef.current = handleScrollStop;\n\n const dragHandedOvertoProvider = useCallback(\n (dragDistance: number, clientContraPos: number) => {\n const { CONTRA_POS } = dimensions(orientation);\n const lastClientContraPos = mousePosRef.current[CONTRA_POS];\n\n const dragOutDistance = isDragSource\n ? Math.abs(lastClientContraPos - clientContraPos)\n : 0;\n\n if (allowDragDrop === true && !isDragSource && !isDropTarget) {\n //This is a simple internal drag\n return false;\n }\n\n // If isDropTarget is false, there are configured dropTargets in context\n // but this is not one, so drag will be handed straight over to DragProvider\n // (global drag). If isDropTarget is undefined, we have no DragProvider\n // so we are dealing with a simple local drag drop operation.\n const handoverToProvider =\n isDropTarget === false || dragOutDistance - dragDistance > 5;\n\n if (dragDropStateRef.current && handoverToProvider) {\n if (onDragOut?.(id as string, dragDropStateRef.current)) {\n // TODO create a cleanup function\n removeDragHandlers();\n releaseDrag?.();\n dragDropStateRef.current = null;\n }\n // remove the drag boundaries\n dragBoundaries.current = UNBOUNDED;\n return true;\n }\n },\n [\n allowDragDrop,\n id,\n isDragSource,\n isDropTarget,\n onDragOut,\n orientation,\n releaseDrag,\n removeDragHandlers,\n ],\n );\n\n const dragMouseMoveHandler = useCallback(\n (evt: MouseEvent) => {\n const { CLIENT_POS, CONTRA_CLIENT_POS, POS } = dimensions(orientation);\n const { clientX, clientY } = evt;\n const { [CLIENT_POS]: clientPos, [CONTRA_CLIENT_POS]: clientContraPos } =\n evt;\n const lastClientPos = mousePosRef.current[POS];\n const dragDistance = Math.abs(lastClientPos - clientPos);\n const { current: dragDropState } = dragDropStateRef;\n const { current: boundary } = dragBoundaries;\n\n if (dragHandedOvertoProvider(dragDistance, clientContraPos)) {\n return;\n }\n\n mousePosRef.current.x = clientX;\n mousePosRef.current.y = clientY;\n\n if (dragDropState) {\n const { draggableElement, mouseOffset } = dragDropState;\n\n if (dragBoundaries.current === UNBOUNDED && draggableElement) {\n const dragPosX = mousePosRef.current.x - mouseOffset.x;\n const dragPosY = mousePosRef.current.y - mouseOffset.y;\n draggableElement.style.top = `${dragPosY}px`;\n draggableElement.style.left = `${dragPosX}px`;\n } else if (dragDistance > 0 && draggableElement) {\n const mouseMoveDirection = lastClientPos < clientPos ? \"fwd\" : \"bwd\";\n const scrollDirection = getScrollDirection(clientPos);\n const dragPos = mousePosRef.current[POS] - mouseOffset[POS];\n const START = orientation === \"horizontal\" ? \"left\" : \"top\";\n\n if (\n scrollDirection &&\n isScrollableRef.current &&\n !isScrolling.current\n ) {\n handleScrollStart?.(scrollDirection);\n startScrolling(scrollDirection, 1);\n\n if (scrollDirection === \"fwd\") {\n draggableElement.style[START] = `${boundary.end}px`;\n } else {\n draggableElement.style[START] = `${boundary.start}px`;\n }\n } else if (!scrollDirection && isScrolling.current) {\n stopScrolling();\n }\n\n if (!isScrolling.current) {\n const renderDragPos = Math.round(\n Math.max(boundary.start, Math.min(boundary.end, dragPos)),\n );\n draggableElement.style[START] = `${renderDragPos}px`;\n drag(renderDragPos, mouseMoveDirection);\n }\n }\n }\n },\n [\n drag,\n dragHandedOvertoProvider,\n getScrollDirection,\n handleScrollStart,\n isScrolling,\n orientation,\n startScrolling,\n stopScrolling,\n ],\n );\n const dragMouseUpHandler = useCallback(() => {\n removeDragHandlers();\n if (dragDropStateRef.current) {\n settlingItemRef.current = dragDropStateRef.current.draggableElement;\n }\n const dropOptions = drop();\n handleDrop(dropOptions);\n\n setDraggableStatus((status) => ({\n ...status,\n draggedItemIndex: -1,\n isDragging: false,\n }));\n // TODO clear the dragDropState\n }, [drop, handleDrop, removeDragHandlers]);\n\n dragMouseMoveHandlerRef.current = dragMouseMoveHandler;\n dragMouseUpHandlerRef.current = dragMouseUpHandler;\n\n const resumeDrag = useCallback<ResumeDragHandler>(\n (dragDropState: DragDropState) => {\n dragDropStateRef.current = dragDropState;\n // Note this is using the draggable element rather than the original draggedElement\n const { draggableElement, mouseOffset } = dragDropState;\n const { current: container } = containerRef;\n\n if (container && draggableElement) {\n const containerRect = container.getBoundingClientRect();\n const draggableRect = draggableElement.getBoundingClientRect();\n setDragBoundaries(containerRect, draggableRect);\n\n mousePosRef.current.x = draggableRect.left + mouseOffset.x;\n mousePosRef.current.y = draggableRect.top + mouseOffset.y;\n\n // why doesn't this work if we use the initialDragEement\n beginDrag(draggableElement);\n\n attachDragHandlers();\n\n return true;\n } else {\n return false;\n }\n },\n [attachDragHandlers, beginDrag, containerRef, setDragBoundaries],\n );\n\n const dragStart = useCallback(\n (mousePosition: MousePosition) => {\n const { current: container } = containerRef;\n const { current: target } = mousedownElementRef;\n const dragElement = getDraggableElement(target, itemQuery);\n const scrollableContainer =\n scrollingContainerRef?.current ??\n getScrollableContainer(container, itemQuery);\n if (container && scrollableContainer && dragElement) {\n isScrollableRef.current = isContainerScrollable(\n scrollableContainer,\n orientation,\n );\n scrollableContainerRef.current = scrollableContainer;\n\n const containerRect = scrollableContainer.getBoundingClientRect();\n const draggableRect = dragElement.getBoundingClientRect();\n\n const dragDropState = (dragDropStateRef.current = new DragDropState(\n mousePosition,\n dragElement,\n ));\n\n setDragBoundaries(containerRect, draggableRect);\n\n beginDrag(dragElement);\n\n const {\n dataset: { index = \"-1\" },\n } = dragElement;\n\n setDraggableStatus({\n isDragging: true,\n draggable: (\n <Draggable\n element={cloneElement(dragElement)}\n onDropped={terminateDrag}\n onTransitionEnd={terminateDrag}\n ref={dragDropState.setDraggable}\n style={constrainRect(draggableRect, containerRect)}\n wrapperClassName={draggableClassName}\n />\n ),\n draggedItemIndex: parseInt(index),\n });\n\n onDragStart?.(dragDropState);\n attachDragHandlers();\n\n mousedownElementRef.current = null;\n }\n },\n [\n attachDragHandlers,\n beginDrag,\n containerRef,\n draggableClassName,\n itemQuery,\n onDragStart,\n orientation,\n scrollingContainerRef,\n setDragBoundaries,\n terminateDrag,\n ],\n );\n\n const preDragMouseMoveHandler = useCallback(\n (evt: MouseEvent) => {\n const { current: mouseDownPosition } = startPosRef;\n const { CLIENT_POS, POS } = dimensions(orientation);\n const { [CLIENT_POS]: clientPos } = evt;\n const mouseMoveDistance = Math.abs(clientPos - mouseDownPosition[POS]);\n if (mouseMoveDistance > dragThreshold && containerRef.current) {\n if (mouseDownTimer.current) {\n window.clearTimeout(mouseDownTimer.current);\n mouseDownTimer.current = null;\n }\n document.removeEventListener(\"mousemove\", preDragMouseMoveHandler);\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n\n const mousePosition = {\n clientX: mouseDownPosition.x,\n clientY: mouseDownPosition.y,\n };\n dragStart(mousePosition);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [containerRef, beginDrag, orientation],\n );\n\n const preDragMouseUpHandler = useCallback(() => {\n if (mouseDownTimer.current) {\n window.clearTimeout(mouseDownTimer.current);\n mouseDownTimer.current = null;\n }\n document.removeEventListener(\"mousemove\", preDragMouseMoveHandler, false);\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n }, [preDragMouseMoveHandler]);\n\n const mouseDownHandler: MouseEventHandler = useCallback(\n (evt) => {\n if (evt.button !== 0) {\n return;\n }\n // TODO runtime check here for valid drop targets ?\n const { current: container } = containerRef;\n // We don't want to prevent other handlers on this element from working\n // but we do want to stop a drag drop being initiated on a bubbled event.\n evt.stopPropagation();\n if (container && !evt.defaultPrevented) {\n const { clientX, clientY } = evt;\n mousePosRef.current.x = startPosRef.current.x = clientX;\n mousePosRef.current.y = startPosRef.current.y = clientY;\n mousedownElementRef.current = evt.target as HTMLElement;\n\n const mousePosition = {\n clientX,\n clientY,\n };\n\n document.addEventListener(\"mousemove\", preDragMouseMoveHandler, false);\n document.addEventListener(\"mouseup\", preDragMouseUpHandler, false);\n\n evt.persist();\n\n mouseDownTimer.current = window.setTimeout(() => {\n document.removeEventListener(\n \"mousemove\",\n preDragMouseMoveHandler,\n false,\n );\n document.removeEventListener(\"mouseup\", preDragMouseUpHandler, false);\n dragStart(mousePosition);\n }, 500);\n }\n },\n [containerRef, dragStart, preDragMouseMoveHandler, preDragMouseUpHandler],\n );\n\n const { current: settlingItem } = settlingItemRef;\n useLayoutEffect(() => {\n if (settlingItem && containerRef.current) {\n const dropPos = dropPosRef.current;\n const droppedItem = containerRef.current.querySelector(\n `${itemQuery}[data-index=\"${dropPos}\"]`,\n );\n\n if (droppedItem) {\n droppedItem.classList.add(\"vuuDropTarget-settling\");\n requestAnimationFrame(() => {\n const { top: targetTop, left: targetLeft } =\n droppedItem.getBoundingClientRect();\n // If the droppedItem is already exactly in the drop position, we can just\n // terminate the drag here and now. Most likely, though, it is out by a few\n // pixels. We animate the dragged item into the final resting place before\n // terminating the drag.\n const style = getComputedStyle(settlingItem);\n const currentLeft = parseInt(style.getPropertyValue(\"left\"));\n const currentTop = parseInt(style.getPropertyValue(\"top\"));\n if (currentLeft !== targetLeft || currentTop !== targetTop) {\n settlingItem.classList.add(\"vuuDraggable-settling\");\n settlingItem.style.top = `${targetTop}px`;\n settlingItem.style.left = `${targetLeft}px`;\n } else {\n terminateDrag();\n }\n });\n } else {\n // didn't find the dragged item. This is currently happening\n // because of a quirk with last item when scrolling has taken\n // place. Take no chances, make sure we don't keep an orphaned draggable\n setDraggableStatus((status) => ({\n ...status,\n draggable: undefined,\n }));\n }\n }\n }, [containerRef, itemQuery, settlingItem, terminateDrag]);\n\n useEffect(() => {\n if (id && (isDragSource || isDropTarget)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore TODO drah drop WIP\n register(id, allowDragDrop === \"drop-only\" ? false : resumeDrag, onDrop);\n }\n }, [\n allowDragDrop,\n id,\n isDragSource,\n isDropTarget,\n onDrop,\n register,\n resumeDrag,\n ]);\n\n return {\n ...dragResult,\n ...draggableStatus,\n isScrolling,\n onMouseDown:\n allowDragDrop && allowDragDrop !== \"drop-only\"\n ? mouseDownHandler\n : undefined,\n };\n};\n"],"names":["NULL_DROP_OPTIONS","NOT_OVERFLOWED","isOverflowElement","useRef","useState","useDragDropProvider","useCallback","dimensions","settlingItem","dispatchCustomEvent","useDragDropNaturalMovement","useDragDropIndicator","useDragDropCopy","useAutoScroll","getScrollableContainer","isContainerScrollable","DragDropState","jsx","Draggable","cloneElement","constrainRect","useLayoutEffect","useEffect"],"mappings":"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"}