@wbiokr/arrow 1.0.2 → 1.0.3
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 +4 -0
- package/dist/bundle.cjs.js +1 -147
- package/dist/bundle.cjs.js.map +1 -1
- package/dist/bundle.esm.js +1 -507
- package/dist/bundle.esm.js.map +1 -1
- package/package.json +7 -3
package/dist/bundle.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.esm.js","sources":["../src/editor.js"],"sourcesContent":["import { Keybinding } from '@wbiokr/keybinding'\n\n// 样式注入\nconst STYLES = `\n.ae-d2-container {\n position: relative;\n width: 1000px;\n height: 600px;\n background: #fff;\n margin: auto;\n}\n\n.ae-d2-svg {\n width: 100%;\n height: 100%;\n position: absolute;\n left: 0;\n top: 0;\n z-index: 10;\n}\n\n\n.ae-arrow-path {\n fill: none;\n stroke-linecap: round;\n stroke-linejoin: round;\n cursor: pointer;\n}\n\n.ae-arrow-path:hover {\n stroke: #00aaff;\n}\n\n.ae-transform-box {\n fill: none;\n stroke: #00aaff;\n stroke-width: 2;\n stroke-dasharray: 4;\n}\n\n.ae-transform-handle {\n fill: #fff;\n stroke: #00aaff;\n stroke-width: 2;\n cursor: pointer;\n}\n\n.ae-transform-handle:hover {\n fill: #00aaff;\n}\n\n.ae-rotate-handle {\n fill: #fff;\n stroke: #ff6600;\n stroke-width: 2;\n cursor: grab;\n}\n\n.ae-rotate-handle:hover {\n fill: #ff6600;\n}\n\n.ae-rotate-line {\n stroke: #ff6600;\n stroke-width: 1;\n stroke-dasharray: 4;\n}\n\n/* 工具条样式 */\n.ae-toolbar {\n position: absolute;\n display: none;\n flex-direction: column;\n gap: 10px;\n padding: 12px;\n background: #fff;\n border: 1px solid #ddd;\n border-radius: 8px;\n box-shadow: 0 2px 12px rgba(0,0,0,0.15);\n z-index: 20;\n pointer-events: auto;\n min-width: 140px;\n}\n\n.ae-toolbar-drag-handle {\n cursor: grab;\n text-align: center;\n padding: 4px;\n color: #999;\n font-size: 14px;\n line-height: 1;\n user-select: none;\n border-bottom: 1px solid #eee;\n margin: -12px -12px 8px -12px;\n padding-top: 8px;\n padding-bottom: 8px;\n border-radius: 8px 8px 0 0;\n}\n\n.ae-toolbar-drag-handle:active {\n cursor: grabbing;\n}\n\n.ae-toolbar-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ae-toolbar-label {\n font-size: 11px;\n color: #666;\n}\n\n.ae-toolbar input[type=\"color\"] {\n width: 40px;\n height: 30px;\n border: 1px solid #ddd;\n border-radius: 4px;\n cursor: pointer;\n padding: 0;\n background: none;\n}\n\n.ae-toolbar input[type=\"range\"] {\n width: 120px;\n cursor: pointer;\n}\n\n.ae-toolbar-value {\n font-size: 10px;\n color: #999;\n text-align: right;\n}\n`\n\n// 注入样式\nif (typeof document !== 'undefined') {\n const styleEl = document.createElement('style')\n styleEl.textContent = STYLES\n document.head.appendChild(styleEl)\n}\n\nexport class ArrowEditor {\n\n constructor(container, options = {}) {\n this.container = typeof container === 'string' ? document.querySelector(container) : container\n this.svg = null\n\n this.arrows = []\n this.drawing = false\n this.current = null\n this.selected = null\n this.mode = null\n this.lastClickTime = 0\n this.lastClickPos = null\n this._shouldBlockClick = false\n this._defaultColor = '#2b8cff'\n\n // 配置选项\n this.isCtrl = options.isCtrl || false\n this.stopPropagation = options.stopPropagation || false\n this.preventDefault = options.preventDefault || false\n this.onDrawEnd = options.onDrawEnd || null\n this.onRemove = options.onRemove || null\n this.onChange = options.onChange || null\n\n // 变换相关\n this._transformMode = null // 'rotate' | 'scale'\n this._transformHandle = null\n this._transformStartPos = null\n this._transformStartPoints = null\n this._transformCenter = null\n this._transformStartAngle = null\n this._rotationOffset = 0\n\n // 工具条相关\n this._toolbar = null\n this._strokeWidth = 8\n this._curveRate = 0\n\n this._createSVG()\n this._initKeybindings()\n this._initEvents()\n }\n\n _createSVG() {\n // 检查并设置容器的定位\n if (typeof getComputedStyle !== 'undefined') {\n const containerStyle = getComputedStyle(this.container)\n if (containerStyle.position === 'static') {\n this.container.style.position = 'relative'\n }\n }\n\n // 创建 SVG 元素\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n this.svg.setAttribute('class', 'ae-d2-svg')\n this.container.appendChild(this.svg)\n\n // 创建 defs 和 marker\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n this.svg.appendChild(defs)\n\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker')\n marker.setAttribute('id', 'ae-arrowhead')\n marker.setAttribute('markerWidth', '10')\n marker.setAttribute('markerHeight', '10')\n marker.setAttribute('refX', '9')\n marker.setAttribute('refY', '5')\n marker.setAttribute('orient', 'auto')\n\n const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\n polygon.setAttribute('points', '0,0 10,5 0,10 2,5')\n polygon.setAttribute('fill', this._defaultColor)\n\n marker.appendChild(polygon)\n defs.appendChild(marker)\n }\n\n _createToolbar() {\n if (this._toolbar) {\n this._toolbar.remove()\n }\n\n this._toolbar = document.createElement('div')\n this._toolbar.className = 'ae-toolbar'\n\n const color = this.selected.color || this._defaultColor\n const strokeWidth = this.selected.strokeWidth || this._strokeWidth\n const curveRate = this.selected.curveRate ?? this.selected.cornerRoundness ?? 0\n\n this._toolbar.innerHTML = `\n <div class=\"ae-toolbar-drag-handle\">:::</div>\n <div class=\"ae-toolbar-item\">\n <span class=\"ae-toolbar-label\">颜色</span>\n <input type=\"color\" class=\"ae-color-input\" value=\"${color}\" />\n </div>\n <div class=\"ae-toolbar-item\">\n <span class=\"ae-toolbar-label\">粗细</span>\n <input type=\"range\" class=\"ae-stroke-input\" min=\"1\" max=\"60\" value=\"${strokeWidth}\" />\n <span class=\"ae-toolbar-value\">${strokeWidth}px</span>\n </div>\n <div class=\"ae-toolbar-item\">\n <span class=\"ae-toolbar-label\">曲线率</span>\n <input type=\"range\" class=\"ae-round-input\" min=\"0\" max=\"1\" step=\"0.1\" value=\"${curveRate}\" />\n </div>\n `\n\n // 颜色选择\n const colorInput = this._toolbar.querySelector('.ae-color-input')\n colorInput.addEventListener('input', (e) => {\n if (!this.selected) return\n this.selected.color = e.target.value\n this._defaultColor = e.target.value\n this._updateMarkerColor(e.target.value)\n this.render()\n if (this.onChange) {\n this.onChange({ type: 'color', arrow: this.selected, value: e.target.value, arrows: this.getData() })\n }\n })\n\n // 粗细调整\n const strokeInput = this._toolbar.querySelector('.ae-stroke-input')\n const strokeValue = this._toolbar.querySelector('.ae-stroke-input + .ae-toolbar-value')\n strokeInput.addEventListener('input', (e) => {\n if (!this.selected) return\n this.selected.strokeWidth = parseInt(e.target.value)\n strokeValue.textContent = e.target.value + 'px'\n this.render()\n if (this.onChange) {\n this.onChange({ type: 'strokeWidth', arrow: this.selected, value: parseInt(e.target.value), arrows: this.getData() })\n }\n })\n\n // 曲线率调整\n const roundInput = this._toolbar.querySelector('.ae-round-input')\n roundInput.addEventListener('input', (e) => {\n if (!this.selected) return\n this.selected.curveRate = parseFloat(e.target.value)\n this.render()\n if (this.onChange) {\n this.onChange({ type: 'curveRate', arrow: this.selected, value: parseFloat(e.target.value), arrows: this.getData() })\n }\n })\n\n // 拖拽功能 - 使用类实例绑定\n const dragHandle = this._toolbar.querySelector('.ae-toolbar-drag-handle')\n this._setupToolbarDrag(dragHandle)\n\n // 阻止工具条上的事件触发到容器\n this._toolbar.addEventListener('mousedown', (e) => {\n e.stopPropagation()\n })\n this._toolbar.addEventListener('mouseup', (e) => {\n e.stopPropagation()\n })\n\n this.container.appendChild(this._toolbar)\n }\n\n // 工具条拖拽设置\n _setupToolbarDrag(dragHandle) {\n let isDragging = false\n let dragOffset = { x: 0, y: 0 }\n\n dragHandle.addEventListener('mousedown', (e) => {\n isDragging = true\n this._toolbarDragging = true\n const rect = this._toolbar.getBoundingClientRect()\n dragOffset.x = e.clientX - rect.left\n dragOffset.y = e.clientY - rect.top\n e.preventDefault()\n e.stopPropagation()\n\n const onMove = (moveEvent) => {\n if (!isDragging) return\n const containerRect = this.container.getBoundingClientRect()\n let newLeft = moveEvent.clientX - containerRect.left - dragOffset.x\n let newTop = moveEvent.clientY - containerRect.top - dragOffset.y\n const toolbarWidth = this._toolbar.offsetWidth\n const toolbarHeight = this._toolbar.offsetHeight\n newLeft = Math.max(0, Math.min(newLeft, containerRect.width - toolbarWidth))\n newTop = Math.max(0, Math.min(newTop, containerRect.height - toolbarHeight))\n this._toolbar.style.left = newLeft + 'px'\n this._toolbar.style.top = newTop + 'px'\n }\n\n const onUp = (e) => {\n isDragging = false\n this._toolbarDragging = false\n document.removeEventListener('mousemove', onMove)\n document.removeEventListener('mouseup', onUp)\n this._toolbar.removeEventListener('mouseup', onUp)\n \n e.preventDefault()\n e.stopPropagation()\n }\n\n document.addEventListener('mousemove', onMove)\n document.addEventListener('mouseup', onUp)\n\n this._toolbar.addEventListener('mouseup', onUp)\n })\n }\n\n _showToolbar() {\n if (this.selected) {\n if (!this._toolbar) {\n this._createToolbar()\n }\n this._toolbar.style.display = 'flex'\n\n // 更新工具条值\n const color = this.selected.color || this._defaultColor\n const strokeWidth = this.selected.strokeWidth || this._strokeWidth\n const curveRate = this.selected.curveRate ?? this.selected.cornerRoundness ?? 0\n\n const colorInput = this._toolbar.querySelector('.ae-color-input')\n const strokeInput = this._toolbar.querySelector('.ae-stroke-input')\n const strokeValue = this._toolbar.querySelector('.ae-stroke-input + .ae-toolbar-value')\n const roundInput = this._toolbar.querySelector('.ae-round-input')\n\n if (colorInput) colorInput.value = color\n if (strokeInput) {\n strokeInput.value = strokeWidth\n strokeValue.textContent = strokeWidth + 'px'\n }\n if (roundInput) roundInput.value = curveRate\n\n // 定位到所选箭头旁边\n const bbox = this._getArrowBBox(this.selected)\n const toolbarWidth = this._toolbar.offsetWidth || 150\n const toolbarHeight = this._toolbar.offsetHeight || 120\n\n // 计算位置:放在箭头右侧,如果空间不够则放左侧\n let left = bbox.maxX + 20\n if (left + toolbarWidth > this.container.offsetWidth) {\n left = bbox.minX - toolbarWidth - 20\n }\n\n // 垂直居中于箭头\n let top = bbox.centerY - toolbarHeight / 2\n if (top < 0) top = 0\n if (top + toolbarHeight > this.container.offsetHeight) {\n top = this.container.offsetHeight - toolbarHeight\n }\n\n this._toolbar.style.left = left + 'px'\n this._toolbar.style.top = top + 'px'\n }\n }\n\n _hideToolbar() {\n if (this._toolbar) {\n this._toolbar.style.display = 'none'\n }\n }\n\n _updateMarkerColor(color) {\n const marker = this.svg.querySelector('#ae-arrowhead polygon')\n if (marker) {\n marker.setAttribute('fill', color)\n }\n }\n\n _initKeybindings() {\n // 创建快捷键实例,绑定到 container 上\n this._kb = new Keybinding('arrow-editor')\n\n // Enter: 完成绘制\n this._kb.on('enter', () => {\n this._handleEnter()\n })\n\n // Esc: 结束绘制、取消选中\n this._kb.on('esc', () => {\n this._handleEsc()\n })\n\n // Delete/Backspace: 删除选中的箭头\n this._kb.on('delete', () => {\n this._handleDelete()\n })\n\n this._kb.on('backspace', () => {\n this._handleDelete()\n })\n }\n\n _initEvents() {\n this.container.onclick = e => {\n // 点击工具条时不处理\n if (this._toolbar && (e.target === this._toolbar || this._toolbar.contains(e.target))) {\n return\n }\n if (this.preventDefault) e.preventDefault()\n if (this.stopPropagation) e.stopPropagation()\n const p = this._mousePos(e)\n this._handleClick(p, e)\n }\n\n this.container.onmousemove = e => {\n if (this.preventDefault) e.preventDefault()\n if (this.stopPropagation) e.stopPropagation()\n const p = this._mousePos(e)\n this._handleMouseMove(e, p)\n }\n\n this.container.onmousedown = e => {\n // 点击工具条不触发移动\n if (this._toolbar && (e.target === this._toolbar || this._toolbar.contains(e.target))) {\n return\n }\n\n if (this.preventDefault) e.preventDefault()\n if (this.stopPropagation) e.stopPropagation()\n\n if (this.selected) {\n const handle = e.target.getAttribute('data-handle')\n if (handle) {\n this._transformMode = handle\n this._transformHandle = handle\n const p = this._mousePos(e)\n this._transformStartPos = p\n this._transformStartPoints = this.selected.points.map(pt => ({ x: pt.x, y: pt.y }))\n this._transformCenter = this._getArrowBBox(this.selected)\n\n if (handle === 'rotate') {\n const center = this._transformCenter\n const dx = p.x - center.centerX\n const dy = p.y - center.centerY\n this._transformStartAngle = Math.atan2(dy, dx)\n this._rotationOffset = 0\n }\n\n e.stopPropagation()\n return\n }\n\n this.mode = 'move'\n }\n }\n\n this.container.onmouseup = (e) => {\n // 如果有变换操作,调用 onChange 回调\n if (this._transformMode && this.selected) {\n if (this.onChange) {\n this.onChange({ type: this._transformMode, arrow: this.selected, arrows: this.getData() })\n }\n }\n this.mode = null\n this._transformMode = null\n this._transformHandle = null\n }\n }\n\n _mousePos(e) {\n const r = this.container.getBoundingClientRect()\n return {\n x: e.clientX - r.left,\n y: e.clientY - r.top\n }\n }\n\n _generatePath(pts, curveRate = 0) {\n if (pts.length < 2) return ''\n\n // curveRate 为 0 时画直线\n if (curveRate === 0) {\n let d = `M ${pts[0].x} ${pts[0].y}`\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x} ${pts[i].y}`\n }\n return d\n }\n\n // 根据曲线率计算控制点位置\n // curveRate: 0 - 直线,1 - 最弯曲\n let d = `M ${pts[0].x} ${pts[0].y}`\n\n for (let i = 0; i < pts.length - 1; i++) {\n const curr = pts[i]\n const next = pts[i + 1]\n\n // 计算当前线段的向量\n const dx = next.x - curr.x\n const dy = next.y - curr.y\n const len = Math.hypot(dx, dy)\n\n if (len === 0) continue\n\n // 计算进入当前点的切线向量(前一段线段)\n let inDx = dx\n let inDy = dy\n\n if (i > 0) {\n const prev = pts[i - 1]\n inDx = curr.x - prev.x\n inDy = curr.y - prev.y\n }\n\n // 计算出当前点的切线向量(下一段线段)\n let outDx = dx\n let outDy = dy\n\n if (i < pts.length - 2) {\n const after = pts[i + 2]\n outDx = after.x - next.x\n outDy = after.y - next.y\n }\n\n // 单位向量\n const inLen = Math.hypot(inDx, inDy) || 1\n const outLen = Math.hypot(outDx, outDy) || 1\n const uxIn = inDx / inLen\n const uyIn = inDy / inLen\n const uxOut = outDx / outLen\n const uyOut = outDy / outLen\n\n // 控制点距离:曲线率 * 线段长度 * 系数\n const controlDist = len * curveRate * 0.3\n\n // 第一个控制点:从当前点沿进入方向的切线\n const cp1X = curr.x + uxIn * controlDist\n const cp1Y = curr.y + uyIn * controlDist\n\n // 第二个控制点:从下一个点沿出去方向的切线反方向\n const cp2X = next.x - uxOut * controlDist\n const cp2Y = next.y - uyOut * controlDist\n\n d += ` C ${cp1X} ${cp1Y} ${cp2X} ${cp2Y} ${next.x} ${next.y}`\n }\n\n return d\n }\n\n _generateArrowHead(pts, strokeWidth = 8) {\n if (pts.length < 2) return ''\n\n const last = pts[pts.length - 1]\n let prev = pts[pts.length - 2]\n\n if (pts.length >= 3) {\n const dist = Math.hypot(last.x - prev.x, last.y - prev.y)\n if (dist < 5) {\n prev = pts[pts.length - 3]\n }\n }\n\n const dx = last.x - prev.x\n const dy = last.y - prev.y\n const len = Math.hypot(dx, dy)\n\n if (len < 1) return ''\n\n const ux = dx / len\n const uy = dy / len\n\n const notchX = last.x\n const notchY = last.y\n\n // 根据粗细调整箭头大小\n const scale = strokeWidth / 8\n const baseLen = 40 * scale\n const baseWidth = 20 * scale\n const notchLen = 20 * scale\n\n const tipX = last.x + ux * notchLen\n const tipY = last.y + uy * notchLen\n const baseX = last.x - ux * (baseLen - notchLen)\n const baseY = last.y - uy * (baseLen - notchLen)\n\n const px = -uy\n const py = ux\n\n const leftX = baseX + px * baseWidth\n const leftY = baseY + py * baseWidth\n const rightX = baseX - px * baseWidth\n const rightY = baseY - py * baseWidth\n\n return `M ${tipX} ${tipY} L ${leftX} ${leftY} L ${notchX} ${notchY} L ${rightX} ${rightY} Z`\n }\n\n _createArrowGroup(arrow, index) {\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n g.setAttribute('data-index', index)\n\n const color = arrow.color || this._defaultColor\n const strokeWidth = arrow.strokeWidth || this._strokeWidth\n const curveRate = arrow.curveRate ?? arrow.cornerRoundness ?? 0\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('class', 'ae-arrow-path')\n path.style.stroke = color\n path.style.strokeWidth = strokeWidth + 'px'\n path.setAttribute('d', this._generatePath(arrow.points, curveRate))\n g.appendChild(path)\n\n const arrowHead = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n arrowHead.setAttribute('fill', color)\n arrowHead.setAttribute('d', this._generateArrowHead(arrow.points, strokeWidth))\n g.appendChild(arrowHead)\n\n if (arrow === this.selected) {\n const bbox = this._getArrowBBox(arrow)\n\n // 变换框\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n rect.setAttribute('class', 'ae-transform-box')\n rect.setAttribute('x', bbox.minX - 10)\n rect.setAttribute('y', bbox.minY - 10)\n rect.setAttribute('width', bbox.width + 20)\n rect.setAttribute('height', bbox.height + 20)\n g.appendChild(rect)\n\n // 缩放手柄(右下角)\n const scaleHandle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n scaleHandle.setAttribute('class', 'ae-transform-handle')\n scaleHandle.setAttribute('cx', bbox.maxX + 10)\n scaleHandle.setAttribute('cy', bbox.maxY + 10)\n scaleHandle.setAttribute('r', 6)\n scaleHandle.setAttribute('data-handle', 'scale')\n g.appendChild(scaleHandle)\n\n // 旋转手柄(顶部中间)\n const rotateY = bbox.minY - 30\n const rotateX = bbox.centerX\n const rotateLine = document.createElementNS('http://www.w3.org/2000/svg', 'line')\n rotateLine.setAttribute('class', 'ae-rotate-line')\n rotateLine.setAttribute('x1', bbox.centerX)\n rotateLine.setAttribute('y1', bbox.minY - 10)\n rotateLine.setAttribute('x2', rotateX)\n rotateLine.setAttribute('y2', rotateY)\n g.appendChild(rotateLine)\n\n const rotateHandle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n rotateHandle.setAttribute('class', 'ae-rotate-handle')\n rotateHandle.setAttribute('cx', rotateX)\n rotateHandle.setAttribute('cy', rotateY)\n rotateHandle.setAttribute('r', 8)\n rotateHandle.setAttribute('data-handle', 'rotate')\n g.appendChild(rotateHandle)\n }\n\n return g\n }\n\n render() {\n this.svg.querySelectorAll('g').forEach(g => g.remove())\n\n this.arrows.forEach((arrow, index) => {\n const g = this._createArrowGroup(arrow, index)\n this.svg.appendChild(g)\n })\n\n if (this.current) {\n const g = this._createArrowGroup(this.current, this.arrows.length)\n this.svg.appendChild(g)\n }\n }\n\n _isDoubleClick(p) {\n const now = Date.now()\n const dt = now - this.lastClickTime\n this.lastClickTime = now\n\n if (dt < 300 && this.lastClickPos && Math.hypot(p.x - this.lastClickPos.x, p.y - this.lastClickPos.y) < 10) {\n this.lastClickPos = null\n return true\n }\n\n this.lastClickPos = p\n return false\n }\n\n _handleClick(p, e) {\n // 如果配置了 isCtrl,需要按着 Ctrl 键才能绘制\n if (this.isCtrl && !e.ctrlKey) {\n return\n }\n\n // 如果刚才有拖拽,阻止点击事件\n if (this._shouldBlockClick) {\n this._shouldBlockClick = false\n return\n }\n\n if (this._isDoubleClick(p)) {\n if (this.drawing && this.current && this.current.points.length >= 2) {\n this.drawing = false\n this.arrows.push(this.current)\n const arrow = this.current\n this.current = null\n this.svg.classList.remove('ae-d2-svg-fixed')\n this.render()\n if (this.onDrawEnd) {\n this.onDrawEnd({ arrow, arrows: this.getData() })\n }\n }\n return\n }\n\n // 有选中的箭头时,点击空白处取消选中\n if (this.selected) {\n for (const a of this.arrows) {\n if (this._hitArrow(a, p)) {\n this.render()\n return\n }\n }\n // 点击空白处,取消选中\n this.selected = null\n this._hideToolbar()\n this.render()\n return\n }\n\n // 没有选中时,检查是否点击到箭头\n for (const a of this.arrows) {\n if (this._hitArrow(a, p)) {\n this.selected = a\n this._showToolbar()\n this.render()\n return\n }\n }\n\n // 点击空白处\n if (this.drawing) {\n // 正在绘制中,添加点\n this.current.points.push(p)\n } else {\n // 开始绘制\n this.drawing = true\n this.current = {\n points: [p, p],\n color: this._defaultColor\n }\n // 添加 fixed 类,让 SVG 固定定位覆盖整个视口\n this.svg.classList.add('ae-d2-svg-fixed')\n }\n\n this.render()\n }\n\n _handleEnter() {\n // 正在绘制时,按 Enter 完成绘制\n if (this.drawing && this.current && this.current.points.length >= 2) {\n this.drawing = false\n this.arrows.push(this.current)\n const arrow = this.current\n this.current = null\n this.svg.classList.remove('ae-d2-svg-fixed')\n this.render()\n if (this.onDrawEnd) {\n this.onDrawEnd({ arrow, arrows: this.getData() })\n }\n }\n }\n\n _handleEsc() {\n // 按 Esc: 结束绘制、取消选中\n if (this.drawing) {\n this.drawing = false\n this.current = null\n this.svg.classList.remove('ae-d2-svg-fixed')\n }\n if (this.selected) {\n this.selected = null\n }\n this._hideColorPicker()\n this._hideToolbar()\n this.render()\n }\n\n _handleDelete() {\n // 删除选中的箭头\n if (this.selected) {\n const arrow = this.selected\n const index = this.arrows.indexOf(this.selected)\n if (index > -1) {\n this.arrows.splice(index, 1)\n }\n this.selected = null\n this._hideToolbar()\n this.render()\n if (this.onRemove) {\n this.onRemove({ arrow, arrows: this.getData() })\n }\n }\n }\n\n _showColorPicker(e) {\n if (this._showingColorPicker) {\n this._hideColorPicker()\n return\n }\n\n this._showingColorPicker = true\n\n // 创建颜色选择器浮窗\n const popup = document.createElement('div')\n popup.className = 'ae-color-picker-popup'\n\n const label = document.createElement('span')\n label.textContent = '选择颜色'\n label.style.cssText = 'font-size: 12px; color: #666;'\n\n const colorInput = document.createElement('input')\n colorInput.type = 'color'\n colorInput.value = this.selected.color || this._defaultColor\n // 自动打开颜色选择器\n colorInput.showPicker()\n\n popup.appendChild(label)\n popup.appendChild(colorInput)\n\n // 定位到颜色手柄位置\n const rect = this.container.getBoundingClientRect()\n const bbox = this._getArrowBBox(this.selected)\n const x = rect.left + bbox.minX - 50\n const y = rect.top + bbox.maxY + 15\n\n popup.style.left = x + 'px'\n popup.style.top = y + 'px'\n\n // 颜色改变时实时更新\n colorInput.addEventListener('input', (ev) => {\n this.selected.color = ev.target.value\n this._defaultColor = ev.target.value\n this.render()\n if (this.onChange) {\n this.onChange({ type: 'color', arrow: this.selected, value: ev.target.value, arrows: this.getData() })\n }\n })\n\n // 点击外部关闭\n const closeHandler = (ev) => {\n if (!popup.contains(ev.target)) {\n this._hideColorPicker()\n document.removeEventListener('click', closeHandler)\n }\n }\n\n document.body.appendChild(popup)\n this._colorPickerPopup = popup\n\n document.addEventListener('click', closeHandler)\n }\n\n _hideColorPicker() {\n if (this._colorPickerPopup) {\n this._colorPickerPopup.remove()\n this._colorPickerPopup = null\n }\n this._showingColorPicker = false\n }\n\n // 删除选中的箭头\n deleteSelected() {\n if (this.selected) {\n this.arrows = this.arrows.filter(a => a !== this.selected)\n this.selected = null\n this.render()\n }\n }\n\n _handleMouseMove(e, p) {\n // 如果正在拖拽工具条,不处理\n if (this._toolbarDragging) {\n return\n }\n\n // 如果鼠标在工具条上,不处理\n if (this._toolbar && (e.target === this._toolbar || this._toolbar.contains(e.target))) {\n return\n }\n\n // 如果配置了 isCtrl,需要按着 Ctrl 键才能绘制\n if (this.isCtrl && !e.ctrlKey) {\n // 如果正在绘制中,按 Ctrl 键松开则结束绘制\n if (this.drawing && this.current && this.current.points.length >= 2) {\n this.drawing = false\n this.arrows.push(this.current)\n const arrow = this.current\n this.current = null\n this.svg.classList.remove('ae-d2-svg-fixed')\n this.render()\n if (this.onDrawEnd) {\n this.onDrawEnd({ arrow, arrows: this.getData() })\n }\n }\n return\n }\n\n if (this.drawing) {\n this.current.points[this.current.points.length - 1] = p\n this.render()\n }\n\n // 变换处理(旋转/缩放)\n if (this._transformMode && this.selected) {\n if (this._transformMode === 'rotate') {\n this._handleRotate(p)\n } else if (this._transformMode === 'scale') {\n this._handleScale(p)\n }\n this.render()\n return\n }\n\n if (this.selected && this.mode === 'move') {\n const dx = e.movementX\n const dy = e.movementY\n\n // 如果有移动,标记需要阻止点击\n if (dx !== 0 || dy !== 0) {\n this._shouldBlockClick = true\n }\n\n this.selected.points.forEach(pt => {\n pt.x += dx\n pt.y += dy\n })\n\n this.render()\n }\n }\n\n _getArrowBBox(arrow) {\n const points = arrow.points\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n\n for (const pt of points) {\n minX = Math.min(minX, pt.x)\n minY = Math.min(minY, pt.y)\n maxX = Math.max(maxX, pt.x)\n maxY = Math.max(maxY, pt.y)\n }\n\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n centerX: (minX + maxX) / 2,\n centerY: (minY + maxY) / 2\n }\n }\n\n _handleRotate(p) {\n const center = this._transformCenter\n const centerX = center.centerX\n const centerY = center.centerY\n\n // 计算当前角度和起始角度\n const currentAngle = Math.atan2(p.y - centerY, p.x - centerX)\n const startAngle = Math.atan2(this._transformStartPos.y - centerY, this._transformStartPos.x - centerX)\n const angleDiff = currentAngle - startAngle\n\n // 旋转点\n const cos = Math.cos(angleDiff)\n const sin = Math.sin(angleDiff)\n\n this.selected.points.forEach((pt, i) => {\n const relX = this._transformStartPoints[i].x - centerX\n const relY = this._transformStartPoints[i].y - centerY\n pt.x = centerX + relX * cos - relY * sin\n pt.y = centerY + relX * sin + relY * cos\n })\n }\n\n _handleScale(p) {\n const center = this._transformCenter\n const centerX = center.centerX\n const centerY = center.centerY\n const startPoints = this._transformStartPoints\n const startPos = this._transformStartPos\n\n // 计算缩放比例\n const dx = p.x - centerX\n const dy = p.y - centerY\n const startDx = startPos.x - centerX\n const startDy = startPos.y - centerY\n\n const currentDist = Math.hypot(dx, dy)\n const startDist = Math.hypot(startDx, startDy)\n const scale = currentDist / startDist\n\n // 应用缩放\n this.selected.points.forEach((pt, i) => {\n pt.x = centerX + (startPoints[i].x - centerX) * scale\n pt.y = centerY + (startPoints[i].y - centerY) * scale\n })\n }\n\n _hitArrow(a, p) {\n for (let i = 0; i < a.points.length - 1; i++) {\n if (this._dist(p, a.points[i], a.points[i + 1]) < 15)\n return true\n }\n return false\n }\n\n _dist(p, a, b) {\n const dx = b.x - a.x\n const dy = b.y - a.y\n const t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / (dx * dx + dy * dy)\n const tt = Math.max(0, Math.min(1, t))\n const px = a.x + tt * dx\n const py = a.y + tt * dy\n return Math.hypot(p.x - px, p.y - py)\n }\n\n // 获取所有箭头数据\n getData() {\n return this.arrows.map(arrow => ({\n points: arrow.points,\n curveRate: arrow.curveRate ?? arrow.cornerRoundness ?? 0,\n strokeWidth: arrow.strokeWidth,\n color: arrow.color\n }))\n }\n\n // 设置箭头数据\n setData(data) {\n this.arrows = data.map(item => ({\n points: item.points,\n curveRate: item.curveRate ?? 0,\n strokeWidth: item.strokeWidth ?? 8,\n color: item.color\n }))\n this.render()\n }\n\n // 清空所有箭头\n clear() {\n this.arrows = []\n this.drawing = false\n this.current = null\n this.selected = null\n this.render()\n }\n\n // 销毁编辑器,移除所有事件和元素\n destroy() {\n // 销毁键盘绑定\n if (this._kb && this._kb.destroy) {\n this._kb.destroy()\n }\n\n // 移除容器上的事件\n this.container.onclick = null\n this.container.onmousemove = null\n this.container.onmousedown = null\n this.container.onmouseup = null\n this.container.ondblclick = null\n\n // 移除 SVG 元素\n if (this.svg) {\n this.svg.remove()\n this.svg = null\n }\n\n // 移除工具条\n if (this._toolbar) {\n this._toolbar.remove()\n this._toolbar = null\n }\n\n // 移除颜色选择器\n if (this._colorPickerPopup) {\n this._colorPickerPopup.remove()\n this._colorPickerPopup = null\n }\n\n // 清空数据\n this.arrows = []\n this.drawing = false\n this.current = null\n this.selected = null\n this.mode = null\n this._transformMode = null\n this._transformHandle = null\n }\n}\n"],"names":["STYLES","styleEl","ArrowEditor","container","options","defs","marker","polygon","color","strokeWidth","curveRate","e","strokeInput","strokeValue","dragHandle","isDragging","dragOffset","rect","onMove","moveEvent","containerRect","newLeft","newTop","toolbarWidth","toolbarHeight","onUp","colorInput","roundInput","bbox","left","top","Keybinding","p","handle","pt","center","dx","dy","r","pts","d","i","curr","next","len","inDx","inDy","prev","outDx","outDy","after","inLen","outLen","uxIn","uyIn","uxOut","uyOut","controlDist","cp1X","cp1Y","cp2X","cp2Y","last","ux","uy","notchX","notchY","scale","baseLen","baseWidth","notchLen","tipX","tipY","baseX","baseY","px","py","leftX","leftY","rightX","rightY","arrow","index","g","path","arrowHead","scaleHandle","rotateY","rotateX","rotateLine","rotateHandle","now","dt","a","popup","label","x","y","ev","closeHandler","points","minX","minY","maxX","maxY","centerX","centerY","currentAngle","startAngle","angleDiff","cos","sin","relX","relY","startPoints","startPos","startDx","startDy","currentDist","startDist","b","t","tt","data","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bundle.esm.js","sources":["../src/editor.js"],"sourcesContent":["import { Keybinding } from '@wbiokr/keybinding'\n\n// 样式注入\nconst STYLES = `\n.ae-d2-container {\n position: relative;\n width: 1000px;\n height: 600px;\n background: #fff;\n margin: auto;\n}\n\n.ae-d2-svg {\n width: 100%;\n height: 100%;\n position: absolute;\n left: 0;\n top: 0;\n z-index: 10;\n}\n\n\n.ae-arrow-path {\n fill: none;\n stroke-linecap: round;\n stroke-linejoin: round;\n cursor: pointer;\n}\n\n.ae-arrow-path:hover {\n stroke: #00aaff;\n}\n\n.ae-transform-box {\n fill: none;\n stroke: #00aaff;\n stroke-width: 2;\n stroke-dasharray: 4;\n}\n\n.ae-transform-handle {\n fill: #fff;\n stroke: #00aaff;\n stroke-width: 2;\n cursor: pointer;\n}\n\n.ae-transform-handle:hover {\n fill: #00aaff;\n}\n\n.ae-rotate-handle {\n fill: #fff;\n stroke: #ff6600;\n stroke-width: 2;\n cursor: grab;\n}\n\n.ae-rotate-handle:hover {\n fill: #ff6600;\n}\n\n.ae-rotate-line {\n stroke: #ff6600;\n stroke-width: 1;\n stroke-dasharray: 4;\n}\n\n/* 工具条样式 */\n.ae-toolbar {\n position: absolute;\n display: none;\n flex-direction: column;\n gap: 10px;\n padding: 12px;\n background: #fff;\n border: 1px solid #ddd;\n border-radius: 8px;\n box-shadow: 0 2px 12px rgba(0,0,0,0.15);\n z-index: 20;\n pointer-events: auto;\n min-width: 140px;\n}\n\n.ae-toolbar-drag-handle {\n cursor: grab;\n text-align: center;\n padding: 4px;\n color: #999;\n font-size: 14px;\n line-height: 1;\n user-select: none;\n border-bottom: 1px solid #eee;\n margin: -12px -12px 8px -12px;\n padding-top: 8px;\n padding-bottom: 8px;\n border-radius: 8px 8px 0 0;\n}\n\n.ae-toolbar-drag-handle:active {\n cursor: grabbing;\n}\n\n.ae-toolbar-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ae-toolbar-label {\n font-size: 11px;\n color: #666;\n}\n\n.ae-toolbar input[type=\"color\"] {\n width: 40px;\n height: 30px;\n border: 1px solid #ddd;\n border-radius: 4px;\n cursor: pointer;\n padding: 0;\n background: none;\n}\n\n.ae-toolbar input[type=\"range\"] {\n width: 120px;\n cursor: pointer;\n}\n\n.ae-toolbar-value {\n font-size: 10px;\n color: #999;\n text-align: right;\n}\n`\n\n// 注入样式\nif (typeof document !== 'undefined') {\n const styleEl = document.createElement('style')\n styleEl.textContent = STYLES\n document.head.appendChild(styleEl)\n}\n\nexport class ArrowEditor {\n\n constructor(container, options = {}) {\n this.container = typeof container === 'string' ? document.querySelector(container) : container\n this.svg = null\n\n this.arrows = []\n this.drawing = false\n this.current = null\n this.selected = null\n this.mode = null\n this.lastClickTime = 0\n this.lastClickPos = null\n this._shouldBlockClick = false\n this._defaultColor = '#2b8cff'\n\n // 配置选项\n this.isCtrl = options.isCtrl || false\n this.stopPropagation = options.stopPropagation || false\n this.preventDefault = options.preventDefault || false\n this.onDrawEnd = options.onDrawEnd || null\n this.onRemove = options.onRemove || null\n this.onChange = options.onChange || null\n\n // 变换相关\n this._transformMode = null // 'rotate' | 'scale'\n this._transformHandle = null\n this._transformStartPos = null\n this._transformStartPoints = null\n this._transformCenter = null\n this._transformStartAngle = null\n this._rotationOffset = 0\n\n // 工具条相关\n this._toolbar = null\n this._strokeWidth = 8\n this._curveRate = 0\n\n this._createSVG()\n this._initKeybindings()\n this._initEvents()\n }\n\n _createSVG() {\n // 检查并设置容器的定位\n if (typeof getComputedStyle !== 'undefined') {\n const containerStyle = getComputedStyle(this.container)\n if (containerStyle.position === 'static') {\n this.container.style.position = 'relative'\n }\n }\n\n // 创建 SVG 元素\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n this.svg.setAttribute('class', 'ae-d2-svg')\n this.container.appendChild(this.svg)\n\n // 创建 defs 和 marker\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n this.svg.appendChild(defs)\n\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker')\n marker.setAttribute('id', 'ae-arrowhead')\n marker.setAttribute('markerWidth', '10')\n marker.setAttribute('markerHeight', '10')\n marker.setAttribute('refX', '9')\n marker.setAttribute('refY', '5')\n marker.setAttribute('orient', 'auto')\n\n const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\n polygon.setAttribute('points', '0,0 10,5 0,10 2,5')\n polygon.setAttribute('fill', this._defaultColor)\n\n marker.appendChild(polygon)\n defs.appendChild(marker)\n }\n\n _createToolbar() {\n if (this._toolbar) {\n this._toolbar.remove()\n }\n\n this._toolbar = document.createElement('div')\n this._toolbar.className = 'ae-toolbar'\n\n const color = this.selected.color || this._defaultColor\n const strokeWidth = this.selected.strokeWidth || this._strokeWidth\n const curveRate = this.selected.curveRate ?? this.selected.cornerRoundness ?? 0\n\n this._toolbar.innerHTML = `\n <div class=\"ae-toolbar-drag-handle\">:::</div>\n <div class=\"ae-toolbar-item\">\n <span class=\"ae-toolbar-label\">颜色</span>\n <input type=\"color\" class=\"ae-color-input\" value=\"${color}\" />\n </div>\n <div class=\"ae-toolbar-item\">\n <span class=\"ae-toolbar-label\">粗细</span>\n <input type=\"range\" class=\"ae-stroke-input\" min=\"1\" max=\"60\" value=\"${strokeWidth}\" />\n <span class=\"ae-toolbar-value\">${strokeWidth}px</span>\n </div>\n <div class=\"ae-toolbar-item\">\n <span class=\"ae-toolbar-label\">曲线率</span>\n <input type=\"range\" class=\"ae-round-input\" min=\"0\" max=\"1\" step=\"0.1\" value=\"${curveRate}\" />\n </div>\n `\n\n // 颜色选择\n const colorInput = this._toolbar.querySelector('.ae-color-input')\n colorInput.addEventListener('input', (e) => {\n if (!this.selected) return\n this.selected.color = e.target.value\n this._defaultColor = e.target.value\n this._updateMarkerColor(e.target.value)\n this.render()\n if (this.onChange) {\n this.onChange({ type: 'color', arrow: this.selected, value: e.target.value, arrows: this.getData() })\n }\n })\n\n // 粗细调整\n const strokeInput = this._toolbar.querySelector('.ae-stroke-input')\n const strokeValue = this._toolbar.querySelector('.ae-stroke-input + .ae-toolbar-value')\n strokeInput.addEventListener('input', (e) => {\n if (!this.selected) return\n this.selected.strokeWidth = parseInt(e.target.value)\n strokeValue.textContent = e.target.value + 'px'\n this.render()\n if (this.onChange) {\n this.onChange({ type: 'strokeWidth', arrow: this.selected, value: parseInt(e.target.value), arrows: this.getData() })\n }\n })\n\n // 曲线率调整\n const roundInput = this._toolbar.querySelector('.ae-round-input')\n roundInput.addEventListener('input', (e) => {\n if (!this.selected) return\n this.selected.curveRate = parseFloat(e.target.value)\n this.render()\n if (this.onChange) {\n this.onChange({ type: 'curveRate', arrow: this.selected, value: parseFloat(e.target.value), arrows: this.getData() })\n }\n })\n\n // 拖拽功能 - 使用类实例绑定\n const dragHandle = this._toolbar.querySelector('.ae-toolbar-drag-handle')\n this._setupToolbarDrag(dragHandle)\n\n // 阻止工具条上的事件触发到容器\n this._toolbar.addEventListener('mousedown', (e) => {\n e.stopPropagation()\n })\n this._toolbar.addEventListener('mouseup', (e) => {\n e.stopPropagation()\n })\n\n this.container.appendChild(this._toolbar)\n }\n\n // 工具条拖拽设置\n _setupToolbarDrag(dragHandle) {\n let isDragging = false\n let dragOffset = { x: 0, y: 0 }\n\n dragHandle.addEventListener('mousedown', (e) => {\n isDragging = true\n this._toolbarDragging = true\n const rect = this._toolbar.getBoundingClientRect()\n dragOffset.x = e.clientX - rect.left\n dragOffset.y = e.clientY - rect.top\n e.preventDefault()\n e.stopPropagation()\n\n const onMove = (moveEvent) => {\n if (!isDragging) return\n const containerRect = this.container.getBoundingClientRect()\n let newLeft = moveEvent.clientX - containerRect.left - dragOffset.x\n let newTop = moveEvent.clientY - containerRect.top - dragOffset.y\n const toolbarWidth = this._toolbar.offsetWidth\n const toolbarHeight = this._toolbar.offsetHeight\n newLeft = Math.max(0, Math.min(newLeft, containerRect.width - toolbarWidth))\n newTop = Math.max(0, Math.min(newTop, containerRect.height - toolbarHeight))\n this._toolbar.style.left = newLeft + 'px'\n this._toolbar.style.top = newTop + 'px'\n }\n\n const onUp = (e) => {\n isDragging = false\n this._toolbarDragging = false\n document.removeEventListener('mousemove', onMove)\n document.removeEventListener('mouseup', onUp)\n this._toolbar.removeEventListener('mouseup', onUp)\n \n e.preventDefault()\n e.stopPropagation()\n }\n\n document.addEventListener('mousemove', onMove)\n document.addEventListener('mouseup', onUp)\n\n this._toolbar.addEventListener('mouseup', onUp)\n })\n }\n\n _showToolbar() {\n if (this.selected) {\n if (!this._toolbar) {\n this._createToolbar()\n }\n this._toolbar.style.display = 'flex'\n\n // 更新工具条值\n const color = this.selected.color || this._defaultColor\n const strokeWidth = this.selected.strokeWidth || this._strokeWidth\n const curveRate = this.selected.curveRate ?? this.selected.cornerRoundness ?? 0\n\n const colorInput = this._toolbar.querySelector('.ae-color-input')\n const strokeInput = this._toolbar.querySelector('.ae-stroke-input')\n const strokeValue = this._toolbar.querySelector('.ae-stroke-input + .ae-toolbar-value')\n const roundInput = this._toolbar.querySelector('.ae-round-input')\n\n if (colorInput) colorInput.value = color\n if (strokeInput) {\n strokeInput.value = strokeWidth\n strokeValue.textContent = strokeWidth + 'px'\n }\n if (roundInput) roundInput.value = curveRate\n\n // 定位到所选箭头旁边\n const bbox = this._getArrowBBox(this.selected)\n const toolbarWidth = this._toolbar.offsetWidth || 150\n const toolbarHeight = this._toolbar.offsetHeight || 120\n\n // 计算位置:放在箭头右侧,如果空间不够则放左侧\n let left = bbox.maxX + 20\n if (left + toolbarWidth > this.container.offsetWidth) {\n left = bbox.minX - toolbarWidth - 20\n }\n\n // 垂直居中于箭头\n let top = bbox.centerY - toolbarHeight / 2\n if (top < 0) top = 0\n if (top + toolbarHeight > this.container.offsetHeight) {\n top = this.container.offsetHeight - toolbarHeight\n }\n\n this._toolbar.style.left = left + 'px'\n this._toolbar.style.top = top + 'px'\n }\n }\n\n _hideToolbar() {\n if (this._toolbar) {\n this._toolbar.style.display = 'none'\n }\n }\n\n _updateMarkerColor(color) {\n const marker = this.svg.querySelector('#ae-arrowhead polygon')\n if (marker) {\n marker.setAttribute('fill', color)\n }\n }\n\n _initKeybindings() {\n // 创建快捷键实例,绑定到 container 上\n this._kb = new Keybinding('arrow-editor')\n\n // Enter: 完成绘制\n this._kb.on('enter', () => {\n this._handleEnter()\n })\n\n // Esc: 结束绘制、取消选中\n this._kb.on('esc', () => {\n this._handleEsc()\n })\n\n // Delete/Backspace: 删除选中的箭头\n this._kb.on('delete', () => {\n this._handleDelete()\n })\n\n this._kb.on('backspace', () => {\n this._handleDelete()\n })\n }\n\n _initEvents() {\n this.container.onclick = e => {\n // 点击工具条时不处理\n if (this._toolbar && (e.target === this._toolbar || this._toolbar.contains(e.target))) {\n return\n }\n if (this.preventDefault) e.preventDefault()\n if (this.stopPropagation) e.stopPropagation()\n const p = this._mousePos(e)\n this._handleClick(p, e)\n }\n\n this.container.onmousemove = e => {\n if (this.preventDefault) e.preventDefault()\n if (this.stopPropagation) e.stopPropagation()\n const p = this._mousePos(e)\n this._handleMouseMove(e, p)\n }\n\n this.container.onmousedown = e => {\n // 点击工具条不触发移动\n if (this._toolbar && (e.target === this._toolbar || this._toolbar.contains(e.target))) {\n return\n }\n\n if (this.preventDefault) e.preventDefault()\n if (this.stopPropagation) e.stopPropagation()\n\n if (this.selected) {\n const handle = e.target.getAttribute('data-handle')\n if (handle) {\n this._transformMode = handle\n this._transformHandle = handle\n const p = this._mousePos(e)\n this._transformStartPos = p\n this._transformStartPoints = this.selected.points.map(pt => ({ x: pt.x, y: pt.y }))\n this._transformCenter = this._getArrowBBox(this.selected)\n\n if (handle === 'rotate') {\n const center = this._transformCenter\n const dx = p.x - center.centerX\n const dy = p.y - center.centerY\n this._transformStartAngle = Math.atan2(dy, dx)\n this._rotationOffset = 0\n }\n\n e.stopPropagation()\n return\n }\n\n this.mode = 'move'\n }\n }\n\n this.container.onmouseup = (e) => {\n // 如果有变换操作,调用 onChange 回调\n if (this._transformMode && this.selected) {\n if (this.onChange) {\n this.onChange({ type: this._transformMode, arrow: this.selected, arrows: this.getData() })\n }\n }\n this.mode = null\n this._transformMode = null\n this._transformHandle = null\n }\n }\n\n _mousePos(e) {\n const r = this.container.getBoundingClientRect()\n return {\n x: e.clientX - r.left,\n y: e.clientY - r.top\n }\n }\n\n _generatePath(pts, curveRate = 0) {\n if (pts.length < 2) return ''\n\n // curveRate 为 0 时画直线\n if (curveRate === 0) {\n let d = `M ${pts[0].x} ${pts[0].y}`\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x} ${pts[i].y}`\n }\n return d\n }\n\n // 根据曲线率计算控制点位置\n // curveRate: 0 - 直线,1 - 最弯曲\n let d = `M ${pts[0].x} ${pts[0].y}`\n\n for (let i = 0; i < pts.length - 1; i++) {\n const curr = pts[i]\n const next = pts[i + 1]\n\n // 计算当前线段的向量\n const dx = next.x - curr.x\n const dy = next.y - curr.y\n const len = Math.hypot(dx, dy)\n\n if (len === 0) continue\n\n // 计算进入当前点的切线向量(前一段线段)\n let inDx = dx\n let inDy = dy\n\n if (i > 0) {\n const prev = pts[i - 1]\n inDx = curr.x - prev.x\n inDy = curr.y - prev.y\n }\n\n // 计算出当前点的切线向量(下一段线段)\n let outDx = dx\n let outDy = dy\n\n if (i < pts.length - 2) {\n const after = pts[i + 2]\n outDx = after.x - next.x\n outDy = after.y - next.y\n }\n\n // 单位向量\n const inLen = Math.hypot(inDx, inDy) || 1\n const outLen = Math.hypot(outDx, outDy) || 1\n const uxIn = inDx / inLen\n const uyIn = inDy / inLen\n const uxOut = outDx / outLen\n const uyOut = outDy / outLen\n\n // 控制点距离:曲线率 * 线段长度 * 系数\n const controlDist = len * curveRate * 0.3\n\n // 第一个控制点:从当前点沿进入方向的切线\n const cp1X = curr.x + uxIn * controlDist\n const cp1Y = curr.y + uyIn * controlDist\n\n // 第二个控制点:从下一个点沿出去方向的切线反方向\n const cp2X = next.x - uxOut * controlDist\n const cp2Y = next.y - uyOut * controlDist\n\n d += ` C ${cp1X} ${cp1Y} ${cp2X} ${cp2Y} ${next.x} ${next.y}`\n }\n\n return d\n }\n\n _generateArrowHead(pts, strokeWidth = 8) {\n if (pts.length < 2) return ''\n\n const last = pts[pts.length - 1]\n let prev = pts[pts.length - 2]\n\n if (pts.length >= 3) {\n const dist = Math.hypot(last.x - prev.x, last.y - prev.y)\n if (dist < 5) {\n prev = pts[pts.length - 3]\n }\n }\n\n const dx = last.x - prev.x\n const dy = last.y - prev.y\n const len = Math.hypot(dx, dy)\n\n if (len < 1) return ''\n\n const ux = dx / len\n const uy = dy / len\n\n const notchX = last.x\n const notchY = last.y\n\n // 根据粗细调整箭头大小\n const scale = strokeWidth / 8\n const baseLen = 40 * scale\n const baseWidth = 20 * scale\n const notchLen = 20 * scale\n\n const tipX = last.x + ux * notchLen\n const tipY = last.y + uy * notchLen\n const baseX = last.x - ux * (baseLen - notchLen)\n const baseY = last.y - uy * (baseLen - notchLen)\n\n const px = -uy\n const py = ux\n\n const leftX = baseX + px * baseWidth\n const leftY = baseY + py * baseWidth\n const rightX = baseX - px * baseWidth\n const rightY = baseY - py * baseWidth\n\n return `M ${tipX} ${tipY} L ${leftX} ${leftY} L ${notchX} ${notchY} L ${rightX} ${rightY} Z`\n }\n\n _createArrowGroup(arrow, index) {\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n g.setAttribute('data-index', index)\n\n const color = arrow.color || this._defaultColor\n const strokeWidth = arrow.strokeWidth || this._strokeWidth\n const curveRate = arrow.curveRate ?? arrow.cornerRoundness ?? 0\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('class', 'ae-arrow-path')\n path.style.stroke = color\n path.style.strokeWidth = strokeWidth + 'px'\n path.setAttribute('d', this._generatePath(arrow.points, curveRate))\n g.appendChild(path)\n\n const arrowHead = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n arrowHead.setAttribute('fill', color)\n arrowHead.setAttribute('d', this._generateArrowHead(arrow.points, strokeWidth))\n g.appendChild(arrowHead)\n\n if (arrow === this.selected) {\n const bbox = this._getArrowBBox(arrow)\n\n // 变换框\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n rect.setAttribute('class', 'ae-transform-box')\n rect.setAttribute('x', bbox.minX - 10)\n rect.setAttribute('y', bbox.minY - 10)\n rect.setAttribute('width', bbox.width + 20)\n rect.setAttribute('height', bbox.height + 20)\n g.appendChild(rect)\n\n // 缩放手柄(右下角)\n const scaleHandle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n scaleHandle.setAttribute('class', 'ae-transform-handle')\n scaleHandle.setAttribute('cx', bbox.maxX + 10)\n scaleHandle.setAttribute('cy', bbox.maxY + 10)\n scaleHandle.setAttribute('r', 6)\n scaleHandle.setAttribute('data-handle', 'scale')\n g.appendChild(scaleHandle)\n\n // 旋转手柄(顶部中间)\n const rotateY = bbox.minY - 30\n const rotateX = bbox.centerX\n const rotateLine = document.createElementNS('http://www.w3.org/2000/svg', 'line')\n rotateLine.setAttribute('class', 'ae-rotate-line')\n rotateLine.setAttribute('x1', bbox.centerX)\n rotateLine.setAttribute('y1', bbox.minY - 10)\n rotateLine.setAttribute('x2', rotateX)\n rotateLine.setAttribute('y2', rotateY)\n g.appendChild(rotateLine)\n\n const rotateHandle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n rotateHandle.setAttribute('class', 'ae-rotate-handle')\n rotateHandle.setAttribute('cx', rotateX)\n rotateHandle.setAttribute('cy', rotateY)\n rotateHandle.setAttribute('r', 8)\n rotateHandle.setAttribute('data-handle', 'rotate')\n g.appendChild(rotateHandle)\n }\n\n return g\n }\n\n render() {\n this.svg.querySelectorAll('g').forEach(g => g.remove())\n\n this.arrows.forEach((arrow, index) => {\n const g = this._createArrowGroup(arrow, index)\n this.svg.appendChild(g)\n })\n\n if (this.current) {\n const g = this._createArrowGroup(this.current, this.arrows.length)\n this.svg.appendChild(g)\n }\n }\n\n _isDoubleClick(p) {\n const now = Date.now()\n const dt = now - this.lastClickTime\n this.lastClickTime = now\n\n if (dt < 300 && this.lastClickPos && Math.hypot(p.x - this.lastClickPos.x, p.y - this.lastClickPos.y) < 10) {\n this.lastClickPos = null\n return true\n }\n\n this.lastClickPos = p\n return false\n }\n\n _handleClick(p, e) {\n // 如果配置了 isCtrl,需要按着 Ctrl 键才能绘制\n if (this.isCtrl && !e.ctrlKey) {\n return\n }\n\n // 如果刚才有拖拽,阻止点击事件\n if (this._shouldBlockClick) {\n this._shouldBlockClick = false\n return\n }\n\n if (this._isDoubleClick(p)) {\n if (this.drawing && this.current && this.current.points.length >= 2) {\n this.drawing = false\n this.arrows.push(this.current)\n const arrow = this.current\n this.current = null\n this.svg.classList.remove('ae-d2-svg-fixed')\n this.render()\n if (this.onDrawEnd) {\n this.onDrawEnd({ arrow, arrows: this.getData() })\n }\n }\n return\n }\n\n // 有选中的箭头时,点击空白处取消选中\n if (this.selected) {\n for (const a of this.arrows) {\n if (this._hitArrow(a, p)) {\n this.render()\n return\n }\n }\n // 点击空白处,取消选中\n this.selected = null\n this._hideToolbar()\n this.render()\n return\n }\n\n // 没有选中时,检查是否点击到箭头\n for (const a of this.arrows) {\n if (this._hitArrow(a, p)) {\n this.selected = a\n this._showToolbar()\n this.render()\n return\n }\n }\n\n // 点击空白处\n if (this.drawing) {\n // 正在绘制中,添加点\n this.current.points.push(p)\n } else {\n // 开始绘制\n this.drawing = true\n this.current = {\n points: [p, p],\n color: this._defaultColor\n }\n // 添加 fixed 类,让 SVG 固定定位覆盖整个视口\n this.svg.classList.add('ae-d2-svg-fixed')\n }\n\n this.render()\n }\n\n _handleEnter() {\n // 正在绘制时,按 Enter 完成绘制\n if (this.drawing && this.current && this.current.points.length >= 2) {\n this.drawing = false\n this.arrows.push(this.current)\n const arrow = this.current\n this.current = null\n this.svg.classList.remove('ae-d2-svg-fixed')\n this.render()\n if (this.onDrawEnd) {\n this.onDrawEnd({ arrow, arrows: this.getData() })\n }\n }\n }\n\n _handleEsc() {\n // 按 Esc: 结束绘制、取消选中\n if (this.drawing) {\n this.drawing = false\n this.current = null\n this.svg.classList.remove('ae-d2-svg-fixed')\n }\n if (this.selected) {\n this.selected = null\n }\n this._hideColorPicker()\n this._hideToolbar()\n this.render()\n }\n\n _handleDelete() {\n // 删除选中的箭头\n if (this.selected) {\n const arrow = this.selected\n const index = this.arrows.indexOf(this.selected)\n if (index > -1) {\n this.arrows.splice(index, 1)\n }\n this.selected = null\n this._hideToolbar()\n this.render()\n if (this.onRemove) {\n this.onRemove({ arrow, arrows: this.getData() })\n }\n }\n }\n\n _showColorPicker(e) {\n if (this._showingColorPicker) {\n this._hideColorPicker()\n return\n }\n\n this._showingColorPicker = true\n\n // 创建颜色选择器浮窗\n const popup = document.createElement('div')\n popup.className = 'ae-color-picker-popup'\n\n const label = document.createElement('span')\n label.textContent = '选择颜色'\n label.style.cssText = 'font-size: 12px; color: #666;'\n\n const colorInput = document.createElement('input')\n colorInput.type = 'color'\n colorInput.value = this.selected.color || this._defaultColor\n // 自动打开颜色选择器\n colorInput.showPicker()\n\n popup.appendChild(label)\n popup.appendChild(colorInput)\n\n // 定位到颜色手柄位置\n const rect = this.container.getBoundingClientRect()\n const bbox = this._getArrowBBox(this.selected)\n const x = rect.left + bbox.minX - 50\n const y = rect.top + bbox.maxY + 15\n\n popup.style.left = x + 'px'\n popup.style.top = y + 'px'\n\n // 颜色改变时实时更新\n colorInput.addEventListener('input', (ev) => {\n this.selected.color = ev.target.value\n this._defaultColor = ev.target.value\n this.render()\n if (this.onChange) {\n this.onChange({ type: 'color', arrow: this.selected, value: ev.target.value, arrows: this.getData() })\n }\n })\n\n // 点击外部关闭\n const closeHandler = (ev) => {\n if (!popup.contains(ev.target)) {\n this._hideColorPicker()\n document.removeEventListener('click', closeHandler)\n }\n }\n\n document.body.appendChild(popup)\n this._colorPickerPopup = popup\n\n document.addEventListener('click', closeHandler)\n }\n\n _hideColorPicker() {\n if (this._colorPickerPopup) {\n this._colorPickerPopup.remove()\n this._colorPickerPopup = null\n }\n this._showingColorPicker = false\n }\n\n // 删除选中的箭头\n deleteSelected() {\n if (this.selected) {\n this.arrows = this.arrows.filter(a => a !== this.selected)\n this.selected = null\n this.render()\n }\n }\n\n _handleMouseMove(e, p) {\n // 如果正在拖拽工具条,不处理\n if (this._toolbarDragging) {\n return\n }\n\n // 如果鼠标在工具条上,不处理\n if (this._toolbar && (e.target === this._toolbar || this._toolbar.contains(e.target))) {\n return\n }\n\n // 如果配置了 isCtrl,需要按着 Ctrl 键才能绘制\n if (this.isCtrl && !e.ctrlKey) {\n // 如果正在绘制中,按 Ctrl 键松开则结束绘制\n if (this.drawing && this.current && this.current.points.length >= 2) {\n this.drawing = false\n this.arrows.push(this.current)\n const arrow = this.current\n this.current = null\n this.svg.classList.remove('ae-d2-svg-fixed')\n this.render()\n if (this.onDrawEnd) {\n this.onDrawEnd({ arrow, arrows: this.getData() })\n }\n }\n return\n }\n\n if (this.drawing) {\n this.current.points[this.current.points.length - 1] = p\n this.render()\n }\n\n // 变换处理(旋转/缩放)\n if (this._transformMode && this.selected) {\n if (this._transformMode === 'rotate') {\n this._handleRotate(p)\n } else if (this._transformMode === 'scale') {\n this._handleScale(p)\n }\n this.render()\n return\n }\n\n if (this.selected && this.mode === 'move') {\n const dx = e.movementX\n const dy = e.movementY\n\n // 如果有移动,标记需要阻止点击\n if (dx !== 0 || dy !== 0) {\n this._shouldBlockClick = true\n }\n\n this.selected.points.forEach(pt => {\n pt.x += dx\n pt.y += dy\n })\n\n this.render()\n }\n }\n\n _getArrowBBox(arrow) {\n const points = arrow.points\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n\n for (const pt of points) {\n minX = Math.min(minX, pt.x)\n minY = Math.min(minY, pt.y)\n maxX = Math.max(maxX, pt.x)\n maxY = Math.max(maxY, pt.y)\n }\n\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n centerX: (minX + maxX) / 2,\n centerY: (minY + maxY) / 2\n }\n }\n\n _handleRotate(p) {\n const center = this._transformCenter\n const centerX = center.centerX\n const centerY = center.centerY\n\n // 计算当前角度和起始角度\n const currentAngle = Math.atan2(p.y - centerY, p.x - centerX)\n const startAngle = Math.atan2(this._transformStartPos.y - centerY, this._transformStartPos.x - centerX)\n const angleDiff = currentAngle - startAngle\n\n // 旋转点\n const cos = Math.cos(angleDiff)\n const sin = Math.sin(angleDiff)\n\n this.selected.points.forEach((pt, i) => {\n const relX = this._transformStartPoints[i].x - centerX\n const relY = this._transformStartPoints[i].y - centerY\n pt.x = centerX + relX * cos - relY * sin\n pt.y = centerY + relX * sin + relY * cos\n })\n }\n\n _handleScale(p) {\n const center = this._transformCenter\n const centerX = center.centerX\n const centerY = center.centerY\n const startPoints = this._transformStartPoints\n const startPos = this._transformStartPos\n\n // 计算缩放比例\n const dx = p.x - centerX\n const dy = p.y - centerY\n const startDx = startPos.x - centerX\n const startDy = startPos.y - centerY\n\n const currentDist = Math.hypot(dx, dy)\n const startDist = Math.hypot(startDx, startDy)\n const scale = currentDist / startDist\n\n // 应用缩放\n this.selected.points.forEach((pt, i) => {\n pt.x = centerX + (startPoints[i].x - centerX) * scale\n pt.y = centerY + (startPoints[i].y - centerY) * scale\n })\n }\n\n _hitArrow(a, p) {\n for (let i = 0; i < a.points.length - 1; i++) {\n if (this._dist(p, a.points[i], a.points[i + 1]) < 15)\n return true\n }\n return false\n }\n\n _dist(p, a, b) {\n const dx = b.x - a.x\n const dy = b.y - a.y\n const t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / (dx * dx + dy * dy)\n const tt = Math.max(0, Math.min(1, t))\n const px = a.x + tt * dx\n const py = a.y + tt * dy\n return Math.hypot(p.x - px, p.y - py)\n }\n\n // 获取所有箭头数据\n getData() {\n return this.arrows.map(arrow => ({\n points: arrow.points,\n curveRate: arrow.curveRate ?? arrow.cornerRoundness ?? 0,\n strokeWidth: arrow.strokeWidth,\n color: arrow.color\n }))\n }\n\n // 设置箭头数据\n setData(data) {\n this.arrows = data.map(item => ({\n points: item.points,\n curveRate: item.curveRate ?? 0,\n strokeWidth: item.strokeWidth ?? 8,\n color: item.color\n }))\n this.render()\n }\n\n // 清空所有箭头\n clear() {\n this.arrows = []\n this.drawing = false\n this.current = null\n this.selected = null\n this.render()\n }\n\n // 销毁编辑器,移除所有事件和元素\n destroy() {\n // 销毁键盘绑定\n if (this._kb && this._kb.destroy) {\n this._kb.destroy()\n }\n\n // 移除容器上的事件\n this.container.onclick = null\n this.container.onmousemove = null\n this.container.onmousedown = null\n this.container.onmouseup = null\n this.container.ondblclick = null\n\n // 移除 SVG 元素\n if (this.svg) {\n this.svg.remove()\n this.svg = null\n }\n\n // 移除工具条\n if (this._toolbar) {\n this._toolbar.remove()\n this._toolbar = null\n }\n\n // 移除颜色选择器\n if (this._colorPickerPopup) {\n this._colorPickerPopup.remove()\n this._colorPickerPopup = null\n }\n\n // 清空数据\n this.arrows = []\n this.drawing = false\n this.current = null\n this.selected = null\n this.mode = null\n this._transformMode = null\n this._transformHandle = null\n }\n}\n"],"names":["document","styleEl","createElement","textContent","head","appendChild","ArrowEditor","constructor","container","options","this","querySelector","svg","arrows","drawing","current","selected","mode","lastClickTime","lastClickPos","_shouldBlockClick","_defaultColor","isCtrl","stopPropagation","preventDefault","onDrawEnd","onRemove","onChange","_transformMode","_transformHandle","_transformStartPos","_transformStartPoints","_transformCenter","_transformStartAngle","_rotationOffset","_toolbar","_strokeWidth","_curveRate","_createSVG","_initKeybindings","_initEvents","getComputedStyle","position","style","createElementNS","setAttribute","defs","marker","polygon","_createToolbar","remove","className","color","strokeWidth","curveRate","_b","cornerRoundness","innerHTML","addEventListener","e","target","value","_updateMarkerColor","render","type","arrow","getData","strokeInput","strokeValue","parseInt","parseFloat","dragHandle","_setupToolbarDrag","isDragging","dragOffset","x","y","_toolbarDragging","rect","getBoundingClientRect","clientX","left","clientY","top","onMove","moveEvent","containerRect","newLeft","newTop","toolbarWidth","offsetWidth","toolbarHeight","offsetHeight","Math","max","min","width","height","onUp","removeEventListener","_showToolbar","display","colorInput","roundInput","bbox","_getArrowBBox","maxX","minX","centerY","_hideToolbar","_kb","Keybinding","on","_handleEnter","_handleEsc","_handleDelete","onclick","contains","p","_mousePos","_handleClick","onmousemove","_handleMouseMove","onmousedown","handle","getAttribute","points","map","pt","center","dx","centerX","dy","atan2","onmouseup","r","_generatePath","pts","length","d","i","curr","next","len","hypot","inDx","inDy","prev","outDx","outDy","after","inLen","outLen","uxIn","uyIn","uxOut","uyOut","controlDist","_generateArrowHead","last","ux","uy","notchX","notchY","scale","baseLen","baseWidth","notchLen","tipX","tipY","baseX","baseY","px","_createArrowGroup","index","g","_a","path","stroke","arrowHead","minY","scaleHandle","maxY","rotateY","rotateX","rotateLine","rotateHandle","querySelectorAll","forEach","_isDoubleClick","now","Date","dt","ctrlKey","push","classList","a","_hitArrow","add","_hideColorPicker","indexOf","splice","_showColorPicker","_showingColorPicker","popup","label","cssText","showPicker","ev","closeHandler","body","_colorPickerPopup","deleteSelected","filter","_handleRotate","_handleScale","movementX","movementY","Infinity","angleDiff","cos","sin","relX","relY","startPoints","startPos","startDx","startDy","_dist","b","t","tt","py","setData","data","item","clear","destroy","ondblclick"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wbiokr/arrow",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Arrow editor for drawing arrows on web pages",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=20.19.0 || >=22.12.0"
|
|
8
|
+
},
|
|
6
9
|
"main": "dist/bundle.esm.js",
|
|
7
10
|
"module": "dist/bundle.esm.js",
|
|
8
11
|
"types": "dist/bundle.esm.d.ts",
|
|
@@ -31,8 +34,9 @@
|
|
|
31
34
|
"author": "Wbiokr",
|
|
32
35
|
"license": "MIT",
|
|
33
36
|
"devDependencies": {
|
|
34
|
-
"
|
|
35
|
-
"
|
|
37
|
+
"@wbiokr/keybinding": "^2.3.5",
|
|
38
|
+
"terser": "^5.46.0",
|
|
39
|
+
"vite": "^7.3.1"
|
|
36
40
|
},
|
|
37
41
|
"peerDependencies": {
|
|
38
42
|
"@wbiokr/keybinding": "^2.3.5"
|