{ "version": 3, "sources": ["../../../../src/lib/shapes/draw/DrawShapeUtil.tsx"], "sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n\tBox2d,\n\tCircle2d,\n\tPolygon2d,\n\tPolyline2d,\n\tSVGContainer,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLDrawShape,\n\tTLDrawShapeSegment,\n\tTLOnResizeHandler,\n\tTLShapeUtilCanvasSvgDef,\n\tVecLike,\n\tdrawShapeMigrations,\n\tdrawShapeProps,\n\tgetDefaultColorTheme,\n\tgetSvgPathFromPoints,\n\tlast,\n\trng,\n\ttoFixed,\n} from '@tldraw/editor'\nimport { ShapeFill, getShapeFillSvg, useDefaultColorTheme } from '../shared/ShapeFill'\nimport { STROKE_SIZES } from '../shared/default-shape-constants'\nimport { getFillDefForCanvas, getFillDefForExport } from '../shared/defaultStyleDefs'\nimport { getStrokeOutlinePoints } from '../shared/freehand/getStrokeOutlinePoints'\nimport { getStrokePoints } from '../shared/freehand/getStrokePoints'\nimport { setStrokePointRadii } from '../shared/freehand/setStrokePointRadii'\nimport { getSvgPathFromStrokePoints } from '../shared/freehand/svg'\nimport { useForceSolid } from '../shared/useForceSolid'\nimport { getDrawShapeStrokeDashArray, getFreehandOptions, getPointsFromSegments } from './getPath'\n\n/** @public */\nexport class DrawShapeUtil extends ShapeUtil {\n\tstatic override type = 'draw' as const\n\tstatic override props = drawShapeProps\n\tstatic override migrations = drawShapeMigrations\n\n\toverride hideResizeHandles = (shape: TLDrawShape) => getIsDot(shape)\n\toverride hideRotateHandle = (shape: TLDrawShape) => getIsDot(shape)\n\toverride hideSelectionBoundsFg = (shape: TLDrawShape) => getIsDot(shape)\n\n\toverride getDefaultProps(): TLDrawShape['props'] {\n\t\treturn {\n\t\t\tsegments: [],\n\t\t\tcolor: 'black',\n\t\t\tfill: 'none',\n\t\t\tdash: 'draw',\n\t\t\tsize: 'm',\n\t\t\tisComplete: false,\n\t\t\tisClosed: false,\n\t\t\tisPen: false,\n\t\t}\n\t}\n\n\tgetGeometry(shape: TLDrawShape) {\n\t\tconst points = getPointsFromSegments(shape.props.segments)\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size]\n\n\t\t// A dot\n\t\tif (shape.props.segments.length === 1) {\n\t\t\tconst box = Box2d.FromPoints(points)\n\t\t\tif (box.width < strokeWidth * 2 && box.height < strokeWidth * 2) {\n\t\t\t\treturn new Circle2d({\n\t\t\t\t\tx: -strokeWidth,\n\t\t\t\t\ty: -strokeWidth,\n\t\t\t\t\tradius: strokeWidth,\n\t\t\t\t\tisFilled: true,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst strokePoints = getStrokePoints(\n\t\t\tpoints,\n\t\t\tgetFreehandOptions(shape.props, strokeWidth, true, true)\n\t\t).map((p) => p.point)\n\n\t\t// A closed draw stroke\n\t\tif (shape.props.isClosed) {\n\t\t\treturn new Polygon2d({\n\t\t\t\tpoints: strokePoints,\n\t\t\t\tisFilled: shape.props.fill !== 'none',\n\t\t\t})\n\t\t}\n\n\t\t// An open draw stroke\n\t\treturn new Polyline2d({\n\t\t\tpoints: strokePoints,\n\t\t})\n\t}\n\n\tcomponent(shape: TLDrawShape) {\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst forceSolid = useForceSolid()\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size]\n\t\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\t\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\n\t\tlet sw = strokeWidth\n\t\tif (\n\t\t\t!forceSolid &&\n\t\t\t!shape.props.isPen &&\n\t\t\tshape.props.dash === 'draw' &&\n\t\t\tallPointsFromSegments.length === 1\n\t\t) {\n\t\t\tsw += rng(shape.id)() * (strokeWidth / 6)\n\t\t}\n\n\t\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, forceSolid)\n\t\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\n\t\tconst solidStrokePath =\n\t\t\tstrokePoints.length > 1\n\t\t\t\t? getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\t\t\t\t: getDot(allPointsFromSegments[0], sw)\n\n\t\tif ((!forceSolid && shape.props.dash === 'draw') || strokePoints.length < 2) {\n\t\t\tsetStrokePointRadii(strokePoints, options)\n\t\t\tconst strokeOutlinePoints = getStrokeOutlinePoints(strokePoints, options)\n\n\t\t\treturn (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\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\n\t\t\t\t\n\t\t\t\n\t\t)\n\t}\n\n\tindicator(shape: TLDrawShape) {\n\t\tconst forceSolid = useForceSolid()\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size]\n\t\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\t\tlet sw = strokeWidth\n\t\tif (\n\t\t\t!forceSolid &&\n\t\t\t!shape.props.isPen &&\n\t\t\tshape.props.dash === 'draw' &&\n\t\t\tallPointsFromSegments.length === 1\n\t\t) {\n\t\t\tsw += rng(shape.id)() * (strokeWidth / 6)\n\t\t}\n\n\t\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\t\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, true)\n\t\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\t\tconst solidStrokePath =\n\t\t\tstrokePoints.length > 1\n\t\t\t\t? getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\t\t\t\t: getDot(allPointsFromSegments[0], sw)\n\n\t\treturn \n\t}\n\n\toverride toSvg(shape: TLDrawShape, 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 } = shape.props\n\n\t\tconst strokeWidth = STROKE_SIZES[shape.props.size]\n\t\tconst allPointsFromSegments = getPointsFromSegments(shape.props.segments)\n\n\t\tconst showAsComplete = shape.props.isComplete || last(shape.props.segments)?.type === 'straight'\n\n\t\tlet sw = strokeWidth\n\t\tif (!shape.props.isPen && shape.props.dash === 'draw' && allPointsFromSegments.length === 1) {\n\t\t\tsw += rng(shape.id)() * (strokeWidth / 6)\n\t\t}\n\n\t\tconst options = getFreehandOptions(shape.props, sw, showAsComplete, false)\n\t\tconst strokePoints = getStrokePoints(allPointsFromSegments, options)\n\t\tconst solidStrokePath =\n\t\t\tstrokePoints.length > 1\n\t\t\t\t? getSvgPathFromStrokePoints(strokePoints, shape.props.isClosed)\n\t\t\t\t: getDot(allPointsFromSegments[0], sw)\n\n\t\tlet foregroundPath: SVGPathElement | undefined\n\n\t\tif (shape.props.dash === 'draw' || strokePoints.length < 2) {\n\t\t\tsetStrokePointRadii(strokePoints, options)\n\t\t\tconst strokeOutlinePoints = getStrokeOutlinePoints(strokePoints, options)\n\n\t\t\tconst p = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\t\t\tp.setAttribute('d', getSvgPathFromPoints(strokeOutlinePoints, true))\n\t\t\tp.setAttribute('fill', theme[color].solid)\n\t\t\tp.setAttribute('stroke-linecap', 'round')\n\n\t\t\tforegroundPath = p\n\t\t} else {\n\t\t\tconst p = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\t\t\tp.setAttribute('d', solidStrokePath)\n\t\t\tp.setAttribute('stroke', theme[color].solid)\n\t\t\tp.setAttribute('fill', 'none')\n\t\t\tp.setAttribute('stroke-linecap', 'round')\n\t\t\tp.setAttribute('stroke-width', strokeWidth.toString())\n\t\t\tp.setAttribute('stroke-dasharray', getDrawShapeStrokeDashArray(shape, strokeWidth))\n\t\t\tp.setAttribute('stroke-dashoffset', '0')\n\n\t\t\tforegroundPath = p\n\t\t}\n\n\t\tconst fillPath = getShapeFillSvg({\n\t\t\tfill: shape.props.isClosed ? shape.props.fill : 'none',\n\t\t\td: solidStrokePath,\n\t\t\tcolor: shape.props.color,\n\t\t\ttheme,\n\t\t})\n\n\t\tif (fillPath) {\n\t\t\tconst g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\t\t\tg.appendChild(fillPath)\n\t\t\tg.appendChild(foregroundPath)\n\t\t\treturn g\n\t\t}\n\n\t\treturn foregroundPath\n\t}\n\n\toverride getCanvasSvgDefs(): TLShapeUtilCanvasSvgDef[] {\n\t\treturn [getFillDefForCanvas()]\n\t}\n\n\toverride onResize: TLOnResizeHandler = (shape, info) => {\n\t\tconst { scaleX, scaleY } = info\n\n\t\tconst newSegments: TLDrawShapeSegment[] = []\n\n\t\tfor (const segment of shape.props.segments) {\n\t\t\tnewSegments.push({\n\t\t\t\t...segment,\n\t\t\t\tpoints: segment.points.map(({ x, y, z }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: toFixed(scaleX * x),\n\t\t\t\t\t\ty: toFixed(scaleY * y),\n\t\t\t\t\t\tz,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t})\n\t\t}\n\n\t\treturn {\n\t\t\tprops: {\n\t\t\t\tsegments: newSegments,\n\t\t\t},\n\t\t}\n\t}\n\n\toverride expandSelectionOutlinePx(shape: TLDrawShape): number {\n\t\tconst multiplier = shape.props.dash === 'draw' ? 1.6 : 1\n\t\treturn (STROKE_SIZES[shape.props.size] * multiplier) / 2\n\t}\n}\n\nfunction getDot(point: VecLike, sw: number) {\n\tconst r = (sw + 1) * 0.5\n\treturn `M ${point.x} ${point.y} m -${r}, 0 a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 -${\n\t\tr * 2\n\t},0`\n}\n\nfunction getIsDot(shape: TLDrawShape) {\n\treturn shape.props.segments.length === 1 && shape.props.segments[0].points.length < 2\n}\n"], "mappings": "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", "names": [] }