react-dragdrop-kit 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +210 -253
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/kanban.esm.js +1 -1
- package/dist/kanban.esm.js.map +1 -1
- package/dist/kanban.js +1 -1
- package/dist/kanban.js.map +1 -1
- package/dist/src/components/DragDropList.d.ts +1 -1
- package/dist/src/components/DraggableItemWrapper.d.ts +1 -1
- package/dist/src/hooks/useDragDropMonitor.d.ts +7 -2
- package/dist/src/hooks/useDragDropMonitor.logic.d.ts +39 -0
- package/dist/src/kanban/types.d.ts +3 -1
- package/dist/src/kanban/utils/reorder.d.ts +6 -0
- package/dist/src/types/index.d.ts +6 -0
- package/dist/src/utils/order.d.ts +7 -0
- package/package.json +10 -11
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/styles/defaultStyles.ts","../src/components/DraggableItemWrapper.tsx","../src/hooks/useDragDropMonitor.ts","../src/utils/order.ts","../src/components/DragDropList.tsx"],"sourcesContent":["export const defaultStyles = {\r\n container: {\r\n default: {\r\n minHeight: \"200px\",\r\n transition: \"all 0.2s ease\",\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e2e8f0\",\r\n backgroundColor: \"#ffffff\",\r\n display: \"flex\",\r\n flexDirection: \"column\" as const,\r\n gap: \"16px\",\r\n padding: \"16px\",\r\n },\r\n dragging: {\r\n backgroundColor: \"rgba(66, 153, 225, 0.05)\",\r\n borderColor: \"#3182ce\",\r\n },\r\n horizontal: {\r\n flexDirection: \"row\" as const,\r\n flexWrap: \"wrap\" as const,\r\n },\r\n },\r\n item: {\r\n default: {\r\n transition: \"all 0.2s ease\",\r\n cursor: \"grab\",\r\n userSelect: \"none\" as const,\r\n position: \"relative\" as const,\r\n },\r\n dragging: {\r\n opacity: 0.5,\r\n cursor: \"grabbing\",\r\n },\r\n hover: {\r\n transform: \"scale(1.02)\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n },\r\n disabled: {\r\n cursor: \"not-allowed\",\r\n opacity: 0.6,\r\n },\r\n },\r\n preview: {\r\n position: \"fixed\" as const,\r\n pointerEvents: \"none\" as const,\r\n zIndex: 9999,\r\n opacity: 0.8,\r\n transform: \"rotate(2deg)\",\r\n boxShadow: \"0 10px 20px rgba(0, 0, 0, 0.15)\",\r\n },\r\n dropIndicator: {\r\n position: \"absolute\" as const,\r\n height: \"2px\",\r\n backgroundColor: \"#3182ce\",\r\n left: 0,\r\n right: 0,\r\n zIndex: 10,\r\n transition: \"all 0.2s ease\",\r\n },\r\n};\r\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\r\nimport {\r\n draggable,\r\n dropTargetForElements,\r\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport type { DraggableItemWrapperProps, DraggableItem } from \"../types\";\r\nimport { defaultStyles } from \"../styles/defaultStyles\";\r\n\r\nconst DRAGGABLE_ITEM = \"draggable-item\";\r\n\r\nexport function DraggableItemWrapper<T extends DraggableItem>({\r\n item,\r\n index,\r\n children,\r\n className = \"\",\r\n style = {},\r\n dragPreviewClassName = \"\",\r\n dragPreviewStyle = {},\r\n onDragStart,\r\n onDragEnd,\r\n disabled = false,\r\n showDropIndicator = false,\r\n dropIndicatorClassName = \"\",\r\n dropIndicatorStyle = {},\r\n dropIndicatorPosition = \"bottom\",\r\n}: DraggableItemWrapperProps<T>) {\r\n const elementRef = useRef<HTMLDivElement>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [isHovered, setIsHovered] = useState(false);\r\n const [dropPosition, setDropPosition] = useState<\"top\" | \"bottom\" | null>(\r\n null\r\n );\r\n\r\n const getItemStyles = (): React.CSSProperties => {\r\n const baseStyle = { ...defaultStyles.item.default };\r\n\r\n if (disabled) {\r\n Object.assign(baseStyle, defaultStyles.item.disabled);\r\n } else if (isDragging) {\r\n Object.assign(baseStyle, defaultStyles.item.dragging);\r\n } else if (isHovered) {\r\n Object.assign(baseStyle, defaultStyles.item.hover);\r\n }\r\n\r\n return { ...baseStyle, ...style };\r\n };\r\n\r\n const getPreviewStyles = (): React.CSSProperties => {\r\n return { ...defaultStyles.preview, ...dragPreviewStyle };\r\n };\r\n\r\n const createDraggable = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return draggable({\r\n element,\r\n getInitialData: () => ({\r\n type: DRAGGABLE_ITEM,\r\n id: item.id,\r\n index,\r\n }),\r\n onGenerateDragPreview: ({ nativeSetDragImage }) => {\r\n const previewElement = element.cloneNode(true) as HTMLElement;\r\n const previewStyles = getPreviewStyles();\r\n\r\n // Apply custom preview class if provided\r\n if (dragPreviewClassName) {\r\n previewElement.className = dragPreviewClassName;\r\n }\r\n\r\n Object.assign(previewElement.style, previewStyles, {\r\n width: `${element?.offsetWidth || 100}px`,\r\n height: `${element?.offsetHeight || 50}px`,\r\n });\r\n\r\n document.body.appendChild(previewElement);\r\n if (nativeSetDragImage) {\r\n nativeSetDragImage(previewElement, 20, 20);\r\n }\r\n requestAnimationFrame(() => previewElement.remove());\r\n },\r\n onDragStart: () => {\r\n setIsDragging(true);\r\n onDragStart?.(item, index);\r\n },\r\n onDrop: () => {\r\n setIsDragging(false);\r\n onDragEnd?.(item, index);\r\n },\r\n });\r\n },\r\n [\r\n item,\r\n index,\r\n dragPreviewClassName,\r\n dragPreviewStyle,\r\n onDragStart,\r\n onDragEnd,\r\n disabled,\r\n ]\r\n );\r\n\r\n const createDropTarget = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return dropTargetForElements({\r\n element,\r\n getData: () => ({\r\n type: DRAGGABLE_ITEM,\r\n id: item.id,\r\n index,\r\n }),\r\n canDrop: (args: any) => args.source.data?.type === DRAGGABLE_ITEM,\r\n getIsSticky: () => true,\r\n onDragEnter: ({ source, self }: any) => {\r\n if (source.data?.id !== self.data?.id) {\r\n setIsHovered(true);\r\n if (showDropIndicator) {\r\n setDropPosition(dropIndicatorPosition);\r\n }\r\n }\r\n },\r\n onDragLeave: () => {\r\n setIsHovered(false);\r\n setDropPosition(null);\r\n },\r\n onDrop: () => {\r\n setIsHovered(false);\r\n setDropPosition(null);\r\n },\r\n });\r\n },\r\n [item.id, index, disabled, showDropIndicator, dropIndicatorPosition]\r\n );\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element) return;\r\n\r\n element.setAttribute(\"data-index\", index.toString());\r\n\r\n if (disabled) {\r\n // provide a no-op cleanup to satisfy all code paths\r\n return () => {};\r\n }\r\n\r\n // normal draggable + droptarget setup\r\n return combine(createDraggable(element), createDropTarget(element));\r\n }, [index, createDraggable, createDropTarget, disabled]);\r\n\r\n return (\r\n <div ref={elementRef} className={className} style={getItemStyles()}>\r\n {showDropIndicator && dropPosition === \"top\" && (\r\n <div\r\n className={dropIndicatorClassName}\r\n style={{\r\n ...defaultStyles.dropIndicator,\r\n ...dropIndicatorStyle,\r\n top: -1,\r\n }}\r\n />\r\n )}\r\n {children}\r\n {showDropIndicator && dropPosition === \"bottom\" && (\r\n <div\r\n className={dropIndicatorClassName}\r\n style={{\r\n ...defaultStyles.dropIndicator,\r\n ...dropIndicatorStyle,\r\n bottom: -1,\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { monitorForElements } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport { extractClosestEdge } from \"@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge\";\r\nimport type { DraggableItem, OrderUpdate } from \"../types\";\r\nimport { reorder, calculateOrderUpdates } from \"../utils/order\";\r\n\r\nexport function useDragDropMonitor<T extends DraggableItem>({\r\n items,\r\n onReorder,\r\n disabled = false,\r\n}: {\r\n items: T[];\r\n onReorder: (newItems: T[], orderUpdates: OrderUpdate[]) => void;\r\n disabled?: boolean;\r\n}) {\r\n if (disabled) {\r\n return () => {};\r\n }\r\n\r\n\r\n const handleDrop = ({ location, source }: any) => {\r\n const sourceIndex = source.data?.index as number;\r\n if (sourceIndex === undefined) return;\r\n\r\n const { dropTargets } = location.current;\r\n const destinationTarget = dropTargets.find(\r\n (target: any) =>\r\n target.data?.type === \"draggable-item\" &&\r\n target.data?.id !== source.data?.id\r\n );\r\n\r\n if (!destinationTarget) return;\r\n\r\n const edge = extractClosestEdge(destinationTarget);\r\n const targetIndex = Number(\r\n destinationTarget.element.getAttribute(\"data-index\")\r\n );\r\n const destinationIndex = edge === \"bottom\" ? targetIndex + 1 : targetIndex;\r\n\r\n if (sourceIndex !== destinationIndex) {\r\n const oldItems = [...items];\r\n const newItems = reorder(items, sourceIndex, destinationIndex);\r\n const orderUpdates = calculateOrderUpdates(oldItems, newItems);\r\n onReorder(newItems, orderUpdates);\r\n }\r\n };\r\n\r\n return monitorForElements({\r\n onDrop: handleDrop,\r\n });\r\n}\r\n","import type { DraggableItem, OrderUpdate } from '../types';\r\n\r\nexport function reorder<T>(list: T[], startIndex: number, endIndex: number): T[] {\r\n const result = Array.from(list);\r\n const [removed] = result.splice(startIndex, 1);\r\n result.splice(endIndex, 0, removed);\r\n return result;\r\n}\r\n\r\nexport function calculateOrderUpdates<T extends DraggableItem>(oldItems: T[], newItems: T[]): OrderUpdate[] {\r\n const affected = newItems.filter((item, i) => item.id !== oldItems[i]?.id);\r\n const orderList = affected.slice().sort((a, b) => a.position - b.position).map(i => i.position);\r\n return affected.map((item, i) => ({ id: item.id, newPosition: orderList[i] }));\r\n}\r\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\r\nimport { dropTargetForElements } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport { DraggableItemWrapper } from \"./DraggableItemWrapper\";\r\nimport type { DragDropListProps, DraggableItem } from \"../types\";\r\nimport { useDragDropMonitor } from \"../hooks/useDragDropMonitor\";\r\nimport { defaultStyles } from \"../styles/defaultStyles\";\r\n\r\nexport function DragDropList<T extends DraggableItem>({\r\n items,\r\n onReorder,\r\n renderItem,\r\n containerClassName = \"\",\r\n containerStyle = {},\r\n itemClassName = \"\",\r\n itemStyle = {},\r\n dragPreviewClassName = \"\",\r\n dragPreviewStyle = {},\r\n onDragStart,\r\n onDragEnd,\r\n disabled = false,\r\n gap,\r\n direction = \"vertical\",\r\n showDropIndicator = false,\r\n dropIndicatorClassName = \"\",\r\n dropIndicatorStyle = {},\r\n dropIndicatorPosition = \"bottom\",\r\n}: DragDropListProps<T>) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const monitor = useDragDropMonitor({ items, onReorder, disabled });\r\n const [isDraggingOver, setIsDraggingOver] = useState(false);\r\n\r\n const getContainerStyles = (): React.CSSProperties => {\r\n const baseStyle = { ...defaultStyles.container.default };\r\n\r\n if (direction === \"horizontal\") {\r\n Object.assign(baseStyle, defaultStyles.container.horizontal);\r\n }\r\n\r\n if (isDraggingOver) {\r\n Object.assign(baseStyle, defaultStyles.container.dragging);\r\n }\r\n\r\n if (gap !== undefined) {\r\n baseStyle.gap = typeof gap === \"number\" ? `${gap}px` : gap;\r\n }\r\n\r\n return { ...baseStyle, ...containerStyle };\r\n };\r\n\r\n const createDropTarget = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return dropTargetForElements({\r\n element,\r\n getData: () => ({ type: \"container\" }),\r\n onDragEnter: () => setIsDraggingOver(true),\r\n onDragLeave: () => setIsDraggingOver(false),\r\n onDrop: () => setIsDraggingOver(false),\r\n });\r\n },\r\n [disabled]\r\n );\r\n\r\n useEffect(() => {\r\n const element = containerRef.current;\r\n if (!element || disabled) return;\r\n\r\n return combine(createDropTarget(element), monitor);\r\n }, [createDropTarget, monitor, disabled]);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={containerClassName}\r\n style={getContainerStyles()}\r\n >\r\n {items.map((item, index) => (\r\n <DraggableItemWrapper\r\n key={item.id}\r\n item={item}\r\n index={index}\r\n className={itemClassName}\r\n style={itemStyle}\r\n dragPreviewClassName={dragPreviewClassName}\r\n dragPreviewStyle={dragPreviewStyle}\r\n onDragStart={onDragStart}\r\n onDragEnd={onDragEnd}\r\n disabled={disabled}\r\n showDropIndicator={showDropIndicator}\r\n dropIndicatorClassName={dropIndicatorClassName}\r\n dropIndicatorStyle={dropIndicatorStyle}\r\n dropIndicatorPosition={dropIndicatorPosition}\r\n >\r\n {renderItem(item, index)}\r\n </DraggableItemWrapper>\r\n ))}\r\n </div>\r\n );\r\n}\r\n"],"names":["defaultStyles","container","default","minHeight","transition","borderRadius","border","backgroundColor","display","flexDirection","gap","padding","dragging","borderColor","horizontal","flexWrap","item","cursor","userSelect","position","opacity","hover","transform","boxShadow","disabled","preview","pointerEvents","zIndex","dropIndicator","height","left","right","DRAGGABLE_ITEM","DraggableItemWrapper","index","children","className","style","dragPreviewClassName","dragPreviewStyle","onDragStart","onDragEnd","showDropIndicator","dropIndicatorClassName","dropIndicatorStyle","dropIndicatorPosition","elementRef","useRef","isDragging","setIsDragging","useState","isHovered","setIsHovered","dropPosition","setDropPosition","createDraggable","useCallback","element","draggable","getInitialData","type","id","onGenerateDragPreview","nativeSetDragImage","previewElement","cloneNode","previewStyles","Object","assign","width","offsetWidth","offsetHeight","document","body","appendChild","requestAnimationFrame","remove","onDrop","createDropTarget","dropTargetForElements","getData","canDrop","args","_a","source","data","getIsSticky","onDragEnter","self","_b","onDragLeave","useEffect","current","setAttribute","toString","combine","React","createElement","ref","baseStyle","getItemStyles","top","bottom","useDragDropMonitor","items","onReorder","monitorForElements","location","sourceIndex","undefined","dropTargets","destinationTarget","find","target","_c","edge","extractClosestEdge","targetIndex","Number","getAttribute","destinationIndex","oldItems","newItems","list","startIndex","endIndex","result","Array","from","removed","splice","reorder","orderUpdates","affected","filter","i","orderList","slice","sort","a","b","map","newPosition","calculateOrderUpdates","DragDropList","renderItem","containerClassName","containerStyle","itemClassName","itemStyle","direction","containerRef","monitor","isDraggingOver","setIsDraggingOver","getContainerStyles","key"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/styles/defaultStyles.ts","../src/components/DraggableItemWrapper.tsx","../src/utils/order.ts","../src/hooks/useDragDropMonitor.logic.ts","../src/hooks/useDragDropMonitor.ts","../src/components/DragDropList.tsx"],"sourcesContent":["export const defaultStyles = {\r\n container: {\r\n default: {\r\n minHeight: \"200px\",\r\n transition: \"all 0.2s ease\",\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e2e8f0\",\r\n backgroundColor: \"#ffffff\",\r\n display: \"flex\",\r\n flexDirection: \"column\" as const,\r\n gap: \"16px\",\r\n padding: \"16px\",\r\n },\r\n dragging: {\r\n backgroundColor: \"rgba(66, 153, 225, 0.05)\",\r\n borderColor: \"#3182ce\",\r\n },\r\n horizontal: {\r\n flexDirection: \"row\" as const,\r\n flexWrap: \"wrap\" as const,\r\n },\r\n },\r\n item: {\r\n default: {\r\n transition: \"all 0.2s ease\",\r\n cursor: \"grab\",\r\n userSelect: \"none\" as const,\r\n position: \"relative\" as const,\r\n },\r\n dragging: {\r\n opacity: 0.5,\r\n cursor: \"grabbing\",\r\n },\r\n hover: {\r\n transform: \"scale(1.02)\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n },\r\n disabled: {\r\n cursor: \"not-allowed\",\r\n opacity: 0.6,\r\n },\r\n },\r\n preview: {\r\n position: \"fixed\" as const,\r\n pointerEvents: \"none\" as const,\r\n zIndex: 9999,\r\n opacity: 0.8,\r\n transform: \"rotate(2deg)\",\r\n boxShadow: \"0 10px 20px rgba(0, 0, 0, 0.15)\",\r\n },\r\n dropIndicator: {\r\n position: \"absolute\" as const,\r\n height: \"2px\",\r\n backgroundColor: \"#3182ce\",\r\n left: 0,\r\n right: 0,\r\n zIndex: 10,\r\n transition: \"all 0.2s ease\",\r\n },\r\n};\r\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\r\nimport {\r\n draggable,\r\n dropTargetForElements,\r\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport { attachClosestEdge } from \"@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge\";\r\nimport type { DraggableItemWrapperProps, DraggableItem } from \"../types\";\r\nimport { defaultStyles } from \"../styles/defaultStyles\";\r\n\r\nconst DRAGGABLE_ITEM = \"draggable-item\";\r\n\r\nexport function DraggableItemWrapper<T extends DraggableItem>({\r\n item,\r\n index,\r\n children,\r\n className = \"\",\r\n style = {},\r\n dragPreviewClassName = \"\",\r\n dragPreviewStyle = {},\r\n onDragStart,\r\n onDragEnd,\r\n disabled = false,\r\n showDropIndicator = false,\r\n dropIndicatorClassName = \"\",\r\n dropIndicatorStyle = {},\r\n dropIndicatorPosition = \"bottom\",\r\n direction = \"vertical\",\r\n dragHandle,\r\n}: DraggableItemWrapperProps<T>) {\r\n const elementRef = useRef<HTMLDivElement>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [isHovered, setIsHovered] = useState(false);\r\n const [dropPosition, setDropPosition] = useState<\"top\" | \"bottom\" | null>(\r\n null\r\n );\r\n\r\n const getItemStyles = (): React.CSSProperties => {\r\n const baseStyle = { ...defaultStyles.item.default };\r\n\r\n if (disabled) {\r\n Object.assign(baseStyle, defaultStyles.item.disabled);\r\n } else if (isDragging) {\r\n Object.assign(baseStyle, defaultStyles.item.dragging);\r\n } else if (isHovered) {\r\n Object.assign(baseStyle, defaultStyles.item.hover);\r\n }\r\n\r\n return { ...baseStyle, ...style };\r\n };\r\n\r\n const getPreviewStyles = (): React.CSSProperties => {\r\n return { ...defaultStyles.preview, ...dragPreviewStyle };\r\n };\r\n\r\n const createDraggable = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n const dragHandleElement = dragHandle\r\n ? element.querySelector(dragHandle)\r\n : undefined;\r\n\r\n return draggable({\r\n element,\r\n dragHandle: dragHandleElement ?? undefined,\r\n canDrag: () => !dragHandle || Boolean(dragHandleElement),\r\n getInitialData: () => ({\r\n type: DRAGGABLE_ITEM,\r\n id: item.id,\r\n index,\r\n }),\r\n onGenerateDragPreview: ({ nativeSetDragImage }) => {\r\n const previewElement = element.cloneNode(true) as HTMLElement;\r\n const previewStyles = getPreviewStyles();\r\n\r\n // Apply custom preview class if provided\r\n if (dragPreviewClassName) {\r\n previewElement.className = dragPreviewClassName;\r\n }\r\n\r\n Object.assign(previewElement.style, previewStyles, {\r\n width: `${element?.offsetWidth || 100}px`,\r\n height: `${element?.offsetHeight || 50}px`,\r\n });\r\n\r\n document.body.appendChild(previewElement);\r\n if (nativeSetDragImage) {\r\n nativeSetDragImage(previewElement, 20, 20);\r\n }\r\n requestAnimationFrame(() => previewElement.remove());\r\n },\r\n onDragStart: () => {\r\n setIsDragging(true);\r\n onDragStart?.(item, index);\r\n },\r\n onDrop: () => {\r\n setIsDragging(false);\r\n onDragEnd?.(item, index);\r\n },\r\n });\r\n },\r\n [\r\n item,\r\n index,\r\n dragHandle,\r\n dragPreviewClassName,\r\n dragPreviewStyle,\r\n onDragStart,\r\n onDragEnd,\r\n disabled,\r\n ]\r\n );\r\n\r\n const createDropTarget = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return dropTargetForElements({\r\n element,\r\n getData: ({ input, element: targetElement }) => {\r\n const baseData = {\r\n type: DRAGGABLE_ITEM,\r\n id: item.id,\r\n index,\r\n };\r\n const allowedEdges =\r\n direction === \"horizontal\" ? ([\"left\", \"right\"] as const) : ([\"top\", \"bottom\"] as const);\r\n\r\n return attachClosestEdge(baseData, {\r\n input,\r\n element: targetElement,\r\n allowedEdges: [...allowedEdges],\r\n });\r\n },\r\n canDrop: ({ source }) =>\n source.data?.type === DRAGGABLE_ITEM && source.data?.id !== item.id,\n onDragEnter: ({ source, self }) => {\n if (source.data?.id !== self.data?.id) {\n setIsHovered(true);\n if (showDropIndicator) {\r\n setDropPosition(dropIndicatorPosition);\r\n }\r\n }\r\n },\r\n onDragLeave: () => {\r\n setIsHovered(false);\r\n setDropPosition(null);\r\n },\r\n onDrop: () => {\r\n setIsHovered(false);\r\n setDropPosition(null);\r\n },\r\n });\r\n },\r\n [item.id, index, direction, disabled, showDropIndicator, dropIndicatorPosition]\r\n );\r\n\r\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n\n if (disabled) {\n // provide a no-op cleanup to satisfy all code paths\n return () => {};\n }\r\n\r\n // normal draggable + droptarget setup\r\n return combine(createDraggable(element), createDropTarget(element));\r\n }, [index, createDraggable, createDropTarget, disabled]);\r\n\r\n return (\r\n <div\n ref={elementRef}\n data-index={index}\n data-rdk-item-id={item.id}\n className={className}\n style={getItemStyles()}\n >\n {showDropIndicator && dropPosition === \"top\" && (\r\n <div\r\n className={dropIndicatorClassName}\r\n style={{\r\n ...defaultStyles.dropIndicator,\r\n ...dropIndicatorStyle,\r\n top: -1,\r\n }}\r\n />\r\n )}\r\n {children}\r\n {showDropIndicator && dropPosition === \"bottom\" && (\r\n <div\r\n className={dropIndicatorClassName}\r\n style={{\r\n ...defaultStyles.dropIndicator,\r\n ...dropIndicatorStyle,\r\n bottom: -1,\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { DraggableItem, OrderUpdate } from '../types';\r\n\r\nexport function reorder<T>(list: T[], startIndex: number, endIndex: number): T[] {\r\n const result = Array.from(list);\r\n const [removed] = result.splice(startIndex, 1);\r\n result.splice(endIndex, 0, removed);\r\n return result;\r\n}\r\n\r\nexport function normalizeDestinationIndex(params: {\r\n itemCount: number;\r\n sourceIndex: number;\r\n rawDestinationIndex: number;\r\n isSameList: boolean;\r\n}): number {\r\n const { itemCount, sourceIndex, rawDestinationIndex, isSameList } = params;\r\n\r\n if (itemCount <= 0) return 0;\r\n\r\n const maxRaw = itemCount;\r\n const clampedRaw = Math.max(0, Math.min(rawDestinationIndex, maxRaw));\r\n const adjusted = isSameList && sourceIndex < clampedRaw ? clampedRaw - 1 : clampedRaw;\r\n const maxFinal = isSameList ? itemCount - 1 : itemCount;\r\n\r\n return Math.max(0, Math.min(adjusted, maxFinal));\r\n}\r\n\r\nexport function reorderMany<T>(list: T[], selectedIndexes: number[], rawDestinationIndex: number): T[] {\r\n const uniqueIndexes = Array.from(\r\n new Set(selectedIndexes.filter((index) => index >= 0 && index < list.length))\r\n ).sort((a, b) => a - b);\r\n\r\n if (uniqueIndexes.length === 0) return list;\r\n\r\n const selectedSet = new Set(uniqueIndexes);\r\n const moving = uniqueIndexes.map((index) => list[index]);\r\n const remaining = list.filter((_, index) => !selectedSet.has(index));\r\n\r\n const clampedRaw = Math.max(0, Math.min(rawDestinationIndex, list.length));\r\n const removedBeforeDestination = uniqueIndexes.filter((index) => index < clampedRaw).length;\r\n const insertionIndex = Math.max(\r\n 0,\r\n Math.min(clampedRaw - removedBeforeDestination, remaining.length)\r\n );\r\n\r\n const result = [...remaining];\r\n result.splice(insertionIndex, 0, ...moving);\r\n return result;\r\n}\r\n\r\nexport function calculateOrderUpdates<T extends DraggableItem>(oldItems: T[], newItems: T[]): OrderUpdate[] {\r\n const oldIndexById = new Map(oldItems.map((item, index) => [item.id, index]));\r\n\r\n return newItems.flatMap((item, index) => {\r\n const oldIndex = oldIndexById.get(item.id);\r\n if (oldIndex === undefined || oldIndex === index) return [];\r\n return [{ id: item.id, newPosition: index, moved: true }];\r\n });\r\n}\r\n","import { extractClosestEdge } from \"@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge\";\nimport type { ElementEventPayloadMap } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport type { DraggableItem } from \"../types\";\nimport { reorder, reorderMany, normalizeDestinationIndex } from \"../utils/order\";\n\nexport type ListDirection = \"vertical\" | \"horizontal\";\nexport const DEFAULT_DIRECTION: ListDirection = \"vertical\";\n\nexport type MonitorOptions = {\n direction: ListDirection;\n selectedIds: string[];\n multiDragEnabled: boolean;\n liveReorder: boolean;\n};\n\nexport type DestinationInfo = {\n rawDestinationIndex: number;\n previewKey: string;\n} | null;\n\ntype LocationCurrent = ElementEventPayloadMap[\"onDrop\"][\"location\"][\"current\"];\n\nfunction getDistanceToTargetCenter(\n target: LocationCurrent[\"dropTargets\"][number],\n input: LocationCurrent[\"input\"]\n): number {\n const rect = target.element.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n return (input.clientX - centerX) ** 2 + (input.clientY - centerY) ** 2;\n}\n\nfunction getClosestDestinationTarget(params: {\n dropTargets: LocationCurrent[\"dropTargets\"];\n input: LocationCurrent[\"input\"];\n sourceId: string;\n excludedIds: Set<string>;\n}): LocationCurrent[\"dropTargets\"][number] | null {\n const { dropTargets, input, sourceId, excludedIds } = params;\n\n const candidates = dropTargets.filter((target) => {\n if (target.data?.type !== \"draggable-item\") return false;\n const targetId = String(target.data?.id ?? \"\");\n if (!targetId || targetId === sourceId) return false;\n return !excludedIds.has(targetId);\n });\n\n if (candidates.length === 0) return null;\n if (candidates.length === 1) return candidates[0];\n\n return candidates.reduce((closest, current) =>\n getDistanceToTargetCenter(current, input) <\n getDistanceToTargetCenter(closest, input)\n ? current\n : closest\n );\n}\n\nfunction getContainerInsertionIndex<T extends DraggableItem>(params: {\n containerElement: Element;\n input: LocationCurrent[\"input\"];\n direction: ListDirection;\n items: T[];\n excludedIds: Set<string>;\n}): number | null {\n const { containerElement, input, direction, items, excludedIds } = params;\n const indexById = new Map(items.map((item, index) => [item.id, index]));\n\n const itemElements = Array.from(\n containerElement.querySelectorAll<HTMLElement>(\"[data-rdk-item-id]\")\n );\n\n if (itemElements.length === 0) return 0;\n\n const targetPoint =\n direction === \"horizontal\" ? input.clientX : input.clientY;\n\n const points = itemElements\n .map((element) => {\n const itemId = element.getAttribute(\"data-rdk-item-id\");\n if (!itemId || excludedIds.has(itemId)) return null;\n\n const index = indexById.get(itemId);\n if (index === undefined) return null;\n\n const rect = element.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distance =\n (input.clientX - centerX) ** 2 + (input.clientY - centerY) ** 2;\n const centerOnAxis = direction === \"horizontal\" ? centerX : centerY;\n\n return { index, distance, centerOnAxis };\n })\n .filter(\n (\n point\n ): point is { index: number; distance: number; centerOnAxis: number } =>\n point !== null\n );\n\n if (points.length === 0) return null;\n\n const closest = points.reduce((nearest, current) =>\n current.distance < nearest.distance ? current : nearest\n );\n\n return targetPoint >= closest.centerOnAxis ? closest.index + 1 : closest.index;\n}\n\nexport function hasOrderChanged<T extends DraggableItem>(oldItems: T[], newItems: T[]): boolean {\n if (oldItems.length !== newItems.length) return true;\n return newItems.some((item, index) => item.id !== oldItems[index]?.id);\n}\n\nexport function getMovingIds<T extends DraggableItem>(params: {\n items: T[];\n sourceId: string;\n selectedIds: string[];\n multiDragEnabled: boolean;\n}): Set<string> {\n const { items, sourceId, selectedIds, multiDragEnabled } = params;\n\n if (!multiDragEnabled) return new Set([sourceId]);\n\n const idsInList = new Set(items.map((item) => item.id));\n const selectedSet = new Set(selectedIds.filter((id) => idsInList.has(id)));\n\n if (!selectedSet.has(sourceId)) {\n return new Set([sourceId]);\n }\n\n return selectedSet;\n}\n\nexport function reorderFromDragState<T extends DraggableItem>(params: {\n items: T[];\n sourceId: string;\n sourceIndex: number;\n rawDestinationIndex: number;\n selectedIds: string[];\n multiDragEnabled: boolean;\n}): T[] {\n const {\n items,\n sourceId,\n sourceIndex,\n rawDestinationIndex,\n selectedIds,\n multiDragEnabled,\n } = params;\n\n if (multiDragEnabled) {\n const selectedSet = new Set(selectedIds);\n if (!selectedSet.has(sourceId)) {\n selectedSet.clear();\n }\n selectedSet.add(sourceId);\n\n const selectedIndexes = items\n .map((item, index) => (selectedSet.has(item.id) ? index : -1))\n .filter((index) => index !== -1);\n\n if (selectedIndexes.length > 1) {\n return reorderMany(items, selectedIndexes, rawDestinationIndex);\n }\n }\n\n const destinationIndex = normalizeDestinationIndex({\n itemCount: items.length,\n sourceIndex,\n rawDestinationIndex,\n isSameList: true,\n });\n\n return reorder(items, sourceIndex, destinationIndex);\n}\n\nexport function resolveDestination<T extends DraggableItem>(params: {\n location: LocationCurrent;\n sourceId: string;\n sourceIndex: number;\n direction: ListDirection;\n items: T[];\n excludedIds: Set<string>;\n}): DestinationInfo {\n const { location, sourceId, sourceIndex, direction, items, excludedIds } = params;\n const { dropTargets, input } = location;\n\n const destinationTarget = getClosestDestinationTarget({\n dropTargets,\n input,\n sourceId,\n excludedIds,\n });\n\n const containerTarget = dropTargets.find(\n (target) => target.data?.type === \"container\"\n );\n\n if (!destinationTarget && !containerTarget) return null;\n\n if (!destinationTarget) {\n if (!containerTarget) return null;\n\n const insertionIndex = getContainerInsertionIndex({\n containerElement: containerTarget.element,\n input,\n direction,\n items,\n excludedIds,\n });\n\n const rawDestinationIndex = insertionIndex ?? items.length;\n\n return {\n rawDestinationIndex,\n previewKey: `container:${rawDestinationIndex}`,\n };\n }\n\n const targetId = String(destinationTarget.data?.id ?? \"\");\n if (!targetId) return null;\n\n const targetIndex = items.findIndex((item) => item.id === targetId);\n if (targetIndex === -1) {\n // Fallback to target.data.index is unreliable after live reorders.\n // If the target id is not present in current items, skip this update.\n return null;\n }\n\n const edge = extractClosestEdge(destinationTarget.data);\n let isAfter: boolean;\n\n // Slot-based semantics:\n // dropping on an item moves dragged item to that item's slot,\n // which is \"after\" when moving down and \"before\" when moving up.\n if (sourceIndex < targetIndex) {\n isAfter = true;\n } else if (sourceIndex > targetIndex) {\n isAfter = false;\n } else if (edge === null) {\n const rect = destinationTarget.element.getBoundingClientRect();\n const axisCenter =\n direction === \"horizontal\"\n ? rect.left + rect.width / 2\n : rect.top + rect.height / 2;\n const axisPoint = direction === \"horizontal\" ? input.clientX : input.clientY;\n isAfter = axisPoint >= axisCenter;\n } else {\n isAfter = edge === \"bottom\" || (direction === \"horizontal\" && edge === \"right\");\n }\n\n const rawDestinationIndex = isAfter ? targetIndex + 1 : targetIndex;\n\n return {\n rawDestinationIndex,\n previewKey: `item:${targetId}:${isAfter ? \"after\" : \"before\"}`,\n };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { monitorForElements } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport type { ElementEventPayloadMap } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport type { DraggableItem, OrderUpdate } from \"../types\";\nimport { calculateOrderUpdates } from \"../utils/order\";\nimport {\n DEFAULT_DIRECTION,\n getMovingIds,\n hasOrderChanged,\n reorderFromDragState,\n resolveDestination,\n type ListDirection,\n type MonitorOptions,\n} from \"./useDragDropMonitor.logic\";\n\nexport function useDragDropMonitor<T extends DraggableItem>({\n items,\n onReorder,\n disabled = false,\n direction = DEFAULT_DIRECTION,\n selectedIds = [],\n multiDragEnabled = false,\n liveReorder = false,\n}: {\n items: T[];\n onReorder: (newItems: T[], orderUpdates: OrderUpdate[]) => void;\n disabled?: boolean;\n direction?: ListDirection;\n selectedIds?: string[];\n multiDragEnabled?: boolean;\n liveReorder?: boolean;\n}) {\n const itemsRef = useRef<T[]>(items);\n const onReorderRef = useRef(onReorder);\n const optionsRef = useRef<MonitorOptions>({\n direction,\n selectedIds,\n multiDragEnabled,\n liveReorder,\n });\n\n const dragSessionRef = useRef<{\n sourceId: string | null;\n movingIds: Set<string> | null;\n originalItems: T[] | null;\n didLiveReorder: boolean;\n lastPreviewKey: string | null;\n }>({\n sourceId: null,\n movingIds: null,\n originalItems: null,\n didLiveReorder: false,\n lastPreviewKey: null,\n });\n\n useEffect(() => {\n itemsRef.current = items;\n onReorderRef.current = onReorder;\n optionsRef.current = {\n direction,\n selectedIds,\n multiDragEnabled,\n liveReorder,\n };\n }, [items, onReorder, direction, selectedIds, multiDragEnabled, liveReorder]);\n\n const resetDragSession = useCallback(() => {\n dragSessionRef.current = {\n sourceId: null,\n movingIds: null,\n originalItems: null,\n didLiveReorder: false,\n lastPreviewKey: null,\n };\n }, []);\n\n const getSourceIndex = useCallback((sourceId: string, sourceDataIndex: unknown): number => {\n const currentItems = itemsRef.current;\n const currentIndex = currentItems.findIndex((item) => item.id === sourceId);\n if (currentIndex !== -1) return currentIndex;\n\n const parsedIndex = Number(sourceDataIndex);\n return Number.isFinite(parsedIndex) ? parsedIndex : -1;\n }, []);\n\n const getMovingIdsForSource = useCallback((sourceId: string): Set<string> => {\n const currentItems = itemsRef.current;\n const { selectedIds: currentSelectedIds, multiDragEnabled: currentMultiDragEnabled } =\n optionsRef.current;\n\n return getMovingIds({\n items: currentItems,\n sourceId,\n selectedIds: currentSelectedIds,\n multiDragEnabled: currentMultiDragEnabled,\n });\n }, []);\n\n const getSessionMovingIds = useCallback(\n (sourceId: string): Set<string> => {\n const sessionMovingIds = dragSessionRef.current.movingIds;\n if (sessionMovingIds) {\n return new Set(sessionMovingIds);\n }\n return getMovingIdsForSource(sourceId);\n },\n [getMovingIdsForSource]\n );\n\n const commitReorder = useCallback(\n ({\n sourceId,\n sourceIndex,\n rawDestinationIndex,\n }: {\n sourceId: string;\n sourceIndex: number;\n rawDestinationIndex: number;\n }): boolean => {\n const oldItems = [...itemsRef.current];\n const {\n selectedIds: currentSelectedIds,\n multiDragEnabled: currentMultiDragEnabled,\n } = optionsRef.current;\n\n const newItems = reorderFromDragState({\n items: oldItems,\n sourceId,\n sourceIndex,\n rawDestinationIndex,\n selectedIds: currentSelectedIds,\n multiDragEnabled: currentMultiDragEnabled,\n });\n\n if (!hasOrderChanged(oldItems, newItems)) return false;\n\n const orderUpdates = calculateOrderUpdates(oldItems, newItems);\n itemsRef.current = newItems;\n onReorderRef.current(newItems, orderUpdates);\n return true;\n },\n []\n );\n\n const handleDragStart = useCallback(\n ({ source }: ElementEventPayloadMap[\"onDragStart\"]) => {\n if (source.data?.type !== \"draggable-item\") return;\n\n const sourceId = source.data?.id as string | undefined;\n if (!sourceId) return;\n\n const currentItems = itemsRef.current;\n const { selectedIds: currentSelectedIds, multiDragEnabled: currentMultiDragEnabled } =\n optionsRef.current;\n const movingIds = getMovingIds({\n items: currentItems,\n sourceId,\n selectedIds: currentSelectedIds,\n multiDragEnabled: currentMultiDragEnabled,\n });\n\n dragSessionRef.current = {\n sourceId,\n movingIds,\n originalItems: optionsRef.current.liveReorder ? [...currentItems] : null,\n didLiveReorder: false,\n lastPreviewKey: null,\n };\n },\n []\n );\n\n const handleDropTargetChange = useCallback(\n ({ location, source }: ElementEventPayloadMap[\"onDropTargetChange\"]) => {\n if (source.data?.type !== \"draggable-item\") return;\n\n const { direction: currentDirection, liveReorder: currentLiveReorder } =\n optionsRef.current;\n if (!currentLiveReorder) return;\n\n const sourceId = source.data?.id as string | undefined;\n if (!sourceId) return;\n\n const sourceIndex = getSourceIndex(sourceId, source.data?.index);\n if (sourceIndex < 0) return;\n\n const currentItems = itemsRef.current;\n const movingIds = getSessionMovingIds(sourceId);\n const destination = resolveDestination({\n location: location.current,\n sourceId,\n sourceIndex,\n direction: currentDirection,\n items: currentItems,\n excludedIds: movingIds,\n });\n\n if (!destination) return;\n if (dragSessionRef.current.lastPreviewKey === destination.previewKey) return;\n\n const didReorder = commitReorder({\n sourceId,\n sourceIndex,\n rawDestinationIndex: destination.rawDestinationIndex,\n });\n\n dragSessionRef.current.lastPreviewKey = destination.previewKey;\n if (didReorder) {\n dragSessionRef.current.didLiveReorder = true;\n }\n },\n [getSourceIndex, getSessionMovingIds, commitReorder]\n );\n\n const handleDrop = useCallback(\n ({ location, source }: ElementEventPayloadMap[\"onDrop\"]) => {\n if (source.data?.type !== \"draggable-item\") {\n resetDragSession();\n return;\n }\n\n const sourceId = source.data?.id as string | undefined;\n if (!sourceId) {\n resetDragSession();\n return;\n }\n\n const { direction: currentDirection, liveReorder: currentLiveReorder } =\n optionsRef.current;\n const currentItems = itemsRef.current;\n const movingIds = getSessionMovingIds(sourceId);\n\n const sourceIndex = getSourceIndex(sourceId, source.data?.index);\n if (sourceIndex < 0) {\n resetDragSession();\n return;\n }\n\n const destination = resolveDestination({\n location: location.current,\n sourceId,\n sourceIndex,\n direction: currentDirection,\n items: currentItems,\n excludedIds: movingIds,\n });\n\n if (!destination) {\n const { originalItems, didLiveReorder } = dragSessionRef.current;\n if (currentLiveReorder && didLiveReorder && originalItems) {\n const oldItems = [...itemsRef.current];\n if (hasOrderChanged(oldItems, originalItems)) {\n const orderUpdates = calculateOrderUpdates(oldItems, originalItems);\n itemsRef.current = originalItems;\n onReorderRef.current(originalItems, orderUpdates);\n }\n }\n resetDragSession();\n return;\n }\n\n const { didLiveReorder, lastPreviewKey } = dragSessionRef.current;\n if (currentLiveReorder && didLiveReorder && lastPreviewKey === destination.previewKey) {\n resetDragSession();\n return;\n }\n\n commitReorder({\n sourceId,\n sourceIndex,\n rawDestinationIndex: destination.rawDestinationIndex,\n });\n resetDragSession();\n },\n [getSessionMovingIds, getSourceIndex, commitReorder, resetDragSession]\n );\n\n useEffect(() => {\n if (disabled) return;\n\n return monitorForElements({\n onDragStart: handleDragStart,\n onDropTargetChange: handleDropTargetChange,\n onDrop: handleDrop,\n });\n }, [disabled, handleDragStart, handleDropTargetChange, handleDrop]);\n\n // Kept for backward compatibility with existing tests/internals.\n return useCallback(() => {}, []);\n}\r\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { dropTargetForElements } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport { DraggableItemWrapper } from \"./DraggableItemWrapper\";\r\nimport type { DragDropListProps, DraggableItem } from \"../types\";\r\nimport { useDragDropMonitor } from \"../hooks/useDragDropMonitor\";\r\nimport { defaultStyles } from \"../styles/defaultStyles\";\r\n\r\nexport function DragDropList<T extends DraggableItem>({\r\n items,\r\n onReorder,\r\n renderItem,\r\n containerClassName = \"\",\r\n containerStyle = {},\r\n itemClassName = \"\",\r\n itemStyle = {},\r\n dragPreviewClassName = \"\",\r\n dragPreviewStyle = {},\r\n onDragStart,\r\n onDragEnd,\r\n disabled = false,\r\n gap,\r\n direction = \"vertical\",\r\n showDropIndicator = false,\r\n dropIndicatorClassName = \"\",\r\n dropIndicatorStyle = {},\r\n dropIndicatorPosition = \"bottom\",\r\n dragHandle,\n selectedIds = [],\n multiDragEnabled = false,\n liveReorder = false,\n}: DragDropListProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\r\n useDragDropMonitor({\n items,\n onReorder,\n disabled,\n direction,\n selectedIds,\n multiDragEnabled,\n liveReorder,\n });\n const [isDraggingOver, setIsDraggingOver] = useState(false);\r\n\r\n const getContainerStyles = (): React.CSSProperties => {\r\n const baseStyle = { ...defaultStyles.container.default };\r\n\r\n if (direction === \"horizontal\") {\r\n Object.assign(baseStyle, defaultStyles.container.horizontal);\r\n }\r\n\r\n if (isDraggingOver) {\r\n Object.assign(baseStyle, defaultStyles.container.dragging);\r\n }\r\n\r\n if (gap !== undefined) {\r\n baseStyle.gap = typeof gap === \"number\" ? `${gap}px` : gap;\r\n }\r\n\r\n return { ...baseStyle, ...containerStyle };\r\n };\r\n\r\n const createDropTarget = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return dropTargetForElements({\r\n element,\r\n getData: () => ({ type: \"container\" }),\r\n onDragEnter: () => setIsDraggingOver(true),\r\n onDragLeave: () => setIsDraggingOver(false),\r\n onDrop: () => setIsDraggingOver(false),\r\n });\r\n },\r\n [disabled]\r\n );\r\n\r\n useEffect(() => {\r\n const element = containerRef.current;\r\n if (!element || disabled) return;\r\n\r\n return createDropTarget(element);\r\n }, [createDropTarget, disabled]);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={containerClassName}\r\n style={getContainerStyles()}\r\n >\r\n {items.map((item, index) => (\r\n <DraggableItemWrapper\r\n key={item.id}\r\n item={item}\r\n index={index}\r\n className={itemClassName}\r\n style={itemStyle}\r\n dragPreviewClassName={dragPreviewClassName}\r\n dragPreviewStyle={dragPreviewStyle}\r\n onDragStart={onDragStart}\r\n onDragEnd={onDragEnd}\r\n disabled={disabled}\r\n showDropIndicator={showDropIndicator}\r\n dropIndicatorClassName={dropIndicatorClassName}\r\n dropIndicatorStyle={dropIndicatorStyle}\r\n dropIndicatorPosition={dropIndicatorPosition}\r\n direction={direction}\r\n dragHandle={dragHandle}\r\n >\r\n {renderItem(item, index)}\r\n </DraggableItemWrapper>\r\n ))}\r\n </div>\r\n );\r\n}\r\n"],"names":["defaultStyles","container","default","minHeight","transition","borderRadius","border","backgroundColor","display","flexDirection","gap","padding","dragging","borderColor","horizontal","flexWrap","item","cursor","userSelect","position","opacity","hover","transform","boxShadow","disabled","preview","pointerEvents","zIndex","dropIndicator","height","left","right","DRAGGABLE_ITEM","DraggableItemWrapper","index","children","className","style","dragPreviewClassName","dragPreviewStyle","onDragStart","onDragEnd","showDropIndicator","dropIndicatorClassName","dropIndicatorStyle","dropIndicatorPosition","direction","dragHandle","elementRef","useRef","isDragging","setIsDragging","useState","isHovered","setIsHovered","dropPosition","setDropPosition","createDraggable","useCallback","element","dragHandleElement","querySelector","undefined","draggable","canDrag","Boolean","getInitialData","type","id","onGenerateDragPreview","nativeSetDragImage","previewElement","cloneNode","previewStyles","Object","assign","width","offsetWidth","offsetHeight","document","body","appendChild","requestAnimationFrame","remove","onDrop","createDropTarget","dropTargetForElements","getData","input","targetElement","baseData","attachClosestEdge","allowedEdges","canDrop","source","_a","_b","data","onDragEnter","self","onDragLeave","useEffect","current","combine","React","createElement","ref","baseStyle","getItemStyles","top","bottom","calculateOrderUpdates","oldItems","newItems","oldIndexById","Map","map","flatMap","oldIndex","get","newPosition","moved","getDistanceToTargetCenter","target","rect","getBoundingClientRect","centerX","centerY","Math","pow","clientX","clientY","hasOrderChanged","length","some","getMovingIds","params","items","sourceId","selectedIds","multiDragEnabled","Set","idsInList","selectedSet","filter","has","reorderFromDragState","sourceIndex","rawDestinationIndex","clear","add","selectedIndexes","list","uniqueIndexes","Array","from","sort","a","b","moving","remaining","_","clampedRaw","max","min","removedBeforeDestination","insertionIndex","result","splice","reorderMany","destinationIndex","itemCount","isSameList","maxRaw","adjusted","maxFinal","normalizeDestinationIndex","startIndex","endIndex","removed","reorder","resolveDestination","location","excludedIds","dropTargets","destinationTarget","candidates","targetId","String","_c","reduce","closest","getClosestDestinationTarget","containerTarget","find","containerElement","indexById","itemElements","querySelectorAll","targetPoint","points","itemId","getAttribute","distance","centerOnAxis","point","nearest","getContainerInsertionIndex","previewKey","targetIndex","findIndex","edge","extractClosestEdge","isAfter","axisCenter","useDragDropMonitor","onReorder","liveReorder","itemsRef","onReorderRef","optionsRef","dragSessionRef","movingIds","originalItems","didLiveReorder","lastPreviewKey","resetDragSession","getSourceIndex","sourceDataIndex","currentIndex","parsedIndex","Number","isFinite","getMovingIdsForSource","currentItems","currentSelectedIds","currentMultiDragEnabled","getSessionMovingIds","sessionMovingIds","commitReorder","orderUpdates","handleDragStart","handleDropTargetChange","currentDirection","currentLiveReorder","destination","didReorder","handleDrop","monitorForElements","onDropTargetChange","DragDropList","renderItem","containerClassName","containerStyle","itemClassName","itemStyle","containerRef","isDraggingOver","setIsDraggingOver","getContainerStyles","key"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react"),t=require("@atlaskit/pragmatic-drag-and-drop/combine"),r=require("@atlaskit/pragmatic-drag-and-drop/element/adapter"),a=require("@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge");const o={container:{default:{minHeight:"200px",transition:"all 0.2s ease",borderRadius:"8px",border:"1px solid #e2e8f0",backgroundColor:"#ffffff",display:"flex",flexDirection:"column",gap:"16px",padding:"16px"},dragging:{backgroundColor:"rgba(66, 153, 225, 0.05)",borderColor:"#3182ce"},horizontal:{flexDirection:"row",flexWrap:"wrap"}},item:{default:{transition:"all 0.2s ease",cursor:"grab",userSelect:"none",position:"relative"},dragging:{opacity:.5,cursor:"grabbing"},hover:{transform:"scale(1.02)",boxShadow:"0 4px 6px rgba(0, 0, 0, 0.1)"},disabled:{cursor:"not-allowed",opacity:.6}},preview:{position:"fixed",pointerEvents:"none",zIndex:9999,opacity:.8,transform:"rotate(2deg)",boxShadow:"0 10px 20px rgba(0, 0, 0, 0.15)"},dropIndicator:{position:"absolute",height:"2px",backgroundColor:"#3182ce",left:0,right:0,zIndex:10,transition:"all 0.2s ease"}},i="draggable-item";function n({item:a,index:n,children:s,className:d="",style:l={},dragPreviewClassName:c="",dragPreviewStyle:g={},onDragStart:p,onDragEnd:u,disabled:m=!1,showDropIndicator:b=!1,dropIndicatorClassName:f="",dropIndicatorStyle:v={},dropIndicatorPosition:x="bottom"}){const D=e.useRef(null),[y,S]=e.useState(!1),[h,I]=e.useState(!1),[j,O]=e.useState(null),w=e.useCallback(e=>m?()=>{}:r.draggable({element:e,getInitialData:()=>({type:i,id:a.id,index:n}),onGenerateDragPreview:({nativeSetDragImage:t})=>{const r=e.cloneNode(!0),a=Object.assign(Object.assign({},o.preview),g);c&&(r.className=c),Object.assign(r.style,a,{width:`${(null==e?void 0:e.offsetWidth)||100}px`,height:`${(null==e?void 0:e.offsetHeight)||50}px`}),document.body.appendChild(r),t&&t(r,20,20),requestAnimationFrame(()=>r.remove())},onDragStart:()=>{S(!0),null==p||p(a,n)},onDrop:()=>{S(!1),null==u||u(a,n)}}),[a,n,c,g,p,u,m]),C=e.useCallback(e=>m?()=>{}:r.dropTargetForElements({element:e,getData:()=>({type:i,id:a.id,index:n}),canDrop:e=>{var t;return(null===(t=e.source.data)||void 0===t?void 0:t.type)===i},getIsSticky:()=>!0,onDragEnter:({source:e,self:t})=>{var r,a;(null===(r=e.data)||void 0===r?void 0:r.id)!==(null===(a=t.data)||void 0===a?void 0:a.id)&&(I(!0),b&&O(x))},onDragLeave:()=>{I(!1),O(null)},onDrop:()=>{I(!1),O(null)}}),[a.id,n,m,b,x]);return e.useEffect(()=>{const e=D.current;if(e)return e.setAttribute("data-index",n.toString()),m?()=>{}:t.combine(w(e),C(e))},[n,w,C,m]),e.createElement("div",{ref:D,className:d,style:(()=>{const e=Object.assign({},o.item.default);return m?Object.assign(e,o.item.disabled):y?Object.assign(e,o.item.dragging):h&&Object.assign(e,o.item.hover),Object.assign(Object.assign({},e),l)})()},b&&"top"===j&&e.createElement("div",{className:f,style:Object.assign(Object.assign(Object.assign({},o.dropIndicator),v),{top:-1})}),s,b&&"bottom"===j&&e.createElement("div",{className:f,style:Object.assign(Object.assign(Object.assign({},o.dropIndicator),v),{bottom:-1})}))}function s({items:e,onReorder:t,disabled:o=!1}){if(o)return()=>{};return r.monitorForElements({onDrop:({location:r,source:o})=>{var i;const n=null===(i=o.data)||void 0===i?void 0:i.index;if(void 0===n)return;const{dropTargets:s}=r.current,d=s.find(e=>{var t,r,a;return"draggable-item"===(null===(t=e.data)||void 0===t?void 0:t.type)&&(null===(r=e.data)||void 0===r?void 0:r.id)!==(null===(a=o.data)||void 0===a?void 0:a.id)});if(!d)return;const l=a.extractClosestEdge(d),c=Number(d.element.getAttribute("data-index")),g="bottom"===l?c+1:c;if(n!==g){const r=[...e],a=function(e,t,r){const a=Array.from(e),[o]=a.splice(t,1);return a.splice(r,0,o),a}(e,n,g),o=function(e,t){const r=t.filter((t,r)=>{var a;return t.id!==(null===(a=e[r])||void 0===a?void 0:a.id)}),a=r.slice().sort((e,t)=>e.position-t.position).map(e=>e.position);return r.map((e,t)=>({id:e.id,newPosition:a[t]}))}(r,a);t(a,o)}}})}exports.DragDropList=function({items:a,onReorder:i,renderItem:d,containerClassName:l="",containerStyle:c={},itemClassName:g="",itemStyle:p={},dragPreviewClassName:u="",dragPreviewStyle:m={},onDragStart:b,onDragEnd:f,disabled:v=!1,gap:x,direction:D="vertical",showDropIndicator:y=!1,dropIndicatorClassName:S="",dropIndicatorStyle:h={},dropIndicatorPosition:I="bottom"}){const j=e.useRef(null),O=s({items:a,onReorder:i,disabled:v}),[w,C]=e.useState(!1),E=e.useCallback(e=>v?()=>{}:r.dropTargetForElements({element:e,getData:()=>({type:"container"}),onDragEnter:()=>C(!0),onDragLeave:()=>C(!1),onDrop:()=>C(!1)}),[v]);return e.useEffect(()=>{const e=j.current;if(e&&!v)return t.combine(E(e),O)},[E,O,v]),e.createElement("div",{ref:j,className:l,style:(()=>{const e=Object.assign({},o.container.default);return"horizontal"===D&&Object.assign(e,o.container.horizontal),w&&Object.assign(e,o.container.dragging),void 0!==x&&(e.gap="number"==typeof x?`${x}px`:x),Object.assign(Object.assign({},e),c)})()},a.map((t,r)=>e.createElement(n,{key:t.id,item:t,index:r,className:g,style:p,dragPreviewClassName:u,dragPreviewStyle:m,onDragStart:b,onDragEnd:f,disabled:v,showDropIndicator:y,dropIndicatorClassName:S,dropIndicatorStyle:h,dropIndicatorPosition:I},d(t,r))))},exports.DraggableItemWrapper=n,exports.defaultStyles=o,exports.useDragDropMonitor=s;
|
|
1
|
+
"use strict";var e=require("react"),t=require("@atlaskit/pragmatic-drag-and-drop/element/adapter"),n=require("@atlaskit/pragmatic-drag-and-drop/combine"),r=require("@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge");const i={container:{default:{minHeight:"200px",transition:"all 0.2s ease",borderRadius:"8px",border:"1px solid #e2e8f0",backgroundColor:"#ffffff",display:"flex",flexDirection:"column",gap:"16px",padding:"16px"},dragging:{backgroundColor:"rgba(66, 153, 225, 0.05)",borderColor:"#3182ce"},horizontal:{flexDirection:"row",flexWrap:"wrap"}},item:{default:{transition:"all 0.2s ease",cursor:"grab",userSelect:"none",position:"relative"},dragging:{opacity:.5,cursor:"grabbing"},hover:{transform:"scale(1.02)",boxShadow:"0 4px 6px rgba(0, 0, 0, 0.1)"},disabled:{cursor:"not-allowed",opacity:.6}},preview:{position:"fixed",pointerEvents:"none",zIndex:9999,opacity:.8,transform:"rotate(2deg)",boxShadow:"0 10px 20px rgba(0, 0, 0, 0.15)"},dropIndicator:{position:"absolute",height:"2px",backgroundColor:"#3182ce",left:0,right:0,zIndex:10,transition:"all 0.2s ease"}},a="draggable-item";function o({item:o,index:d,children:l,className:s="",style:c={},dragPreviewClassName:u="",dragPreviewStyle:g={},onDragStart:m,onDragEnd:p,disabled:f=!1,showDropIndicator:v=!1,dropIndicatorClassName:b="",dropIndicatorStyle:I={},dropIndicatorPosition:h="bottom",direction:x="vertical",dragHandle:w}){const D=e.useRef(null),[y,E]=e.useState(!1),[S,C]=e.useState(!1),[R,k]=e.useState(null),O=e.useCallback(e=>{if(f)return()=>{};const n=w?e.querySelector(w):void 0;return t.draggable({element:e,dragHandle:null!=n?n:void 0,canDrag:()=>!w||Boolean(n),getInitialData:()=>({type:a,id:o.id,index:d}),onGenerateDragPreview:({nativeSetDragImage:t})=>{const n=e.cloneNode(!0),r=Object.assign(Object.assign({},i.preview),g);u&&(n.className=u),Object.assign(n.style,r,{width:`${(null==e?void 0:e.offsetWidth)||100}px`,height:`${(null==e?void 0:e.offsetHeight)||50}px`}),document.body.appendChild(n),t&&t(n,20,20),requestAnimationFrame(()=>n.remove())},onDragStart:()=>{E(!0),null==m||m(o,d)},onDrop:()=>{E(!1),null==p||p(o,d)}})},[o,d,w,u,g,m,p,f]),j=e.useCallback(e=>f?()=>{}:t.dropTargetForElements({element:e,getData:({input:e,element:t})=>{const n={type:a,id:o.id,index:d},i="horizontal"===x?["left","right"]:["top","bottom"];return r.attachClosestEdge(n,{input:e,element:t,allowedEdges:[...i]})},canDrop:({source:e})=>{var t,n;return(null===(t=e.data)||void 0===t?void 0:t.type)===a&&(null===(n=e.data)||void 0===n?void 0:n.id)!==o.id},onDragEnter:({source:e,self:t})=>{var n,r;(null===(n=e.data)||void 0===n?void 0:n.id)!==(null===(r=t.data)||void 0===r?void 0:r.id)&&(C(!0),v&&k(h))},onDragLeave:()=>{C(!1),k(null)},onDrop:()=>{C(!1),k(null)}}),[o.id,d,x,f,v,h]);return e.useEffect(()=>{const e=D.current;if(e)return f?()=>{}:n.combine(O(e),j(e))},[d,O,j,f]),e.createElement("div",{ref:D,"data-index":d,"data-rdk-item-id":o.id,className:s,style:(()=>{const e=Object.assign({},i.item.default);return f?Object.assign(e,i.item.disabled):y?Object.assign(e,i.item.dragging):S&&Object.assign(e,i.item.hover),Object.assign(Object.assign({},e),c)})()},v&&"top"===R&&e.createElement("div",{className:b,style:Object.assign(Object.assign(Object.assign({},i.dropIndicator),I),{top:-1})}),l,v&&"bottom"===R&&e.createElement("div",{className:b,style:Object.assign(Object.assign(Object.assign({},i.dropIndicator),I),{bottom:-1})}))}function d(e,t){const n=new Map(e.map((e,t)=>[e.id,t]));return t.flatMap((e,t)=>{const r=n.get(e.id);return void 0===r||r===t?[]:[{id:e.id,newPosition:t,moved:!0}]})}function l(e,t){const n=e.element.getBoundingClientRect(),r=n.left+n.width/2,i=n.top+n.height/2;return Math.pow(t.clientX-r,2)+Math.pow(t.clientY-i,2)}function s(e,t){return e.length!==t.length||t.some((t,n)=>{var r;return t.id!==(null===(r=e[n])||void 0===r?void 0:r.id)})}function c(e){const{items:t,sourceId:n,selectedIds:r,multiDragEnabled:i}=e;if(!i)return new Set([n]);const a=new Set(t.map(e=>e.id)),o=new Set(r.filter(e=>a.has(e)));return o.has(n)?o:new Set([n])}function u(e){const{items:t,sourceId:n,sourceIndex:r,rawDestinationIndex:i,selectedIds:a,multiDragEnabled:o}=e;if(o){const e=new Set(a);e.has(n)||e.clear(),e.add(n);const r=t.map((t,n)=>e.has(t.id)?n:-1).filter(e=>-1!==e);if(r.length>1)return function(e,t,n){const r=Array.from(new Set(t.filter(t=>t>=0&&t<e.length))).sort((e,t)=>e-t);if(0===r.length)return e;const i=new Set(r),a=r.map(t=>e[t]),o=e.filter((e,t)=>!i.has(t)),d=Math.max(0,Math.min(n,e.length)),l=r.filter(e=>e<d).length,s=Math.max(0,Math.min(d-l,o.length)),c=[...o];return c.splice(s,0,...a),c}(t,r,i)}const d=function(e){const{itemCount:t,sourceIndex:n,rawDestinationIndex:r,isSameList:i}=e;if(t<=0)return 0;const a=t,o=Math.max(0,Math.min(r,a)),d=i&&n<o?o-1:o,l=i?t-1:t;return Math.max(0,Math.min(d,l))}({itemCount:t.length,sourceIndex:r,rawDestinationIndex:i,isSameList:!0});return function(e,t,n){const r=Array.from(e),[i]=r.splice(t,1);return r.splice(n,0,i),r}(t,r,d)}function g(e){var t,n;const{location:i,sourceId:a,sourceIndex:o,direction:d,items:s,excludedIds:c}=e,{dropTargets:u,input:g}=i,m=function(e){const{dropTargets:t,input:n,sourceId:r,excludedIds:i}=e,a=t.filter(e=>{var t,n,a;if("draggable-item"!==(null===(t=e.data)||void 0===t?void 0:t.type))return!1;const o=String(null!==(a=null===(n=e.data)||void 0===n?void 0:n.id)&&void 0!==a?a:"");return!(!o||o===r||i.has(o))});return 0===a.length?null:1===a.length?a[0]:a.reduce((e,t)=>l(t,n)<l(e,n)?t:e)}({dropTargets:u,input:g,sourceId:a,excludedIds:c}),p=u.find(e=>{var t;return"container"===(null===(t=e.data)||void 0===t?void 0:t.type)});if(!m&&!p)return null;if(!m){if(!p)return null;const e=function(e){const{containerElement:t,input:n,direction:r,items:i,excludedIds:a}=e,o=new Map(i.map((e,t)=>[e.id,t])),d=Array.from(t.querySelectorAll("[data-rdk-item-id]"));if(0===d.length)return 0;const l="horizontal"===r?n.clientX:n.clientY,s=d.map(e=>{const t=e.getAttribute("data-rdk-item-id");if(!t||a.has(t))return null;const i=o.get(t);if(void 0===i)return null;const d=e.getBoundingClientRect(),l=d.left+d.width/2,s=d.top+d.height/2;return{index:i,distance:Math.pow(n.clientX-l,2)+Math.pow(n.clientY-s,2),centerOnAxis:"horizontal"===r?l:s}}).filter(e=>null!==e);if(0===s.length)return null;const c=s.reduce((e,t)=>t.distance<e.distance?t:e);return l>=c.centerOnAxis?c.index+1:c.index}({containerElement:p.element,input:g,direction:d,items:s,excludedIds:c}),t=null!=e?e:s.length;return{rawDestinationIndex:t,previewKey:`container:${t}`}}const f=String(null!==(n=null===(t=m.data)||void 0===t?void 0:t.id)&&void 0!==n?n:"");if(!f)return null;const v=s.findIndex(e=>e.id===f);if(-1===v)return null;const b=r.extractClosestEdge(m.data);let I;if(o<v)I=!0;else if(o>v)I=!1;else if(null===b){const e=m.element.getBoundingClientRect(),t="horizontal"===d?e.left+e.width/2:e.top+e.height/2;I=("horizontal"===d?g.clientX:g.clientY)>=t}else I="bottom"===b||"horizontal"===d&&"right"===b;return{rawDestinationIndex:I?v+1:v,previewKey:`item:${f}:${I?"after":"before"}`}}function m({items:n,onReorder:r,disabled:i=!1,direction:a="vertical",selectedIds:o=[],multiDragEnabled:l=!1,liveReorder:m=!1}){const p=e.useRef(n),f=e.useRef(r),v=e.useRef({direction:a,selectedIds:o,multiDragEnabled:l,liveReorder:m}),b=e.useRef({sourceId:null,movingIds:null,originalItems:null,didLiveReorder:!1,lastPreviewKey:null});e.useEffect(()=>{p.current=n,f.current=r,v.current={direction:a,selectedIds:o,multiDragEnabled:l,liveReorder:m}},[n,r,a,o,l,m]);const I=e.useCallback(()=>{b.current={sourceId:null,movingIds:null,originalItems:null,didLiveReorder:!1,lastPreviewKey:null}},[]),h=e.useCallback((e,t)=>{const n=p.current.findIndex(t=>t.id===e);if(-1!==n)return n;const r=Number(t);return Number.isFinite(r)?r:-1},[]),x=e.useCallback(e=>{const t=p.current,{selectedIds:n,multiDragEnabled:r}=v.current;return c({items:t,sourceId:e,selectedIds:n,multiDragEnabled:r})},[]),w=e.useCallback(e=>{const t=b.current.movingIds;return t?new Set(t):x(e)},[x]),D=e.useCallback(({sourceId:e,sourceIndex:t,rawDestinationIndex:n})=>{const r=[...p.current],{selectedIds:i,multiDragEnabled:a}=v.current,o=u({items:r,sourceId:e,sourceIndex:t,rawDestinationIndex:n,selectedIds:i,multiDragEnabled:a});if(!s(r,o))return!1;const l=d(r,o);return p.current=o,f.current(o,l),!0},[]),y=e.useCallback(({source:e})=>{var t,n;if("draggable-item"!==(null===(t=e.data)||void 0===t?void 0:t.type))return;const r=null===(n=e.data)||void 0===n?void 0:n.id;if(!r)return;const i=p.current,{selectedIds:a,multiDragEnabled:o}=v.current,d=c({items:i,sourceId:r,selectedIds:a,multiDragEnabled:o});b.current={sourceId:r,movingIds:d,originalItems:v.current.liveReorder?[...i]:null,didLiveReorder:!1,lastPreviewKey:null}},[]),E=e.useCallback(({location:e,source:t})=>{var n,r,i;if("draggable-item"!==(null===(n=t.data)||void 0===n?void 0:n.type))return;const{direction:a,liveReorder:o}=v.current;if(!o)return;const d=null===(r=t.data)||void 0===r?void 0:r.id;if(!d)return;const l=h(d,null===(i=t.data)||void 0===i?void 0:i.index);if(l<0)return;const s=p.current,c=w(d),u=g({location:e.current,sourceId:d,sourceIndex:l,direction:a,items:s,excludedIds:c});if(!u)return;if(b.current.lastPreviewKey===u.previewKey)return;const m=D({sourceId:d,sourceIndex:l,rawDestinationIndex:u.rawDestinationIndex});b.current.lastPreviewKey=u.previewKey,m&&(b.current.didLiveReorder=!0)},[h,w,D]),S=e.useCallback(({location:e,source:t})=>{var n,r,i;if("draggable-item"!==(null===(n=t.data)||void 0===n?void 0:n.type))return void I();const a=null===(r=t.data)||void 0===r?void 0:r.id;if(!a)return void I();const{direction:o,liveReorder:l}=v.current,c=p.current,u=w(a),m=h(a,null===(i=t.data)||void 0===i?void 0:i.index);if(m<0)return void I();const x=g({location:e.current,sourceId:a,sourceIndex:m,direction:o,items:c,excludedIds:u});if(!x){const{originalItems:e,didLiveReorder:t}=b.current;if(l&&t&&e){const t=[...p.current];if(s(t,e)){const n=d(t,e);p.current=e,f.current(e,n)}}return void I()}const{didLiveReorder:y,lastPreviewKey:E}=b.current;l&&y&&E===x.previewKey||D({sourceId:a,sourceIndex:m,rawDestinationIndex:x.rawDestinationIndex}),I()},[w,h,D,I]);return e.useEffect(()=>{if(!i)return t.monitorForElements({onDragStart:y,onDropTargetChange:E,onDrop:S})},[i,y,E,S]),e.useCallback(()=>{},[])}exports.DragDropList=function({items:n,onReorder:r,renderItem:a,containerClassName:d="",containerStyle:l={},itemClassName:s="",itemStyle:c={},dragPreviewClassName:u="",dragPreviewStyle:g={},onDragStart:p,onDragEnd:f,disabled:v=!1,gap:b,direction:I="vertical",showDropIndicator:h=!1,dropIndicatorClassName:x="",dropIndicatorStyle:w={},dropIndicatorPosition:D="bottom",dragHandle:y,selectedIds:E=[],multiDragEnabled:S=!1,liveReorder:C=!1}){const R=e.useRef(null);m({items:n,onReorder:r,disabled:v,direction:I,selectedIds:E,multiDragEnabled:S,liveReorder:C});const[k,O]=e.useState(!1),j=e.useCallback(e=>v?()=>{}:t.dropTargetForElements({element:e,getData:()=>({type:"container"}),onDragEnter:()=>O(!0),onDragLeave:()=>O(!1),onDrop:()=>O(!1)}),[v]);return e.useEffect(()=>{const e=R.current;if(e&&!v)return j(e)},[j,v]),e.createElement("div",{ref:R,className:d,style:(()=>{const e=Object.assign({},i.container.default);return"horizontal"===I&&Object.assign(e,i.container.horizontal),k&&Object.assign(e,i.container.dragging),void 0!==b&&(e.gap="number"==typeof b?`${b}px`:b),Object.assign(Object.assign({},e),l)})()},n.map((t,n)=>e.createElement(o,{key:t.id,item:t,index:n,className:s,style:c,dragPreviewClassName:u,dragPreviewStyle:g,onDragStart:p,onDragEnd:f,disabled:v,showDropIndicator:h,dropIndicatorClassName:x,dropIndicatorStyle:w,dropIndicatorPosition:D,direction:I,dragHandle:y},a(t,n))))},exports.DraggableItemWrapper=o,exports.defaultStyles=i,exports.useDragDropMonitor=m;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/styles/defaultStyles.ts","../src/components/DraggableItemWrapper.tsx","../src/hooks/useDragDropMonitor.ts","../src/utils/order.ts","../src/components/DragDropList.tsx"],"sourcesContent":["export const defaultStyles = {\r\n container: {\r\n default: {\r\n minHeight: \"200px\",\r\n transition: \"all 0.2s ease\",\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e2e8f0\",\r\n backgroundColor: \"#ffffff\",\r\n display: \"flex\",\r\n flexDirection: \"column\" as const,\r\n gap: \"16px\",\r\n padding: \"16px\",\r\n },\r\n dragging: {\r\n backgroundColor: \"rgba(66, 153, 225, 0.05)\",\r\n borderColor: \"#3182ce\",\r\n },\r\n horizontal: {\r\n flexDirection: \"row\" as const,\r\n flexWrap: \"wrap\" as const,\r\n },\r\n },\r\n item: {\r\n default: {\r\n transition: \"all 0.2s ease\",\r\n cursor: \"grab\",\r\n userSelect: \"none\" as const,\r\n position: \"relative\" as const,\r\n },\r\n dragging: {\r\n opacity: 0.5,\r\n cursor: \"grabbing\",\r\n },\r\n hover: {\r\n transform: \"scale(1.02)\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n },\r\n disabled: {\r\n cursor: \"not-allowed\",\r\n opacity: 0.6,\r\n },\r\n },\r\n preview: {\r\n position: \"fixed\" as const,\r\n pointerEvents: \"none\" as const,\r\n zIndex: 9999,\r\n opacity: 0.8,\r\n transform: \"rotate(2deg)\",\r\n boxShadow: \"0 10px 20px rgba(0, 0, 0, 0.15)\",\r\n },\r\n dropIndicator: {\r\n position: \"absolute\" as const,\r\n height: \"2px\",\r\n backgroundColor: \"#3182ce\",\r\n left: 0,\r\n right: 0,\r\n zIndex: 10,\r\n transition: \"all 0.2s ease\",\r\n },\r\n};\r\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\r\nimport {\r\n draggable,\r\n dropTargetForElements,\r\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport type { DraggableItemWrapperProps, DraggableItem } from \"../types\";\r\nimport { defaultStyles } from \"../styles/defaultStyles\";\r\n\r\nconst DRAGGABLE_ITEM = \"draggable-item\";\r\n\r\nexport function DraggableItemWrapper<T extends DraggableItem>({\r\n item,\r\n index,\r\n children,\r\n className = \"\",\r\n style = {},\r\n dragPreviewClassName = \"\",\r\n dragPreviewStyle = {},\r\n onDragStart,\r\n onDragEnd,\r\n disabled = false,\r\n showDropIndicator = false,\r\n dropIndicatorClassName = \"\",\r\n dropIndicatorStyle = {},\r\n dropIndicatorPosition = \"bottom\",\r\n}: DraggableItemWrapperProps<T>) {\r\n const elementRef = useRef<HTMLDivElement>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [isHovered, setIsHovered] = useState(false);\r\n const [dropPosition, setDropPosition] = useState<\"top\" | \"bottom\" | null>(\r\n null\r\n );\r\n\r\n const getItemStyles = (): React.CSSProperties => {\r\n const baseStyle = { ...defaultStyles.item.default };\r\n\r\n if (disabled) {\r\n Object.assign(baseStyle, defaultStyles.item.disabled);\r\n } else if (isDragging) {\r\n Object.assign(baseStyle, defaultStyles.item.dragging);\r\n } else if (isHovered) {\r\n Object.assign(baseStyle, defaultStyles.item.hover);\r\n }\r\n\r\n return { ...baseStyle, ...style };\r\n };\r\n\r\n const getPreviewStyles = (): React.CSSProperties => {\r\n return { ...defaultStyles.preview, ...dragPreviewStyle };\r\n };\r\n\r\n const createDraggable = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return draggable({\r\n element,\r\n getInitialData: () => ({\r\n type: DRAGGABLE_ITEM,\r\n id: item.id,\r\n index,\r\n }),\r\n onGenerateDragPreview: ({ nativeSetDragImage }) => {\r\n const previewElement = element.cloneNode(true) as HTMLElement;\r\n const previewStyles = getPreviewStyles();\r\n\r\n // Apply custom preview class if provided\r\n if (dragPreviewClassName) {\r\n previewElement.className = dragPreviewClassName;\r\n }\r\n\r\n Object.assign(previewElement.style, previewStyles, {\r\n width: `${element?.offsetWidth || 100}px`,\r\n height: `${element?.offsetHeight || 50}px`,\r\n });\r\n\r\n document.body.appendChild(previewElement);\r\n if (nativeSetDragImage) {\r\n nativeSetDragImage(previewElement, 20, 20);\r\n }\r\n requestAnimationFrame(() => previewElement.remove());\r\n },\r\n onDragStart: () => {\r\n setIsDragging(true);\r\n onDragStart?.(item, index);\r\n },\r\n onDrop: () => {\r\n setIsDragging(false);\r\n onDragEnd?.(item, index);\r\n },\r\n });\r\n },\r\n [\r\n item,\r\n index,\r\n dragPreviewClassName,\r\n dragPreviewStyle,\r\n onDragStart,\r\n onDragEnd,\r\n disabled,\r\n ]\r\n );\r\n\r\n const createDropTarget = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return dropTargetForElements({\r\n element,\r\n getData: () => ({\r\n type: DRAGGABLE_ITEM,\r\n id: item.id,\r\n index,\r\n }),\r\n canDrop: (args: any) => args.source.data?.type === DRAGGABLE_ITEM,\r\n getIsSticky: () => true,\r\n onDragEnter: ({ source, self }: any) => {\r\n if (source.data?.id !== self.data?.id) {\r\n setIsHovered(true);\r\n if (showDropIndicator) {\r\n setDropPosition(dropIndicatorPosition);\r\n }\r\n }\r\n },\r\n onDragLeave: () => {\r\n setIsHovered(false);\r\n setDropPosition(null);\r\n },\r\n onDrop: () => {\r\n setIsHovered(false);\r\n setDropPosition(null);\r\n },\r\n });\r\n },\r\n [item.id, index, disabled, showDropIndicator, dropIndicatorPosition]\r\n );\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element) return;\r\n\r\n element.setAttribute(\"data-index\", index.toString());\r\n\r\n if (disabled) {\r\n // provide a no-op cleanup to satisfy all code paths\r\n return () => {};\r\n }\r\n\r\n // normal draggable + droptarget setup\r\n return combine(createDraggable(element), createDropTarget(element));\r\n }, [index, createDraggable, createDropTarget, disabled]);\r\n\r\n return (\r\n <div ref={elementRef} className={className} style={getItemStyles()}>\r\n {showDropIndicator && dropPosition === \"top\" && (\r\n <div\r\n className={dropIndicatorClassName}\r\n style={{\r\n ...defaultStyles.dropIndicator,\r\n ...dropIndicatorStyle,\r\n top: -1,\r\n }}\r\n />\r\n )}\r\n {children}\r\n {showDropIndicator && dropPosition === \"bottom\" && (\r\n <div\r\n className={dropIndicatorClassName}\r\n style={{\r\n ...defaultStyles.dropIndicator,\r\n ...dropIndicatorStyle,\r\n bottom: -1,\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { monitorForElements } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport { extractClosestEdge } from \"@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge\";\r\nimport type { DraggableItem, OrderUpdate } from \"../types\";\r\nimport { reorder, calculateOrderUpdates } from \"../utils/order\";\r\n\r\nexport function useDragDropMonitor<T extends DraggableItem>({\r\n items,\r\n onReorder,\r\n disabled = false,\r\n}: {\r\n items: T[];\r\n onReorder: (newItems: T[], orderUpdates: OrderUpdate[]) => void;\r\n disabled?: boolean;\r\n}) {\r\n if (disabled) {\r\n return () => {};\r\n }\r\n\r\n\r\n const handleDrop = ({ location, source }: any) => {\r\n const sourceIndex = source.data?.index as number;\r\n if (sourceIndex === undefined) return;\r\n\r\n const { dropTargets } = location.current;\r\n const destinationTarget = dropTargets.find(\r\n (target: any) =>\r\n target.data?.type === \"draggable-item\" &&\r\n target.data?.id !== source.data?.id\r\n );\r\n\r\n if (!destinationTarget) return;\r\n\r\n const edge = extractClosestEdge(destinationTarget);\r\n const targetIndex = Number(\r\n destinationTarget.element.getAttribute(\"data-index\")\r\n );\r\n const destinationIndex = edge === \"bottom\" ? targetIndex + 1 : targetIndex;\r\n\r\n if (sourceIndex !== destinationIndex) {\r\n const oldItems = [...items];\r\n const newItems = reorder(items, sourceIndex, destinationIndex);\r\n const orderUpdates = calculateOrderUpdates(oldItems, newItems);\r\n onReorder(newItems, orderUpdates);\r\n }\r\n };\r\n\r\n return monitorForElements({\r\n onDrop: handleDrop,\r\n });\r\n}\r\n","import type { DraggableItem, OrderUpdate } from '../types';\r\n\r\nexport function reorder<T>(list: T[], startIndex: number, endIndex: number): T[] {\r\n const result = Array.from(list);\r\n const [removed] = result.splice(startIndex, 1);\r\n result.splice(endIndex, 0, removed);\r\n return result;\r\n}\r\n\r\nexport function calculateOrderUpdates<T extends DraggableItem>(oldItems: T[], newItems: T[]): OrderUpdate[] {\r\n const affected = newItems.filter((item, i) => item.id !== oldItems[i]?.id);\r\n const orderList = affected.slice().sort((a, b) => a.position - b.position).map(i => i.position);\r\n return affected.map((item, i) => ({ id: item.id, newPosition: orderList[i] }));\r\n}\r\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\r\nimport { dropTargetForElements } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport { DraggableItemWrapper } from \"./DraggableItemWrapper\";\r\nimport type { DragDropListProps, DraggableItem } from \"../types\";\r\nimport { useDragDropMonitor } from \"../hooks/useDragDropMonitor\";\r\nimport { defaultStyles } from \"../styles/defaultStyles\";\r\n\r\nexport function DragDropList<T extends DraggableItem>({\r\n items,\r\n onReorder,\r\n renderItem,\r\n containerClassName = \"\",\r\n containerStyle = {},\r\n itemClassName = \"\",\r\n itemStyle = {},\r\n dragPreviewClassName = \"\",\r\n dragPreviewStyle = {},\r\n onDragStart,\r\n onDragEnd,\r\n disabled = false,\r\n gap,\r\n direction = \"vertical\",\r\n showDropIndicator = false,\r\n dropIndicatorClassName = \"\",\r\n dropIndicatorStyle = {},\r\n dropIndicatorPosition = \"bottom\",\r\n}: DragDropListProps<T>) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const monitor = useDragDropMonitor({ items, onReorder, disabled });\r\n const [isDraggingOver, setIsDraggingOver] = useState(false);\r\n\r\n const getContainerStyles = (): React.CSSProperties => {\r\n const baseStyle = { ...defaultStyles.container.default };\r\n\r\n if (direction === \"horizontal\") {\r\n Object.assign(baseStyle, defaultStyles.container.horizontal);\r\n }\r\n\r\n if (isDraggingOver) {\r\n Object.assign(baseStyle, defaultStyles.container.dragging);\r\n }\r\n\r\n if (gap !== undefined) {\r\n baseStyle.gap = typeof gap === \"number\" ? `${gap}px` : gap;\r\n }\r\n\r\n return { ...baseStyle, ...containerStyle };\r\n };\r\n\r\n const createDropTarget = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return dropTargetForElements({\r\n element,\r\n getData: () => ({ type: \"container\" }),\r\n onDragEnter: () => setIsDraggingOver(true),\r\n onDragLeave: () => setIsDraggingOver(false),\r\n onDrop: () => setIsDraggingOver(false),\r\n });\r\n },\r\n [disabled]\r\n );\r\n\r\n useEffect(() => {\r\n const element = containerRef.current;\r\n if (!element || disabled) return;\r\n\r\n return combine(createDropTarget(element), monitor);\r\n }, [createDropTarget, monitor, disabled]);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={containerClassName}\r\n style={getContainerStyles()}\r\n >\r\n {items.map((item, index) => (\r\n <DraggableItemWrapper\r\n key={item.id}\r\n item={item}\r\n index={index}\r\n className={itemClassName}\r\n style={itemStyle}\r\n dragPreviewClassName={dragPreviewClassName}\r\n dragPreviewStyle={dragPreviewStyle}\r\n onDragStart={onDragStart}\r\n onDragEnd={onDragEnd}\r\n disabled={disabled}\r\n showDropIndicator={showDropIndicator}\r\n dropIndicatorClassName={dropIndicatorClassName}\r\n dropIndicatorStyle={dropIndicatorStyle}\r\n dropIndicatorPosition={dropIndicatorPosition}\r\n >\r\n {renderItem(item, index)}\r\n </DraggableItemWrapper>\r\n ))}\r\n </div>\r\n );\r\n}\r\n"],"names":["defaultStyles","container","default","minHeight","transition","borderRadius","border","backgroundColor","display","flexDirection","gap","padding","dragging","borderColor","horizontal","flexWrap","item","cursor","userSelect","position","opacity","hover","transform","boxShadow","disabled","preview","pointerEvents","zIndex","dropIndicator","height","left","right","DRAGGABLE_ITEM","DraggableItemWrapper","index","children","className","style","dragPreviewClassName","dragPreviewStyle","onDragStart","onDragEnd","showDropIndicator","dropIndicatorClassName","dropIndicatorStyle","dropIndicatorPosition","elementRef","useRef","isDragging","setIsDragging","useState","isHovered","setIsHovered","dropPosition","setDropPosition","createDraggable","useCallback","element","draggable","getInitialData","type","id","onGenerateDragPreview","nativeSetDragImage","previewElement","cloneNode","previewStyles","Object","assign","width","offsetWidth","offsetHeight","document","body","appendChild","requestAnimationFrame","remove","onDrop","createDropTarget","dropTargetForElements","getData","canDrop","args","_a","source","data","getIsSticky","onDragEnter","self","_b","onDragLeave","useEffect","current","setAttribute","toString","combine","React","createElement","ref","baseStyle","getItemStyles","top","bottom","useDragDropMonitor","items","onReorder","monitorForElements","location","sourceIndex","undefined","dropTargets","destinationTarget","find","target","_c","edge","extractClosestEdge","targetIndex","Number","getAttribute","destinationIndex","oldItems","newItems","list","startIndex","endIndex","result","Array","from","removed","splice","reorder","orderUpdates","affected","filter","i","orderList","slice","sort","a","b","map","newPosition","calculateOrderUpdates","renderItem","containerClassName","containerStyle","itemClassName","itemStyle","direction","containerRef","monitor","isDraggingOver","setIsDraggingOver","getContainerStyles","key"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/styles/defaultStyles.ts","../src/components/DraggableItemWrapper.tsx","../src/utils/order.ts","../src/hooks/useDragDropMonitor.logic.ts","../src/hooks/useDragDropMonitor.ts","../src/components/DragDropList.tsx"],"sourcesContent":["export const defaultStyles = {\r\n container: {\r\n default: {\r\n minHeight: \"200px\",\r\n transition: \"all 0.2s ease\",\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e2e8f0\",\r\n backgroundColor: \"#ffffff\",\r\n display: \"flex\",\r\n flexDirection: \"column\" as const,\r\n gap: \"16px\",\r\n padding: \"16px\",\r\n },\r\n dragging: {\r\n backgroundColor: \"rgba(66, 153, 225, 0.05)\",\r\n borderColor: \"#3182ce\",\r\n },\r\n horizontal: {\r\n flexDirection: \"row\" as const,\r\n flexWrap: \"wrap\" as const,\r\n },\r\n },\r\n item: {\r\n default: {\r\n transition: \"all 0.2s ease\",\r\n cursor: \"grab\",\r\n userSelect: \"none\" as const,\r\n position: \"relative\" as const,\r\n },\r\n dragging: {\r\n opacity: 0.5,\r\n cursor: \"grabbing\",\r\n },\r\n hover: {\r\n transform: \"scale(1.02)\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n },\r\n disabled: {\r\n cursor: \"not-allowed\",\r\n opacity: 0.6,\r\n },\r\n },\r\n preview: {\r\n position: \"fixed\" as const,\r\n pointerEvents: \"none\" as const,\r\n zIndex: 9999,\r\n opacity: 0.8,\r\n transform: \"rotate(2deg)\",\r\n boxShadow: \"0 10px 20px rgba(0, 0, 0, 0.15)\",\r\n },\r\n dropIndicator: {\r\n position: \"absolute\" as const,\r\n height: \"2px\",\r\n backgroundColor: \"#3182ce\",\r\n left: 0,\r\n right: 0,\r\n zIndex: 10,\r\n transition: \"all 0.2s ease\",\r\n },\r\n};\r\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\r\nimport {\r\n draggable,\r\n dropTargetForElements,\r\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport { attachClosestEdge } from \"@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge\";\r\nimport type { DraggableItemWrapperProps, DraggableItem } from \"../types\";\r\nimport { defaultStyles } from \"../styles/defaultStyles\";\r\n\r\nconst DRAGGABLE_ITEM = \"draggable-item\";\r\n\r\nexport function DraggableItemWrapper<T extends DraggableItem>({\r\n item,\r\n index,\r\n children,\r\n className = \"\",\r\n style = {},\r\n dragPreviewClassName = \"\",\r\n dragPreviewStyle = {},\r\n onDragStart,\r\n onDragEnd,\r\n disabled = false,\r\n showDropIndicator = false,\r\n dropIndicatorClassName = \"\",\r\n dropIndicatorStyle = {},\r\n dropIndicatorPosition = \"bottom\",\r\n direction = \"vertical\",\r\n dragHandle,\r\n}: DraggableItemWrapperProps<T>) {\r\n const elementRef = useRef<HTMLDivElement>(null);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [isHovered, setIsHovered] = useState(false);\r\n const [dropPosition, setDropPosition] = useState<\"top\" | \"bottom\" | null>(\r\n null\r\n );\r\n\r\n const getItemStyles = (): React.CSSProperties => {\r\n const baseStyle = { ...defaultStyles.item.default };\r\n\r\n if (disabled) {\r\n Object.assign(baseStyle, defaultStyles.item.disabled);\r\n } else if (isDragging) {\r\n Object.assign(baseStyle, defaultStyles.item.dragging);\r\n } else if (isHovered) {\r\n Object.assign(baseStyle, defaultStyles.item.hover);\r\n }\r\n\r\n return { ...baseStyle, ...style };\r\n };\r\n\r\n const getPreviewStyles = (): React.CSSProperties => {\r\n return { ...defaultStyles.preview, ...dragPreviewStyle };\r\n };\r\n\r\n const createDraggable = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n const dragHandleElement = dragHandle\r\n ? element.querySelector(dragHandle)\r\n : undefined;\r\n\r\n return draggable({\r\n element,\r\n dragHandle: dragHandleElement ?? undefined,\r\n canDrag: () => !dragHandle || Boolean(dragHandleElement),\r\n getInitialData: () => ({\r\n type: DRAGGABLE_ITEM,\r\n id: item.id,\r\n index,\r\n }),\r\n onGenerateDragPreview: ({ nativeSetDragImage }) => {\r\n const previewElement = element.cloneNode(true) as HTMLElement;\r\n const previewStyles = getPreviewStyles();\r\n\r\n // Apply custom preview class if provided\r\n if (dragPreviewClassName) {\r\n previewElement.className = dragPreviewClassName;\r\n }\r\n\r\n Object.assign(previewElement.style, previewStyles, {\r\n width: `${element?.offsetWidth || 100}px`,\r\n height: `${element?.offsetHeight || 50}px`,\r\n });\r\n\r\n document.body.appendChild(previewElement);\r\n if (nativeSetDragImage) {\r\n nativeSetDragImage(previewElement, 20, 20);\r\n }\r\n requestAnimationFrame(() => previewElement.remove());\r\n },\r\n onDragStart: () => {\r\n setIsDragging(true);\r\n onDragStart?.(item, index);\r\n },\r\n onDrop: () => {\r\n setIsDragging(false);\r\n onDragEnd?.(item, index);\r\n },\r\n });\r\n },\r\n [\r\n item,\r\n index,\r\n dragHandle,\r\n dragPreviewClassName,\r\n dragPreviewStyle,\r\n onDragStart,\r\n onDragEnd,\r\n disabled,\r\n ]\r\n );\r\n\r\n const createDropTarget = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return dropTargetForElements({\r\n element,\r\n getData: ({ input, element: targetElement }) => {\r\n const baseData = {\r\n type: DRAGGABLE_ITEM,\r\n id: item.id,\r\n index,\r\n };\r\n const allowedEdges =\r\n direction === \"horizontal\" ? ([\"left\", \"right\"] as const) : ([\"top\", \"bottom\"] as const);\r\n\r\n return attachClosestEdge(baseData, {\r\n input,\r\n element: targetElement,\r\n allowedEdges: [...allowedEdges],\r\n });\r\n },\r\n canDrop: ({ source }) =>\n source.data?.type === DRAGGABLE_ITEM && source.data?.id !== item.id,\n onDragEnter: ({ source, self }) => {\n if (source.data?.id !== self.data?.id) {\n setIsHovered(true);\n if (showDropIndicator) {\r\n setDropPosition(dropIndicatorPosition);\r\n }\r\n }\r\n },\r\n onDragLeave: () => {\r\n setIsHovered(false);\r\n setDropPosition(null);\r\n },\r\n onDrop: () => {\r\n setIsHovered(false);\r\n setDropPosition(null);\r\n },\r\n });\r\n },\r\n [item.id, index, direction, disabled, showDropIndicator, dropIndicatorPosition]\r\n );\r\n\r\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n\n if (disabled) {\n // provide a no-op cleanup to satisfy all code paths\n return () => {};\n }\r\n\r\n // normal draggable + droptarget setup\r\n return combine(createDraggable(element), createDropTarget(element));\r\n }, [index, createDraggable, createDropTarget, disabled]);\r\n\r\n return (\r\n <div\n ref={elementRef}\n data-index={index}\n data-rdk-item-id={item.id}\n className={className}\n style={getItemStyles()}\n >\n {showDropIndicator && dropPosition === \"top\" && (\r\n <div\r\n className={dropIndicatorClassName}\r\n style={{\r\n ...defaultStyles.dropIndicator,\r\n ...dropIndicatorStyle,\r\n top: -1,\r\n }}\r\n />\r\n )}\r\n {children}\r\n {showDropIndicator && dropPosition === \"bottom\" && (\r\n <div\r\n className={dropIndicatorClassName}\r\n style={{\r\n ...defaultStyles.dropIndicator,\r\n ...dropIndicatorStyle,\r\n bottom: -1,\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { DraggableItem, OrderUpdate } from '../types';\r\n\r\nexport function reorder<T>(list: T[], startIndex: number, endIndex: number): T[] {\r\n const result = Array.from(list);\r\n const [removed] = result.splice(startIndex, 1);\r\n result.splice(endIndex, 0, removed);\r\n return result;\r\n}\r\n\r\nexport function normalizeDestinationIndex(params: {\r\n itemCount: number;\r\n sourceIndex: number;\r\n rawDestinationIndex: number;\r\n isSameList: boolean;\r\n}): number {\r\n const { itemCount, sourceIndex, rawDestinationIndex, isSameList } = params;\r\n\r\n if (itemCount <= 0) return 0;\r\n\r\n const maxRaw = itemCount;\r\n const clampedRaw = Math.max(0, Math.min(rawDestinationIndex, maxRaw));\r\n const adjusted = isSameList && sourceIndex < clampedRaw ? clampedRaw - 1 : clampedRaw;\r\n const maxFinal = isSameList ? itemCount - 1 : itemCount;\r\n\r\n return Math.max(0, Math.min(adjusted, maxFinal));\r\n}\r\n\r\nexport function reorderMany<T>(list: T[], selectedIndexes: number[], rawDestinationIndex: number): T[] {\r\n const uniqueIndexes = Array.from(\r\n new Set(selectedIndexes.filter((index) => index >= 0 && index < list.length))\r\n ).sort((a, b) => a - b);\r\n\r\n if (uniqueIndexes.length === 0) return list;\r\n\r\n const selectedSet = new Set(uniqueIndexes);\r\n const moving = uniqueIndexes.map((index) => list[index]);\r\n const remaining = list.filter((_, index) => !selectedSet.has(index));\r\n\r\n const clampedRaw = Math.max(0, Math.min(rawDestinationIndex, list.length));\r\n const removedBeforeDestination = uniqueIndexes.filter((index) => index < clampedRaw).length;\r\n const insertionIndex = Math.max(\r\n 0,\r\n Math.min(clampedRaw - removedBeforeDestination, remaining.length)\r\n );\r\n\r\n const result = [...remaining];\r\n result.splice(insertionIndex, 0, ...moving);\r\n return result;\r\n}\r\n\r\nexport function calculateOrderUpdates<T extends DraggableItem>(oldItems: T[], newItems: T[]): OrderUpdate[] {\r\n const oldIndexById = new Map(oldItems.map((item, index) => [item.id, index]));\r\n\r\n return newItems.flatMap((item, index) => {\r\n const oldIndex = oldIndexById.get(item.id);\r\n if (oldIndex === undefined || oldIndex === index) return [];\r\n return [{ id: item.id, newPosition: index, moved: true }];\r\n });\r\n}\r\n","import { extractClosestEdge } from \"@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge\";\nimport type { ElementEventPayloadMap } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport type { DraggableItem } from \"../types\";\nimport { reorder, reorderMany, normalizeDestinationIndex } from \"../utils/order\";\n\nexport type ListDirection = \"vertical\" | \"horizontal\";\nexport const DEFAULT_DIRECTION: ListDirection = \"vertical\";\n\nexport type MonitorOptions = {\n direction: ListDirection;\n selectedIds: string[];\n multiDragEnabled: boolean;\n liveReorder: boolean;\n};\n\nexport type DestinationInfo = {\n rawDestinationIndex: number;\n previewKey: string;\n} | null;\n\ntype LocationCurrent = ElementEventPayloadMap[\"onDrop\"][\"location\"][\"current\"];\n\nfunction getDistanceToTargetCenter(\n target: LocationCurrent[\"dropTargets\"][number],\n input: LocationCurrent[\"input\"]\n): number {\n const rect = target.element.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n return (input.clientX - centerX) ** 2 + (input.clientY - centerY) ** 2;\n}\n\nfunction getClosestDestinationTarget(params: {\n dropTargets: LocationCurrent[\"dropTargets\"];\n input: LocationCurrent[\"input\"];\n sourceId: string;\n excludedIds: Set<string>;\n}): LocationCurrent[\"dropTargets\"][number] | null {\n const { dropTargets, input, sourceId, excludedIds } = params;\n\n const candidates = dropTargets.filter((target) => {\n if (target.data?.type !== \"draggable-item\") return false;\n const targetId = String(target.data?.id ?? \"\");\n if (!targetId || targetId === sourceId) return false;\n return !excludedIds.has(targetId);\n });\n\n if (candidates.length === 0) return null;\n if (candidates.length === 1) return candidates[0];\n\n return candidates.reduce((closest, current) =>\n getDistanceToTargetCenter(current, input) <\n getDistanceToTargetCenter(closest, input)\n ? current\n : closest\n );\n}\n\nfunction getContainerInsertionIndex<T extends DraggableItem>(params: {\n containerElement: Element;\n input: LocationCurrent[\"input\"];\n direction: ListDirection;\n items: T[];\n excludedIds: Set<string>;\n}): number | null {\n const { containerElement, input, direction, items, excludedIds } = params;\n const indexById = new Map(items.map((item, index) => [item.id, index]));\n\n const itemElements = Array.from(\n containerElement.querySelectorAll<HTMLElement>(\"[data-rdk-item-id]\")\n );\n\n if (itemElements.length === 0) return 0;\n\n const targetPoint =\n direction === \"horizontal\" ? input.clientX : input.clientY;\n\n const points = itemElements\n .map((element) => {\n const itemId = element.getAttribute(\"data-rdk-item-id\");\n if (!itemId || excludedIds.has(itemId)) return null;\n\n const index = indexById.get(itemId);\n if (index === undefined) return null;\n\n const rect = element.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distance =\n (input.clientX - centerX) ** 2 + (input.clientY - centerY) ** 2;\n const centerOnAxis = direction === \"horizontal\" ? centerX : centerY;\n\n return { index, distance, centerOnAxis };\n })\n .filter(\n (\n point\n ): point is { index: number; distance: number; centerOnAxis: number } =>\n point !== null\n );\n\n if (points.length === 0) return null;\n\n const closest = points.reduce((nearest, current) =>\n current.distance < nearest.distance ? current : nearest\n );\n\n return targetPoint >= closest.centerOnAxis ? closest.index + 1 : closest.index;\n}\n\nexport function hasOrderChanged<T extends DraggableItem>(oldItems: T[], newItems: T[]): boolean {\n if (oldItems.length !== newItems.length) return true;\n return newItems.some((item, index) => item.id !== oldItems[index]?.id);\n}\n\nexport function getMovingIds<T extends DraggableItem>(params: {\n items: T[];\n sourceId: string;\n selectedIds: string[];\n multiDragEnabled: boolean;\n}): Set<string> {\n const { items, sourceId, selectedIds, multiDragEnabled } = params;\n\n if (!multiDragEnabled) return new Set([sourceId]);\n\n const idsInList = new Set(items.map((item) => item.id));\n const selectedSet = new Set(selectedIds.filter((id) => idsInList.has(id)));\n\n if (!selectedSet.has(sourceId)) {\n return new Set([sourceId]);\n }\n\n return selectedSet;\n}\n\nexport function reorderFromDragState<T extends DraggableItem>(params: {\n items: T[];\n sourceId: string;\n sourceIndex: number;\n rawDestinationIndex: number;\n selectedIds: string[];\n multiDragEnabled: boolean;\n}): T[] {\n const {\n items,\n sourceId,\n sourceIndex,\n rawDestinationIndex,\n selectedIds,\n multiDragEnabled,\n } = params;\n\n if (multiDragEnabled) {\n const selectedSet = new Set(selectedIds);\n if (!selectedSet.has(sourceId)) {\n selectedSet.clear();\n }\n selectedSet.add(sourceId);\n\n const selectedIndexes = items\n .map((item, index) => (selectedSet.has(item.id) ? index : -1))\n .filter((index) => index !== -1);\n\n if (selectedIndexes.length > 1) {\n return reorderMany(items, selectedIndexes, rawDestinationIndex);\n }\n }\n\n const destinationIndex = normalizeDestinationIndex({\n itemCount: items.length,\n sourceIndex,\n rawDestinationIndex,\n isSameList: true,\n });\n\n return reorder(items, sourceIndex, destinationIndex);\n}\n\nexport function resolveDestination<T extends DraggableItem>(params: {\n location: LocationCurrent;\n sourceId: string;\n sourceIndex: number;\n direction: ListDirection;\n items: T[];\n excludedIds: Set<string>;\n}): DestinationInfo {\n const { location, sourceId, sourceIndex, direction, items, excludedIds } = params;\n const { dropTargets, input } = location;\n\n const destinationTarget = getClosestDestinationTarget({\n dropTargets,\n input,\n sourceId,\n excludedIds,\n });\n\n const containerTarget = dropTargets.find(\n (target) => target.data?.type === \"container\"\n );\n\n if (!destinationTarget && !containerTarget) return null;\n\n if (!destinationTarget) {\n if (!containerTarget) return null;\n\n const insertionIndex = getContainerInsertionIndex({\n containerElement: containerTarget.element,\n input,\n direction,\n items,\n excludedIds,\n });\n\n const rawDestinationIndex = insertionIndex ?? items.length;\n\n return {\n rawDestinationIndex,\n previewKey: `container:${rawDestinationIndex}`,\n };\n }\n\n const targetId = String(destinationTarget.data?.id ?? \"\");\n if (!targetId) return null;\n\n const targetIndex = items.findIndex((item) => item.id === targetId);\n if (targetIndex === -1) {\n // Fallback to target.data.index is unreliable after live reorders.\n // If the target id is not present in current items, skip this update.\n return null;\n }\n\n const edge = extractClosestEdge(destinationTarget.data);\n let isAfter: boolean;\n\n // Slot-based semantics:\n // dropping on an item moves dragged item to that item's slot,\n // which is \"after\" when moving down and \"before\" when moving up.\n if (sourceIndex < targetIndex) {\n isAfter = true;\n } else if (sourceIndex > targetIndex) {\n isAfter = false;\n } else if (edge === null) {\n const rect = destinationTarget.element.getBoundingClientRect();\n const axisCenter =\n direction === \"horizontal\"\n ? rect.left + rect.width / 2\n : rect.top + rect.height / 2;\n const axisPoint = direction === \"horizontal\" ? input.clientX : input.clientY;\n isAfter = axisPoint >= axisCenter;\n } else {\n isAfter = edge === \"bottom\" || (direction === \"horizontal\" && edge === \"right\");\n }\n\n const rawDestinationIndex = isAfter ? targetIndex + 1 : targetIndex;\n\n return {\n rawDestinationIndex,\n previewKey: `item:${targetId}:${isAfter ? \"after\" : \"before\"}`,\n };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { monitorForElements } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport type { ElementEventPayloadMap } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport type { DraggableItem, OrderUpdate } from \"../types\";\nimport { calculateOrderUpdates } from \"../utils/order\";\nimport {\n DEFAULT_DIRECTION,\n getMovingIds,\n hasOrderChanged,\n reorderFromDragState,\n resolveDestination,\n type ListDirection,\n type MonitorOptions,\n} from \"./useDragDropMonitor.logic\";\n\nexport function useDragDropMonitor<T extends DraggableItem>({\n items,\n onReorder,\n disabled = false,\n direction = DEFAULT_DIRECTION,\n selectedIds = [],\n multiDragEnabled = false,\n liveReorder = false,\n}: {\n items: T[];\n onReorder: (newItems: T[], orderUpdates: OrderUpdate[]) => void;\n disabled?: boolean;\n direction?: ListDirection;\n selectedIds?: string[];\n multiDragEnabled?: boolean;\n liveReorder?: boolean;\n}) {\n const itemsRef = useRef<T[]>(items);\n const onReorderRef = useRef(onReorder);\n const optionsRef = useRef<MonitorOptions>({\n direction,\n selectedIds,\n multiDragEnabled,\n liveReorder,\n });\n\n const dragSessionRef = useRef<{\n sourceId: string | null;\n movingIds: Set<string> | null;\n originalItems: T[] | null;\n didLiveReorder: boolean;\n lastPreviewKey: string | null;\n }>({\n sourceId: null,\n movingIds: null,\n originalItems: null,\n didLiveReorder: false,\n lastPreviewKey: null,\n });\n\n useEffect(() => {\n itemsRef.current = items;\n onReorderRef.current = onReorder;\n optionsRef.current = {\n direction,\n selectedIds,\n multiDragEnabled,\n liveReorder,\n };\n }, [items, onReorder, direction, selectedIds, multiDragEnabled, liveReorder]);\n\n const resetDragSession = useCallback(() => {\n dragSessionRef.current = {\n sourceId: null,\n movingIds: null,\n originalItems: null,\n didLiveReorder: false,\n lastPreviewKey: null,\n };\n }, []);\n\n const getSourceIndex = useCallback((sourceId: string, sourceDataIndex: unknown): number => {\n const currentItems = itemsRef.current;\n const currentIndex = currentItems.findIndex((item) => item.id === sourceId);\n if (currentIndex !== -1) return currentIndex;\n\n const parsedIndex = Number(sourceDataIndex);\n return Number.isFinite(parsedIndex) ? parsedIndex : -1;\n }, []);\n\n const getMovingIdsForSource = useCallback((sourceId: string): Set<string> => {\n const currentItems = itemsRef.current;\n const { selectedIds: currentSelectedIds, multiDragEnabled: currentMultiDragEnabled } =\n optionsRef.current;\n\n return getMovingIds({\n items: currentItems,\n sourceId,\n selectedIds: currentSelectedIds,\n multiDragEnabled: currentMultiDragEnabled,\n });\n }, []);\n\n const getSessionMovingIds = useCallback(\n (sourceId: string): Set<string> => {\n const sessionMovingIds = dragSessionRef.current.movingIds;\n if (sessionMovingIds) {\n return new Set(sessionMovingIds);\n }\n return getMovingIdsForSource(sourceId);\n },\n [getMovingIdsForSource]\n );\n\n const commitReorder = useCallback(\n ({\n sourceId,\n sourceIndex,\n rawDestinationIndex,\n }: {\n sourceId: string;\n sourceIndex: number;\n rawDestinationIndex: number;\n }): boolean => {\n const oldItems = [...itemsRef.current];\n const {\n selectedIds: currentSelectedIds,\n multiDragEnabled: currentMultiDragEnabled,\n } = optionsRef.current;\n\n const newItems = reorderFromDragState({\n items: oldItems,\n sourceId,\n sourceIndex,\n rawDestinationIndex,\n selectedIds: currentSelectedIds,\n multiDragEnabled: currentMultiDragEnabled,\n });\n\n if (!hasOrderChanged(oldItems, newItems)) return false;\n\n const orderUpdates = calculateOrderUpdates(oldItems, newItems);\n itemsRef.current = newItems;\n onReorderRef.current(newItems, orderUpdates);\n return true;\n },\n []\n );\n\n const handleDragStart = useCallback(\n ({ source }: ElementEventPayloadMap[\"onDragStart\"]) => {\n if (source.data?.type !== \"draggable-item\") return;\n\n const sourceId = source.data?.id as string | undefined;\n if (!sourceId) return;\n\n const currentItems = itemsRef.current;\n const { selectedIds: currentSelectedIds, multiDragEnabled: currentMultiDragEnabled } =\n optionsRef.current;\n const movingIds = getMovingIds({\n items: currentItems,\n sourceId,\n selectedIds: currentSelectedIds,\n multiDragEnabled: currentMultiDragEnabled,\n });\n\n dragSessionRef.current = {\n sourceId,\n movingIds,\n originalItems: optionsRef.current.liveReorder ? [...currentItems] : null,\n didLiveReorder: false,\n lastPreviewKey: null,\n };\n },\n []\n );\n\n const handleDropTargetChange = useCallback(\n ({ location, source }: ElementEventPayloadMap[\"onDropTargetChange\"]) => {\n if (source.data?.type !== \"draggable-item\") return;\n\n const { direction: currentDirection, liveReorder: currentLiveReorder } =\n optionsRef.current;\n if (!currentLiveReorder) return;\n\n const sourceId = source.data?.id as string | undefined;\n if (!sourceId) return;\n\n const sourceIndex = getSourceIndex(sourceId, source.data?.index);\n if (sourceIndex < 0) return;\n\n const currentItems = itemsRef.current;\n const movingIds = getSessionMovingIds(sourceId);\n const destination = resolveDestination({\n location: location.current,\n sourceId,\n sourceIndex,\n direction: currentDirection,\n items: currentItems,\n excludedIds: movingIds,\n });\n\n if (!destination) return;\n if (dragSessionRef.current.lastPreviewKey === destination.previewKey) return;\n\n const didReorder = commitReorder({\n sourceId,\n sourceIndex,\n rawDestinationIndex: destination.rawDestinationIndex,\n });\n\n dragSessionRef.current.lastPreviewKey = destination.previewKey;\n if (didReorder) {\n dragSessionRef.current.didLiveReorder = true;\n }\n },\n [getSourceIndex, getSessionMovingIds, commitReorder]\n );\n\n const handleDrop = useCallback(\n ({ location, source }: ElementEventPayloadMap[\"onDrop\"]) => {\n if (source.data?.type !== \"draggable-item\") {\n resetDragSession();\n return;\n }\n\n const sourceId = source.data?.id as string | undefined;\n if (!sourceId) {\n resetDragSession();\n return;\n }\n\n const { direction: currentDirection, liveReorder: currentLiveReorder } =\n optionsRef.current;\n const currentItems = itemsRef.current;\n const movingIds = getSessionMovingIds(sourceId);\n\n const sourceIndex = getSourceIndex(sourceId, source.data?.index);\n if (sourceIndex < 0) {\n resetDragSession();\n return;\n }\n\n const destination = resolveDestination({\n location: location.current,\n sourceId,\n sourceIndex,\n direction: currentDirection,\n items: currentItems,\n excludedIds: movingIds,\n });\n\n if (!destination) {\n const { originalItems, didLiveReorder } = dragSessionRef.current;\n if (currentLiveReorder && didLiveReorder && originalItems) {\n const oldItems = [...itemsRef.current];\n if (hasOrderChanged(oldItems, originalItems)) {\n const orderUpdates = calculateOrderUpdates(oldItems, originalItems);\n itemsRef.current = originalItems;\n onReorderRef.current(originalItems, orderUpdates);\n }\n }\n resetDragSession();\n return;\n }\n\n const { didLiveReorder, lastPreviewKey } = dragSessionRef.current;\n if (currentLiveReorder && didLiveReorder && lastPreviewKey === destination.previewKey) {\n resetDragSession();\n return;\n }\n\n commitReorder({\n sourceId,\n sourceIndex,\n rawDestinationIndex: destination.rawDestinationIndex,\n });\n resetDragSession();\n },\n [getSessionMovingIds, getSourceIndex, commitReorder, resetDragSession]\n );\n\n useEffect(() => {\n if (disabled) return;\n\n return monitorForElements({\n onDragStart: handleDragStart,\n onDropTargetChange: handleDropTargetChange,\n onDrop: handleDrop,\n });\n }, [disabled, handleDragStart, handleDropTargetChange, handleDrop]);\n\n // Kept for backward compatibility with existing tests/internals.\n return useCallback(() => {}, []);\n}\r\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { dropTargetForElements } from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\r\nimport { DraggableItemWrapper } from \"./DraggableItemWrapper\";\r\nimport type { DragDropListProps, DraggableItem } from \"../types\";\r\nimport { useDragDropMonitor } from \"../hooks/useDragDropMonitor\";\r\nimport { defaultStyles } from \"../styles/defaultStyles\";\r\n\r\nexport function DragDropList<T extends DraggableItem>({\r\n items,\r\n onReorder,\r\n renderItem,\r\n containerClassName = \"\",\r\n containerStyle = {},\r\n itemClassName = \"\",\r\n itemStyle = {},\r\n dragPreviewClassName = \"\",\r\n dragPreviewStyle = {},\r\n onDragStart,\r\n onDragEnd,\r\n disabled = false,\r\n gap,\r\n direction = \"vertical\",\r\n showDropIndicator = false,\r\n dropIndicatorClassName = \"\",\r\n dropIndicatorStyle = {},\r\n dropIndicatorPosition = \"bottom\",\r\n dragHandle,\n selectedIds = [],\n multiDragEnabled = false,\n liveReorder = false,\n}: DragDropListProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\r\n useDragDropMonitor({\n items,\n onReorder,\n disabled,\n direction,\n selectedIds,\n multiDragEnabled,\n liveReorder,\n });\n const [isDraggingOver, setIsDraggingOver] = useState(false);\r\n\r\n const getContainerStyles = (): React.CSSProperties => {\r\n const baseStyle = { ...defaultStyles.container.default };\r\n\r\n if (direction === \"horizontal\") {\r\n Object.assign(baseStyle, defaultStyles.container.horizontal);\r\n }\r\n\r\n if (isDraggingOver) {\r\n Object.assign(baseStyle, defaultStyles.container.dragging);\r\n }\r\n\r\n if (gap !== undefined) {\r\n baseStyle.gap = typeof gap === \"number\" ? `${gap}px` : gap;\r\n }\r\n\r\n return { ...baseStyle, ...containerStyle };\r\n };\r\n\r\n const createDropTarget = useCallback(\r\n (element: HTMLElement) => {\r\n if (disabled) return () => {};\r\n\r\n return dropTargetForElements({\r\n element,\r\n getData: () => ({ type: \"container\" }),\r\n onDragEnter: () => setIsDraggingOver(true),\r\n onDragLeave: () => setIsDraggingOver(false),\r\n onDrop: () => setIsDraggingOver(false),\r\n });\r\n },\r\n [disabled]\r\n );\r\n\r\n useEffect(() => {\r\n const element = containerRef.current;\r\n if (!element || disabled) return;\r\n\r\n return createDropTarget(element);\r\n }, [createDropTarget, disabled]);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={containerClassName}\r\n style={getContainerStyles()}\r\n >\r\n {items.map((item, index) => (\r\n <DraggableItemWrapper\r\n key={item.id}\r\n item={item}\r\n index={index}\r\n className={itemClassName}\r\n style={itemStyle}\r\n dragPreviewClassName={dragPreviewClassName}\r\n dragPreviewStyle={dragPreviewStyle}\r\n onDragStart={onDragStart}\r\n onDragEnd={onDragEnd}\r\n disabled={disabled}\r\n showDropIndicator={showDropIndicator}\r\n dropIndicatorClassName={dropIndicatorClassName}\r\n dropIndicatorStyle={dropIndicatorStyle}\r\n dropIndicatorPosition={dropIndicatorPosition}\r\n direction={direction}\r\n dragHandle={dragHandle}\r\n >\r\n {renderItem(item, index)}\r\n </DraggableItemWrapper>\r\n ))}\r\n </div>\r\n );\r\n}\r\n"],"names":["defaultStyles","container","default","minHeight","transition","borderRadius","border","backgroundColor","display","flexDirection","gap","padding","dragging","borderColor","horizontal","flexWrap","item","cursor","userSelect","position","opacity","hover","transform","boxShadow","disabled","preview","pointerEvents","zIndex","dropIndicator","height","left","right","DRAGGABLE_ITEM","DraggableItemWrapper","index","children","className","style","dragPreviewClassName","dragPreviewStyle","onDragStart","onDragEnd","showDropIndicator","dropIndicatorClassName","dropIndicatorStyle","dropIndicatorPosition","direction","dragHandle","elementRef","useRef","isDragging","setIsDragging","useState","isHovered","setIsHovered","dropPosition","setDropPosition","createDraggable","useCallback","element","dragHandleElement","querySelector","undefined","draggable","canDrag","Boolean","getInitialData","type","id","onGenerateDragPreview","nativeSetDragImage","previewElement","cloneNode","previewStyles","Object","assign","width","offsetWidth","offsetHeight","document","body","appendChild","requestAnimationFrame","remove","onDrop","createDropTarget","dropTargetForElements","getData","input","targetElement","baseData","allowedEdges","attachClosestEdge","canDrop","source","_a","_b","data","onDragEnter","self","onDragLeave","useEffect","current","combine","React","createElement","ref","baseStyle","getItemStyles","top","bottom","calculateOrderUpdates","oldItems","newItems","oldIndexById","Map","map","flatMap","oldIndex","get","newPosition","moved","getDistanceToTargetCenter","target","rect","getBoundingClientRect","centerX","centerY","Math","pow","clientX","clientY","hasOrderChanged","length","some","getMovingIds","params","items","sourceId","selectedIds","multiDragEnabled","Set","idsInList","selectedSet","filter","has","reorderFromDragState","sourceIndex","rawDestinationIndex","clear","add","selectedIndexes","list","uniqueIndexes","Array","from","sort","a","b","moving","remaining","_","clampedRaw","max","min","removedBeforeDestination","insertionIndex","result","splice","reorderMany","destinationIndex","itemCount","isSameList","maxRaw","adjusted","maxFinal","normalizeDestinationIndex","startIndex","endIndex","removed","reorder","resolveDestination","location","excludedIds","dropTargets","destinationTarget","candidates","targetId","String","_c","reduce","closest","getClosestDestinationTarget","containerTarget","find","containerElement","indexById","itemElements","querySelectorAll","targetPoint","points","itemId","getAttribute","distance","centerOnAxis","point","nearest","getContainerInsertionIndex","previewKey","targetIndex","findIndex","edge","extractClosestEdge","isAfter","axisCenter","useDragDropMonitor","onReorder","liveReorder","itemsRef","onReorderRef","optionsRef","dragSessionRef","movingIds","originalItems","didLiveReorder","lastPreviewKey","resetDragSession","getSourceIndex","sourceDataIndex","currentIndex","parsedIndex","Number","isFinite","getMovingIdsForSource","currentItems","currentSelectedIds","currentMultiDragEnabled","getSessionMovingIds","sessionMovingIds","commitReorder","orderUpdates","handleDragStart","handleDropTargetChange","currentDirection","currentLiveReorder","destination","didReorder","handleDrop","monitorForElements","onDropTargetChange","renderItem","containerClassName","containerStyle","itemClassName","itemStyle","containerRef","isDraggingOver","setIsDraggingOver","getContainerStyles","key"],"mappings":"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"}
|
package/dist/kanban.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e,{createContext as n,useRef as t,useState as r,useCallback as a,useEffect as o,useMemo as i,useContext as d}from"react";import{draggable as c,dropTargetForElements as l,monitorForElements as s}from"@atlaskit/pragmatic-drag-and-drop/element/adapter";import{attachClosestEdge as u,extractClosestEdge as g}from"@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";import{combine as m}from"@atlaskit/pragmatic-drag-and-drop/combine";const p=n(null),f="kanban-column";function b({column:n,cardIds:i,children:d,isDragDisabled:s=!1,index:g}){const m=t(null),p=t(null),[b,x]=r(!1),[D,y]=r(!1),v=a(e=>s?()=>{}:c({element:e,getInitialData:()=>({type:f,id:n.id,index:g}),onDragStart:()=>x(!0),onDrop:()=>x(!1)}),[n.id,g,s]),I=a(e=>s?()=>{}:l({element:e,getData:({input:e,element:t})=>{const r={type:f,id:n.id,index:g};return u(r,{input:e,element:t,allowedEdges:["left","right"]})},canDrop:({source:e})=>e.data.type===f&&e.data.id!==n.id}),[n.id,g,s]),h=a(e=>l({element:e,getData:()=>({type:"kanban-column-drop-zone",columnId:n.id}),canDrop:({source:e})=>"kanban-card"===e.data.type,onDragEnter:()=>y(!0),onDragLeave:()=>y(!1),onDrop:()=>y(!1)}),[n.id]);o(()=>{const e=m.current,n=p.current;if(!e||!n)return;const t=[v(e),I(e),h(n)];return()=>{t.forEach(e=>e())}},[v,I,h]);const
|
|
1
|
+
import e,{createContext as n,useRef as t,useState as r,useCallback as a,useEffect as o,useMemo as i,useContext as d}from"react";import{draggable as c,dropTargetForElements as l,monitorForElements as s}from"@atlaskit/pragmatic-drag-and-drop/element/adapter";import{attachClosestEdge as u,extractClosestEdge as g}from"@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";import{combine as m}from"@atlaskit/pragmatic-drag-and-drop/combine";const p=n(null),f="kanban-column";function b({column:n,cardIds:i,children:d,isDragDisabled:s=!1,index:g}){const m=t(null),p=t(null),[b,x]=r(!1),[D,y]=r(!1),v=a(e=>s?()=>{}:c({element:e,getInitialData:()=>({type:f,id:n.id,index:g}),onDragStart:()=>x(!0),onDrop:()=>x(!1)}),[n.id,g,s]),I=a(e=>s?()=>{}:l({element:e,getData:({input:e,element:t})=>{const r={type:f,id:n.id,index:g};return u(r,{input:e,element:t,allowedEdges:["left","right"]})},canDrop:({source:e})=>e.data.type===f&&e.data.id!==n.id}),[n.id,g,s]),h=a(e=>l({element:e,getData:()=>({type:"kanban-column-drop-zone",columnId:n.id}),canDrop:({source:e})=>"kanban-card"===e.data.type,onDragEnter:()=>y(!0),onDragLeave:()=>y(!1),onDrop:()=>y(!1)}),[n.id]);o(()=>{const e=m.current,n=p.current;if(!e||!n)return;const t=[v(e),I(e),h(n)];return()=>{t.forEach(e=>e())}},[v,I,h]);const w={draggableProps:{"data-draggable-id":n.id,"data-draggable-type":"COLUMN",style:b?{opacity:.5}:void 0},dragHandleProps:{tabIndex:0,role:"button","aria-roledescription":"draggable column","aria-label":`${n.title}, ${i.length} cards, press space to pick up`},innerRef:m,dropZoneRef:p},E={isDragging:b,isDraggingOver:D};return e.createElement(e.Fragment,null,d(w,E))}const x="kanban-card";function D({card:n,children:i,isDragDisabled:d=!1,index:s,columnId:g}){const p=t(null),[f,b]=r(!1),[D,y]=r(!1),v=a(e=>d?()=>{}:c({element:e,getInitialData:()=>({type:x,id:n.id,index:s,columnId:g}),onDragStart:()=>b(!0),onDrop:()=>b(!1)}),[n.id,s,g,d]),I=a(e=>d?()=>{}:l({element:e,getData:({input:e,element:t})=>{const r={type:x,id:n.id,index:s,columnId:g};return u(r,{input:e,element:t,allowedEdges:["top","bottom"]})},canDrop:({source:e})=>e.data.type===x&&e.data.id!==n.id,onDragEnter:()=>y(!0),onDragLeave:()=>y(!1),onDrop:()=>y(!1)}),[n.id,s,g,d]);o(()=>{const e=p.current;if(e&&!d)return m(v(e),I(e))},[v,I,d]);const h={draggableProps:{"data-draggable-id":n.id,"data-draggable-type":"CARD",style:f?{opacity:.5}:void 0},dragHandleProps:{tabIndex:0,role:"button","aria-roledescription":"draggable card","aria-label":`${n.title}, press space to pick up`},innerRef:p},w={isDragging:f,isDraggingOver:D};return e.createElement(e.Fragment,null,i(h,w))}function y(e,n,t){const r=Array.from(e),[a]=r.splice(n,1);return r.splice(t,0,a),r}function v(e){const{itemCount:n,sourceIndex:t,rawDestinationIndex:r,isSameList:a}=e;if(n<=0)return 0;const o=n,i=Math.max(0,Math.min(r,o)),d=a&&t<i?i-1:i,c=a?n-1:n;return Math.max(0,Math.min(d,c))}function I(e,n){if(!n.destination)return e;const{source:t,destination:r,type:a}=n;return"COLUMN"===a?t.index===r.index?e:function(e,n,t){return Object.assign(Object.assign({},e),{columns:y(e.columns,n,t)})}(e,t.index,r.index):"CARD"===a?t.columnId===r.columnId?t.index===r.index?e:function(e,n,t,r){const a=e.columns.find(e=>e.id===n);if(!a)return e;const o=y(a.cardIds,t,r);return Object.assign(Object.assign({},e),{columns:e.columns.map(e=>e.id===n?Object.assign(Object.assign({},e),{cardIds:o}):e)})}(e,t.columnId,t.index,r.index):function(e,n,t,r){const a=e.columns.find(e=>e.id===n.columnId),o=e.columns.find(e=>e.id===t.columnId);if(!a||!o)return e;const i=[...a.cardIds];i.splice(n.index,1);const d=[...o.cardIds];return d.splice(t.index,0,r),Object.assign(Object.assign({},e),{columns:e.columns.map(e=>e.id===n.columnId?Object.assign(Object.assign({},e),{cardIds:i}):e.id===t.columnId?Object.assign(Object.assign({},e),{cardIds:d}):e)})}(e,t,r,n.draggableId):e}const h="kanban-card",w="kanban-column";function E({onDragStart:e,onDragEnd:n,state:t,disabled:a}){const[i,d]=r({draggingId:null,draggingType:null,source:null,destination:null});return o(()=>{if(a)return;return s({onDragStart({source:n}){const t=n.data.type,r=n.data.id,a=n.data.columnId,o=n.data.index,i=t===h?"CARD":"COLUMN",c={columnId:"CARD"===i?a:void 0,index:o};d({draggingId:r,draggingType:i,source:c,destination:c}),null==e||e({id:r,type:i})},onDrop({source:e,location:r}){const a=e.data.type,o=e.data.id,i=e.data.index,c=e.data.columnId,l=r.current.dropTargets;let s;if(a===h){const e=l.find(e=>"kanban-column-drop-zone"===e.data.type);if(e){const n=e.data.columnId,r=t.columns.find(e=>e.id===c),a=t.columns.find(e=>e.id===n);if(r&&a){const e=l.find(e=>e.data.type===h&&e.data.id!==o);let t=a.cardIds.length;if(e){const n=e.data.index;t="bottom"===g(e.data)?n+1:n}const d=c===n,u=v({itemCount:d?r.cardIds.length:a.cardIds.length,sourceIndex:i,rawDestinationIndex:t,isSameList:d});s={columnId:n,index:u}}}}else if(a===w){const e=l.find(e=>e.data.type===w&&e.data.id!==o);if(e){const n=e.data.index,r=g(e.data),a="bottom"===r||"right"===r?n+1:n;s={index:v({itemCount:t.columns.length,sourceIndex:i,rawDestinationIndex:a,isSameList:!0})}}}const u={type:a===h?"CARD":"COLUMN",source:{columnId:c,index:i},destination:s,draggableId:o};d({draggingId:null,draggingType:null,source:null,destination:null}),n(u,t)}})},[a,e,n,t]),i}function O({state:n,onDragEnd:t,onDragStart:r,renderColumn:a,renderCard:o,getCardKey:d,getColumnKey:c,isDragDisabled:l,className:s,style:u}){const g=E({state:n,onDragEnd:t,onDragStart:r,disabled:!1}),m=i(()=>({state:n,dragState:g,isDragDisabled:l}),[n,g,l]),f=d||(e=>e.id),x=c||(e=>e.id);return e.createElement(p.Provider,{value:m},e.createElement("div",{className:s,style:Object.assign({display:"flex",gap:"16px"},u)},n.columns.map((t,r)=>e.createElement(b,{key:x(t),column:t,cardIds:t.cardIds,index:r,isDragDisabled:null==l?void 0:l(t.id,"COLUMN")},(r,i)=>e.createElement("div",Object.assign({ref:r.innerRef},r.draggableProps,{style:Object.assign({minWidth:"250px",display:"flex",flexDirection:"column"},r.draggableProps.style)}),e.createElement("div",Object.assign({},r.dragHandleProps),a(t,r,i)),e.createElement("div",{ref:r.dropZoneRef,style:{flex:1,minHeight:"100px",display:"flex",flexDirection:"column",gap:"8px"}},t.cardIds.map((r,a)=>{const i=n.cards[r];return i?e.createElement(D,{key:f(i),card:i,index:a,columnId:t.id,isDragDisabled:null==l?void 0:l(i.id,"CARD")},(n,t)=>e.createElement("div",Object.assign({ref:n.innerRef},n.draggableProps,n.dragHandleProps),o(i,n,t))):null})))))))}const C={threshold:50,maxSpeed:20,enabled:!0};function $(e,n,r={}){const{threshold:i,maxSpeed:d,enabled:c}=Object.assign(Object.assign({},C),r),l=t(),s=t(null),u=a(e=>{s.current={x:e.clientX,y:e.clientY}},[]),g=a(()=>{if(!(c&&n&&e.current&&s.current))return;const t=function(e){if(!e)return null;let n=e.parentElement;for(;n;){const{overflow:e,overflowY:t}=window.getComputedStyle(n);if(/(auto|scroll)/.test(e+t))return n;n=n.parentElement}return document.documentElement}(e.current);if(!t)return;const r=t.getBoundingClientRect(),a=s.current,o=function(e){const{overflow:n,overflowY:t,overflowX:r}=window.getComputedStyle(e),a=/(auto|scroll)/.test(n+t),o=/(auto|scroll)/.test(n+r);return{vertical:a&&e.scrollHeight>e.clientHeight,horizontal:o&&e.scrollWidth>e.clientWidth}}(t),u=function(e,n,t){const r=function(e,n){return{top:e.y-n.top,right:n.right-e.x,bottom:n.bottom-e.y,left:e.x-n.left}}(e,n);for(const[e,n]of Object.entries(r))if(n<t)return{edge:e,distance:n};return{edge:null,distance:1/0}}(a,r,i);if(u.edge){const e=function(e,n,t){return e>=n?0:(n-e)/n*t}(u.distance,i,d),n={x:0,y:0};o.vertical&&("top"===u.edge?n.y=-e:"bottom"===u.edge&&(n.y=e)),o.horizontal&&("left"===u.edge?n.x=-e:"right"===u.edge&&(n.x=e)),0===n.x&&0===n.y||function(e,n){n.x&&(e.scrollLeft+=n.x),n.y&&(e.scrollTop+=n.y)}(t,n)}l.current=requestAnimationFrame(g)},[c,n,e,i,d]);o(()=>c&&n?(window.addEventListener("mousemove",u),l.current=requestAnimationFrame(g),()=>{window.removeEventListener("mousemove",u),l.current&&cancelAnimationFrame(l.current)}):(l.current&&(cancelAnimationFrame(l.current),l.current=void 0),void(s.current=null)),[c,n,u,g])}const j=n(null);function S(){const e=d(j);if(!e)throw new Error("useAnnouncer must be used within AnnouncerProvider");return e}function P({children:n,politeness:r="polite"}){const a=t(null),i=t(null),d=t();o(()=>()=>{d.current&&clearTimeout(d.current)},[]);const c={announce:(e,n=r)=>{const t="assertive"===n?i:a;t.current&&(d.current&&clearTimeout(d.current),t.current.textContent="",d.current=setTimeout(()=>{t.current&&(t.current.textContent=e)},100))}};return e.createElement(j.Provider,{value:c},n,e.createElement("div",{ref:a,role:"status","aria-live":"polite","aria-atomic":"true",style:{position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:"0"}}),e.createElement("div",{ref:i,role:"alert","aria-live":"assertive","aria-atomic":"true",style:{position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:"0"}}))}const k={onDragStart:(e,n,t)=>`Picked up ${e}. Position ${n+1} of ${t}.`,onDragMove:(e,n,t)=>`${e} moved to position ${n+1} of ${t}.`,onDragEnd:(e,n,t,r)=>n===t?`${e} dropped. Position ${r+1} in ${t}.`:`${e} moved from ${n} to ${t}. Position ${r+1}.`,onDragCancel:(e,n)=>`Drag cancelled. ${e} returned to ${n}.`,onColumnMove:(e,n,t)=>`${e} moved to position ${n+1} of ${t}.`};export{P as AnnouncerProvider,O as KanbanBoard,D as KanbanCardView,b as KanbanColumnView,k as announcements,I as applyDragResult,y as reorderArray,S as useAnnouncer,$ as useAutoscroll,E as useKanbanDnd};
|
|
2
2
|
//# sourceMappingURL=kanban.esm.js.map
|