@ohkit/draggable-box 0.0.2 → 0.0.4
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 +182 -1
- package/dist/index.es.js +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.modern.mjs +1 -1
- package/dist/index.modern.mjs.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/types/index.d.ts +26 -10
- package/dist/types/type.d.ts +25 -0
- package/dist/types/utils.d.ts +6 -0
- package/package.json +3 -3
- package/src/index.tsx +145 -45
- package/src/type.ts +26 -0
- package/src/utils.ts +10 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils.ts","../src/constants.ts","../src/index.tsx"],"sourcesContent":["import {findParent} from '@ohkit/dom-helper';\n\n/**\n * 检查元素是否创建了新的定位上下文(包含块)\n * @param element 要检查的元素\n * @param includePosition 是否检查position属性(absolute/relative/fixed)\n */\nexport function isPositioningContextCreator(element: HTMLElement, includePosition: boolean): boolean {\n const style = window.getComputedStyle(element);\n const position = style.getPropertyValue('position');\n const transform = style.getPropertyValue('transform');\n const filter = style.getPropertyValue('filter');\n const perspective = style.getPropertyValue('perspective');\n const contain = style.getPropertyValue('contain');\n const willChange = style.getPropertyValue('will-change');\n \n return (includePosition && position !== 'static') || \n transform !== 'none' || \n filter !== 'none' || \n perspective !== 'none' ||\n contain.includes('paint') ||\n contain.includes('layout') ||\n contain.includes('strict') ||\n willChange.includes('transform') ||\n willChange.includes('perspective') ||\n willChange.includes('filter');\n}\n\n/**\n * 查找影响 fixed 定位的父元素\n * 当父元素有 transform/filter/perspective/contain/will-change 等属性时,fixed 定位会相对于该父元素\n */\nexport function findFixedPositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.documentElement;\n }\n const fixedPositionParent = findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, false);\n }, {excludeOwn: true}); // 没有找到,返回 window(通过 document.documentElement)\n return fixedPositionParent;\n}\n\n/**\n * 查找 absolute 定位的父元素\n * 查找最近的包含块创建者,包含所有可能影响absolute定位的属性\n */\nexport function findAbsolutePositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.body;\n }\n return findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, true);\n }, {excludeOwn: true});\n}\n\n/**\n * 获取容器的缩放比例\n * 通过比较元素的实际尺寸和 getBoundingClientRect 返回的尺寸来计算缩放比例\n */\nexport function getScaleRatio(dom?: HTMLElement | null): { scaleX: number; scaleY: number } {\n if (!dom) {\n return { scaleX: 1, scaleY: 1 };\n }\n // 通过比较 offsetWidth 和 getBoundingClientRect().width 来获取缩放比例\n const rect = dom.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n // 扩大{magnification}倍进行计算, 相当于保留小数点后4位\n const magnification = 10000;\n scaleX = dom.offsetWidth > 0 ? Math.round(rect.width / dom.offsetWidth * magnification) / magnification : 1;\n scaleY = dom.offsetHeight > 0 ? Math.round(rect.height / dom.offsetHeight * magnification) / magnification : 1;\n // console.log('rect.width dom.offsetWidth', rect.width, dom.offsetWidth);\n // console.log('rect.height dom.offsetHeight', rect.height, dom.offsetHeight);\n // console.log('scaleX', scaleX, 'scaleY', scaleY);\n return { scaleX, scaleY };\n}\n\n/**\n * 限制数值在指定范围内\n * \n * @param value 要限制的数值\n * @param min 最小值\n * @param max 最大值\n * @returns 限制后的数值,确保在 [min, max] 范围内\n */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n","\nexport const ValidPlacement = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n","import React from 'react';\nimport {\n prefixClassname as p,\n classNames as cx,\n} from \"@ohkit/prefix-classname\";\nimport {addEventListener, addClass} from '@ohkit/dom-helper';\nimport {findFixedPositionParent, findAbsolutePositionParent, getScaleRatio, clamp} from './utils';\nimport {ValidPlacement} from './constants';\nimport {DraggableBoxProps, DraggableBoxState} from './type';\n\nimport './style.scss';\n\nexport const c = p(\"ohkit-draggable-box__\");\nexport class DraggableBox extends React.Component<DraggableBoxProps, DraggableBoxState> {\n static defaultProps: Partial<DraggableBoxProps> = {\n zIndex: 9999,\n offsetX: 20,\n offsetY: 20,\n placement: 'bottom-right',\n disabled: false,\n lockAxis: 'none',\n showDragArea: false,\n positionMode: 'fixed',\n };\n\n constructor(props: DraggableBoxProps) {\n super(props);\n \n const { placement = 'bottom-right', offsetY = 20, offsetX = 20 } = props;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n // 简化状态初始化\n this.state = {\n top: placementY === 'top' ? offsetY : undefined,\n bottom: placementY === 'bottom' ? offsetY : undefined,\n left: placementX === 'left' ? offsetX : undefined,\n right: placementX === 'right' ? offsetX : undefined,\n };\n }\n\n private prePositionMode: DraggableBoxProps['positionMode'];\n private preDraggerRef: HTMLElement | null = null;\n private container: HTMLElement | null = null;\n /**\n * 获取定位容器\n * 根据 positionMode 返回对应的定位父元素\n */\n private getContainer(useCache = true) {\n const { positionMode = 'fixed' } = this.props;\n if (!this.container || !useCache || this.prePositionMode !== positionMode || this.preDraggerRef !== this.draggerRef) {\n this.prePositionMode = positionMode;\n this.preDraggerRef = this.draggerRef;\n this.container = positionMode === 'fixed' \n ? findFixedPositionParent(this.draggerRef) \n : findAbsolutePositionParent(this.draggerRef);\n }\n return this.container;\n }\n\n /**\n * 获取容器的尺寸和位置信息\n */\n private getContainerRect() {\n const container = this.getContainer(false);\n if (!container) {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n left: 0,\n top: 0,\n scrollLeft: 0,\n scrollTop: 0,\n scrollerScrollLeft: 0,\n scrollerScrollTop: 0,\n borderLeftWidth: 0,\n borderTopWidth: 0\n };\n }\n const containerRect = container.getBoundingClientRect();\n \n // 获取容器的border宽度(仅 top, left 对坐标计算有影响)\n const containerStyle = window.getComputedStyle(container);\n const borderLeftWidth = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTopWidth = parseFloat(containerStyle.borderTopWidth) || 0;\n const borderRightWidth = parseFloat(containerStyle.borderRightWidth) || 0;\n const borderBottomWidth = parseFloat(containerStyle.borderBottomWidth) || 0;\n const yScrollerWidth = container.offsetWidth - container.clientWidth - borderLeftWidth - borderRightWidth;\n const xScrollerHeight = container.offsetHeight - container.clientHeight - borderTopWidth - borderBottomWidth;\n // console.log('yScrollerWidth, xScrollerHeight', yScrollerWidth, xScrollerHeight);\n\n return {\n width: containerRect.width / this.cachedScaleX - borderLeftWidth - borderRightWidth - yScrollerWidth,\n height: containerRect.height / this.cachedScaleY - borderTopWidth - borderBottomWidth - xScrollerHeight,\n left: containerRect.left / this.cachedScaleX,\n top: containerRect.top / this.cachedScaleY,\n scrollLeft: container.scrollLeft,\n scrollTop: container.scrollTop,\n borderLeftWidth: borderLeftWidth,\n borderTopWidth: borderTopWidth,\n };\n }\n\n get dragBoxSize() {\n let width = 0;\n let height = 0;\n if (this.draggerRef) {\n width = this.draggerRef.offsetWidth;\n height = this.draggerRef.offsetHeight;\n }\n return {\n height,\n width\n };\n }\n\n get dragPositionBoundaries() {\n const { boundsX, boundsY, placement = 'bottom-right' } = this.props;\n const dragSize = this.dragBoxSize;\n const {width: containerWidth, height: containerHeight} = this.getContainerRect();\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n const defaultBounds = {\n minX: 0,\n maxX: Math.max(containerWidth - dragSize.width, 0),\n minY: 0,\n maxY: Math.max(containerHeight- dragSize.height, 0),\n };\n // 初始化边界\n let {minX, maxX, minY, maxY} = defaultBounds\n\n // 处理X轴边界\n if (boundsX) {\n const [minBound, maxBound] = boundsX;\n if (placementX === 'left') {\n // 左边位置:boundsX=[左边最小距离, 左边最大距离]\n if (minBound !== undefined) minX = Math.max(minX, minBound);\n if (maxBound !== undefined) maxX = Math.min(maxX, maxBound);\n } else {\n // 右边位置:boundsX=[右边最小距离, 右边最大距离]\n // 直接使用边界值作为right的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n }\n }\n }\n\n // 处理Y轴边界\n if (boundsY) {\n const [minBound, maxBound] = boundsY;\n \n if (placementY === 'top') {\n // 顶部位置:boundsY=[顶边最小距离, 顶边最大距离]\n if (minBound !== undefined) minY = Math.max(minY, minBound);\n if (maxBound !== undefined) maxY = Math.min(maxY, maxBound);\n } else {\n // 底部位置:boundsY=[底边最小距离, 底边最大距离]\n // 直接使用边界值作为bottom的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n }\n }\n }\n // 确保各个边界值在默认范围内\n minX = clamp(minX, defaultBounds.minX, defaultBounds.maxX);\n maxX = clamp(maxX, minX, defaultBounds.maxX);\n minY = clamp(minY, defaultBounds.minY, defaultBounds.maxY);\n maxY = clamp(maxY, minY, defaultBounds.maxY);\n\n return { minX, maxX, minY, maxY };\n }\n\n get curPositionKey() {\n let {placement} = this.props;\n if (!placement || !ValidPlacement.includes(placement)) {\n placement = 'bottom-right';\n }\n return placement.split('-') as ['top' | 'bottom', 'left' | 'right']; // [y, x]\n }\n\n get position() {\n const [y, x] = this.curPositionKey;\n const positionStyles: Record<string, string> = {};\n \n // 确保位置值存在且是有效的数字\n if (this.state[y] !== undefined) {\n positionStyles[y] = `${this.state[y]}px`;\n }\n if (this.state[x] !== undefined) {\n positionStyles[x] = `${this.state[x]}px`;\n }\n \n return positionStyles;\n }\n\n draggerRef: HTMLDivElement | null = null;\n\n isDragging = false;\n\n axisX?: number;\n axisY?: number;\n dX = 0;\n dY = 0;\n startTop = 0;\n startLeft = 0;\n\n // 缓存缩放比例,避免在 dragging 中频繁计算\n cachedScaleX = 1;\n cachedScaleY = 1;\n\n __moveDisposer?: () => void;\n __clickDisposer?: () => void;\n __bodyClassDisposer?: () => void;\n __upDisposer?: () => void;\n __resizeDisposer?: () => void;\n\n dragAreaRef: HTMLDivElement | null = null;\n\n reportStartPosition() {\n if (this.draggerRef) {\n // 获取缩放比例\n const { scaleX, scaleY } = getScaleRatio(this.getContainer());\n this.cachedScaleX = scaleX;\n this.cachedScaleY = scaleY;\n const { top, left } = this.draggerRef.getBoundingClientRect();\n const containerRect = this.getContainerRect();\n // console.log(containerRect, 'containerRect');\n \n // 计算相对于容器的位置,并除以缩放比例得到未缩放的坐标\n this.startTop = top / scaleY - containerRect.top + containerRect.scrollTop - containerRect.borderTopWidth;\n this.startLeft = left / scaleY - containerRect.left + containerRect.scrollLeft - containerRect.borderLeftWidth;\n }\n }\n\n enableDrag = () => {\n this.reportStartPosition();\n this.__moveDisposer?.();\n this.__moveDisposer = addEventListener(document, 'mousemove', (evt) => {\n // INFO: 移动过程中禁止click事件\n if (!this.__clickDisposer) {\n const moveDistanse = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2));\n // INFO: 移动超过5px?? 确保用户有真实的移动意愿,而不是手抖~~\n if (moveDistanse > 5) {\n this.__clickDisposer = addEventListener(\n document,\n 'click',\n (evt) => {\n evt.stopPropagation();\n },\n true\n );\n this.__bodyClassDisposer = addClass([document.body, this.draggerRef], c('moving')) || undefined;\n \n // 显示拖拽区域\n if (this.props.showDragArea && this.dragAreaRef) {\n this.showDragArea();\n }\n }\n }\n this.dragging(evt);\n }, true);\n\n this.__upDisposer?.();\n this.__upDisposer = addEventListener(\n document,\n 'mouseup',\n (evt) => {\n this.endDrag();\n evt.stopPropagation();\n evt.preventDefault();\n },\n true\n );\n };\n\n startDrag = (evt: React.MouseEvent<HTMLDivElement>) => {\n // 判断鼠标非右击才继续执行\n if (evt.nativeEvent.button === 2) {\n return;\n }\n this.axisX = evt.nativeEvent.pageX;\n this.axisY = evt.nativeEvent.pageY;\n if (!this.props.disabled) {\n this.enableDrag();\n }\n };\n\n dragging = (evt: MouseEvent) => {\n this.isDragging = true;\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n \n // 使用缓存的缩放比例,避免频繁计算\n const scaleX = this.cachedScaleX;\n const scaleY = this.cachedScaleY;\n \n // 计算原始偏移量(需要除以缩放比例)\n this.dX = (evt.pageX - (this.axisX || 0)) / scaleX;\n this.dY = (evt.pageY - (this.axisY || 0)) / scaleY;\n \n // 应用方向锁定并计算变换值\n let translateX = this.dX;\n let translateY = this.dY;\n \n if (lockAxis === 'x') {\n translateY = 0; // 锁定Y方向\n } else if (lockAxis === 'y') {\n translateX = 0; // 锁定X方向\n }\n \n // 应用边界条件到允许移动的方向\n const potentialLeft = this.startLeft + translateX;\n const potentialTop = this.startTop + translateY;\n \n // X轴边界条件(在允许X轴移动时应用)\n if (lockAxis !== 'y') {\n if (potentialLeft < minX) {\n translateX = minX - this.startLeft;\n } else if (potentialLeft > maxX) {\n translateX = maxX - this.startLeft;\n }\n }\n \n // Y轴边界条件(在允许Y轴移动时应用)\n if (lockAxis !== 'x') {\n if (potentialTop < minY) {\n translateY = minY - this.startTop;\n } else if (potentialTop > maxY) {\n translateY = maxY - this.startTop;\n }\n }\n \n if (this.draggerRef) {\n this.draggerRef.style.transform = `translate(${translateX}px, ${translateY}px)`;\n }\n evt.stopPropagation();\n };\n\n endDrag = () => {\n if (this.isDragging) {\n this.calcPosition();\n if (this.draggerRef) {\n this.draggerRef.style.transform = '';\n }\n \n // 隐藏拖拽区域\n if (this.props.showDragArea) {\n this.hideDragArea();\n }\n }\n\n this.__moveDisposer?.();\n this.__moveDisposer = undefined;\n if (this.__clickDisposer) {\n requestAnimationFrame(() => {\n if (this.__clickDisposer) {\n this.__clickDisposer();\n this.__clickDisposer = undefined;\n }\n });\n }\n this.__upDisposer?.();\n this.__upDisposer = undefined;\n this.__bodyClassDisposer?.();\n this.__bodyClassDisposer = undefined;\n\n this.isDragging = false;\n };\n\n showDragArea = () => {\n if (!this.props.showDragArea || !this.dragAreaRef) return;\n \n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const dragSize = this.dragBoxSize;\n \n // 重置样式\n this.dragAreaRef.style.border = '1px dashed var(--ohkit-color-primary, #1890ff)';\n this.dragAreaRef.style.backgroundColor = 'rgba(173, 216, 230, 0.2)'; // 淡透蓝色\n \n if (lockAxis === 'x') {\n // 锁定Y方向,显示为水平虚线区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = '2px'; // 更细的虚线高度\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${this.startTop + dragSize.height / 2}px`;\n } else if (lockAxis === 'y') {\n // 锁定X方向,显示为垂直虚线区域\n this.dragAreaRef.style.width = '2px'; // 更细的虚线宽度\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${this.startLeft + dragSize.width / 2}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n } else {\n // 自由拖拽,显示完整区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n }\n \n this.dragAreaRef.style.display = 'block';\n };\n\n hideDragArea = () => {\n if (this.dragAreaRef) {\n this.dragAreaRef.style.display = 'none';\n }\n };\n calcPosition = () => {\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const {height, width} = this.getContainerRect();\n \n // 计算新的位置\n let newTop = this.startTop;\n let newLeft = this.startLeft;\n \n if (lockAxis !== 'y') {\n newLeft += this.dX;\n }\n if (lockAxis !== 'x') {\n newTop += this.dY;\n }\n \n // 应用边界限制\n const realTop = clamp(newTop, minY, maxY);\n const realLeft = clamp(newLeft, minX, maxX);\n const realBottom = height - realTop - this.dragBoxSize.height;\n const realRight = width - realLeft - this.dragBoxSize.width;\n if (realTop !== this.state.top || realLeft !== this.state.left || this.state.bottom !== realBottom || this.state.right !== realRight) {\n // console.log(minY, maxY, this.startTop, this.dY, newTop, realTop, 'minY, maxY, this.startTop, this.dY, newTop, realTop --- calcPosition y');\n // console.log(minX, maxX, this.startLeft, this.dX, newLeft, realLeft, 'minX, maxX, this.startLeft, this.dX, newLeft, realLeft ---calcPosition x');\n this.setState({\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight\n });\n }\n this.startTop = realTop;\n this.startLeft = realLeft;\n this.dX = this.dY = 0;\n };\n\n\n componentDidMount() {\n // 检查初始位置是否在边界范围内,如果不在则修正\n this.reportStartPosition();\n this.calcPosition();\n \n this.__resizeDisposer = addEventListener(window, 'resize', () => {\n this.calcPosition();\n });\n }\n\n componentWillUnmount() {\n this.__resizeDisposer?.();\n this.__bodyClassDisposer?.();\n this.__moveDisposer?.();\n this.__clickDisposer?.();\n this.__upDisposer?.();\n }\n\n render() {\n const { className, zIndex, children, showDragArea, positionMode = 'fixed' } = this.props;\n const { startDrag, endDrag } = this;\n const stl = {\n zIndex,\n ...this.position,\n position: positionMode\n };\n return (\n <>\n {showDragArea && (\n <div\n className={c('drag-area')}\n ref={(r) => {\n this.dragAreaRef = r;\n }}\n style={{\n display: 'none',\n position: positionMode,\n backgroundColor: 'rgba(173, 216, 230, 0.2)', // 淡透蓝色\n border: '1px dashed var(--ohkit-color-primary, #1890ff)',\n pointerEvents: 'none',\n zIndex: (zIndex || 9999) - 1,\n boxSizing: 'border-box',\n borderRadius: this.props.lockAxis !== 'none' ? '2px' : '0',\n }}\n />\n )}\n <div\n className={cx(c('container'), className)}\n style={stl}\n ref={(r) => {\n this.draggerRef = r;\n }}\n onMouseDown={startDrag}\n onMouseUp={endDrag}\n >\n {children}\n </div>\n </>\n );\n }\n}\n\nexport default DraggableBox;"],"names":["isPositioningContextCreator","element","includePosition","style","window","getComputedStyle","position","getPropertyValue","transform","filter","perspective","contain","willChange","includes","clamp","value","min","max","Math","ValidPlacement","c","p","prefixClassname","DraggableBox","_React$Component","props","_this","call","this","prePositionMode","preDraggerRef","container","draggerRef","isDragging","axisX","axisY","dX","dY","startTop","startLeft","cachedScaleX","cachedScaleY","__moveDisposer","__clickDisposer","__bodyClassDisposer","__upDisposer","__resizeDisposer","dragAreaRef","enableDrag","reportStartPosition","addEventListener","document","evt","sqrt","pow","stopPropagation","addClass","body","undefined","showDragArea","dragging","endDrag","preventDefault","startDrag","nativeEvent","button","pageX","pageY","disabled","lockAxis","_this$dragPositionBou","dragPositionBoundaries","minX","maxX","minY","maxY","scaleY","translateX","translateY","potentialLeft","potentialTop","calcPosition","hideDragArea","requestAnimationFrame","_this$dragPositionBou2","dragSize","dragBoxSize","border","backgroundColor","width","height","left","top","display","_this$dragPositionBou3","_this$getContainerRec","getContainerRect","newTop","newLeft","realTop","realLeft","realBottom","realRight","state","bottom","right","setState","_props$placement","placement","_props$offsetY","offsetY","_props$offsetX","offsetX","_placement$split","split","placementY","placementX","_proto","prototype","getContainer","useCache","dom","_this$props$positionM","positionMode","findParent","parent","excludeOwn","documentElement","findAbsolutePositionParent","innerWidth","innerHeight","scrollLeft","scrollTop","scrollerScrollLeft","scrollerScrollTop","borderLeftWidth","borderTopWidth","containerRect","getBoundingClientRect","containerStyle","parseFloat","borderRightWidth","borderBottomWidth","offsetWidth","clientWidth","offsetHeight","clientHeight","_getScaleRatio","scaleX","rect","magnification","round","getScaleRatio","_this$draggerRef$getB","componentDidMount","_this2","componentWillUnmount","_this$__resizeDispose","_this$__bodyClassDisp","_this$__moveDisposer","_this$__clickDisposer","_this$__upDisposer","render","_this3","_this$props","className","zIndex","children","_this$props$positionM2","stl","_extends","React","createElement","Fragment","ref","r","pointerEvents","boxSizing","borderRadius","cx","onMouseDown","onMouseUp","key","get","_this$props2","boundsX","boundsY","_this$props2$placemen","_this$getContainerRec2","containerWidth","containerHeight","_placement$split2","defaultBounds","minBound","maxBound","_this$curPositionKey","curPositionKey","y","x","positionStyles","Component","defaultProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils.ts","../src/constants.ts","../src/index.tsx"],"sourcesContent":["import {findParent} from '@ohkit/dom-helper';\n\n/**\n * 检查元素是否创建了新的定位上下文(包含块)\n * @param element 要检查的元素\n * @param includePosition 是否检查position属性(absolute/relative/fixed)\n */\nexport function isPositioningContextCreator(element: HTMLElement, includePosition: boolean): boolean {\n const style = window.getComputedStyle(element);\n const position = style.getPropertyValue('position');\n const transform = style.getPropertyValue('transform');\n const filter = style.getPropertyValue('filter');\n const perspective = style.getPropertyValue('perspective');\n const contain = style.getPropertyValue('contain');\n const willChange = style.getPropertyValue('will-change');\n \n return (includePosition && position !== 'static') || \n transform !== 'none' || \n filter !== 'none' || \n perspective !== 'none' ||\n contain.includes('paint') ||\n contain.includes('layout') ||\n contain.includes('strict') ||\n willChange.includes('transform') ||\n willChange.includes('perspective') ||\n willChange.includes('filter');\n}\n\n/**\n * 查找影响 fixed 定位的父元素\n * 当父元素有 transform/filter/perspective/contain/will-change 等属性时,fixed 定位会相对于该父元素\n */\nexport function findFixedPositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.documentElement;\n }\n const fixedPositionParent = findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, false);\n }, {excludeOwn: true}); // 没有找到,返回 window(通过 document.documentElement)\n return fixedPositionParent;\n}\n\n/**\n * 查找 absolute 定位的父元素\n * 查找最近的包含块创建者,包含所有可能影响absolute定位的属性\n */\nexport function findAbsolutePositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.body;\n }\n return findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, true);\n }, {excludeOwn: true});\n}\n\n/**\n * 获取容器的缩放比例\n * 通过比较元素的实际尺寸和 getBoundingClientRect 返回的尺寸来计算缩放比例\n */\nexport function getScaleRatio(dom?: HTMLElement | null): { scaleX: number; scaleY: number } {\n if (!dom) {\n return { scaleX: 1, scaleY: 1 };\n }\n // 通过比较 offsetWidth 和 getBoundingClientRect().width 来获取缩放比例\n const rect = dom.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n // 扩大{magnification}倍进行计算, 相当于保留小数点后4位\n const magnification = 10000;\n scaleX = dom.offsetWidth > 0 ? Math.round(rect.width / dom.offsetWidth * magnification) / magnification : 1;\n scaleY = dom.offsetHeight > 0 ? Math.round(rect.height / dom.offsetHeight * magnification) / magnification : 1;\n // console.log('rect.width dom.offsetWidth', rect.width, dom.offsetWidth);\n // console.log('rect.height dom.offsetHeight', rect.height, dom.offsetHeight);\n // console.log('scaleX', scaleX, 'scaleY', scaleY);\n return { scaleX, scaleY };\n}\n\n/**\n * 限制数值在指定范围内\n * \n * @param value 要限制的数值\n * @param min 最小值\n * @param max 最大值\n * @returns 限制后的数值,确保在 [min, max] 范围内\n */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\n\n/**\n * 检测当前环境是否支持触摸事件\n * \n * @returns 如果环境支持触摸事件返回 true,否则返回 false\n */\nexport function supportsTouchEvents() {\n return typeof window !== 'undefined' && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};","\nexport const ValidPlacement = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n","import React from 'react';\nimport {\n prefixClassname as p,\n classNames as cx,\n} from \"@ohkit/prefix-classname\";\nimport {addEventListener, addClass} from '@ohkit/dom-helper';\nimport {findFixedPositionParent, findAbsolutePositionParent, getScaleRatio, clamp, supportsTouchEvents} from './utils';\nimport {ValidPlacement} from './constants';\nimport {DraggableBoxProps, DraggableBoxState} from './type';\n\nimport './style.scss';\n\nexport * from './utils';\nexport * from './type';\nexport const c = p(\"ohkit-draggable-box__\");\nexport class DraggableBox extends React.Component<DraggableBoxProps, DraggableBoxState> {\n static defaultProps: Partial<DraggableBoxProps> = {\n zIndex: 9999,\n offsetX: 20,\n offsetY: 20,\n placement: 'bottom-right',\n disabled: false,\n lockAxis: 'none',\n showDragArea: false,\n showDragAreaOverMoveDistanse: 5,\n positionMode: 'fixed',\n };\n\n constructor(props: DraggableBoxProps) {\n super(props);\n const { offsetX, offsetY } = this.props;\n this.state = this.formatState({offsetX, offsetY});\n }\n\n private formatState({offsetX = DraggableBox.defaultProps.offsetX, offsetY = DraggableBox.defaultProps.offsetY} = {}) {\n const { placement = 'bottom-right' } = this.props;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n const newState = {\n top: placementY === 'top' ? offsetY : undefined,\n bottom: placementY === 'bottom' ? offsetY : undefined,\n left: placementX === 'left' ? offsetX : undefined,\n right: placementX === 'right' ? offsetX : undefined,\n }\n return newState;\n }\n\n private prePositionMode: DraggableBoxProps['positionMode'];\n private preDraggerRef: HTMLElement | null = null;\n private container: HTMLElement | null = null;\n /**\n * 获取定位容器\n * 根据 positionMode 返回对应的定位父元素\n */\n private getContainer(useCache = true) {\n const { positionMode = 'fixed' } = this.props;\n if (!this.container || !useCache || this.prePositionMode !== positionMode || this.preDraggerRef !== this.draggerRef) {\n this.prePositionMode = positionMode;\n this.preDraggerRef = this.draggerRef;\n this.container = positionMode === 'fixed' \n ? findFixedPositionParent(this.draggerRef) \n : findAbsolutePositionParent(this.draggerRef);\n }\n return this.container;\n }\n\n /**\n * 获取容器的尺寸和位置信息\n */\n private getContainerRect() {\n const container = this.getContainer(false);\n if (!container) {\n return {\n width: document.documentElement.clientWidth, // window.innerWidth, 避免滚动条影响计算\n height: document.documentElement.clientHeight, // window.innerHeight, 避免滚动条影响计算\n left: 0,\n top: 0,\n scrollLeft: 0,\n scrollTop: 0,\n scrollerScrollLeft: 0,\n scrollerScrollTop: 0,\n borderLeftWidth: 0,\n borderTopWidth: 0\n };\n }\n const containerRect = container.getBoundingClientRect();\n \n // 获取容器的border宽度(仅 top, left 对坐标计算有影响)\n const containerStyle = window.getComputedStyle(container);\n const borderLeftWidth = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTopWidth = parseFloat(containerStyle.borderTopWidth) || 0;\n const borderRightWidth = parseFloat(containerStyle.borderRightWidth) || 0;\n const borderBottomWidth = parseFloat(containerStyle.borderBottomWidth) || 0;\n const yScrollerWidth = container.offsetWidth - container.clientWidth - borderLeftWidth - borderRightWidth;\n const xScrollerHeight = container.offsetHeight - container.clientHeight - borderTopWidth - borderBottomWidth;\n // console.log('yScrollerWidth, xScrollerHeight', yScrollerWidth, xScrollerHeight);\n\n return {\n width: containerRect.width / this.cachedScaleX - borderLeftWidth - borderRightWidth - yScrollerWidth,\n height: containerRect.height / this.cachedScaleY - borderTopWidth - borderBottomWidth - xScrollerHeight,\n left: containerRect.left / this.cachedScaleX,\n top: containerRect.top / this.cachedScaleY,\n scrollLeft: container.scrollLeft,\n scrollTop: container.scrollTop,\n borderLeftWidth: borderLeftWidth,\n borderTopWidth: borderTopWidth,\n };\n }\n\n get dragBoxSize() {\n let width = 0;\n let height = 0;\n if (this.draggerRef) {\n width = this.draggerRef.offsetWidth;\n height = this.draggerRef.offsetHeight;\n }\n return {\n height,\n width\n };\n }\n\n get dragPositionBoundaries() {\n const { boundsX, boundsY, placement = 'bottom-right' } = this.props;\n const dragSize = this.dragBoxSize;\n const {width: containerWidth, height: containerHeight} = this.getContainerRect();\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n const defaultBounds = {\n minX: 0,\n maxX: Math.max(containerWidth - dragSize.width, 0),\n minY: 0,\n maxY: Math.max(containerHeight- dragSize.height, 0),\n };\n // 初始化边界\n let {minX, maxX, minY, maxY} = defaultBounds\n\n // 处理X轴边界\n if (boundsX) {\n const [minBound, maxBound] = boundsX;\n if (placementX === 'left') {\n // 左边位置:boundsX=[左边最小距离, 左边最大距离]\n if (minBound !== undefined) minX = Math.max(minX, minBound);\n if (maxBound !== undefined) maxX = Math.min(maxX, maxBound);\n } else {\n // 右边位置:boundsX=[右边最小距离, 右边最大距离]\n // 直接使用边界值作为right的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n }\n }\n }\n\n // 处理Y轴边界\n if (boundsY) {\n const [minBound, maxBound] = boundsY;\n \n if (placementY === 'top') {\n // 顶部位置:boundsY=[顶边最小距离, 顶边最大距离]\n if (minBound !== undefined) minY = Math.max(minY, minBound);\n if (maxBound !== undefined) maxY = Math.min(maxY, maxBound);\n } else {\n // 底部位置:boundsY=[底边最小距离, 底边最大距离]\n // 直接使用边界值作为bottom的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n }\n }\n }\n // 确保各个边界值在默认范围内\n minX = clamp(minX, defaultBounds.minX, defaultBounds.maxX);\n maxX = clamp(maxX, minX, defaultBounds.maxX);\n minY = clamp(minY, defaultBounds.minY, defaultBounds.maxY);\n maxY = clamp(maxY, minY, defaultBounds.maxY);\n\n return { minX, maxX, minY, maxY };\n }\n\n get curPositionKey() {\n let {placement} = this.props;\n if (!placement || !ValidPlacement.includes(placement)) {\n placement = 'bottom-right';\n }\n return placement.split('-') as ['top' | 'bottom', 'left' | 'right']; // [y, x]\n }\n\n get position() {\n const [y, x] = this.curPositionKey;\n const positionStyles: Record<string, string> = {};\n \n // 确保位置值存在且是有效的数字\n if (this.state[y] !== undefined) {\n positionStyles[y] = `${this.state[y]}px`;\n }\n if (this.state[x] !== undefined) {\n positionStyles[x] = `${this.state[x]}px`;\n }\n \n return positionStyles;\n }\n\n draggerRef: HTMLDivElement | null = null;\n\n isDragging = false;\n\n axisX?: number;\n axisY?: number;\n dX = 0;\n dY = 0;\n startTop = 0;\n startLeft = 0;\n startBottom = 0;\n startRight = 0;\n translateX = 0;\n translateY = 0;\n\n // 缓存缩放比例,避免在 dragging 中频繁计算\n cachedScaleX = 1;\n cachedScaleY = 1;\n\n private __moveDisposer?: () => void;\n private __clickDisposer?: () => void;\n private __bodyClassDisposer?: () => void;\n private __upDisposer?: () => void;\n private __resizeDisposer?: () => void;\n private __preventScrollDisposer?: () => void;\n\n dragAreaRef: HTMLDivElement | null = null;\n\n private reportStartPosition() {\n if (this.draggerRef) {\n // 获取缩放比例\n const { scaleX, scaleY } = getScaleRatio(this.getContainer());\n this.cachedScaleX = scaleX;\n this.cachedScaleY = scaleY;\n const { top, left } = this.draggerRef.getBoundingClientRect();\n const containerRect = this.getContainerRect();\n // console.log(containerRect, 'containerRect');\n \n // 计算相对于容器的位置,并除以缩放比例得到未缩放的坐标\n this.startTop = top / scaleY - containerRect.top + containerRect.scrollTop - containerRect.borderTopWidth;\n this.startLeft = left / scaleY - containerRect.left + containerRect.scrollLeft - containerRect.borderLeftWidth;\n this.startBottom = containerRect.height - this.startTop - this.dragBoxSize.height;\n this.startRight = containerRect.width - this.startLeft - this.dragBoxSize.width;\n }\n }\n\n enableDrag = (isTouch = false) => {\n this.reportStartPosition();\n this.__moveDisposer?.();\n this.__moveDisposer = addEventListener(isTouch && this.draggerRef ? this.draggerRef : document, isTouch ? 'touchmove' : 'mousemove', (evt) => {\n evt.stopPropagation();\n if (isTouch) {\n evt.preventDefault();\n }\n // INFO: 移动过程中禁止click事件\n if (!this.__clickDisposer) {\n const moveDistanse = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2));\n // INFO: 移动超过px?? 确保用户有真实的移动意愿,而不是手抖~~\n if (moveDistanse > (this.props.showDragAreaOverMoveDistanse || 5)) {\n this.__clickDisposer = addEventListener(\n document,\n 'click',\n (evt) => {\n evt.stopPropagation();\n },\n true\n );\n this.__bodyClassDisposer = addClass([document.body, this.draggerRef], c('moving')) || undefined;\n \n // 显示拖拽区域\n if (this.props.showDragArea && this.dragAreaRef) {\n this.showDragArea();\n }\n }\n }\n // 调用拖拽开始回调\n if (!this.isDragging && this.props.onDragStart) {\n const positionChange = {\n top: this.startTop,\n left: this.startLeft,\n bottom: this.startBottom,\n right: this.startRight,\n diffX: 0,\n diffY: 0\n };\n this.props.onDragStart(positionChange);\n }\n this.dragging(evt as TouchEvent | MouseEvent);\n }, {\n passive: !isTouch\n });\n\n this.__upDisposer?.();\n this.__upDisposer = addEventListener(\n document,\n 'mouseup',\n () => {\n this.endDrag();\n },\n true\n );\n };\n\n startDrag = (evt: React.MouseEvent<HTMLDivElement>) => {\n // 判断鼠标非右击才继续执行\n if (evt.nativeEvent.button === 2) {\n return;\n }\n this.axisX = evt.nativeEvent.pageX;\n this.axisY = evt.nativeEvent.pageY;\n if (!this.props.disabled) {\n this.enableDrag();\n }\n };\n\n dragging = (evt: MouseEvent | TouchEvent) => {\n this.isDragging = true;\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n \n // 使用缓存的缩放比例,避免频繁计算\n const scaleX = this.cachedScaleX;\n const scaleY = this.cachedScaleY;\n \n // 获取坐标\n let pageX: number, pageY: number;\n if (evt instanceof TouchEvent) {\n const touch = evt.touches[0];\n if (!touch) return;\n pageX = touch.pageX;\n pageY = touch.pageY;\n } else {\n pageX = evt.pageX;\n pageY = evt.pageY;\n }\n \n // 计算原始偏移量(需要除以缩放比例)\n this.dX = (pageX - (this.axisX || 0)) / scaleX;\n this.dY = (pageY - (this.axisY || 0)) / scaleY;\n \n // 应用方向锁定并计算变换值\n let translateX = this.dX;\n let translateY = this.dY;\n \n if (lockAxis === 'x') {\n translateY = 0; // 锁定Y方向\n } else if (lockAxis === 'y') {\n translateX = 0; // 锁定X方向\n }\n \n // 应用边界条件到允许移动的方向\n const potentialLeft = this.startLeft + translateX;\n const potentialTop = this.startTop + translateY;\n \n // X轴边界条件(在允许X轴移动时应用)\n if (lockAxis !== 'y') {\n if (potentialLeft < minX) {\n translateX = minX - this.startLeft;\n } else if (potentialLeft > maxX) {\n translateX = maxX - this.startLeft;\n }\n }\n \n // Y轴边界条件(在允许Y轴移动时应用)\n if (lockAxis !== 'x') {\n if (potentialTop < minY) {\n translateY = minY - this.startTop;\n } else if (potentialTop > maxY) {\n translateY = maxY - this.startTop;\n }\n }\n if (this.translateX === translateX && this.translateY === translateY) {\n return;\n }\n\n // 调用拖拽中回调\n if (this.props.onDrag) {\n const positionChange = {\n top: this.startTop + translateY,\n left: this.startLeft + translateX,\n bottom: this.startBottom - translateY,\n right: this.startRight - translateX,\n diffX: translateX,\n diffY: translateY\n };\n this.props.onDrag(positionChange);\n }\n \n if (this.draggerRef) {\n this.draggerRef.style.transform = `translate(${translateX}px, ${translateY}px)`;\n }\n this.translateX = translateX;\n this.translateY = translateY;\n };\n\n startTouchDrag = (evt: React.TouchEvent<HTMLDivElement>) => {\n const touch = evt.touches[0];\n if (!touch) return;\n this.axisX = touch.pageX;\n this.axisY = touch.pageY;\n if (!this.props.disabled) {\n this.enableDrag(true);\n }\n };\n\n endDrag = () => {\n if (this.isDragging) {\n const positionChange = this.calcPosition();\n // 调用拖拽结束回调\n this.props.onDragEnd?.(positionChange);\n if (this.draggerRef) {\n this.draggerRef.style.transform = '';\n }\n \n // 隐藏拖拽区域\n if (this.props.showDragArea) {\n this.hideDragArea();\n }\n }\n\n if (this.__moveDisposer) {\n this.__moveDisposer();\n this.__moveDisposer = undefined;\n }\n if (this.__clickDisposer) {\n requestAnimationFrame(() => {\n if (this.__clickDisposer) {\n this.__clickDisposer();\n this.__clickDisposer = undefined;\n }\n });\n }\n if (this.__upDisposer) {\n this.__upDisposer();\n this.__upDisposer = undefined;\n }\n if (this.__bodyClassDisposer) {\n this.__bodyClassDisposer();\n this.__bodyClassDisposer = undefined;\n }\n\n this.isDragging = false;\n };\n\n showDragArea = () => {\n if (!this.props.showDragArea || !this.dragAreaRef) return;\n \n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const dragSize = this.dragBoxSize;\n \n // 重置样式\n this.dragAreaRef.style.border = '1px dashed var(--ohkit-color-primary, #1890ff)';\n this.dragAreaRef.style.backgroundColor = 'rgba(173, 216, 230, 0.2)'; // 淡透蓝色\n \n if (lockAxis === 'x') {\n // 锁定Y方向,显示为水平虚线区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = '2px'; // 更细的虚线高度\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${this.startTop + dragSize.height / 2}px`;\n } else if (lockAxis === 'y') {\n // 锁定X方向,显示为垂直虚线区域\n this.dragAreaRef.style.width = '2px'; // 更细的虚线宽度\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${this.startLeft + dragSize.width / 2}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n } else {\n // 自由拖拽,显示完整区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n }\n \n this.dragAreaRef.style.display = 'block';\n };\n\n hideDragArea = () => {\n if (this.dragAreaRef) {\n this.dragAreaRef.style.display = 'none';\n }\n };\n calcPosition = () => {\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const {height, width} = this.getContainerRect();\n \n // 计算新的位置\n let newTop = this.startTop;\n let newLeft = this.startLeft;\n \n if (lockAxis !== 'y') {\n newLeft += this.dX;\n }\n if (lockAxis !== 'x') {\n newTop += this.dY;\n }\n \n // 应用边界限制\n const realTop = clamp(newTop, minY, maxY);\n const realLeft = clamp(newLeft, minX, maxX);\n const realBottom = height - realTop - this.dragBoxSize.height;\n const realRight = width - realLeft - this.dragBoxSize.width;\n if (realTop !== this.state.top || realLeft !== this.state.left || this.state.bottom !== realBottom || this.state.right !== realRight) {\n this.setState({\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight\n });\n }\n const positionChange = {\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight,\n diffX: realLeft - this.startLeft,\n diffY: realTop - this.startTop\n };\n this.startTop = realTop;\n this.startLeft = realLeft;\n this.startBottom = realBottom;\n this.startRight = realRight;\n this.dX = this.dY = 0;\n return positionChange;\n };\n\n // 更新状态并计算位置 (外部可以调用)\n updateState = ({offsetX, offsetY}: Pick<DraggableBoxProps, 'offsetX' | 'offsetY'> = {}) => {\n this.setState(this.formatState({offsetX, offsetY}), () => {\n this.reportStartPosition();\n this.calcPosition();\n });\n }\n\n componentDidMount() {\n // 检查初始位置是否在边界范围内,如果不在则修正\n this.reportStartPosition();\n this.calcPosition();\n \n this.__resizeDisposer = addEventListener(window, 'resize', () => {\n this.calcPosition();\n });\n\n // 触屏设备时,阻止拖拽时滚动页面\n if (supportsTouchEvents() && this.draggerRef) {\n this.__preventScrollDisposer = addEventListener(this.draggerRef, 'touchmove', (evt) => {\n evt.preventDefault();\n });\n }\n }\n\n componentWillUnmount() {\n this.__resizeDisposer?.();\n this.__bodyClassDisposer?.();\n this.__moveDisposer?.();\n this.__clickDisposer?.();\n this.__upDisposer?.();\n this.__preventScrollDisposer?.();\n }\n\n render() {\n const { className, zIndex, children, showDragArea, positionMode = 'fixed' } = this.props;\n const { startDrag, startTouchDrag, endDrag } = this;\n const stl = {\n zIndex,\n ...this.position,\n position: positionMode\n };\n return (\n <React.Fragment>\n {showDragArea && (\n <div\n className={c('drag-area')}\n ref={(r) => {\n this.dragAreaRef = r;\n }}\n style={{\n display: 'none',\n position: positionMode,\n backgroundColor: 'rgba(173, 216, 230, 0.2)', // 淡透蓝色\n border: '1px dashed var(--ohkit-color-primary, #1890ff)',\n pointerEvents: 'none',\n zIndex: (zIndex || 9999) - 1,\n boxSizing: 'border-box',\n borderRadius: this.props.lockAxis !== 'none' ? '2px' : '0',\n }}\n />\n )}\n <div\n className={cx(c('container'), className)}\n style={stl}\n ref={(r) => {\n this.draggerRef = r;\n }}\n onMouseDownCapture={startDrag}\n onMouseUpCapture={endDrag}\n onTouchStartCapture={startTouchDrag}\n onTouchEndCapture={endDrag}\n >\n {children}\n </div>\n </React.Fragment>\n );\n }\n}\n"],"names":["isPositioningContextCreator","element","includePosition","style","window","getComputedStyle","position","getPropertyValue","transform","filter","perspective","contain","willChange","includes","findFixedPositionParent","dom","findParent","parent","excludeOwn","document","documentElement","findAbsolutePositionParent","body","getScaleRatio","scaleX","scaleY","rect","getBoundingClientRect","magnification","offsetWidth","Math","round","width","offsetHeight","height","clamp","value","min","max","supportsTouchEvents","navigator","maxTouchPoints","ValidPlacement","c","p","DraggableBox","_React$Component","props","_this","call","this","prePositionMode","preDraggerRef","container","draggerRef","isDragging","axisX","axisY","dX","dY","startTop","startLeft","startBottom","startRight","translateX","translateY","cachedScaleX","cachedScaleY","__moveDisposer","__clickDisposer","__bodyClassDisposer","__upDisposer","__resizeDisposer","__preventScrollDisposer","dragAreaRef","enableDrag","isTouch","reportStartPosition","addEventListener","evt","stopPropagation","preventDefault","sqrt","pow","showDragAreaOverMoveDistanse","addClass","undefined","showDragArea","onDragStart","top","left","bottom","right","diffX","diffY","dragging","passive","endDrag","startDrag","nativeEvent","button","pageX","pageY","disabled","lockAxis","_this$dragPositionBou","dragPositionBoundaries","minX","maxX","minY","maxY","TouchEvent","touch","touches","potentialLeft","potentialTop","onDrag","startTouchDrag","positionChange","calcPosition","onDragEnd","hideDragArea","requestAnimationFrame","_this$dragPositionBou2","dragSize","dragBoxSize","border","backgroundColor","display","_this$dragPositionBou3","_this$getContainerRec","getContainerRect","newTop","newLeft","realTop","realLeft","realBottom","realRight","state","setState","updateState","_temp","_ref","formatState","offsetX","offsetY","_this$props","_proto","prototype","_temp2","_ref2","_ref2$offsetX","defaultProps","_ref2$offsetY","_this$props$placement","placement","_placement$split","split","placementY","placementX","getContainer","useCache","_this$props$positionM","positionMode","clientWidth","clientHeight","scrollLeft","scrollTop","scrollerScrollLeft","scrollerScrollTop","borderLeftWidth","borderTopWidth","containerRect","containerStyle","parseFloat","borderRightWidth","borderBottomWidth","_getScaleRatio","_this$draggerRef$getB","componentDidMount","_this2","componentWillUnmount","_this$__resizeDispose","_this$__bodyClassDisp","_this$__moveDisposer","_this$__clickDisposer","_this$__upDisposer","_this$__preventScroll","render","_this3","_this$props2","className","zIndex","children","_this$props2$position","stl","_extends","React","createElement","Fragment","ref","r","pointerEvents","boxSizing","borderRadius","cx","onMouseDownCapture","onMouseUpCapture","onTouchStartCapture","onTouchEndCapture","key","get","_this$props3","boundsX","boundsY","_this$props3$placemen","_this$getContainerRec2","containerWidth","containerHeight","_placement$split2","defaultBounds","minBound","maxBound","_this$curPositionKey","curPositionKey","y","x","positionStyles","Component"],"mappings":"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"}
|
package/dist/index.modern.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import t from"react";import{prefixClassname as i,classNames as e}from"@ohkit/prefix-classname";import{findParent as s,addEventListener as o,addClass as r}from"@ohkit/dom-helper";function a(){return a=Object.assign?Object.assign.bind():function(t){for(var i=1;i<arguments.length;i++){var e=arguments[i];for(var s in e)({}).hasOwnProperty.call(e,s)&&(t[s]=e[s])}return t},a.apply(null,arguments)}function h(t,i){const e=window.getComputedStyle(t),s=e.getPropertyValue("position"),o=e.getPropertyValue("transform"),r=e.getPropertyValue("filter"),a=e.getPropertyValue("perspective"),h=e.getPropertyValue("contain"),n=e.getPropertyValue("will-change");return i&&"static"!==s||"none"!==o||"none"!==r||"none"!==a||h.includes("paint")||h.includes("layout")||h.includes("strict")||n.includes("transform")||n.includes("perspective")||n.includes("filter")}function n(t,i,e){return Math.min(Math.max(t,i),e)}const d=["top-left","top-right","bottom-left","bottom-right"],l=i("ohkit-draggable-box__");class p extends t.Component{constructor(t){super(t),this.prePositionMode=void 0,this.preDraggerRef=null,this.container=null,this.draggerRef=null,this.isDragging=!1,this.axisX=void 0,this.axisY=void 0,this.dX=0,this.dY=0,this.startTop=0,this.startLeft=0,this.cachedScaleX=1,this.cachedScaleY=1,this.__moveDisposer=void 0,this.__clickDisposer=void 0,this.__bodyClassDisposer=void 0,this.__upDisposer=void 0,this.__resizeDisposer=void 0,this.dragAreaRef=null,this.enableDrag=()=>{var t,i;this.reportStartPosition(),null==(t=this.__moveDisposer)||t.call(this),this.__moveDisposer=o(document,"mousemove",t=>{this.__clickDisposer||Math.sqrt(Math.pow(this.dX,2)+Math.pow(this.dY,2))>5&&(this.__clickDisposer=o(document,"click",t=>{t.stopPropagation()},!0),this.__bodyClassDisposer=r([document.body,this.draggerRef],l("moving"))||void 0,this.props.showDragArea&&this.dragAreaRef&&this.showDragArea()),this.dragging(t)},!0),null==(i=this.__upDisposer)||i.call(this),this.__upDisposer=o(document,"mouseup",t=>{this.endDrag(),t.stopPropagation(),t.preventDefault()},!0)},this.startDrag=t=>{2!==t.nativeEvent.button&&(this.axisX=t.nativeEvent.pageX,this.axisY=t.nativeEvent.pageY,this.props.disabled||this.enableDrag())},this.dragging=t=>{this.isDragging=!0;const{lockAxis:i}=this.props,{minX:e,maxX:s,minY:o,maxY:r}=this.dragPositionBoundaries,a=this.cachedScaleY;this.dX=(t.pageX-(this.axisX||0))/this.cachedScaleX,this.dY=(t.pageY-(this.axisY||0))/a;let h=this.dX,n=this.dY;"x"===i?n=0:"y"===i&&(h=0);const d=this.startLeft+h,l=this.startTop+n;"y"!==i&&(d<e?h=e-this.startLeft:d>s&&(h=s-this.startLeft)),"x"!==i&&(l<o?n=o-this.startTop:l>r&&(n=r-this.startTop)),this.draggerRef&&(this.draggerRef.style.transform=`translate(${h}px, ${n}px)`),t.stopPropagation()},this.endDrag=()=>{var t,i,e;this.isDragging&&(this.calcPosition(),this.draggerRef&&(this.draggerRef.style.transform=""),this.props.showDragArea&&this.hideDragArea()),null==(t=this.__moveDisposer)||t.call(this),this.__moveDisposer=void 0,this.__clickDisposer&&requestAnimationFrame(()=>{this.__clickDisposer&&(this.__clickDisposer(),this.__clickDisposer=void 0)}),null==(i=this.__upDisposer)||i.call(this),this.__upDisposer=void 0,null==(e=this.__bodyClassDisposer)||e.call(this),this.__bodyClassDisposer=void 0,this.isDragging=!1},this.showDragArea=()=>{if(!this.props.showDragArea||!this.dragAreaRef)return;const{lockAxis:t}=this.props,{minX:i,maxX:e,minY:s,maxY:o}=this.dragPositionBoundaries,r=this.dragBoxSize;this.dragAreaRef.style.border="1px dashed var(--ohkit-color-primary, #1890ff)",this.dragAreaRef.style.backgroundColor="rgba(173, 216, 230, 0.2)","x"===t?(this.dragAreaRef.style.width=`${e-i+r.width}px`,this.dragAreaRef.style.height="2px",this.dragAreaRef.style.left=`${i}px`,this.dragAreaRef.style.top=`${this.startTop+r.height/2}px`):"y"===t?(this.dragAreaRef.style.width="2px",this.dragAreaRef.style.height=`${o-s+r.height}px`,this.dragAreaRef.style.left=`${this.startLeft+r.width/2}px`,this.dragAreaRef.style.top=`${s}px`):(this.dragAreaRef.style.width=`${e-i+r.width}px`,this.dragAreaRef.style.height=`${o-s+r.height}px`,this.dragAreaRef.style.left=`${i}px`,this.dragAreaRef.style.top=`${s}px`),this.dragAreaRef.style.display="block"},this.hideDragArea=()=>{this.dragAreaRef&&(this.dragAreaRef.style.display="none")},this.calcPosition=()=>{const{lockAxis:t}=this.props,{minX:i,maxX:e,minY:s,maxY:o}=this.dragPositionBoundaries,{height:r,width:a}=this.getContainerRect();let h=this.startTop,d=this.startLeft;"y"!==t&&(d+=this.dX),"x"!==t&&(h+=this.dY);const l=n(h,s,o),p=n(d,i,e),g=r-l-this.dragBoxSize.height,c=a-p-this.dragBoxSize.width;l===this.state.top&&p===this.state.left&&this.state.bottom===g&&this.state.right===c||this.setState({top:l,left:p,bottom:g,right:c}),this.startTop=l,this.startLeft=p,this.dX=this.dY=0};const{placement:i="bottom-right",offsetY:e=20,offsetX:s=20}=t,[a,h]=i.split("-");this.state={top:"top"===a?e:void 0,bottom:"bottom"===a?e:void 0,left:"left"===h?s:void 0,right:"right"===h?s:void 0}}getContainer(t=!0){const{positionMode:i="fixed"}=this.props;var e;return this.container&&t&&this.prePositionMode===i&&this.preDraggerRef===this.draggerRef||(this.prePositionMode=i,this.preDraggerRef=this.draggerRef,this.container="fixed"===i?(e=this.draggerRef)?s(e,t=>h(t,!1),{excludeOwn:!0}):document.documentElement:function(t){return t?s(t,t=>h(t,!0),{excludeOwn:!0}):document.body}(this.draggerRef)),this.container}getContainerRect(){const t=this.getContainer(!1);if(!t)return{width:window.innerWidth,height:window.innerHeight,left:0,top:0,scrollLeft:0,scrollTop:0,scrollerScrollLeft:0,scrollerScrollTop:0,borderLeftWidth:0,borderTopWidth:0};const i=t.getBoundingClientRect(),e=window.getComputedStyle(t),s=parseFloat(e.borderLeftWidth)||0,o=parseFloat(e.borderTopWidth)||0,r=parseFloat(e.borderRightWidth)||0,a=parseFloat(e.borderBottomWidth)||0;return{width:i.width/this.cachedScaleX-s-r-(t.offsetWidth-t.clientWidth-s-r),height:i.height/this.cachedScaleY-o-a-(t.offsetHeight-t.clientHeight-o-a),left:i.left/this.cachedScaleX,top:i.top/this.cachedScaleY,scrollLeft:t.scrollLeft,scrollTop:t.scrollTop,borderLeftWidth:s,borderTopWidth:o}}get dragBoxSize(){let t=0,i=0;return this.draggerRef&&(t=this.draggerRef.offsetWidth,i=this.draggerRef.offsetHeight),{height:i,width:t}}get dragPositionBoundaries(){const{boundsX:t,boundsY:i,placement:e="bottom-right"}=this.props,s=this.dragBoxSize,{width:o,height:r}=this.getContainerRect(),[a,h]=e.split("-"),d={minX:0,maxX:Math.max(o-s.width,0),minY:0,maxY:Math.max(r-s.height,0)};let{minX:l,maxX:p,minY:g,maxY:c}=d;if(t){const[i,e]=t;"left"===h?(void 0!==i&&(l=Math.max(l,i)),void 0!==e&&(p=Math.min(p,e))):void 0!==i&&void 0!==e?(l=Math.max(l,o-e-s.width),p=Math.min(p,o-i-s.width)):void 0!==i?p=Math.min(p,o-i-s.width):void 0!==e&&(l=Math.max(l,o-e-s.width))}if(i){const[t,e]=i;"top"===a?(void 0!==t&&(g=Math.max(g,t)),void 0!==e&&(c=Math.min(c,e))):void 0!==t&&void 0!==e?(g=Math.max(g,r-e-s.height),c=Math.min(c,r-t-s.height)):void 0!==t?c=Math.min(c,r-t-s.height):void 0!==e&&(g=Math.max(g,r-e-s.height))}return l=n(l,d.minX,d.maxX),p=n(p,l,d.maxX),g=n(g,d.minY,d.maxY),c=n(c,g,d.maxY),{minX:l,maxX:p,minY:g,maxY:c}}get curPositionKey(){let{placement:t}=this.props;return t&&d.includes(t)||(t="bottom-right"),t.split("-")}get position(){const[t,i]=this.curPositionKey,e={};return void 0!==this.state[t]&&(e[t]=`${this.state[t]}px`),void 0!==this.state[i]&&(e[i]=`${this.state[i]}px`),e}reportStartPosition(){if(this.draggerRef){const{scaleX:t,scaleY:i}=function(t){if(!t)return{scaleX:1,scaleY:1};const i=t.getBoundingClientRect();let e=1,s=1;const o=1e4;return e=t.offsetWidth>0?Math.round(i.width/t.offsetWidth*o)/o:1,s=t.offsetHeight>0?Math.round(i.height/t.offsetHeight*o)/o:1,{scaleX:e,scaleY:s}}(this.getContainer());this.cachedScaleX=t,this.cachedScaleY=i;const{top:e,left:s}=this.draggerRef.getBoundingClientRect(),o=this.getContainerRect();this.startTop=e/i-o.top+o.scrollTop-o.borderTopWidth,this.startLeft=s/i-o.left+o.scrollLeft-o.borderLeftWidth}}componentDidMount(){this.reportStartPosition(),this.calcPosition(),this.__resizeDisposer=o(window,"resize",()=>{this.calcPosition()})}componentWillUnmount(){var t,i,e,s,o;null==(t=this.__resizeDisposer)||t.call(this),null==(i=this.__bodyClassDisposer)||i.call(this),null==(e=this.__moveDisposer)||e.call(this),null==(s=this.__clickDisposer)||s.call(this),null==(o=this.__upDisposer)||o.call(this)}render(){const{className:i,zIndex:s,children:o,showDragArea:r,positionMode:h="fixed"}=this.props,{startDrag:n,endDrag:d}=this,p=a({zIndex:s},this.position,{position:h});/*#__PURE__*/return t.createElement(Fragment,null,r&&/*#__PURE__*/t.createElement("div",{className:l("drag-area"),ref:t=>{this.dragAreaRef=t},style:{display:"none",position:h,backgroundColor:"rgba(173, 216, 230, 0.2)",border:"1px dashed var(--ohkit-color-primary, #1890ff)",pointerEvents:"none",zIndex:(s||9999)-1,boxSizing:"border-box",borderRadius:"none"!==this.props.lockAxis?"2px":"0"}}),/*#__PURE__*/t.createElement("div",{className:e(l("container"),i),style:p,ref:t=>{this.draggerRef=t},onMouseDown:n,onMouseUp:d},o))}}p.defaultProps={zIndex:9999,offsetX:20,offsetY:20,placement:"bottom-right",disabled:!1,lockAxis:"none",showDragArea:!1,positionMode:"fixed"};export{p as DraggableBox,l as c,p as default};
|
|
1
|
+
import t from"react";import{prefixClassname as i,classNames as e}from"@ohkit/prefix-classname";import{findParent as s,addEventListener as o,addClass as r}from"@ohkit/dom-helper";function a(){return a=Object.assign?Object.assign.bind():function(t){for(var i=1;i<arguments.length;i++){var e=arguments[i];for(var s in e)({}).hasOwnProperty.call(e,s)&&(t[s]=e[s])}return t},a.apply(null,arguments)}function h(t,i){const e=window.getComputedStyle(t),s=e.getPropertyValue("position"),o=e.getPropertyValue("transform"),r=e.getPropertyValue("filter"),a=e.getPropertyValue("perspective"),h=e.getPropertyValue("contain"),n=e.getPropertyValue("will-change");return i&&"static"!==s||"none"!==o||"none"!==r||"none"!==a||h.includes("paint")||h.includes("layout")||h.includes("strict")||n.includes("transform")||n.includes("perspective")||n.includes("filter")}function n(t){return t?s(t,t=>h(t,!1),{excludeOwn:!0}):document.documentElement}function d(t){return t?s(t,t=>h(t,!0),{excludeOwn:!0}):document.body}function l(t){if(!t)return{scaleX:1,scaleY:1};const i=t.getBoundingClientRect();let e=1,s=1;const o=1e4;return e=t.offsetWidth>0?Math.round(i.width/t.offsetWidth*o)/o:1,s=t.offsetHeight>0?Math.round(i.height/t.offsetHeight*o)/o:1,{scaleX:e,scaleY:s}}function p(t,i,e){return Math.min(Math.max(t,i),e)}function g(){return"undefined"!=typeof window&&("ontouchstart"in window||navigator.maxTouchPoints>0)}const c=["top-left","top-right","bottom-left","bottom-right"],f=i("ohkit-draggable-box__");class m extends t.Component{constructor(t){super(t),this.prePositionMode=void 0,this.preDraggerRef=null,this.container=null,this.draggerRef=null,this.isDragging=!1,this.axisX=void 0,this.axisY=void 0,this.dX=0,this.dY=0,this.startTop=0,this.startLeft=0,this.startBottom=0,this.startRight=0,this.translateX=0,this.translateY=0,this.cachedScaleX=1,this.cachedScaleY=1,this.__moveDisposer=void 0,this.__clickDisposer=void 0,this.__bodyClassDisposer=void 0,this.__upDisposer=void 0,this.__resizeDisposer=void 0,this.__preventScrollDisposer=void 0,this.dragAreaRef=null,this.enableDrag=(t=!1)=>{var i,e;this.reportStartPosition(),null==(i=this.__moveDisposer)||i.call(this),this.__moveDisposer=o(t&&this.draggerRef?this.draggerRef:document,t?"touchmove":"mousemove",i=>{i.stopPropagation(),t&&i.preventDefault(),this.__clickDisposer||Math.sqrt(Math.pow(this.dX,2)+Math.pow(this.dY,2))>(this.props.showDragAreaOverMoveDistanse||5)&&(this.__clickDisposer=o(document,"click",t=>{t.stopPropagation()},!0),this.__bodyClassDisposer=r([document.body,this.draggerRef],f("moving"))||void 0,this.props.showDragArea&&this.dragAreaRef&&this.showDragArea()),!this.isDragging&&this.props.onDragStart&&this.props.onDragStart({top:this.startTop,left:this.startLeft,bottom:this.startBottom,right:this.startRight,diffX:0,diffY:0}),this.dragging(i)},{passive:!t}),null==(e=this.__upDisposer)||e.call(this),this.__upDisposer=o(document,"mouseup",()=>{this.endDrag()},!0)},this.startDrag=t=>{2!==t.nativeEvent.button&&(this.axisX=t.nativeEvent.pageX,this.axisY=t.nativeEvent.pageY,this.props.disabled||this.enableDrag())},this.dragging=t=>{this.isDragging=!0;const{lockAxis:i}=this.props,{minX:e,maxX:s,minY:o,maxY:r}=this.dragPositionBoundaries,a=this.cachedScaleY;let h,n;if(t instanceof TouchEvent){const i=t.touches[0];if(!i)return;h=i.pageX,n=i.pageY}else h=t.pageX,n=t.pageY;this.dX=(h-(this.axisX||0))/this.cachedScaleX,this.dY=(n-(this.axisY||0))/a;let d=this.dX,l=this.dY;"x"===i?l=0:"y"===i&&(d=0);const p=this.startLeft+d,g=this.startTop+l;"y"!==i&&(p<e?d=e-this.startLeft:p>s&&(d=s-this.startLeft)),"x"!==i&&(g<o?l=o-this.startTop:g>r&&(l=r-this.startTop)),(this.translateX!==d||this.translateY!==l)&&(this.props.onDrag&&this.props.onDrag({top:this.startTop+l,left:this.startLeft+d,bottom:this.startBottom-l,right:this.startRight-d,diffX:d,diffY:l}),this.draggerRef&&(this.draggerRef.style.transform=`translate(${d}px, ${l}px)`),this.translateX=d,this.translateY=l)},this.startTouchDrag=t=>{const i=t.touches[0];i&&(this.axisX=i.pageX,this.axisY=i.pageY,this.props.disabled||this.enableDrag(!0))},this.endDrag=()=>{if(this.isDragging){var t,i;const e=this.calcPosition();null==(t=(i=this.props).onDragEnd)||t.call(i,e),this.draggerRef&&(this.draggerRef.style.transform=""),this.props.showDragArea&&this.hideDragArea()}this.__moveDisposer&&(this.__moveDisposer(),this.__moveDisposer=void 0),this.__clickDisposer&&requestAnimationFrame(()=>{this.__clickDisposer&&(this.__clickDisposer(),this.__clickDisposer=void 0)}),this.__upDisposer&&(this.__upDisposer(),this.__upDisposer=void 0),this.__bodyClassDisposer&&(this.__bodyClassDisposer(),this.__bodyClassDisposer=void 0),this.isDragging=!1},this.showDragArea=()=>{if(!this.props.showDragArea||!this.dragAreaRef)return;const{lockAxis:t}=this.props,{minX:i,maxX:e,minY:s,maxY:o}=this.dragPositionBoundaries,r=this.dragBoxSize;this.dragAreaRef.style.border="1px dashed var(--ohkit-color-primary, #1890ff)",this.dragAreaRef.style.backgroundColor="rgba(173, 216, 230, 0.2)","x"===t?(this.dragAreaRef.style.width=`${e-i+r.width}px`,this.dragAreaRef.style.height="2px",this.dragAreaRef.style.left=`${i}px`,this.dragAreaRef.style.top=`${this.startTop+r.height/2}px`):"y"===t?(this.dragAreaRef.style.width="2px",this.dragAreaRef.style.height=`${o-s+r.height}px`,this.dragAreaRef.style.left=`${this.startLeft+r.width/2}px`,this.dragAreaRef.style.top=`${s}px`):(this.dragAreaRef.style.width=`${e-i+r.width}px`,this.dragAreaRef.style.height=`${o-s+r.height}px`,this.dragAreaRef.style.left=`${i}px`,this.dragAreaRef.style.top=`${s}px`),this.dragAreaRef.style.display="block"},this.hideDragArea=()=>{this.dragAreaRef&&(this.dragAreaRef.style.display="none")},this.calcPosition=()=>{const{lockAxis:t}=this.props,{minX:i,maxX:e,minY:s,maxY:o}=this.dragPositionBoundaries,{height:r,width:a}=this.getContainerRect();let h=this.startTop,n=this.startLeft;"y"!==t&&(n+=this.dX),"x"!==t&&(h+=this.dY);const d=p(h,s,o),l=p(n,i,e),g=r-d-this.dragBoxSize.height,c=a-l-this.dragBoxSize.width;d===this.state.top&&l===this.state.left&&this.state.bottom===g&&this.state.right===c||this.setState({top:d,left:l,bottom:g,right:c});const f={top:d,left:l,bottom:g,right:c,diffX:l-this.startLeft,diffY:d-this.startTop};return this.startTop=d,this.startLeft=l,this.startBottom=g,this.startRight=c,this.dX=this.dY=0,f},this.updateState=({offsetX:t,offsetY:i}={})=>{this.setState(this.formatState({offsetX:t,offsetY:i}),()=>{this.reportStartPosition(),this.calcPosition()})};const{offsetX:i,offsetY:e}=this.props;this.state=this.formatState({offsetX:i,offsetY:e})}formatState({offsetX:t=m.defaultProps.offsetX,offsetY:i=m.defaultProps.offsetY}={}){const{placement:e="bottom-right"}=this.props,[s,o]=e.split("-");return{top:"top"===s?i:void 0,bottom:"bottom"===s?i:void 0,left:"left"===o?t:void 0,right:"right"===o?t:void 0}}getContainer(t=!0){const{positionMode:i="fixed"}=this.props;return this.container&&t&&this.prePositionMode===i&&this.preDraggerRef===this.draggerRef||(this.prePositionMode=i,this.preDraggerRef=this.draggerRef,this.container="fixed"===i?n(this.draggerRef):d(this.draggerRef)),this.container}getContainerRect(){const t=this.getContainer(!1);if(!t)return{width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,scrollLeft:0,scrollTop:0,scrollerScrollLeft:0,scrollerScrollTop:0,borderLeftWidth:0,borderTopWidth:0};const i=t.getBoundingClientRect(),e=window.getComputedStyle(t),s=parseFloat(e.borderLeftWidth)||0,o=parseFloat(e.borderTopWidth)||0,r=parseFloat(e.borderRightWidth)||0,a=parseFloat(e.borderBottomWidth)||0;return{width:i.width/this.cachedScaleX-s-r-(t.offsetWidth-t.clientWidth-s-r),height:i.height/this.cachedScaleY-o-a-(t.offsetHeight-t.clientHeight-o-a),left:i.left/this.cachedScaleX,top:i.top/this.cachedScaleY,scrollLeft:t.scrollLeft,scrollTop:t.scrollTop,borderLeftWidth:s,borderTopWidth:o}}get dragBoxSize(){let t=0,i=0;return this.draggerRef&&(t=this.draggerRef.offsetWidth,i=this.draggerRef.offsetHeight),{height:i,width:t}}get dragPositionBoundaries(){const{boundsX:t,boundsY:i,placement:e="bottom-right"}=this.props,s=this.dragBoxSize,{width:o,height:r}=this.getContainerRect(),[a,h]=e.split("-"),n={minX:0,maxX:Math.max(o-s.width,0),minY:0,maxY:Math.max(r-s.height,0)};let{minX:d,maxX:l,minY:g,maxY:c}=n;if(t){const[i,e]=t;"left"===h?(void 0!==i&&(d=Math.max(d,i)),void 0!==e&&(l=Math.min(l,e))):void 0!==i&&void 0!==e?(d=Math.max(d,o-e-s.width),l=Math.min(l,o-i-s.width)):void 0!==i?l=Math.min(l,o-i-s.width):void 0!==e&&(d=Math.max(d,o-e-s.width))}if(i){const[t,e]=i;"top"===a?(void 0!==t&&(g=Math.max(g,t)),void 0!==e&&(c=Math.min(c,e))):void 0!==t&&void 0!==e?(g=Math.max(g,r-e-s.height),c=Math.min(c,r-t-s.height)):void 0!==t?c=Math.min(c,r-t-s.height):void 0!==e&&(g=Math.max(g,r-e-s.height))}return d=p(d,n.minX,n.maxX),l=p(l,d,n.maxX),g=p(g,n.minY,n.maxY),c=p(c,g,n.maxY),{minX:d,maxX:l,minY:g,maxY:c}}get curPositionKey(){let{placement:t}=this.props;return t&&c.includes(t)||(t="bottom-right"),t.split("-")}get position(){const[t,i]=this.curPositionKey,e={};return void 0!==this.state[t]&&(e[t]=`${this.state[t]}px`),void 0!==this.state[i]&&(e[i]=`${this.state[i]}px`),e}reportStartPosition(){if(this.draggerRef){const{scaleX:t,scaleY:i}=l(this.getContainer());this.cachedScaleX=t,this.cachedScaleY=i;const{top:e,left:s}=this.draggerRef.getBoundingClientRect(),o=this.getContainerRect();this.startTop=e/i-o.top+o.scrollTop-o.borderTopWidth,this.startLeft=s/i-o.left+o.scrollLeft-o.borderLeftWidth,this.startBottom=o.height-this.startTop-this.dragBoxSize.height,this.startRight=o.width-this.startLeft-this.dragBoxSize.width}}componentDidMount(){this.reportStartPosition(),this.calcPosition(),this.__resizeDisposer=o(window,"resize",()=>{this.calcPosition()}),g()&&this.draggerRef&&(this.__preventScrollDisposer=o(this.draggerRef,"touchmove",t=>{t.preventDefault()}))}componentWillUnmount(){var t,i,e,s,o,r;null==(t=this.__resizeDisposer)||t.call(this),null==(i=this.__bodyClassDisposer)||i.call(this),null==(e=this.__moveDisposer)||e.call(this),null==(s=this.__clickDisposer)||s.call(this),null==(o=this.__upDisposer)||o.call(this),null==(r=this.__preventScrollDisposer)||r.call(this)}render(){const{className:i,zIndex:s,children:o,showDragArea:r,positionMode:h="fixed"}=this.props,{startDrag:n,startTouchDrag:d,endDrag:l}=this,p=a({zIndex:s},this.position,{position:h});/*#__PURE__*/return t.createElement(t.Fragment,null,r&&/*#__PURE__*/t.createElement("div",{className:f("drag-area"),ref:t=>{this.dragAreaRef=t},style:{display:"none",position:h,backgroundColor:"rgba(173, 216, 230, 0.2)",border:"1px dashed var(--ohkit-color-primary, #1890ff)",pointerEvents:"none",zIndex:(s||9999)-1,boxSizing:"border-box",borderRadius:"none"!==this.props.lockAxis?"2px":"0"}}),/*#__PURE__*/t.createElement("div",{className:e(f("container"),i),style:p,ref:t=>{this.draggerRef=t},onMouseDownCapture:n,onMouseUpCapture:l,onTouchStartCapture:d,onTouchEndCapture:l},o))}}m.defaultProps={zIndex:9999,offsetX:20,offsetY:20,placement:"bottom-right",disabled:!1,lockAxis:"none",showDragArea:!1,showDragAreaOverMoveDistanse:5,positionMode:"fixed"};export{m as DraggableBox,f as c,p as clamp,d as findAbsolutePositionParent,n as findFixedPositionParent,l as getScaleRatio,h as isPositioningContextCreator,g as supportsTouchEvents};
|
|
2
2
|
//# sourceMappingURL=index.modern.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.modern.mjs","sources":["../src/utils.ts","../src/constants.ts","../src/index.tsx"],"sourcesContent":["import {findParent} from '@ohkit/dom-helper';\n\n/**\n * 检查元素是否创建了新的定位上下文(包含块)\n * @param element 要检查的元素\n * @param includePosition 是否检查position属性(absolute/relative/fixed)\n */\nexport function isPositioningContextCreator(element: HTMLElement, includePosition: boolean): boolean {\n const style = window.getComputedStyle(element);\n const position = style.getPropertyValue('position');\n const transform = style.getPropertyValue('transform');\n const filter = style.getPropertyValue('filter');\n const perspective = style.getPropertyValue('perspective');\n const contain = style.getPropertyValue('contain');\n const willChange = style.getPropertyValue('will-change');\n \n return (includePosition && position !== 'static') || \n transform !== 'none' || \n filter !== 'none' || \n perspective !== 'none' ||\n contain.includes('paint') ||\n contain.includes('layout') ||\n contain.includes('strict') ||\n willChange.includes('transform') ||\n willChange.includes('perspective') ||\n willChange.includes('filter');\n}\n\n/**\n * 查找影响 fixed 定位的父元素\n * 当父元素有 transform/filter/perspective/contain/will-change 等属性时,fixed 定位会相对于该父元素\n */\nexport function findFixedPositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.documentElement;\n }\n const fixedPositionParent = findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, false);\n }, {excludeOwn: true}); // 没有找到,返回 window(通过 document.documentElement)\n return fixedPositionParent;\n}\n\n/**\n * 查找 absolute 定位的父元素\n * 查找最近的包含块创建者,包含所有可能影响absolute定位的属性\n */\nexport function findAbsolutePositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.body;\n }\n return findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, true);\n }, {excludeOwn: true});\n}\n\n/**\n * 获取容器的缩放比例\n * 通过比较元素的实际尺寸和 getBoundingClientRect 返回的尺寸来计算缩放比例\n */\nexport function getScaleRatio(dom?: HTMLElement | null): { scaleX: number; scaleY: number } {\n if (!dom) {\n return { scaleX: 1, scaleY: 1 };\n }\n // 通过比较 offsetWidth 和 getBoundingClientRect().width 来获取缩放比例\n const rect = dom.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n // 扩大{magnification}倍进行计算, 相当于保留小数点后4位\n const magnification = 10000;\n scaleX = dom.offsetWidth > 0 ? Math.round(rect.width / dom.offsetWidth * magnification) / magnification : 1;\n scaleY = dom.offsetHeight > 0 ? Math.round(rect.height / dom.offsetHeight * magnification) / magnification : 1;\n // console.log('rect.width dom.offsetWidth', rect.width, dom.offsetWidth);\n // console.log('rect.height dom.offsetHeight', rect.height, dom.offsetHeight);\n // console.log('scaleX', scaleX, 'scaleY', scaleY);\n return { scaleX, scaleY };\n}\n\n/**\n * 限制数值在指定范围内\n * \n * @param value 要限制的数值\n * @param min 最小值\n * @param max 最大值\n * @returns 限制后的数值,确保在 [min, max] 范围内\n */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n","\nexport const ValidPlacement = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n","import React from 'react';\nimport {\n prefixClassname as p,\n classNames as cx,\n} from \"@ohkit/prefix-classname\";\nimport {addEventListener, addClass} from '@ohkit/dom-helper';\nimport {findFixedPositionParent, findAbsolutePositionParent, getScaleRatio, clamp} from './utils';\nimport {ValidPlacement} from './constants';\nimport {DraggableBoxProps, DraggableBoxState} from './type';\n\nimport './style.scss';\n\nexport const c = p(\"ohkit-draggable-box__\");\nexport class DraggableBox extends React.Component<DraggableBoxProps, DraggableBoxState> {\n static defaultProps: Partial<DraggableBoxProps> = {\n zIndex: 9999,\n offsetX: 20,\n offsetY: 20,\n placement: 'bottom-right',\n disabled: false,\n lockAxis: 'none',\n showDragArea: false,\n positionMode: 'fixed',\n };\n\n constructor(props: DraggableBoxProps) {\n super(props);\n \n const { placement = 'bottom-right', offsetY = 20, offsetX = 20 } = props;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n // 简化状态初始化\n this.state = {\n top: placementY === 'top' ? offsetY : undefined,\n bottom: placementY === 'bottom' ? offsetY : undefined,\n left: placementX === 'left' ? offsetX : undefined,\n right: placementX === 'right' ? offsetX : undefined,\n };\n }\n\n private prePositionMode: DraggableBoxProps['positionMode'];\n private preDraggerRef: HTMLElement | null = null;\n private container: HTMLElement | null = null;\n /**\n * 获取定位容器\n * 根据 positionMode 返回对应的定位父元素\n */\n private getContainer(useCache = true) {\n const { positionMode = 'fixed' } = this.props;\n if (!this.container || !useCache || this.prePositionMode !== positionMode || this.preDraggerRef !== this.draggerRef) {\n this.prePositionMode = positionMode;\n this.preDraggerRef = this.draggerRef;\n this.container = positionMode === 'fixed' \n ? findFixedPositionParent(this.draggerRef) \n : findAbsolutePositionParent(this.draggerRef);\n }\n return this.container;\n }\n\n /**\n * 获取容器的尺寸和位置信息\n */\n private getContainerRect() {\n const container = this.getContainer(false);\n if (!container) {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n left: 0,\n top: 0,\n scrollLeft: 0,\n scrollTop: 0,\n scrollerScrollLeft: 0,\n scrollerScrollTop: 0,\n borderLeftWidth: 0,\n borderTopWidth: 0\n };\n }\n const containerRect = container.getBoundingClientRect();\n \n // 获取容器的border宽度(仅 top, left 对坐标计算有影响)\n const containerStyle = window.getComputedStyle(container);\n const borderLeftWidth = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTopWidth = parseFloat(containerStyle.borderTopWidth) || 0;\n const borderRightWidth = parseFloat(containerStyle.borderRightWidth) || 0;\n const borderBottomWidth = parseFloat(containerStyle.borderBottomWidth) || 0;\n const yScrollerWidth = container.offsetWidth - container.clientWidth - borderLeftWidth - borderRightWidth;\n const xScrollerHeight = container.offsetHeight - container.clientHeight - borderTopWidth - borderBottomWidth;\n // console.log('yScrollerWidth, xScrollerHeight', yScrollerWidth, xScrollerHeight);\n\n return {\n width: containerRect.width / this.cachedScaleX - borderLeftWidth - borderRightWidth - yScrollerWidth,\n height: containerRect.height / this.cachedScaleY - borderTopWidth - borderBottomWidth - xScrollerHeight,\n left: containerRect.left / this.cachedScaleX,\n top: containerRect.top / this.cachedScaleY,\n scrollLeft: container.scrollLeft,\n scrollTop: container.scrollTop,\n borderLeftWidth: borderLeftWidth,\n borderTopWidth: borderTopWidth,\n };\n }\n\n get dragBoxSize() {\n let width = 0;\n let height = 0;\n if (this.draggerRef) {\n width = this.draggerRef.offsetWidth;\n height = this.draggerRef.offsetHeight;\n }\n return {\n height,\n width\n };\n }\n\n get dragPositionBoundaries() {\n const { boundsX, boundsY, placement = 'bottom-right' } = this.props;\n const dragSize = this.dragBoxSize;\n const {width: containerWidth, height: containerHeight} = this.getContainerRect();\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n const defaultBounds = {\n minX: 0,\n maxX: Math.max(containerWidth - dragSize.width, 0),\n minY: 0,\n maxY: Math.max(containerHeight- dragSize.height, 0),\n };\n // 初始化边界\n let {minX, maxX, minY, maxY} = defaultBounds\n\n // 处理X轴边界\n if (boundsX) {\n const [minBound, maxBound] = boundsX;\n if (placementX === 'left') {\n // 左边位置:boundsX=[左边最小距离, 左边最大距离]\n if (minBound !== undefined) minX = Math.max(minX, minBound);\n if (maxBound !== undefined) maxX = Math.min(maxX, maxBound);\n } else {\n // 右边位置:boundsX=[右边最小距离, 右边最大距离]\n // 直接使用边界值作为right的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n }\n }\n }\n\n // 处理Y轴边界\n if (boundsY) {\n const [minBound, maxBound] = boundsY;\n \n if (placementY === 'top') {\n // 顶部位置:boundsY=[顶边最小距离, 顶边最大距离]\n if (minBound !== undefined) minY = Math.max(minY, minBound);\n if (maxBound !== undefined) maxY = Math.min(maxY, maxBound);\n } else {\n // 底部位置:boundsY=[底边最小距离, 底边最大距离]\n // 直接使用边界值作为bottom的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n }\n }\n }\n // 确保各个边界值在默认范围内\n minX = clamp(minX, defaultBounds.minX, defaultBounds.maxX);\n maxX = clamp(maxX, minX, defaultBounds.maxX);\n minY = clamp(minY, defaultBounds.minY, defaultBounds.maxY);\n maxY = clamp(maxY, minY, defaultBounds.maxY);\n\n return { minX, maxX, minY, maxY };\n }\n\n get curPositionKey() {\n let {placement} = this.props;\n if (!placement || !ValidPlacement.includes(placement)) {\n placement = 'bottom-right';\n }\n return placement.split('-') as ['top' | 'bottom', 'left' | 'right']; // [y, x]\n }\n\n get position() {\n const [y, x] = this.curPositionKey;\n const positionStyles: Record<string, string> = {};\n \n // 确保位置值存在且是有效的数字\n if (this.state[y] !== undefined) {\n positionStyles[y] = `${this.state[y]}px`;\n }\n if (this.state[x] !== undefined) {\n positionStyles[x] = `${this.state[x]}px`;\n }\n \n return positionStyles;\n }\n\n draggerRef: HTMLDivElement | null = null;\n\n isDragging = false;\n\n axisX?: number;\n axisY?: number;\n dX = 0;\n dY = 0;\n startTop = 0;\n startLeft = 0;\n\n // 缓存缩放比例,避免在 dragging 中频繁计算\n cachedScaleX = 1;\n cachedScaleY = 1;\n\n __moveDisposer?: () => void;\n __clickDisposer?: () => void;\n __bodyClassDisposer?: () => void;\n __upDisposer?: () => void;\n __resizeDisposer?: () => void;\n\n dragAreaRef: HTMLDivElement | null = null;\n\n reportStartPosition() {\n if (this.draggerRef) {\n // 获取缩放比例\n const { scaleX, scaleY } = getScaleRatio(this.getContainer());\n this.cachedScaleX = scaleX;\n this.cachedScaleY = scaleY;\n const { top, left } = this.draggerRef.getBoundingClientRect();\n const containerRect = this.getContainerRect();\n // console.log(containerRect, 'containerRect');\n \n // 计算相对于容器的位置,并除以缩放比例得到未缩放的坐标\n this.startTop = top / scaleY - containerRect.top + containerRect.scrollTop - containerRect.borderTopWidth;\n this.startLeft = left / scaleY - containerRect.left + containerRect.scrollLeft - containerRect.borderLeftWidth;\n }\n }\n\n enableDrag = () => {\n this.reportStartPosition();\n this.__moveDisposer?.();\n this.__moveDisposer = addEventListener(document, 'mousemove', (evt) => {\n // INFO: 移动过程中禁止click事件\n if (!this.__clickDisposer) {\n const moveDistanse = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2));\n // INFO: 移动超过5px?? 确保用户有真实的移动意愿,而不是手抖~~\n if (moveDistanse > 5) {\n this.__clickDisposer = addEventListener(\n document,\n 'click',\n (evt) => {\n evt.stopPropagation();\n },\n true\n );\n this.__bodyClassDisposer = addClass([document.body, this.draggerRef], c('moving')) || undefined;\n \n // 显示拖拽区域\n if (this.props.showDragArea && this.dragAreaRef) {\n this.showDragArea();\n }\n }\n }\n this.dragging(evt);\n }, true);\n\n this.__upDisposer?.();\n this.__upDisposer = addEventListener(\n document,\n 'mouseup',\n (evt) => {\n this.endDrag();\n evt.stopPropagation();\n evt.preventDefault();\n },\n true\n );\n };\n\n startDrag = (evt: React.MouseEvent<HTMLDivElement>) => {\n // 判断鼠标非右击才继续执行\n if (evt.nativeEvent.button === 2) {\n return;\n }\n this.axisX = evt.nativeEvent.pageX;\n this.axisY = evt.nativeEvent.pageY;\n if (!this.props.disabled) {\n this.enableDrag();\n }\n };\n\n dragging = (evt: MouseEvent) => {\n this.isDragging = true;\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n \n // 使用缓存的缩放比例,避免频繁计算\n const scaleX = this.cachedScaleX;\n const scaleY = this.cachedScaleY;\n \n // 计算原始偏移量(需要除以缩放比例)\n this.dX = (evt.pageX - (this.axisX || 0)) / scaleX;\n this.dY = (evt.pageY - (this.axisY || 0)) / scaleY;\n \n // 应用方向锁定并计算变换值\n let translateX = this.dX;\n let translateY = this.dY;\n \n if (lockAxis === 'x') {\n translateY = 0; // 锁定Y方向\n } else if (lockAxis === 'y') {\n translateX = 0; // 锁定X方向\n }\n \n // 应用边界条件到允许移动的方向\n const potentialLeft = this.startLeft + translateX;\n const potentialTop = this.startTop + translateY;\n \n // X轴边界条件(在允许X轴移动时应用)\n if (lockAxis !== 'y') {\n if (potentialLeft < minX) {\n translateX = minX - this.startLeft;\n } else if (potentialLeft > maxX) {\n translateX = maxX - this.startLeft;\n }\n }\n \n // Y轴边界条件(在允许Y轴移动时应用)\n if (lockAxis !== 'x') {\n if (potentialTop < minY) {\n translateY = minY - this.startTop;\n } else if (potentialTop > maxY) {\n translateY = maxY - this.startTop;\n }\n }\n \n if (this.draggerRef) {\n this.draggerRef.style.transform = `translate(${translateX}px, ${translateY}px)`;\n }\n evt.stopPropagation();\n };\n\n endDrag = () => {\n if (this.isDragging) {\n this.calcPosition();\n if (this.draggerRef) {\n this.draggerRef.style.transform = '';\n }\n \n // 隐藏拖拽区域\n if (this.props.showDragArea) {\n this.hideDragArea();\n }\n }\n\n this.__moveDisposer?.();\n this.__moveDisposer = undefined;\n if (this.__clickDisposer) {\n requestAnimationFrame(() => {\n if (this.__clickDisposer) {\n this.__clickDisposer();\n this.__clickDisposer = undefined;\n }\n });\n }\n this.__upDisposer?.();\n this.__upDisposer = undefined;\n this.__bodyClassDisposer?.();\n this.__bodyClassDisposer = undefined;\n\n this.isDragging = false;\n };\n\n showDragArea = () => {\n if (!this.props.showDragArea || !this.dragAreaRef) return;\n \n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const dragSize = this.dragBoxSize;\n \n // 重置样式\n this.dragAreaRef.style.border = '1px dashed var(--ohkit-color-primary, #1890ff)';\n this.dragAreaRef.style.backgroundColor = 'rgba(173, 216, 230, 0.2)'; // 淡透蓝色\n \n if (lockAxis === 'x') {\n // 锁定Y方向,显示为水平虚线区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = '2px'; // 更细的虚线高度\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${this.startTop + dragSize.height / 2}px`;\n } else if (lockAxis === 'y') {\n // 锁定X方向,显示为垂直虚线区域\n this.dragAreaRef.style.width = '2px'; // 更细的虚线宽度\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${this.startLeft + dragSize.width / 2}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n } else {\n // 自由拖拽,显示完整区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n }\n \n this.dragAreaRef.style.display = 'block';\n };\n\n hideDragArea = () => {\n if (this.dragAreaRef) {\n this.dragAreaRef.style.display = 'none';\n }\n };\n calcPosition = () => {\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const {height, width} = this.getContainerRect();\n \n // 计算新的位置\n let newTop = this.startTop;\n let newLeft = this.startLeft;\n \n if (lockAxis !== 'y') {\n newLeft += this.dX;\n }\n if (lockAxis !== 'x') {\n newTop += this.dY;\n }\n \n // 应用边界限制\n const realTop = clamp(newTop, minY, maxY);\n const realLeft = clamp(newLeft, minX, maxX);\n const realBottom = height - realTop - this.dragBoxSize.height;\n const realRight = width - realLeft - this.dragBoxSize.width;\n if (realTop !== this.state.top || realLeft !== this.state.left || this.state.bottom !== realBottom || this.state.right !== realRight) {\n // console.log(minY, maxY, this.startTop, this.dY, newTop, realTop, 'minY, maxY, this.startTop, this.dY, newTop, realTop --- calcPosition y');\n // console.log(minX, maxX, this.startLeft, this.dX, newLeft, realLeft, 'minX, maxX, this.startLeft, this.dX, newLeft, realLeft ---calcPosition x');\n this.setState({\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight\n });\n }\n this.startTop = realTop;\n this.startLeft = realLeft;\n this.dX = this.dY = 0;\n };\n\n\n componentDidMount() {\n // 检查初始位置是否在边界范围内,如果不在则修正\n this.reportStartPosition();\n this.calcPosition();\n \n this.__resizeDisposer = addEventListener(window, 'resize', () => {\n this.calcPosition();\n });\n }\n\n componentWillUnmount() {\n this.__resizeDisposer?.();\n this.__bodyClassDisposer?.();\n this.__moveDisposer?.();\n this.__clickDisposer?.();\n this.__upDisposer?.();\n }\n\n render() {\n const { className, zIndex, children, showDragArea, positionMode = 'fixed' } = this.props;\n const { startDrag, endDrag } = this;\n const stl = {\n zIndex,\n ...this.position,\n position: positionMode\n };\n return (\n <>\n {showDragArea && (\n <div\n className={c('drag-area')}\n ref={(r) => {\n this.dragAreaRef = r;\n }}\n style={{\n display: 'none',\n position: positionMode,\n backgroundColor: 'rgba(173, 216, 230, 0.2)', // 淡透蓝色\n border: '1px dashed var(--ohkit-color-primary, #1890ff)',\n pointerEvents: 'none',\n zIndex: (zIndex || 9999) - 1,\n boxSizing: 'border-box',\n borderRadius: this.props.lockAxis !== 'none' ? '2px' : '0',\n }}\n />\n )}\n <div\n className={cx(c('container'), className)}\n style={stl}\n ref={(r) => {\n this.draggerRef = r;\n }}\n onMouseDown={startDrag}\n onMouseUp={endDrag}\n >\n {children}\n </div>\n </>\n );\n }\n}\n\nexport default DraggableBox;"],"names":["isPositioningContextCreator","element","includePosition","style","window","getComputedStyle","position","getPropertyValue","transform","filter","perspective","contain","willChange","includes","clamp","value","min","max","Math","ValidPlacement","c","p","DraggableBox","React","Component","constructor","props","super","this","prePositionMode","preDraggerRef","container","draggerRef","isDragging","axisX","axisY","dX","dY","startTop","startLeft","cachedScaleX","cachedScaleY","__moveDisposer","__clickDisposer","__bodyClassDisposer","__upDisposer","__resizeDisposer","dragAreaRef","enableDrag","_this$__moveDisposer","_this$__upDisposer","reportStartPosition","call","addEventListener","document","evt","sqrt","pow","stopPropagation","addClass","body","undefined","showDragArea","dragging","endDrag","preventDefault","startDrag","nativeEvent","button","pageX","pageY","disabled","lockAxis","minX","maxX","minY","maxY","dragPositionBoundaries","scaleY","translateX","translateY","potentialLeft","potentialTop","_this$__moveDisposer2","_this$__upDisposer2","_this$__bodyClassDisp","calcPosition","hideDragArea","requestAnimationFrame","dragSize","dragBoxSize","border","backgroundColor","width","height","left","top","display","getContainerRect","newTop","newLeft","realTop","realLeft","realBottom","realRight","state","bottom","right","setState","placement","offsetY","offsetX","placementY","placementX","split","getContainer","useCache","positionMode","dom","findParent","parent","excludeOwn","documentElement","findAbsolutePositionParent","innerWidth","innerHeight","scrollLeft","scrollTop","scrollerScrollLeft","scrollerScrollTop","borderLeftWidth","borderTopWidth","containerRect","getBoundingClientRect","containerStyle","parseFloat","borderRightWidth","borderBottomWidth","offsetWidth","clientWidth","offsetHeight","clientHeight","boundsX","boundsY","containerWidth","containerHeight","defaultBounds","minBound","maxBound","curPositionKey","y","x","positionStyles","scaleX","rect","magnification","round","getScaleRatio","componentDidMount","componentWillUnmount","_this$__resizeDispose","_this$__bodyClassDisp2","_this$__moveDisposer3","_this$__clickDisposer","_this$__upDisposer3","render","className","zIndex","children","stl","_extends","createElement","Fragment","ref","r","pointerEvents","boxSizing","borderRadius","cx","onMouseDown","onMouseUp","defaultProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.modern.mjs","sources":["../src/utils.ts","../src/constants.ts","../src/index.tsx"],"sourcesContent":["import {findParent} from '@ohkit/dom-helper';\n\n/**\n * 检查元素是否创建了新的定位上下文(包含块)\n * @param element 要检查的元素\n * @param includePosition 是否检查position属性(absolute/relative/fixed)\n */\nexport function isPositioningContextCreator(element: HTMLElement, includePosition: boolean): boolean {\n const style = window.getComputedStyle(element);\n const position = style.getPropertyValue('position');\n const transform = style.getPropertyValue('transform');\n const filter = style.getPropertyValue('filter');\n const perspective = style.getPropertyValue('perspective');\n const contain = style.getPropertyValue('contain');\n const willChange = style.getPropertyValue('will-change');\n \n return (includePosition && position !== 'static') || \n transform !== 'none' || \n filter !== 'none' || \n perspective !== 'none' ||\n contain.includes('paint') ||\n contain.includes('layout') ||\n contain.includes('strict') ||\n willChange.includes('transform') ||\n willChange.includes('perspective') ||\n willChange.includes('filter');\n}\n\n/**\n * 查找影响 fixed 定位的父元素\n * 当父元素有 transform/filter/perspective/contain/will-change 等属性时,fixed 定位会相对于该父元素\n */\nexport function findFixedPositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.documentElement;\n }\n const fixedPositionParent = findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, false);\n }, {excludeOwn: true}); // 没有找到,返回 window(通过 document.documentElement)\n return fixedPositionParent;\n}\n\n/**\n * 查找 absolute 定位的父元素\n * 查找最近的包含块创建者,包含所有可能影响absolute定位的属性\n */\nexport function findAbsolutePositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.body;\n }\n return findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, true);\n }, {excludeOwn: true});\n}\n\n/**\n * 获取容器的缩放比例\n * 通过比较元素的实际尺寸和 getBoundingClientRect 返回的尺寸来计算缩放比例\n */\nexport function getScaleRatio(dom?: HTMLElement | null): { scaleX: number; scaleY: number } {\n if (!dom) {\n return { scaleX: 1, scaleY: 1 };\n }\n // 通过比较 offsetWidth 和 getBoundingClientRect().width 来获取缩放比例\n const rect = dom.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n // 扩大{magnification}倍进行计算, 相当于保留小数点后4位\n const magnification = 10000;\n scaleX = dom.offsetWidth > 0 ? Math.round(rect.width / dom.offsetWidth * magnification) / magnification : 1;\n scaleY = dom.offsetHeight > 0 ? Math.round(rect.height / dom.offsetHeight * magnification) / magnification : 1;\n // console.log('rect.width dom.offsetWidth', rect.width, dom.offsetWidth);\n // console.log('rect.height dom.offsetHeight', rect.height, dom.offsetHeight);\n // console.log('scaleX', scaleX, 'scaleY', scaleY);\n return { scaleX, scaleY };\n}\n\n/**\n * 限制数值在指定范围内\n * \n * @param value 要限制的数值\n * @param min 最小值\n * @param max 最大值\n * @returns 限制后的数值,确保在 [min, max] 范围内\n */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\n\n/**\n * 检测当前环境是否支持触摸事件\n * \n * @returns 如果环境支持触摸事件返回 true,否则返回 false\n */\nexport function supportsTouchEvents() {\n return typeof window !== 'undefined' && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};","\nexport const ValidPlacement = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n","import React from 'react';\nimport {\n prefixClassname as p,\n classNames as cx,\n} from \"@ohkit/prefix-classname\";\nimport {addEventListener, addClass} from '@ohkit/dom-helper';\nimport {findFixedPositionParent, findAbsolutePositionParent, getScaleRatio, clamp, supportsTouchEvents} from './utils';\nimport {ValidPlacement} from './constants';\nimport {DraggableBoxProps, DraggableBoxState} from './type';\n\nimport './style.scss';\n\nexport * from './utils';\nexport * from './type';\nexport const c = p(\"ohkit-draggable-box__\");\nexport class DraggableBox extends React.Component<DraggableBoxProps, DraggableBoxState> {\n static defaultProps: Partial<DraggableBoxProps> = {\n zIndex: 9999,\n offsetX: 20,\n offsetY: 20,\n placement: 'bottom-right',\n disabled: false,\n lockAxis: 'none',\n showDragArea: false,\n showDragAreaOverMoveDistanse: 5,\n positionMode: 'fixed',\n };\n\n constructor(props: DraggableBoxProps) {\n super(props);\n const { offsetX, offsetY } = this.props;\n this.state = this.formatState({offsetX, offsetY});\n }\n\n private formatState({offsetX = DraggableBox.defaultProps.offsetX, offsetY = DraggableBox.defaultProps.offsetY} = {}) {\n const { placement = 'bottom-right' } = this.props;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n const newState = {\n top: placementY === 'top' ? offsetY : undefined,\n bottom: placementY === 'bottom' ? offsetY : undefined,\n left: placementX === 'left' ? offsetX : undefined,\n right: placementX === 'right' ? offsetX : undefined,\n }\n return newState;\n }\n\n private prePositionMode: DraggableBoxProps['positionMode'];\n private preDraggerRef: HTMLElement | null = null;\n private container: HTMLElement | null = null;\n /**\n * 获取定位容器\n * 根据 positionMode 返回对应的定位父元素\n */\n private getContainer(useCache = true) {\n const { positionMode = 'fixed' } = this.props;\n if (!this.container || !useCache || this.prePositionMode !== positionMode || this.preDraggerRef !== this.draggerRef) {\n this.prePositionMode = positionMode;\n this.preDraggerRef = this.draggerRef;\n this.container = positionMode === 'fixed' \n ? findFixedPositionParent(this.draggerRef) \n : findAbsolutePositionParent(this.draggerRef);\n }\n return this.container;\n }\n\n /**\n * 获取容器的尺寸和位置信息\n */\n private getContainerRect() {\n const container = this.getContainer(false);\n if (!container) {\n return {\n width: document.documentElement.clientWidth, // window.innerWidth, 避免滚动条影响计算\n height: document.documentElement.clientHeight, // window.innerHeight, 避免滚动条影响计算\n left: 0,\n top: 0,\n scrollLeft: 0,\n scrollTop: 0,\n scrollerScrollLeft: 0,\n scrollerScrollTop: 0,\n borderLeftWidth: 0,\n borderTopWidth: 0\n };\n }\n const containerRect = container.getBoundingClientRect();\n \n // 获取容器的border宽度(仅 top, left 对坐标计算有影响)\n const containerStyle = window.getComputedStyle(container);\n const borderLeftWidth = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTopWidth = parseFloat(containerStyle.borderTopWidth) || 0;\n const borderRightWidth = parseFloat(containerStyle.borderRightWidth) || 0;\n const borderBottomWidth = parseFloat(containerStyle.borderBottomWidth) || 0;\n const yScrollerWidth = container.offsetWidth - container.clientWidth - borderLeftWidth - borderRightWidth;\n const xScrollerHeight = container.offsetHeight - container.clientHeight - borderTopWidth - borderBottomWidth;\n // console.log('yScrollerWidth, xScrollerHeight', yScrollerWidth, xScrollerHeight);\n\n return {\n width: containerRect.width / this.cachedScaleX - borderLeftWidth - borderRightWidth - yScrollerWidth,\n height: containerRect.height / this.cachedScaleY - borderTopWidth - borderBottomWidth - xScrollerHeight,\n left: containerRect.left / this.cachedScaleX,\n top: containerRect.top / this.cachedScaleY,\n scrollLeft: container.scrollLeft,\n scrollTop: container.scrollTop,\n borderLeftWidth: borderLeftWidth,\n borderTopWidth: borderTopWidth,\n };\n }\n\n get dragBoxSize() {\n let width = 0;\n let height = 0;\n if (this.draggerRef) {\n width = this.draggerRef.offsetWidth;\n height = this.draggerRef.offsetHeight;\n }\n return {\n height,\n width\n };\n }\n\n get dragPositionBoundaries() {\n const { boundsX, boundsY, placement = 'bottom-right' } = this.props;\n const dragSize = this.dragBoxSize;\n const {width: containerWidth, height: containerHeight} = this.getContainerRect();\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n const defaultBounds = {\n minX: 0,\n maxX: Math.max(containerWidth - dragSize.width, 0),\n minY: 0,\n maxY: Math.max(containerHeight- dragSize.height, 0),\n };\n // 初始化边界\n let {minX, maxX, minY, maxY} = defaultBounds\n\n // 处理X轴边界\n if (boundsX) {\n const [minBound, maxBound] = boundsX;\n if (placementX === 'left') {\n // 左边位置:boundsX=[左边最小距离, 左边最大距离]\n if (minBound !== undefined) minX = Math.max(minX, minBound);\n if (maxBound !== undefined) maxX = Math.min(maxX, maxBound);\n } else {\n // 右边位置:boundsX=[右边最小距离, 右边最大距离]\n // 直接使用边界值作为right的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n }\n }\n }\n\n // 处理Y轴边界\n if (boundsY) {\n const [minBound, maxBound] = boundsY;\n \n if (placementY === 'top') {\n // 顶部位置:boundsY=[顶边最小距离, 顶边最大距离]\n if (minBound !== undefined) minY = Math.max(minY, minBound);\n if (maxBound !== undefined) maxY = Math.min(maxY, maxBound);\n } else {\n // 底部位置:boundsY=[底边最小距离, 底边最大距离]\n // 直接使用边界值作为bottom的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n }\n }\n }\n // 确保各个边界值在默认范围内\n minX = clamp(minX, defaultBounds.minX, defaultBounds.maxX);\n maxX = clamp(maxX, minX, defaultBounds.maxX);\n minY = clamp(minY, defaultBounds.minY, defaultBounds.maxY);\n maxY = clamp(maxY, minY, defaultBounds.maxY);\n\n return { minX, maxX, minY, maxY };\n }\n\n get curPositionKey() {\n let {placement} = this.props;\n if (!placement || !ValidPlacement.includes(placement)) {\n placement = 'bottom-right';\n }\n return placement.split('-') as ['top' | 'bottom', 'left' | 'right']; // [y, x]\n }\n\n get position() {\n const [y, x] = this.curPositionKey;\n const positionStyles: Record<string, string> = {};\n \n // 确保位置值存在且是有效的数字\n if (this.state[y] !== undefined) {\n positionStyles[y] = `${this.state[y]}px`;\n }\n if (this.state[x] !== undefined) {\n positionStyles[x] = `${this.state[x]}px`;\n }\n \n return positionStyles;\n }\n\n draggerRef: HTMLDivElement | null = null;\n\n isDragging = false;\n\n axisX?: number;\n axisY?: number;\n dX = 0;\n dY = 0;\n startTop = 0;\n startLeft = 0;\n startBottom = 0;\n startRight = 0;\n translateX = 0;\n translateY = 0;\n\n // 缓存缩放比例,避免在 dragging 中频繁计算\n cachedScaleX = 1;\n cachedScaleY = 1;\n\n private __moveDisposer?: () => void;\n private __clickDisposer?: () => void;\n private __bodyClassDisposer?: () => void;\n private __upDisposer?: () => void;\n private __resizeDisposer?: () => void;\n private __preventScrollDisposer?: () => void;\n\n dragAreaRef: HTMLDivElement | null = null;\n\n private reportStartPosition() {\n if (this.draggerRef) {\n // 获取缩放比例\n const { scaleX, scaleY } = getScaleRatio(this.getContainer());\n this.cachedScaleX = scaleX;\n this.cachedScaleY = scaleY;\n const { top, left } = this.draggerRef.getBoundingClientRect();\n const containerRect = this.getContainerRect();\n // console.log(containerRect, 'containerRect');\n \n // 计算相对于容器的位置,并除以缩放比例得到未缩放的坐标\n this.startTop = top / scaleY - containerRect.top + containerRect.scrollTop - containerRect.borderTopWidth;\n this.startLeft = left / scaleY - containerRect.left + containerRect.scrollLeft - containerRect.borderLeftWidth;\n this.startBottom = containerRect.height - this.startTop - this.dragBoxSize.height;\n this.startRight = containerRect.width - this.startLeft - this.dragBoxSize.width;\n }\n }\n\n enableDrag = (isTouch = false) => {\n this.reportStartPosition();\n this.__moveDisposer?.();\n this.__moveDisposer = addEventListener(isTouch && this.draggerRef ? this.draggerRef : document, isTouch ? 'touchmove' : 'mousemove', (evt) => {\n evt.stopPropagation();\n if (isTouch) {\n evt.preventDefault();\n }\n // INFO: 移动过程中禁止click事件\n if (!this.__clickDisposer) {\n const moveDistanse = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2));\n // INFO: 移动超过px?? 确保用户有真实的移动意愿,而不是手抖~~\n if (moveDistanse > (this.props.showDragAreaOverMoveDistanse || 5)) {\n this.__clickDisposer = addEventListener(\n document,\n 'click',\n (evt) => {\n evt.stopPropagation();\n },\n true\n );\n this.__bodyClassDisposer = addClass([document.body, this.draggerRef], c('moving')) || undefined;\n \n // 显示拖拽区域\n if (this.props.showDragArea && this.dragAreaRef) {\n this.showDragArea();\n }\n }\n }\n // 调用拖拽开始回调\n if (!this.isDragging && this.props.onDragStart) {\n const positionChange = {\n top: this.startTop,\n left: this.startLeft,\n bottom: this.startBottom,\n right: this.startRight,\n diffX: 0,\n diffY: 0\n };\n this.props.onDragStart(positionChange);\n }\n this.dragging(evt as TouchEvent | MouseEvent);\n }, {\n passive: !isTouch\n });\n\n this.__upDisposer?.();\n this.__upDisposer = addEventListener(\n document,\n 'mouseup',\n () => {\n this.endDrag();\n },\n true\n );\n };\n\n startDrag = (evt: React.MouseEvent<HTMLDivElement>) => {\n // 判断鼠标非右击才继续执行\n if (evt.nativeEvent.button === 2) {\n return;\n }\n this.axisX = evt.nativeEvent.pageX;\n this.axisY = evt.nativeEvent.pageY;\n if (!this.props.disabled) {\n this.enableDrag();\n }\n };\n\n dragging = (evt: MouseEvent | TouchEvent) => {\n this.isDragging = true;\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n \n // 使用缓存的缩放比例,避免频繁计算\n const scaleX = this.cachedScaleX;\n const scaleY = this.cachedScaleY;\n \n // 获取坐标\n let pageX: number, pageY: number;\n if (evt instanceof TouchEvent) {\n const touch = evt.touches[0];\n if (!touch) return;\n pageX = touch.pageX;\n pageY = touch.pageY;\n } else {\n pageX = evt.pageX;\n pageY = evt.pageY;\n }\n \n // 计算原始偏移量(需要除以缩放比例)\n this.dX = (pageX - (this.axisX || 0)) / scaleX;\n this.dY = (pageY - (this.axisY || 0)) / scaleY;\n \n // 应用方向锁定并计算变换值\n let translateX = this.dX;\n let translateY = this.dY;\n \n if (lockAxis === 'x') {\n translateY = 0; // 锁定Y方向\n } else if (lockAxis === 'y') {\n translateX = 0; // 锁定X方向\n }\n \n // 应用边界条件到允许移动的方向\n const potentialLeft = this.startLeft + translateX;\n const potentialTop = this.startTop + translateY;\n \n // X轴边界条件(在允许X轴移动时应用)\n if (lockAxis !== 'y') {\n if (potentialLeft < minX) {\n translateX = minX - this.startLeft;\n } else if (potentialLeft > maxX) {\n translateX = maxX - this.startLeft;\n }\n }\n \n // Y轴边界条件(在允许Y轴移动时应用)\n if (lockAxis !== 'x') {\n if (potentialTop < minY) {\n translateY = minY - this.startTop;\n } else if (potentialTop > maxY) {\n translateY = maxY - this.startTop;\n }\n }\n if (this.translateX === translateX && this.translateY === translateY) {\n return;\n }\n\n // 调用拖拽中回调\n if (this.props.onDrag) {\n const positionChange = {\n top: this.startTop + translateY,\n left: this.startLeft + translateX,\n bottom: this.startBottom - translateY,\n right: this.startRight - translateX,\n diffX: translateX,\n diffY: translateY\n };\n this.props.onDrag(positionChange);\n }\n \n if (this.draggerRef) {\n this.draggerRef.style.transform = `translate(${translateX}px, ${translateY}px)`;\n }\n this.translateX = translateX;\n this.translateY = translateY;\n };\n\n startTouchDrag = (evt: React.TouchEvent<HTMLDivElement>) => {\n const touch = evt.touches[0];\n if (!touch) return;\n this.axisX = touch.pageX;\n this.axisY = touch.pageY;\n if (!this.props.disabled) {\n this.enableDrag(true);\n }\n };\n\n endDrag = () => {\n if (this.isDragging) {\n const positionChange = this.calcPosition();\n // 调用拖拽结束回调\n this.props.onDragEnd?.(positionChange);\n if (this.draggerRef) {\n this.draggerRef.style.transform = '';\n }\n \n // 隐藏拖拽区域\n if (this.props.showDragArea) {\n this.hideDragArea();\n }\n }\n\n if (this.__moveDisposer) {\n this.__moveDisposer();\n this.__moveDisposer = undefined;\n }\n if (this.__clickDisposer) {\n requestAnimationFrame(() => {\n if (this.__clickDisposer) {\n this.__clickDisposer();\n this.__clickDisposer = undefined;\n }\n });\n }\n if (this.__upDisposer) {\n this.__upDisposer();\n this.__upDisposer = undefined;\n }\n if (this.__bodyClassDisposer) {\n this.__bodyClassDisposer();\n this.__bodyClassDisposer = undefined;\n }\n\n this.isDragging = false;\n };\n\n showDragArea = () => {\n if (!this.props.showDragArea || !this.dragAreaRef) return;\n \n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const dragSize = this.dragBoxSize;\n \n // 重置样式\n this.dragAreaRef.style.border = '1px dashed var(--ohkit-color-primary, #1890ff)';\n this.dragAreaRef.style.backgroundColor = 'rgba(173, 216, 230, 0.2)'; // 淡透蓝色\n \n if (lockAxis === 'x') {\n // 锁定Y方向,显示为水平虚线区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = '2px'; // 更细的虚线高度\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${this.startTop + dragSize.height / 2}px`;\n } else if (lockAxis === 'y') {\n // 锁定X方向,显示为垂直虚线区域\n this.dragAreaRef.style.width = '2px'; // 更细的虚线宽度\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${this.startLeft + dragSize.width / 2}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n } else {\n // 自由拖拽,显示完整区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n }\n \n this.dragAreaRef.style.display = 'block';\n };\n\n hideDragArea = () => {\n if (this.dragAreaRef) {\n this.dragAreaRef.style.display = 'none';\n }\n };\n calcPosition = () => {\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const {height, width} = this.getContainerRect();\n \n // 计算新的位置\n let newTop = this.startTop;\n let newLeft = this.startLeft;\n \n if (lockAxis !== 'y') {\n newLeft += this.dX;\n }\n if (lockAxis !== 'x') {\n newTop += this.dY;\n }\n \n // 应用边界限制\n const realTop = clamp(newTop, minY, maxY);\n const realLeft = clamp(newLeft, minX, maxX);\n const realBottom = height - realTop - this.dragBoxSize.height;\n const realRight = width - realLeft - this.dragBoxSize.width;\n if (realTop !== this.state.top || realLeft !== this.state.left || this.state.bottom !== realBottom || this.state.right !== realRight) {\n this.setState({\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight\n });\n }\n const positionChange = {\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight,\n diffX: realLeft - this.startLeft,\n diffY: realTop - this.startTop\n };\n this.startTop = realTop;\n this.startLeft = realLeft;\n this.startBottom = realBottom;\n this.startRight = realRight;\n this.dX = this.dY = 0;\n return positionChange;\n };\n\n // 更新状态并计算位置 (外部可以调用)\n updateState = ({offsetX, offsetY}: Pick<DraggableBoxProps, 'offsetX' | 'offsetY'> = {}) => {\n this.setState(this.formatState({offsetX, offsetY}), () => {\n this.reportStartPosition();\n this.calcPosition();\n });\n }\n\n componentDidMount() {\n // 检查初始位置是否在边界范围内,如果不在则修正\n this.reportStartPosition();\n this.calcPosition();\n \n this.__resizeDisposer = addEventListener(window, 'resize', () => {\n this.calcPosition();\n });\n\n // 触屏设备时,阻止拖拽时滚动页面\n if (supportsTouchEvents() && this.draggerRef) {\n this.__preventScrollDisposer = addEventListener(this.draggerRef, 'touchmove', (evt) => {\n evt.preventDefault();\n });\n }\n }\n\n componentWillUnmount() {\n this.__resizeDisposer?.();\n this.__bodyClassDisposer?.();\n this.__moveDisposer?.();\n this.__clickDisposer?.();\n this.__upDisposer?.();\n this.__preventScrollDisposer?.();\n }\n\n render() {\n const { className, zIndex, children, showDragArea, positionMode = 'fixed' } = this.props;\n const { startDrag, startTouchDrag, endDrag } = this;\n const stl = {\n zIndex,\n ...this.position,\n position: positionMode\n };\n return (\n <React.Fragment>\n {showDragArea && (\n <div\n className={c('drag-area')}\n ref={(r) => {\n this.dragAreaRef = r;\n }}\n style={{\n display: 'none',\n position: positionMode,\n backgroundColor: 'rgba(173, 216, 230, 0.2)', // 淡透蓝色\n border: '1px dashed var(--ohkit-color-primary, #1890ff)',\n pointerEvents: 'none',\n zIndex: (zIndex || 9999) - 1,\n boxSizing: 'border-box',\n borderRadius: this.props.lockAxis !== 'none' ? '2px' : '0',\n }}\n />\n )}\n <div\n className={cx(c('container'), className)}\n style={stl}\n ref={(r) => {\n this.draggerRef = r;\n }}\n onMouseDownCapture={startDrag}\n onMouseUpCapture={endDrag}\n onTouchStartCapture={startTouchDrag}\n onTouchEndCapture={endDrag}\n >\n {children}\n </div>\n </React.Fragment>\n );\n }\n}\n"],"names":["isPositioningContextCreator","element","includePosition","style","window","getComputedStyle","position","getPropertyValue","transform","filter","perspective","contain","willChange","includes","findFixedPositionParent","dom","findParent","parent","excludeOwn","document","documentElement","findAbsolutePositionParent","body","getScaleRatio","scaleX","scaleY","rect","getBoundingClientRect","magnification","offsetWidth","Math","round","width","offsetHeight","height","clamp","value","min","max","supportsTouchEvents","navigator","maxTouchPoints","ValidPlacement","c","p","DraggableBox","React","Component","constructor","props","super","this","prePositionMode","preDraggerRef","container","draggerRef","isDragging","axisX","axisY","dX","dY","startTop","startLeft","startBottom","startRight","translateX","translateY","cachedScaleX","cachedScaleY","__moveDisposer","__clickDisposer","__bodyClassDisposer","__upDisposer","__resizeDisposer","__preventScrollDisposer","dragAreaRef","enableDrag","isTouch","_this$__moveDisposer","_this$__upDisposer","reportStartPosition","call","addEventListener","evt","stopPropagation","preventDefault","sqrt","pow","showDragAreaOverMoveDistanse","addClass","undefined","showDragArea","onDragStart","top","left","bottom","right","diffX","diffY","dragging","passive","endDrag","startDrag","nativeEvent","button","pageX","pageY","disabled","lockAxis","minX","maxX","minY","maxY","dragPositionBoundaries","TouchEvent","touch","touches","potentialLeft","potentialTop","onDrag","startTouchDrag","_this$props$onDragEnd","_this$props","positionChange","calcPosition","onDragEnd","hideDragArea","requestAnimationFrame","dragSize","dragBoxSize","border","backgroundColor","display","getContainerRect","newTop","newLeft","realTop","realLeft","realBottom","realRight","state","setState","updateState","offsetX","offsetY","formatState","defaultProps","placement","placementY","placementX","split","getContainer","useCache","positionMode","clientWidth","clientHeight","scrollLeft","scrollTop","scrollerScrollLeft","scrollerScrollTop","borderLeftWidth","borderTopWidth","containerRect","containerStyle","parseFloat","borderRightWidth","borderBottomWidth","boundsX","boundsY","containerWidth","containerHeight","defaultBounds","minBound","maxBound","curPositionKey","y","x","positionStyles","componentDidMount","componentWillUnmount","_this$__resizeDispose","_this$__bodyClassDisp","_this$__moveDisposer2","_this$__clickDisposer","_this$__upDisposer2","_this$__preventScroll","render","className","zIndex","children","stl","_extends","createElement","Fragment","ref","r","pointerEvents","boxSizing","borderRadius","cx","onMouseDownCapture","onMouseUpCapture","onTouchStartCapture","onTouchEndCapture"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("@ohkit/prefix-classname"),require("@ohkit/dom-helper")):"function"==typeof define&&define.amd?define(["exports","react","@ohkit/prefix-classname","@ohkit/dom-helper"],t):t((e||self).draggableBox={},e.react,e.prefixClassname,e.domHelper)}(this,function(e,t,i,r){function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=/*#__PURE__*/o(t);function n(){return n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var r in i)({}).hasOwnProperty.call(i,r)&&(e[r]=i[r])}return e},n.apply(null,arguments)}function s(e,t){return s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},s(e,t)}function d(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}function l(e,t){var i=window.getComputedStyle(e),r=i.getPropertyValue("position"),o=i.getPropertyValue("transform"),a=i.getPropertyValue("filter"),n=i.getPropertyValue("perspective"),s=i.getPropertyValue("contain"),d=i.getPropertyValue("will-change");return t&&"static"!==r||"none"!==o||"none"!==a||"none"!==n||s.includes("paint")||s.includes("layout")||s.includes("strict")||d.includes("transform")||d.includes("perspective")||d.includes("filter")}function p(e,t,i){return Math.min(Math.max(e,t),i)}var h=["top-left","top-right","bottom-left","bottom-right"],c=i.prefixClassname("ohkit-draggable-box__"),f=/*#__PURE__*/function(e){function t(t){var i;(i=e.call(this,t)||this).prePositionMode=void 0,i.preDraggerRef=null,i.container=null,i.draggerRef=null,i.isDragging=!1,i.axisX=void 0,i.axisY=void 0,i.dX=0,i.dY=0,i.startTop=0,i.startLeft=0,i.cachedScaleX=1,i.cachedScaleY=1,i.__moveDisposer=void 0,i.__clickDisposer=void 0,i.__bodyClassDisposer=void 0,i.__upDisposer=void 0,i.__resizeDisposer=void 0,i.dragAreaRef=null,i.enableDrag=function(){i.reportStartPosition(),null==i.__moveDisposer||i.__moveDisposer(),i.__moveDisposer=r.addEventListener(document,"mousemove",function(e){i.__clickDisposer||Math.sqrt(Math.pow(i.dX,2)+Math.pow(i.dY,2))>5&&(i.__clickDisposer=r.addEventListener(document,"click",function(e){e.stopPropagation()},!0),i.__bodyClassDisposer=r.addClass([document.body,i.draggerRef],c("moving"))||void 0,i.props.showDragArea&&i.dragAreaRef&&i.showDragArea()),i.dragging(e)},!0),null==i.__upDisposer||i.__upDisposer(),i.__upDisposer=r.addEventListener(document,"mouseup",function(e){i.endDrag(),e.stopPropagation(),e.preventDefault()},!0)},i.startDrag=function(e){2!==e.nativeEvent.button&&(i.axisX=e.nativeEvent.pageX,i.axisY=e.nativeEvent.pageY,i.props.disabled||i.enableDrag())},i.dragging=function(e){i.isDragging=!0;var t=i.props.lockAxis,r=i.dragPositionBoundaries,o=r.minX,a=r.maxX,n=r.minY,s=r.maxY,d=i.cachedScaleY;i.dX=(e.pageX-(i.axisX||0))/i.cachedScaleX,i.dY=(e.pageY-(i.axisY||0))/d;var l=i.dX,p=i.dY;"x"===t?p=0:"y"===t&&(l=0);var h=i.startLeft+l,c=i.startTop+p;"y"!==t&&(h<o?l=o-i.startLeft:h>a&&(l=a-i.startLeft)),"x"!==t&&(c<n?p=n-i.startTop:c>s&&(p=s-i.startTop)),i.draggerRef&&(i.draggerRef.style.transform="translate("+l+"px, "+p+"px)"),e.stopPropagation()},i.endDrag=function(){i.isDragging&&(i.calcPosition(),i.draggerRef&&(i.draggerRef.style.transform=""),i.props.showDragArea&&i.hideDragArea()),null==i.__moveDisposer||i.__moveDisposer(),i.__moveDisposer=void 0,i.__clickDisposer&&requestAnimationFrame(function(){i.__clickDisposer&&(i.__clickDisposer(),i.__clickDisposer=void 0)}),null==i.__upDisposer||i.__upDisposer(),i.__upDisposer=void 0,null==i.__bodyClassDisposer||i.__bodyClassDisposer(),i.__bodyClassDisposer=void 0,i.isDragging=!1},i.showDragArea=function(){if(i.props.showDragArea&&i.dragAreaRef){var e=i.props.lockAxis,t=i.dragPositionBoundaries,r=t.minX,o=t.maxX,a=t.minY,n=t.maxY,s=i.dragBoxSize;i.dragAreaRef.style.border="1px dashed var(--ohkit-color-primary, #1890ff)",i.dragAreaRef.style.backgroundColor="rgba(173, 216, 230, 0.2)","x"===e?(i.dragAreaRef.style.width=o-r+s.width+"px",i.dragAreaRef.style.height="2px",i.dragAreaRef.style.left=r+"px",i.dragAreaRef.style.top=i.startTop+s.height/2+"px"):"y"===e?(i.dragAreaRef.style.width="2px",i.dragAreaRef.style.height=n-a+s.height+"px",i.dragAreaRef.style.left=i.startLeft+s.width/2+"px",i.dragAreaRef.style.top=a+"px"):(i.dragAreaRef.style.width=o-r+s.width+"px",i.dragAreaRef.style.height=n-a+s.height+"px",i.dragAreaRef.style.left=r+"px",i.dragAreaRef.style.top=a+"px"),i.dragAreaRef.style.display="block"}},i.hideDragArea=function(){i.dragAreaRef&&(i.dragAreaRef.style.display="none")},i.calcPosition=function(){var e=i.props.lockAxis,t=i.dragPositionBoundaries,r=t.minX,o=t.maxX,a=t.minY,n=t.maxY,s=i.getContainerRect(),d=s.height,l=s.width,h=i.startTop,c=i.startLeft;"y"!==e&&(c+=i.dX),"x"!==e&&(h+=i.dY);var f=p(h,a,n),g=p(c,r,o),u=d-f-i.dragBoxSize.height,m=l-g-i.dragBoxSize.width;f===i.state.top&&g===i.state.left&&i.state.bottom===u&&i.state.right===m||i.setState({top:f,left:g,bottom:u,right:m}),i.startTop=f,i.startLeft=g,i.dX=i.dY=0};var o=t.placement,a=t.offsetY,n=void 0===a?20:a,s=t.offsetX,d=void 0===s?20:s,l=(void 0===o?"bottom-right":o).split("-"),h=l[0],f=l[1];return i.state={top:"top"===h?n:void 0,bottom:"bottom"===h?n:void 0,left:"left"===f?d:void 0,right:"right"===f?d:void 0},i}var o,f;f=e,(o=t).prototype=Object.create(f.prototype),o.prototype.constructor=o,s(o,f);var g,u,m=t.prototype;return m.getContainer=function(e){void 0===e&&(e=!0);var t,i=this.props.positionMode,o=void 0===i?"fixed":i;return this.container&&e&&this.prePositionMode===o&&this.preDraggerRef===this.draggerRef||(this.prePositionMode=o,this.preDraggerRef=this.draggerRef,this.container="fixed"===o?(t=this.draggerRef)?r.findParent(t,function(e){return l(e,!1)},{excludeOwn:!0}):document.documentElement:function(e){return e?r.findParent(e,function(e){return l(e,!0)},{excludeOwn:!0}):document.body}(this.draggerRef)),this.container},m.getContainerRect=function(){var e=this.getContainer(!1);if(!e)return{width:window.innerWidth,height:window.innerHeight,left:0,top:0,scrollLeft:0,scrollTop:0,scrollerScrollLeft:0,scrollerScrollTop:0,borderLeftWidth:0,borderTopWidth:0};var t=e.getBoundingClientRect(),i=window.getComputedStyle(e),r=parseFloat(i.borderLeftWidth)||0,o=parseFloat(i.borderTopWidth)||0,a=parseFloat(i.borderRightWidth)||0,n=parseFloat(i.borderBottomWidth)||0;return{width:t.width/this.cachedScaleX-r-a-(e.offsetWidth-e.clientWidth-r-a),height:t.height/this.cachedScaleY-o-n-(e.offsetHeight-e.clientHeight-o-n),left:t.left/this.cachedScaleX,top:t.top/this.cachedScaleY,scrollLeft:e.scrollLeft,scrollTop:e.scrollTop,borderLeftWidth:r,borderTopWidth:o}},m.reportStartPosition=function(){if(this.draggerRef){var e=function(e){if(!e)return{scaleX:1,scaleY:1};var t=e.getBoundingClientRect(),i=1e4;return{scaleX:e.offsetWidth>0?Math.round(t.width/e.offsetWidth*i)/i:1,scaleY:e.offsetHeight>0?Math.round(t.height/e.offsetHeight*i)/i:1}}(this.getContainer()),t=e.scaleY;this.cachedScaleX=e.scaleX,this.cachedScaleY=t;var i=this.draggerRef.getBoundingClientRect(),r=i.top,o=i.left,a=this.getContainerRect();this.startTop=r/t-a.top+a.scrollTop-a.borderTopWidth,this.startLeft=o/t-a.left+a.scrollLeft-a.borderLeftWidth}},m.componentDidMount=function(){var e=this;this.reportStartPosition(),this.calcPosition(),this.__resizeDisposer=r.addEventListener(window,"resize",function(){e.calcPosition()})},m.componentWillUnmount=function(){var e,t,i,r,o;null==(e=this.__resizeDisposer)||e.call(this),null==(t=this.__bodyClassDisposer)||t.call(this),null==(i=this.__moveDisposer)||i.call(this),null==(r=this.__clickDisposer)||r.call(this),null==(o=this.__upDisposer)||o.call(this)},m.render=function(){var e=this,t=this.props,r=t.className,o=t.zIndex,s=t.children,d=t.showDragArea,l=t.positionMode,p=void 0===l?"fixed":l,h=this.startDrag,f=this.endDrag,g=n({zIndex:o},this.position,{position:p});/*#__PURE__*/return a.default.createElement(Fragment,null,d&&/*#__PURE__*/a.default.createElement("div",{className:c("drag-area"),ref:function(t){e.dragAreaRef=t},style:{display:"none",position:p,backgroundColor:"rgba(173, 216, 230, 0.2)",border:"1px dashed var(--ohkit-color-primary, #1890ff)",pointerEvents:"none",zIndex:(o||9999)-1,boxSizing:"border-box",borderRadius:"none"!==this.props.lockAxis?"2px":"0"}}),/*#__PURE__*/a.default.createElement("div",{className:i.classNames(c("container"),r),style:g,ref:function(t){e.draggerRef=t},onMouseDown:h,onMouseUp:f},s))},g=t,(u=[{key:"dragBoxSize",get:function(){var e=0,t=0;return this.draggerRef&&(e=this.draggerRef.offsetWidth,t=this.draggerRef.offsetHeight),{height:t,width:e}}},{key:"dragPositionBoundaries",get:function(){var e=this.props,t=e.boundsX,i=e.boundsY,r=e.placement,o=void 0===r?"bottom-right":r,a=this.dragBoxSize,n=this.getContainerRect(),s=n.width,d=n.height,l=o.split("-"),h=l[0],c=l[1],f={minX:0,maxX:Math.max(s-a.width,0),minY:0,maxY:Math.max(d-a.height,0)},g=f.minX,u=f.maxX,m=f.minY,v=f.maxY;if(t){var x=t[0],y=t[1];"left"===c?(void 0!==x&&(g=Math.max(g,x)),void 0!==y&&(u=Math.min(u,y))):void 0!==x&&void 0!==y?(g=Math.max(g,s-y-a.width),u=Math.min(u,s-x-a.width)):void 0!==x?u=Math.min(u,s-x-a.width):void 0!==y&&(g=Math.max(g,s-y-a.width))}if(i){var b=i[0],_=i[1];"top"===h?(void 0!==b&&(m=Math.max(m,b)),void 0!==_&&(v=Math.min(v,_))):void 0!==b&&void 0!==_?(m=Math.max(m,d-_-a.height),v=Math.min(v,d-b-a.height)):void 0!==b?v=Math.min(v,d-b-a.height):void 0!==_&&(m=Math.max(m,d-_-a.height))}return{minX:g=p(g,f.minX,f.maxX),maxX:u=p(u,g,f.maxX),minY:m=p(m,f.minY,f.maxY),maxY:v=p(v,m,f.maxY)}}},{key:"curPositionKey",get:function(){var e=this.props.placement;return e&&h.includes(e)||(e="bottom-right"),e.split("-")}},{key:"position",get:function(){var e=this.curPositionKey,t=e[0],i=e[1],r={};return void 0!==this.state[t]&&(r[t]=this.state[t]+"px"),void 0!==this.state[i]&&(r[i]=this.state[i]+"px"),r}}])&&function(e,t){for(var i=0;i<t.length;i++){var r=t[i];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,d(r.key),r)}}(g.prototype,u),Object.defineProperty(g,"prototype",{writable:!1}),g}(a.default.Component);f.defaultProps={zIndex:9999,offsetX:20,offsetY:20,placement:"bottom-right",disabled:!1,lockAxis:"none",showDragArea:!1,positionMode:"fixed"},e.DraggableBox=f,e.c=c,e.default=f});
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("react"),require("@ohkit/prefix-classname"),require("@ohkit/dom-helper")):"function"==typeof define&&define.amd?define(["exports","react","@ohkit/prefix-classname","@ohkit/dom-helper"],e):e((t||self).draggableBox={},t.react,t.prefixClassname,t.domHelper)}(this,function(t,e,r,o){function i(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var a=/*#__PURE__*/i(e);function s(){return s=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var o in r)({}).hasOwnProperty.call(r,o)&&(t[o]=r[o])}return t},s.apply(null,arguments)}function n(t,e){return n=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},n(t,e)}function d(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}function l(t,e){var r=window.getComputedStyle(t),o=r.getPropertyValue("position"),i=r.getPropertyValue("transform"),a=r.getPropertyValue("filter"),s=r.getPropertyValue("perspective"),n=r.getPropertyValue("contain"),d=r.getPropertyValue("will-change");return e&&"static"!==o||"none"!==i||"none"!==a||"none"!==s||n.includes("paint")||n.includes("layout")||n.includes("strict")||d.includes("transform")||d.includes("perspective")||d.includes("filter")}function p(t){return t?o.findParent(t,function(t){return l(t,!1)},{excludeOwn:!0}):document.documentElement}function f(t){return t?o.findParent(t,function(t){return l(t,!0)},{excludeOwn:!0}):document.body}function h(t){if(!t)return{scaleX:1,scaleY:1};var e=t.getBoundingClientRect(),r=1e4;return{scaleX:t.offsetWidth>0?Math.round(e.width/t.offsetWidth*r)/r:1,scaleY:t.offsetHeight>0?Math.round(e.height/t.offsetHeight*r)/r:1}}function c(t,e,r){return Math.min(Math.max(t,e),r)}function g(){return"undefined"!=typeof window&&("ontouchstart"in window||navigator.maxTouchPoints>0)}var u=["top-left","top-right","bottom-left","bottom-right"],m=r.prefixClassname("ohkit-draggable-box__"),v=/*#__PURE__*/function(t){function e(e){var r;(r=t.call(this,e)||this).prePositionMode=void 0,r.preDraggerRef=null,r.container=null,r.draggerRef=null,r.isDragging=!1,r.axisX=void 0,r.axisY=void 0,r.dX=0,r.dY=0,r.startTop=0,r.startLeft=0,r.startBottom=0,r.startRight=0,r.translateX=0,r.translateY=0,r.cachedScaleX=1,r.cachedScaleY=1,r.__moveDisposer=void 0,r.__clickDisposer=void 0,r.__bodyClassDisposer=void 0,r.__upDisposer=void 0,r.__resizeDisposer=void 0,r.__preventScrollDisposer=void 0,r.dragAreaRef=null,r.enableDrag=function(t){void 0===t&&(t=!1),r.reportStartPosition(),null==r.__moveDisposer||r.__moveDisposer(),r.__moveDisposer=o.addEventListener(t&&r.draggerRef?r.draggerRef:document,t?"touchmove":"mousemove",function(e){e.stopPropagation(),t&&e.preventDefault(),r.__clickDisposer||Math.sqrt(Math.pow(r.dX,2)+Math.pow(r.dY,2))>(r.props.showDragAreaOverMoveDistanse||5)&&(r.__clickDisposer=o.addEventListener(document,"click",function(t){t.stopPropagation()},!0),r.__bodyClassDisposer=o.addClass([document.body,r.draggerRef],m("moving"))||void 0,r.props.showDragArea&&r.dragAreaRef&&r.showDragArea()),!r.isDragging&&r.props.onDragStart&&r.props.onDragStart({top:r.startTop,left:r.startLeft,bottom:r.startBottom,right:r.startRight,diffX:0,diffY:0}),r.dragging(e)},{passive:!t}),null==r.__upDisposer||r.__upDisposer(),r.__upDisposer=o.addEventListener(document,"mouseup",function(){r.endDrag()},!0)},r.startDrag=function(t){2!==t.nativeEvent.button&&(r.axisX=t.nativeEvent.pageX,r.axisY=t.nativeEvent.pageY,r.props.disabled||r.enableDrag())},r.dragging=function(t){r.isDragging=!0;var e,o,i=r.props.lockAxis,a=r.dragPositionBoundaries,s=a.minX,n=a.maxX,d=a.minY,l=a.maxY,p=r.cachedScaleY;if(t instanceof TouchEvent){var f=t.touches[0];if(!f)return;e=f.pageX,o=f.pageY}else e=t.pageX,o=t.pageY;r.dX=(e-(r.axisX||0))/r.cachedScaleX,r.dY=(o-(r.axisY||0))/p;var h=r.dX,c=r.dY;"x"===i?c=0:"y"===i&&(h=0);var g=r.startLeft+h,u=r.startTop+c;"y"!==i&&(g<s?h=s-r.startLeft:g>n&&(h=n-r.startLeft)),"x"!==i&&(u<d?c=d-r.startTop:u>l&&(c=l-r.startTop)),(r.translateX!==h||r.translateY!==c)&&(r.props.onDrag&&r.props.onDrag({top:r.startTop+c,left:r.startLeft+h,bottom:r.startBottom-c,right:r.startRight-h,diffX:h,diffY:c}),r.draggerRef&&(r.draggerRef.style.transform="translate("+h+"px, "+c+"px)"),r.translateX=h,r.translateY=c)},r.startTouchDrag=function(t){var e=t.touches[0];e&&(r.axisX=e.pageX,r.axisY=e.pageY,r.props.disabled||r.enableDrag(!0))},r.endDrag=function(){if(r.isDragging){var t=r.calcPosition();null==r.props.onDragEnd||r.props.onDragEnd(t),r.draggerRef&&(r.draggerRef.style.transform=""),r.props.showDragArea&&r.hideDragArea()}r.__moveDisposer&&(r.__moveDisposer(),r.__moveDisposer=void 0),r.__clickDisposer&&requestAnimationFrame(function(){r.__clickDisposer&&(r.__clickDisposer(),r.__clickDisposer=void 0)}),r.__upDisposer&&(r.__upDisposer(),r.__upDisposer=void 0),r.__bodyClassDisposer&&(r.__bodyClassDisposer(),r.__bodyClassDisposer=void 0),r.isDragging=!1},r.showDragArea=function(){if(r.props.showDragArea&&r.dragAreaRef){var t=r.props.lockAxis,e=r.dragPositionBoundaries,o=e.minX,i=e.maxX,a=e.minY,s=e.maxY,n=r.dragBoxSize;r.dragAreaRef.style.border="1px dashed var(--ohkit-color-primary, #1890ff)",r.dragAreaRef.style.backgroundColor="rgba(173, 216, 230, 0.2)","x"===t?(r.dragAreaRef.style.width=i-o+n.width+"px",r.dragAreaRef.style.height="2px",r.dragAreaRef.style.left=o+"px",r.dragAreaRef.style.top=r.startTop+n.height/2+"px"):"y"===t?(r.dragAreaRef.style.width="2px",r.dragAreaRef.style.height=s-a+n.height+"px",r.dragAreaRef.style.left=r.startLeft+n.width/2+"px",r.dragAreaRef.style.top=a+"px"):(r.dragAreaRef.style.width=i-o+n.width+"px",r.dragAreaRef.style.height=s-a+n.height+"px",r.dragAreaRef.style.left=o+"px",r.dragAreaRef.style.top=a+"px"),r.dragAreaRef.style.display="block"}},r.hideDragArea=function(){r.dragAreaRef&&(r.dragAreaRef.style.display="none")},r.calcPosition=function(){var t=r.props.lockAxis,e=r.dragPositionBoundaries,o=e.minX,i=e.maxX,a=e.minY,s=e.maxY,n=r.getContainerRect(),d=n.height,l=n.width,p=r.startTop,f=r.startLeft;"y"!==t&&(f+=r.dX),"x"!==t&&(p+=r.dY);var h=c(p,a,s),g=c(f,o,i),u=d-h-r.dragBoxSize.height,m=l-g-r.dragBoxSize.width;h===r.state.top&&g===r.state.left&&r.state.bottom===u&&r.state.right===m||r.setState({top:h,left:g,bottom:u,right:m});var v={top:h,left:g,bottom:u,right:m,diffX:g-r.startLeft,diffY:h-r.startTop};return r.startTop=h,r.startLeft=g,r.startBottom=u,r.startRight=m,r.dX=r.dY=0,v},r.updateState=function(t){var e=void 0===t?{}:t;r.setState(r.formatState({offsetX:e.offsetX,offsetY:e.offsetY}),function(){r.reportStartPosition(),r.calcPosition()})};var i=r.props;return r.state=r.formatState({offsetX:i.offsetX,offsetY:i.offsetY}),r}var i,l;l=t,(i=e).prototype=Object.create(l.prototype),i.prototype.constructor=i,n(i,l);var v,x,b=e.prototype;return b.formatState=function(t){var r=void 0===t?{}:t,o=r.offsetX,i=void 0===o?e.defaultProps.offsetX:o,a=r.offsetY,s=void 0===a?e.defaultProps.offsetY:a,n=this.props.placement,d=(void 0===n?"bottom-right":n).split("-"),l=d[0],p=d[1];return{top:"top"===l?s:void 0,bottom:"bottom"===l?s:void 0,left:"left"===p?i:void 0,right:"right"===p?i:void 0}},b.getContainer=function(t){void 0===t&&(t=!0);var e=this.props.positionMode,r=void 0===e?"fixed":e;return this.container&&t&&this.prePositionMode===r&&this.preDraggerRef===this.draggerRef||(this.prePositionMode=r,this.preDraggerRef=this.draggerRef,this.container="fixed"===r?p(this.draggerRef):f(this.draggerRef)),this.container},b.getContainerRect=function(){var t=this.getContainer(!1);if(!t)return{width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,scrollLeft:0,scrollTop:0,scrollerScrollLeft:0,scrollerScrollTop:0,borderLeftWidth:0,borderTopWidth:0};var e=t.getBoundingClientRect(),r=window.getComputedStyle(t),o=parseFloat(r.borderLeftWidth)||0,i=parseFloat(r.borderTopWidth)||0,a=parseFloat(r.borderRightWidth)||0,s=parseFloat(r.borderBottomWidth)||0;return{width:e.width/this.cachedScaleX-o-a-(t.offsetWidth-t.clientWidth-o-a),height:e.height/this.cachedScaleY-i-s-(t.offsetHeight-t.clientHeight-i-s),left:e.left/this.cachedScaleX,top:e.top/this.cachedScaleY,scrollLeft:t.scrollLeft,scrollTop:t.scrollTop,borderLeftWidth:o,borderTopWidth:i}},b.reportStartPosition=function(){if(this.draggerRef){var t=h(this.getContainer()),e=t.scaleY;this.cachedScaleX=t.scaleX,this.cachedScaleY=e;var r=this.draggerRef.getBoundingClientRect(),o=r.top,i=r.left,a=this.getContainerRect();this.startTop=o/e-a.top+a.scrollTop-a.borderTopWidth,this.startLeft=i/e-a.left+a.scrollLeft-a.borderLeftWidth,this.startBottom=a.height-this.startTop-this.dragBoxSize.height,this.startRight=a.width-this.startLeft-this.dragBoxSize.width}},b.componentDidMount=function(){var t=this;this.reportStartPosition(),this.calcPosition(),this.__resizeDisposer=o.addEventListener(window,"resize",function(){t.calcPosition()}),g()&&this.draggerRef&&(this.__preventScrollDisposer=o.addEventListener(this.draggerRef,"touchmove",function(t){t.preventDefault()}))},b.componentWillUnmount=function(){var t,e,r,o,i,a;null==(t=this.__resizeDisposer)||t.call(this),null==(e=this.__bodyClassDisposer)||e.call(this),null==(r=this.__moveDisposer)||r.call(this),null==(o=this.__clickDisposer)||o.call(this),null==(i=this.__upDisposer)||i.call(this),null==(a=this.__preventScrollDisposer)||a.call(this)},b.render=function(){var t=this,e=this.props,o=e.className,i=e.zIndex,n=e.children,d=e.showDragArea,l=e.positionMode,p=void 0===l?"fixed":l,f=this.startDrag,h=this.startTouchDrag,c=this.endDrag,g=s({zIndex:i},this.position,{position:p});/*#__PURE__*/return a.default.createElement(a.default.Fragment,null,d&&/*#__PURE__*/a.default.createElement("div",{className:m("drag-area"),ref:function(e){t.dragAreaRef=e},style:{display:"none",position:p,backgroundColor:"rgba(173, 216, 230, 0.2)",border:"1px dashed var(--ohkit-color-primary, #1890ff)",pointerEvents:"none",zIndex:(i||9999)-1,boxSizing:"border-box",borderRadius:"none"!==this.props.lockAxis?"2px":"0"}}),/*#__PURE__*/a.default.createElement("div",{className:r.classNames(m("container"),o),style:g,ref:function(e){t.draggerRef=e},onMouseDownCapture:f,onMouseUpCapture:c,onTouchStartCapture:h,onTouchEndCapture:c},n))},v=e,(x=[{key:"dragBoxSize",get:function(){var t=0,e=0;return this.draggerRef&&(t=this.draggerRef.offsetWidth,e=this.draggerRef.offsetHeight),{height:e,width:t}}},{key:"dragPositionBoundaries",get:function(){var t=this.props,e=t.boundsX,r=t.boundsY,o=t.placement,i=void 0===o?"bottom-right":o,a=this.dragBoxSize,s=this.getContainerRect(),n=s.width,d=s.height,l=i.split("-"),p=l[0],f=l[1],h={minX:0,maxX:Math.max(n-a.width,0),minY:0,maxY:Math.max(d-a.height,0)},g=h.minX,u=h.maxX,m=h.minY,v=h.maxY;if(e){var x=e[0],b=e[1];"left"===f?(void 0!==x&&(g=Math.max(g,x)),void 0!==b&&(u=Math.min(u,b))):void 0!==x&&void 0!==b?(g=Math.max(g,n-b-a.width),u=Math.min(u,n-x-a.width)):void 0!==x?u=Math.min(u,n-x-a.width):void 0!==b&&(g=Math.max(g,n-b-a.width))}if(r){var D=r[0],_=r[1];"top"===p?(void 0!==D&&(m=Math.max(m,D)),void 0!==_&&(v=Math.min(v,_))):void 0!==D&&void 0!==_?(m=Math.max(m,d-_-a.height),v=Math.min(v,d-D-a.height)):void 0!==D?v=Math.min(v,d-D-a.height):void 0!==_&&(m=Math.max(m,d-_-a.height))}return{minX:g=c(g,h.minX,h.maxX),maxX:u=c(u,g,h.maxX),minY:m=c(m,h.minY,h.maxY),maxY:v=c(v,m,h.maxY)}}},{key:"curPositionKey",get:function(){var t=this.props.placement;return t&&u.includes(t)||(t="bottom-right"),t.split("-")}},{key:"position",get:function(){var t=this.curPositionKey,e=t[0],r=t[1],o={};return void 0!==this.state[e]&&(o[e]=this.state[e]+"px"),void 0!==this.state[r]&&(o[r]=this.state[r]+"px"),o}}])&&function(t,e){for(var r=0;r<e.length;r++){var o=e[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,d(o.key),o)}}(v.prototype,x),Object.defineProperty(v,"prototype",{writable:!1}),v}(a.default.Component);v.defaultProps={zIndex:9999,offsetX:20,offsetY:20,placement:"bottom-right",disabled:!1,lockAxis:"none",showDragArea:!1,showDragAreaOverMoveDistanse:5,positionMode:"fixed"},t.DraggableBox=v,t.c=m,t.clamp=c,t.findAbsolutePositionParent=f,t.findFixedPositionParent=p,t.getScaleRatio=h,t.isPositioningContextCreator=l,t.supportsTouchEvents=g});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|