{ "version": 3, "sources": ["../../../../src/lib/shapes/arrow/ArrowShapeUtil.tsx"], "sourcesContent": ["import {\n\tArc2d,\n\tBox2d,\n\tDefaultFontFamilies,\n\tEdge2d,\n\tGroup2d,\n\tRectangle2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLArrowShape,\n\tTLArrowShapeArrowheadStyle,\n\tTLDefaultColorStyle,\n\tTLDefaultColorTheme,\n\tTLDefaultFillStyle,\n\tTLHandle,\n\tTLOnEditEndHandler,\n\tTLOnHandleChangeHandler,\n\tTLOnResizeHandler,\n\tTLOnTranslateStartHandler,\n\tTLShapePartial,\n\tTLShapeUtilCanvasSvgDef,\n\tTLShapeUtilFlag,\n\tVec2d,\n\tVec2dModel,\n\tarrowShapeMigrations,\n\tarrowShapeProps,\n\tdeepCopy,\n\tgetArrowTerminalsInArrowSpace,\n\tgetArrowheadPathForType,\n\tgetCurvedArrowHandlePath,\n\tgetDefaultColorTheme,\n\tgetSolidCurvedArrowPath,\n\tgetSolidStraightArrowPath,\n\tgetStraightArrowHandlePath,\n\ttoDomPrecision,\n\tuseIsEditing,\n} from '@tldraw/editor'\nimport React from 'react'\nimport { ShapeFill, getShapeFillSvg, useDefaultColorTheme } from '../shared/ShapeFill'\nimport { createTextSvgElementFromSpans } from '../shared/createTextSvgElementFromSpans'\nimport {\n\tARROW_LABEL_FONT_SIZES,\n\tFONT_FAMILIES,\n\tSTROKE_SIZES,\n\tTEXT_PROPS,\n} from '../shared/default-shape-constants'\nimport {\n\tgetFillDefForCanvas,\n\tgetFillDefForExport,\n\tgetFontDefForExport,\n} from '../shared/defaultStyleDefs'\nimport { getPerfectDashProps } from '../shared/getPerfectDashProps'\nimport { ArrowTextLabel } from './components/ArrowTextLabel'\n\nlet globalRenderIndex = 0\n\nexport const ARROW_END_OFFSET = 0.1\n\n/** @public */\nexport class ArrowShapeUtil extends ShapeUtil {\n\tstatic override type = 'arrow' as const\n\tstatic override props = arrowShapeProps\n\tstatic override migrations = arrowShapeMigrations\n\n\toverride canEdit = () => true\n\toverride canBind = () => false\n\toverride canSnap = () => false\n\toverride hideResizeHandles: TLShapeUtilFlag = () => true\n\toverride hideRotateHandle: TLShapeUtilFlag = () => true\n\toverride hideSelectionBoundsBg: TLShapeUtilFlag = () => true\n\toverride hideSelectionBoundsFg: TLShapeUtilFlag = () => true\n\n\toverride getDefaultProps(): TLArrowShape['props'] {\n\t\treturn {\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tfill: 'none',\n\t\t\tcolor: 'black',\n\t\t\tlabelColor: 'black',\n\t\t\tbend: 0,\n\t\t\tstart: { type: 'point', x: 0, y: 0 },\n\t\t\tend: { type: 'point', x: 2, y: 0 },\n\t\t\tarrowheadStart: 'none',\n\t\t\tarrowheadEnd: 'arrow',\n\t\t\ttext: '',\n\t\t\tfont: 'draw',\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLArrowShape) {\n\t\tconst info = this.editor.getArrowInfo(shape)!\n\n\t\tconst bodyGeom = info.isStraight\n\t\t\t? new Edge2d({\n\t\t\t\t\tstart: Vec2d.From(info.start.point),\n\t\t\t\t\tend: Vec2d.From(info.end.point),\n\t\t\t })\n\t\t\t: new Arc2d({\n\t\t\t\t\tcenter: Vec2d.Cast(info.handleArc.center),\n\t\t\t\t\tradius: info.handleArc.radius,\n\t\t\t\t\tstart: Vec2d.Cast(info.start.point),\n\t\t\t\t\tend: Vec2d.Cast(info.end.point),\n\t\t\t\t\tsweepFlag: info.bodyArc.sweepFlag,\n\t\t\t\t\tlargeArcFlag: info.bodyArc.largeArcFlag,\n\t\t\t })\n\n\t\tlet labelGeom: Rectangle2d | undefined\n\n\t\tif (shape.props.text.trim()) {\n\t\t\tconst bodyBounds = bodyGeom.bounds\n\n\t\t\tconst { w, h } = this.editor.textMeasure.measureText(shape.props.text, {\n\t\t\t\t...TEXT_PROPS,\n\t\t\t\tfontFamily: FONT_FAMILIES[shape.props.font],\n\t\t\t\tfontSize: ARROW_LABEL_FONT_SIZES[shape.props.size],\n\t\t\t\tmaxWidth: null,\n\t\t\t})\n\n\t\t\tlet width = w\n\t\t\tlet height = h\n\n\t\t\tif (bodyBounds.width > bodyBounds.height) {\n\t\t\t\twidth = Math.max(Math.min(w, 64), Math.min(bodyBounds.width - 64, w))\n\n\t\t\t\tconst { w: squishedWidth, h: squishedHeight } = this.editor.textMeasure.measureText(\n\t\t\t\t\tshape.props.text,\n\t\t\t\t\t{\n\t\t\t\t\t\t...TEXT_PROPS,\n\t\t\t\t\t\tfontFamily: FONT_FAMILIES[shape.props.font],\n\t\t\t\t\t\tfontSize: ARROW_LABEL_FONT_SIZES[shape.props.size],\n\t\t\t\t\t\tmaxWidth: width,\n\t\t\t\t\t}\n\t\t\t\t)\n\n\t\t\t\twidth = squishedWidth\n\t\t\t\theight = squishedHeight\n\t\t\t}\n\n\t\t\tif (width > 16 * ARROW_LABEL_FONT_SIZES[shape.props.size]) {\n\t\t\t\twidth = 16 * ARROW_LABEL_FONT_SIZES[shape.props.size]\n\n\t\t\t\tconst { w: squishedWidth, h: squishedHeight } = this.editor.textMeasure.measureText(\n\t\t\t\t\tshape.props.text,\n\t\t\t\t\t{\n\t\t\t\t\t\t...TEXT_PROPS,\n\t\t\t\t\t\tfontFamily: FONT_FAMILIES[shape.props.font],\n\t\t\t\t\t\tfontSize: ARROW_LABEL_FONT_SIZES[shape.props.size],\n\t\t\t\t\t\tmaxWidth: width,\n\t\t\t\t\t}\n\t\t\t\t)\n\n\t\t\t\twidth = squishedWidth\n\t\t\t\theight = squishedHeight\n\t\t\t}\n\n\t\t\tlabelGeom = new Rectangle2d({\n\t\t\t\tx: info.middle.x - width / 2 - 4.25,\n\t\t\t\ty: info.middle.y - height / 2 - 4.25,\n\t\t\t\twidth: width + 8.5,\n\t\t\t\theight: height + 8.5,\n\t\t\t\tisFilled: true,\n\t\t\t\tisLabel: true,\n\t\t\t})\n\t\t}\n\n\t\treturn new Group2d({\n\t\t\tchildren: labelGeom ? [bodyGeom, labelGeom] : [bodyGeom],\n\t\t\tisSnappable: false,\n\t\t})\n\t}\n\n\toverride getHandles(shape: TLArrowShape): TLHandle[] {\n\t\tconst info = this.editor.getArrowInfo(shape)!\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: 'start',\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a0',\n\t\t\t\tx: info.start.handle.x,\n\t\t\t\ty: info.start.handle.y,\n\t\t\t\tcanBind: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'middle',\n\t\t\t\ttype: 'virtual',\n\t\t\t\tindex: 'a2',\n\t\t\t\tx: info.middle.x,\n\t\t\t\ty: info.middle.y,\n\t\t\t\tcanBind: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'end',\n\t\t\t\ttype: 'vertex',\n\t\t\t\tindex: 'a3',\n\t\t\t\tx: info.end.handle.x,\n\t\t\t\ty: info.end.handle.y,\n\t\t\t\tcanBind: true,\n\t\t\t},\n\t\t]\n\t}\n\n\toverride onHandleChange: TLOnHandleChangeHandler = (\n\t\tshape,\n\t\t{ handle, isPrecise }\n\t) => {\n\t\tconst handleId = handle.id as 'start' | 'middle' | 'end'\n\n\t\tif (handleId === 'middle') {\n\t\t\t// Bending the arrow...\n\t\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape)\n\n\t\t\tconst delta = Vec2d.Sub(end, start)\n\t\t\tconst v = Vec2d.Per(delta)\n\n\t\t\tconst med = Vec2d.Med(end, start)\n\t\t\tconst A = Vec2d.Sub(med, v)\n\t\t\tconst B = Vec2d.Add(med, v)\n\n\t\t\tconst point = Vec2d.NearestPointOnLineSegment(A, B, handle, false)\n\t\t\tlet bend = Vec2d.Dist(point, med)\n\t\t\tif (Vec2d.Clockwise(point, end, med)) bend *= -1\n\t\t\treturn { id: shape.id, type: shape.type, props: { bend } }\n\t\t}\n\n\t\t// Start or end, pointing the arrow...\n\n\t\tconst next = deepCopy(shape) as TLArrowShape\n\n\t\tconst pageTransform = this.editor.getShapePageTransform(next.id)!\n\t\tconst pointInPageSpace = pageTransform.applyToPoint(handle)\n\n\t\tif (this.editor.inputs.ctrlKey) {\n\t\t\t// todo: maybe double check that this isn't equal to the other handle too?\n\t\t\t// Skip binding\n\t\t\tnext.props[handleId] = {\n\t\t\t\ttype: 'point',\n\t\t\t\tx: handle.x,\n\t\t\t\ty: handle.y,\n\t\t\t}\n\t\t\treturn next\n\t\t}\n\n\t\tconst point = this.editor.getShapePageTransform(shape.id)!.applyToPoint(handle)\n\n\t\tconst target = this.editor.getShapeAtPoint(point, {\n\t\t\thitInside: true,\n\t\t\thitFrameInside: true,\n\t\t\tmargin: 0,\n\t\t\tfilter: (targetShape) => {\n\t\t\t\treturn !targetShape.isLocked && this.editor.getShapeUtil(targetShape).canBind(targetShape)\n\t\t\t},\n\t\t})\n\n\t\tif (!target) {\n\t\t\t// todo: maybe double check that this isn't equal to the other handle too?\n\t\t\tnext.props[handleId] = {\n\t\t\t\ttype: 'point',\n\t\t\t\tx: handle.x,\n\t\t\t\ty: handle.y,\n\t\t\t}\n\t\t\treturn next\n\t\t}\n\n\t\t// we've got a target! the handle is being dragged over a shape, bind to it\n\n\t\tconst targetGeometry = this.editor.getShapeGeometry(target)\n\t\tconst targetBounds = Box2d.ZeroFix(targetGeometry.bounds)\n\t\tconst pointInTargetSpace = this.editor.getPointInShapeSpace(target, pointInPageSpace)\n\n\t\tlet precise = isPrecise\n\n\t\tif (!precise) {\n\t\t\t// If we're switching to a new bound shape, then precise only if moving slowly\n\t\t\tconst prevHandle = next.props[handleId]\n\t\t\tif (\n\t\t\t\tprevHandle.type === 'point' ||\n\t\t\t\t(prevHandle.type === 'binding' && target.id !== prevHandle.boundShapeId)\n\t\t\t) {\n\t\t\t\tprecise = this.editor.inputs.pointerVelocity.len() < 0.5\n\t\t\t}\n\t\t}\n\n\t\tif (precise) {\n\t\t\t// Turn off precision if we're within a certain distance to the center of the shape.\n\t\t\t// Funky math but we want the snap distance to be 4 at the minimum and either\n\t\t\t// 16 or 15% of the smaller dimension of the target shape, whichever is smaller\n\t\t\tprecise =\n\t\t\t\tVec2d.Dist(pointInTargetSpace, targetBounds.center) >\n\t\t\t\tMath.max(4, Math.min(Math.min(targetBounds.width, targetBounds.height) * 0.15, 16)) /\n\t\t\t\t\tthis.editor.zoomLevel\n\t\t}\n\n\t\tif (!isPrecise) {\n\t\t\tif (!targetGeometry.isClosed) {\n\t\t\t\tprecise = true\n\t\t\t}\n\n\t\t\t// Double check that we're not going to be doing an imprecise snap on\n\t\t\t// the same shape twice, as this would result in a zero length line\n\t\t\tconst otherHandle = next.props[handleId === 'start' ? 'end' : 'start']\n\t\t\tif (\n\t\t\t\totherHandle.type === 'binding' &&\n\t\t\t\ttarget.id === otherHandle.boundShapeId &&\n\t\t\t\tVec2d.Equals(otherHandle.normalizedAnchor, { x: 0.5, y: 0.5 })\n\t\t\t) {\n\t\t\t\tprecise = true\n\t\t\t}\n\t\t}\n\n\t\tnext.props[handleId] = {\n\t\t\ttype: 'binding',\n\t\t\tboundShapeId: target.id,\n\t\t\tnormalizedAnchor: precise\n\t\t\t\t? {\n\t\t\t\t\t\tx: (pointInTargetSpace.x - targetBounds.minX) / targetBounds.width,\n\t\t\t\t\t\ty: (pointInTargetSpace.y - targetBounds.minY) / targetBounds.height,\n\t\t\t\t }\n\t\t\t\t: { x: 0.5, y: 0.5 },\n\t\t\tisExact: this.editor.inputs.altKey,\n\t\t}\n\n\t\tif (next.props.start.type === 'binding' && next.props.end.type === 'binding') {\n\t\t\tif (next.props.start.boundShapeId === next.props.end.boundShapeId) {\n\t\t\t\tif (Vec2d.Equals(next.props.start.normalizedAnchor, next.props.end.normalizedAnchor)) {\n\t\t\t\t\tnext.props.end.normalizedAnchor.x += 0.05\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn next\n\t}\n\n\toverride onTranslateStart: TLOnTranslateStartHandler = (shape) => {\n\t\tconst startBindingId =\n\t\t\tshape.props.start.type === 'binding' ? shape.props.start.boundShapeId : null\n\t\tconst endBindingId = shape.props.end.type === 'binding' ? shape.props.end.boundShapeId : null\n\n\t\t// If at least one bound shape is in the selection, do nothing;\n\t\t// If no bound shapes are in the selection, unbind any bound shapes\n\n\t\tconst { selectedShapeIds } = this.editor\n\n\t\tif (\n\t\t\t(startBindingId &&\n\t\t\t\t(selectedShapeIds.includes(startBindingId) ||\n\t\t\t\t\tthis.editor.isAncestorSelected(startBindingId))) ||\n\t\t\t(endBindingId &&\n\t\t\t\t(selectedShapeIds.includes(endBindingId) || this.editor.isAncestorSelected(endBindingId)))\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape)\n\n\t\treturn {\n\t\t\tid: shape.id,\n\t\t\ttype: shape.type,\n\t\t\tprops: {\n\t\t\t\t...shape.props,\n\t\t\t\tstart: {\n\t\t\t\t\ttype: 'point',\n\t\t\t\t\tx: start.x,\n\t\t\t\t\ty: start.y,\n\t\t\t\t},\n\t\t\t\tend: {\n\t\t\t\t\ttype: 'point',\n\t\t\t\t\tx: end.x,\n\t\t\t\t\ty: end.y,\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t}\n\n\toverride onResize: TLOnResizeHandler = (shape, info) => {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst terminals = getArrowTerminalsInArrowSpace(this.editor, shape)\n\n\t\tconst { start, end } = deepCopy(shape.props)\n\t\tlet { bend } = shape.props\n\n\t\t// Rescale start handle if it's not bound to a shape\n\t\tif (start.type === 'point') {\n\t\t\tstart.x = terminals.start.x * scaleX\n\t\t\tstart.y = terminals.start.y * scaleY\n\t\t}\n\n\t\t// Rescale end handle if it's not bound to a shape\n\t\tif (end.type === 'point') {\n\t\t\tend.x = terminals.end.x * scaleX\n\t\t\tend.y = terminals.end.y * scaleY\n\t\t}\n\n\t\t// todo: we should only change the normalized anchor positions\n\t\t// of the shape's handles if the bound shape is also being resized\n\n\t\tconst mx = Math.abs(scaleX)\n\t\tconst my = Math.abs(scaleY)\n\n\t\tif (scaleX < 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (start.type === 'binding') {\n\t\t\t\tstart.normalizedAnchor.x = 1 - start.normalizedAnchor.x\n\t\t\t}\n\n\t\t\tif (end.type === 'binding') {\n\t\t\t\tend.normalizedAnchor.x = 1 - end.normalizedAnchor.x\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= -1\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (start.type === 'binding') {\n\t\t\t\tstart.normalizedAnchor.y = 1 - start.normalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (end.type === 'binding') {\n\t\t\t\tend.normalizedAnchor.y = 1 - end.normalizedAnchor.y\n\t\t\t}\n\t\t} else if (scaleX >= 0 && scaleY >= 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\t\t} else if (scaleX < 0 && scaleY < 0) {\n\t\t\tif (bend !== 0) {\n\t\t\t\tbend *= Math.max(mx, my)\n\t\t\t}\n\n\t\t\tif (start.type === 'binding') {\n\t\t\t\tstart.normalizedAnchor.x = 1 - start.normalizedAnchor.x\n\t\t\t\tstart.normalizedAnchor.y = 1 - start.normalizedAnchor.y\n\t\t\t}\n\n\t\t\tif (end.type === 'binding') {\n\t\t\t\tend.normalizedAnchor.x = 1 - end.normalizedAnchor.x\n\t\t\t\tend.normalizedAnchor.y = 1 - end.normalizedAnchor.y\n\t\t\t}\n\t\t}\n\n\t\tconst next = {\n\t\t\tprops: {\n\t\t\t\tstart,\n\t\t\t\tend,\n\t\t\t\tbend,\n\t\t\t},\n\t\t}\n\n\t\treturn next\n\t}\n\n\toverride onDoubleClickHandle = (\n\t\tshape: TLArrowShape,\n\t\thandle: TLHandle\n\t): TLShapePartial | void => {\n\t\tswitch (handle.id) {\n\t\t\tcase 'start': {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadStart: shape.props.arrowheadStart === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase 'end': {\n\t\t\t\treturn {\n\t\t\t\t\tid: shape.id,\n\t\t\t\t\ttype: shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...shape.props,\n\t\t\t\t\t\tarrowheadEnd: shape.props.arrowheadEnd === 'none' ? 'arrow' : 'none',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcomponent(shape: TLArrowShape) {\n\t\t// Not a class component, but eslint can't tell that :(\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst onlySelectedShape = this.editor.onlySelectedShape\n\t\tconst shouldDisplayHandles =\n\t\t\tthis.editor.isInAny(\n\t\t\t\t'select.idle',\n\t\t\t\t'select.pointing_handle',\n\t\t\t\t'select.dragging_handle',\n\t\t\t\t'arrow.dragging'\n\t\t\t) && !this.editor.instanceState.isReadonly\n\n\t\tconst info = this.editor.getArrowInfo(shape)\n\t\tconst bounds = Box2d.ZeroFix(this.editor.getShapeGeometry(shape).bounds)\n\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst changeIndex = React.useMemo(() => {\n\t\t\treturn this.editor.environment.isSafari ? (globalRenderIndex += 1) : 0\n\t\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t}, [shape])\n\n\t\tif (!info?.isValid) return null\n\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size]\n\n\t\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\t\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\t\tconst path = info.isStraight ? getSolidStraightArrowPath(info) : getSolidCurvedArrowPath(info)\n\n\t\tlet handlePath: null | JSX.Element = null\n\n\t\tif (onlySelectedShape === shape && shouldDisplayHandles) {\n\t\t\tconst sw = 2\n\t\t\tconst { strokeDasharray, strokeDashoffset } = getPerfectDashProps(\n\t\t\t\tinfo.isStraight\n\t\t\t\t\t? Vec2d.Dist(info.start.handle, info.end.handle)\n\t\t\t\t\t: Math.abs(info.handleArc.length),\n\t\t\t\tsw,\n\t\t\t\t{\n\t\t\t\t\tend: 'skip',\n\t\t\t\t\tstart: 'skip',\n\t\t\t\t\tlengthRatio: 2.5,\n\t\t\t\t}\n\t\t\t)\n\n\t\t\thandlePath =\n\t\t\t\tshape.props.start.type === 'binding' || shape.props.end.type === 'binding' ? (\n\t\t\t\t\t\n\t\t\t\t) : null\n\t\t}\n\n\t\tconst { strokeDasharray, strokeDashoffset } = getPerfectDashProps(\n\t\t\tinfo.isStraight ? info.length : Math.abs(info.bodyArc.length),\n\t\t\tstrokeWidth,\n\t\t\t{\n\t\t\t\tstyle: shape.props.dash,\n\t\t\t}\n\t\t)\n\n\t\tconst labelGeometry = shape.props.text.trim()\n\t\t\t? (this.editor.getShapeGeometry(shape).children[1] as Rectangle2d)\n\t\t\t: null\n\n\t\tconst maskStartArrowhead = !(\n\t\t\tinfo.start.arrowhead === 'none' || info.start.arrowhead === 'arrow'\n\t\t)\n\t\tconst maskEndArrowhead = !(info.end.arrowhead === 'none' || info.end.arrowhead === 'arrow')\n\n\t\t// NOTE: I know right setting `changeIndex` hacky-as right! But we need this because otherwise safari loses\n\t\t// the mask, see \n\t\tconst maskId = (shape.id + '_clip_' + changeIndex).replace(':', '_')\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t\n\t\t\t\t\t{/* Yep */}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{labelGeometry && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{as && maskStartArrowhead && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{ae && maskEndArrowhead && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{handlePath}\n\t\t\t\t\t\t{/* firefox will clip if you provide a maskURL even if there is no mask matching that URL in the DOM */}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{as && maskStartArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{ae && maskEndArrowhead && shape.props.fill !== 'none' && (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{as && }\n\t\t\t\t\t\t{ae && }\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t)\n\t}\n\n\tindicator(shape: TLArrowShape) {\n\t\tconst { start, end } = getArrowTerminalsInArrowSpace(this.editor, shape)\n\n\t\tconst info = this.editor.getArrowInfo(shape)\n\t\tconst geometry = this.editor.getShapeGeometry(shape)\n\t\tconst bounds = geometry.bounds\n\n\t\tconst labelGeometry = shape.props.text.trim() ? (geometry.children[1] as Rectangle2d) : null\n\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst isEditing = useIsEditing(shape.id)\n\n\t\tif (!info) return null\n\t\tif (Vec2d.Equals(start, end)) return null\n\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size]\n\n\t\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\t\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\t\tconst path = info.isStraight ? getSolidStraightArrowPath(info) : getSolidCurvedArrowPath(info)\n\n\t\tconst includeMask =\n\t\t\t(as && info.start.arrowhead !== 'arrow') ||\n\t\t\t(ae && info.end.arrowhead !== 'arrow') ||\n\t\t\t!!labelGeometry\n\n\t\tconst maskId = (shape.id + '_clip').replace(':', '_')\n\n\t\tif (isEditing && labelGeometry) {\n\t\t\treturn (\n\t\t\t\t\n\t\t\t)\n\t\t}\n\n\t\treturn (\n\t\t\t\n\t\t\t\t{includeMask && (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{labelGeometry && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{as && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{ae && (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{/* firefox will clip if you provide a maskURL even if there is no mask matching that URL in the DOM */}\n\t\t\t\t\n\t\t\t\t\t{/* This rect needs to be here if we're creating a mask due to an svg quirk on Chrome */}\n\t\t\t\t\t{includeMask && (\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{as && }\n\t\t\t\t{ae && }\n\t\t\t\t{labelGeometry && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t)\n\t}\n\n\toverride onEditEnd: TLOnEditEndHandler = (shape) => {\n\t\tconst {\n\t\t\tid,\n\t\t\ttype,\n\t\t\tprops: { text },\n\t\t} = shape\n\n\t\tif (text.trimEnd() !== shape.props.text) {\n\t\t\tthis.editor.updateShapes([\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\ttype,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\ttext: text.trimEnd(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t}\n\t}\n\n\toverride toSvg(shape: TLArrowShape, ctx: SvgExportContext) {\n\t\tconst theme = getDefaultColorTheme({ isDarkMode: this.editor.user.isDarkMode })\n\t\tctx.addExportDef(getFillDefForExport(shape.props.fill, theme))\n\n\t\tconst color = theme[shape.props.color].solid\n\n\t\tconst info = this.editor.getArrowInfo(shape)\n\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size]\n\n\t\t// Group for arrow\n\t\tconst g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\t\tif (!info) return g\n\n\t\t// Arrowhead start path\n\t\tconst as = info.start.arrowhead && getArrowheadPathForType(info, 'start', strokeWidth)\n\t\t// Arrowhead end path\n\t\tconst ae = info.end.arrowhead && getArrowheadPathForType(info, 'end', strokeWidth)\n\n\t\tconst geometry = this.editor.getShapeGeometry(shape)\n\t\tconst bounds = geometry.bounds\n\n\t\tconst labelGeometry = shape.props.text.trim() ? (geometry.children[1] as Rectangle2d) : null\n\n\t\tconst maskId = (shape.id + '_clip').replace(':', '_')\n\n\t\t// If we have any arrowheads, then mask the arrowheads\n\t\tif (as || ae || !!labelGeometry) {\n\t\t\t// Create mask for arrowheads\n\n\t\t\t// Create defs\n\t\t\tconst defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n\n\t\t\t// Create mask\n\t\t\tconst mask = document.createElementNS('http://www.w3.org/2000/svg', 'mask')\n\t\t\tmask.id = maskId\n\n\t\t\t// Create large white shape for mask\n\t\t\tconst rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n\t\t\trect.setAttribute('x', bounds.minX - 100 + '')\n\t\t\trect.setAttribute('y', bounds.minY - 100 + '')\n\t\t\trect.setAttribute('width', bounds.width + 200 + '')\n\t\t\trect.setAttribute('height', bounds.height + 200 + '')\n\t\t\trect.setAttribute('fill', 'white')\n\t\t\tmask.appendChild(rect)\n\n\t\t\t// add arrowhead start mask\n\t\t\tif (as) mask.appendChild(getArrowheadSvgMask(as, info.start.arrowhead))\n\n\t\t\t// add arrowhead end mask\n\t\t\tif (ae) mask.appendChild(getArrowheadSvgMask(ae, info.end.arrowhead))\n\n\t\t\t// Mask out text label if text is present\n\t\t\tif (labelGeometry) {\n\t\t\t\tconst labelMask = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n\t\t\t\tlabelMask.setAttribute('x', labelGeometry.x + '')\n\t\t\t\tlabelMask.setAttribute('y', labelGeometry.y + '')\n\t\t\t\tlabelMask.setAttribute('width', labelGeometry.w + '')\n\t\t\t\tlabelMask.setAttribute('height', labelGeometry.h + '')\n\t\t\t\tlabelMask.setAttribute('fill', 'black')\n\n\t\t\t\tmask.appendChild(labelMask)\n\t\t\t}\n\n\t\t\tdefs.appendChild(mask)\n\t\t\tg.appendChild(defs)\n\t\t}\n\n\t\tconst g2 = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\t\tg2.setAttribute('mask', `url(#${maskId})`)\n\t\tg.appendChild(g2)\n\n\t\t// Dumb mask fix thing\n\t\tconst rect2 = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n\t\trect2.setAttribute('x', '-100')\n\t\trect2.setAttribute('y', '-100')\n\t\trect2.setAttribute('width', bounds.width + 200 + '')\n\t\trect2.setAttribute('height', bounds.height + 200 + '')\n\t\trect2.setAttribute('fill', 'transparent')\n\t\trect2.setAttribute('stroke', 'none')\n\t\tg2.appendChild(rect2)\n\n\t\t// Arrowhead body path\n\t\tconst path = getArrowSvgPath(\n\t\t\tinfo.isStraight ? getSolidStraightArrowPath(info) : getSolidCurvedArrowPath(info),\n\t\t\tcolor,\n\t\t\tstrokeWidth\n\t\t)\n\n\t\tconst { strokeDasharray, strokeDashoffset } = getPerfectDashProps(\n\t\t\tinfo.isStraight ? info.length : Math.abs(info.bodyArc.length),\n\t\t\tstrokeWidth,\n\t\t\t{\n\t\t\t\tstyle: shape.props.dash,\n\t\t\t}\n\t\t)\n\n\t\tpath.setAttribute('stroke-dasharray', strokeDasharray)\n\t\tpath.setAttribute('stroke-dashoffset', strokeDashoffset)\n\n\t\tg2.appendChild(path)\n\n\t\t// Arrowhead start path\n\t\tif (as) {\n\t\t\tg.appendChild(\n\t\t\t\tgetArrowheadSvgPath(\n\t\t\t\t\tas,\n\t\t\t\t\tshape.props.color,\n\t\t\t\t\tstrokeWidth,\n\t\t\t\t\tshape.props.arrowheadStart === 'arrow' ? 'none' : shape.props.fill,\n\t\t\t\t\ttheme\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\t// Arrowhead end path\n\t\tif (ae) {\n\t\t\tg.appendChild(\n\t\t\t\tgetArrowheadSvgPath(\n\t\t\t\t\tae,\n\t\t\t\t\tshape.props.color,\n\t\t\t\t\tstrokeWidth,\n\t\t\t\t\tshape.props.arrowheadEnd === 'arrow' ? 'none' : shape.props.fill,\n\t\t\t\t\ttheme\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\n\t\t// Text Label\n\t\tif (labelGeometry) {\n\t\t\tctx.addExportDef(getFontDefForExport(shape.props.font))\n\n\t\t\tconst opts = {\n\t\t\t\tfontSize: ARROW_LABEL_FONT_SIZES[shape.props.size],\n\t\t\t\tlineHeight: TEXT_PROPS.lineHeight,\n\t\t\t\tfontFamily: DefaultFontFamilies[shape.props.font],\n\t\t\t\tpadding: 0,\n\t\t\t\ttextAlign: 'middle' as const,\n\t\t\t\twidth: labelGeometry.w - 8,\n\t\t\t\tverticalTextAlign: 'middle' as const,\n\t\t\t\theight: labelGeometry.h,\n\t\t\t\tfontStyle: 'normal',\n\t\t\t\tfontWeight: 'normal',\n\t\t\t\toverflow: 'wrap' as const,\n\t\t\t}\n\n\t\t\tconst textElm = createTextSvgElementFromSpans(\n\t\t\t\tthis.editor,\n\t\t\t\tthis.editor.textMeasure.measureTextSpans(shape.props.text, opts),\n\t\t\t\topts\n\t\t\t)\n\t\t\ttextElm.setAttribute('fill', theme[shape.props.labelColor].solid)\n\n\t\t\tconst children = Array.from(textElm.children) as unknown as SVGTSpanElement[]\n\n\t\t\tchildren.forEach((child) => {\n\t\t\t\tconst x = parseFloat(child.getAttribute('x') || '0')\n\t\t\t\tconst y = parseFloat(child.getAttribute('y') || '0')\n\n\t\t\t\tchild.setAttribute('x', x + 4 + labelGeometry.x + 'px')\n\t\t\t\tchild.setAttribute('y', y + labelGeometry.y + 'px')\n\t\t\t})\n\n\t\t\tconst textBgEl = textElm.cloneNode(true) as SVGTextElement\n\t\t\ttextBgEl.setAttribute('stroke-width', '2')\n\t\t\ttextBgEl.setAttribute('fill', theme.background)\n\t\t\ttextBgEl.setAttribute('stroke', theme.background)\n\n\t\t\tg.appendChild(textBgEl)\n\t\t\tg.appendChild(textElm)\n\t\t}\n\n\t\treturn g\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [getFillDefForCanvas()]\n\t}\n}\n\nfunction getArrowheadSvgMask(d: string, arrowhead: TLArrowShapeArrowheadStyle) {\n\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\tpath.setAttribute('d', d)\n\tpath.setAttribute('fill', arrowhead === 'arrow' ? 'none' : 'black')\n\tpath.setAttribute('stroke', 'none')\n\treturn path\n}\n\nfunction getArrowSvgPath(d: string, color: string, strokeWidth: number) {\n\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\tpath.setAttribute('d', d)\n\tpath.setAttribute('fill', 'none')\n\tpath.setAttribute('stroke', color)\n\tpath.setAttribute('stroke-width', strokeWidth + '')\n\treturn path\n}\n\nfunction getArrowheadSvgPath(\n\td: string,\n\tcolor: TLDefaultColorStyle,\n\tstrokeWidth: number,\n\tfill: TLDefaultFillStyle,\n\ttheme: TLDefaultColorTheme\n) {\n\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\tpath.setAttribute('d', d)\n\tpath.setAttribute('fill', 'none')\n\tpath.setAttribute('stroke', theme[color].solid)\n\tpath.setAttribute('stroke-width', strokeWidth + '')\n\n\t// Get the fill element, if any\n\tconst shapeFill = getShapeFillSvg({\n\t\td,\n\t\tfill,\n\t\tcolor,\n\t\ttheme,\n\t})\n\n\tif (shapeFill) {\n\t\t// If there is a fill element, return a group containing the fill and the path\n\t\tconst g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\t\tg.appendChild(shapeFill)\n\t\tg.appendChild(path)\n\t\treturn g\n\t} else {\n\t\t// Otherwise, just return the path\n\t\treturn path\n\t}\n}\n\nfunction isPrecise(normalizedAnchor: Vec2dModel) {\n\treturn normalizedAnchor.x !== 0.5 || normalizedAnchor.y !== 0.5\n}\n"], "mappings": "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", "names": ["isPrecise", "point", "strokeDasharray", "strokeDashoffset"] }