{ "version": 3, "sources": ["../../../../src/lib/shapes/text/TextShapeUtil.tsx"], "sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n\tDefaultFontFamilies,\n\tEditor,\n\tHTMLContainer,\n\tRectangle2d,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLOnEditEndHandler,\n\tTLOnResizeHandler,\n\tTLShapeUtilFlag,\n\tTLTextShape,\n\tVec2d,\n\tWeakMapCache,\n\tgetDefaultColorTheme,\n\tstopEventPropagation,\n\ttextShapeMigrations,\n\ttextShapeProps,\n\ttoDomPrecision,\n} from '@tldraw/editor'\nimport { createTextSvgElementFromSpans } from '../shared/createTextSvgElementFromSpans'\nimport { FONT_FAMILIES, FONT_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'\nimport { getFontDefForExport } from '../shared/defaultStyleDefs'\nimport { resizeScaled } from '../shared/resizeScaled'\nimport { useEditableText } from '../shared/useEditableText'\n\nconst sizeCache = new WeakMapCache()\n\n/** @public */\nexport class TextShapeUtil extends ShapeUtil {\n\tstatic override type = 'text' as const\n\tstatic override props = textShapeProps\n\tstatic override migrations = textShapeMigrations\n\n\tgetDefaultProps(): TLTextShape['props'] {\n\t\treturn {\n\t\t\tcolor: 'black',\n\t\t\tsize: 'm',\n\t\t\tw: 8,\n\t\t\ttext: '',\n\t\t\tfont: 'draw',\n\t\t\talign: 'middle',\n\t\t\tautoSize: true,\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetMinDimensions(shape: TLTextShape) {\n\t\treturn sizeCache.get(shape.props, (props) => getTextSize(this.editor, props))\n\t}\n\n\tgetGeometry(shape: TLTextShape) {\n\t\tconst { scale } = shape.props\n\t\tconst { width, height } = this.getMinDimensions(shape)!\n\t\treturn new Rectangle2d({\n\t\t\twidth: width * scale,\n\t\t\theight: height * scale,\n\t\t\tisFilled: true,\n\t\t})\n\t}\n\n\toverride canEdit = () => true\n\n\toverride isAspectRatioLocked: TLShapeUtilFlag = () => true\n\n\tcomponent(shape: TLTextShape) {\n\t\tconst {\n\t\t\tid,\n\t\t\ttype,\n\t\t\tprops: { text, color },\n\t\t} = shape\n\n\t\tconst theme = getDefaultColorTheme({ isDarkMode: this.editor.user.isDarkMode })\n\t\tconst { width, height } = this.getMinDimensions(shape)\n\n\t\tconst {\n\t\t\trInput,\n\t\t\tisEmpty,\n\t\t\tisEditing,\n\t\t\thandleFocus,\n\t\t\thandleChange,\n\t\t\thandleKeyDown,\n\t\t\thandleBlur,\n\t\t\thandleInputPointerDown,\n\t\t\thandleDoubleClick,\n\t\t} = useEditableText(id, type, text)\n\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t{text}\n\t\t\t\t\t
\n\t\t\t\t\t{isEditing ? (\n\t\t\t\t\t\t\n\t\t\t\t\t) : null}\n\t\t\t\t\n\t\t\t
\n\t\t)\n\t}\n\n\tindicator(shape: TLTextShape) {\n\t\tconst bounds = this.editor.getShapeGeometry(shape).bounds\n\t\treturn \n\t}\n\n\toverride toSvg(shape: TLTextShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFontDefForExport(shape.props.font))\n\n\t\tconst theme = getDefaultColorTheme({ isDarkMode: this.editor.user.isDarkMode })\n\t\tconst bounds = this.editor.getShapeGeometry(shape).bounds\n\t\tconst text = shape.props.text\n\n\t\tconst width = bounds.width / (shape.props.scale ?? 1)\n\t\tconst height = bounds.height / (shape.props.scale ?? 1)\n\n\t\tconst opts = {\n\t\t\tfontSize: FONT_SIZES[shape.props.size],\n\t\t\tfontFamily: DefaultFontFamilies[shape.props.font],\n\t\t\ttextAlign: shape.props.align,\n\t\t\tverticalTextAlign: 'middle' as const,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tpadding: 0, // no padding?\n\t\t\tlineHeight: TEXT_PROPS.lineHeight,\n\t\t\tfontStyle: 'normal',\n\t\t\tfontWeight: 'normal',\n\t\t\toverflow: 'wrap' as const,\n\t\t}\n\n\t\tconst color = theme[shape.props.color].solid\n\t\tconst groupEl = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n\t\tconst textBgEl = createTextSvgElementFromSpans(\n\t\t\tthis.editor,\n\t\t\tthis.editor.textMeasure.measureTextSpans(text, opts),\n\t\t\t{\n\t\t\t\t...opts,\n\t\t\t\tstroke: theme.background,\n\t\t\t\tstrokeWidth: 2,\n\t\t\t\tfill: theme.background,\n\t\t\t\tpadding: 0,\n\t\t\t}\n\t\t)\n\n\t\tconst textElm = textBgEl.cloneNode(true) as SVGTextElement\n\t\ttextElm.setAttribute('fill', color)\n\t\ttextElm.setAttribute('stroke', 'none')\n\n\t\tgroupEl.append(textBgEl)\n\t\tgroupEl.append(textElm)\n\n\t\treturn groupEl\n\t}\n\n\toverride onResize: TLOnResizeHandler = (shape, info) => {\n\t\tconst { initialBounds, initialShape, scaleX, handle } = info\n\n\t\tif (info.mode === 'scale_shape' || (handle !== 'right' && handle !== 'left')) {\n\t\t\treturn {\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\t...resizeScaled(shape, info),\n\t\t\t}\n\t\t} else {\n\t\t\tconst prevWidth = initialBounds.width\n\t\t\tlet nextWidth = prevWidth * scaleX\n\n\t\t\tconst offset = new Vec2d(0, 0)\n\n\t\t\tnextWidth = Math.max(1, Math.abs(nextWidth))\n\n\t\t\tif (handle === 'left') {\n\t\t\t\toffset.x = prevWidth - nextWidth\n\t\t\t\tif (scaleX < 0) {\n\t\t\t\t\toffset.x += nextWidth\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (scaleX < 0) {\n\t\t\t\t\toffset.x -= nextWidth\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { x, y } = offset.rot(shape.rotation).add(initialShape)\n\n\t\t\treturn {\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tprops: {\n\t\t\t\t\tw: nextWidth / initialShape.props.scale,\n\t\t\t\t\tautoSize: false,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onBeforeCreate = (shape: TLTextShape) => {\n\t\t// When a shape is created, center the text at the created point.\n\n\t\t// Only center if the shape is set to autosize.\n\t\tif (!shape.props.autoSize) return\n\n\t\t// Only center if the shape is empty when created.\n\t\tif (shape.props.text.trim()) return\n\n\t\tconst bounds = this.getMinDimensions(shape)\n\n\t\treturn {\n\t\t\t...shape,\n\t\t\tx: shape.x - bounds.width / 2,\n\t\t\ty: shape.y - bounds.height / 2,\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\tconst trimmedText = shape.props.text.trimEnd()\n\n\t\tif (trimmedText.length === 0) {\n\t\t\tthis.editor.deleteShapes([shape.id])\n\t\t} else {\n\t\t\tif (trimmedText !== shape.props.text) {\n\t\t\t\tthis.editor.updateShapes([\n\t\t\t\t\t{\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\ttext: text.trimEnd(),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t])\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onBeforeUpdate = (prev: TLTextShape, next: TLTextShape) => {\n\t\tif (!next.props.autoSize) return\n\n\t\tconst styleDidChange =\n\t\t\tprev.props.size !== next.props.size ||\n\t\t\tprev.props.align !== next.props.align ||\n\t\t\tprev.props.font !== next.props.font ||\n\t\t\t(prev.props.scale !== 1 && next.props.scale === 1)\n\n\t\tconst textDidChange = prev.props.text !== next.props.text\n\n\t\t// Only update position if either changed\n\t\tif (!styleDidChange && !textDidChange) return\n\n\t\t// Might return a cached value for the bounds\n\t\tconst boundsA = this.getMinDimensions(prev)\n\n\t\t// Will always be a fresh call to getTextSize\n\t\tconst boundsB = getTextSize(this.editor, next.props)\n\n\t\tconst wA = boundsA.width * prev.props.scale\n\t\tconst hA = boundsA.height * prev.props.scale\n\t\tconst wB = boundsB.width * next.props.scale\n\t\tconst hB = boundsB.height * next.props.scale\n\n\t\tlet delta: Vec2d | undefined\n\n\t\tswitch (next.props.align) {\n\t\t\tcase 'middle': {\n\t\t\t\tdelta = new Vec2d((wB - wA) / 2, textDidChange ? 0 : (hB - hA) / 2)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'end': {\n\t\t\t\tdelta = new Vec2d(wB - wA, textDidChange ? 0 : (hB - hA) / 2)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (textDidChange) break\n\t\t\t\tdelta = new Vec2d(0, (hB - hA) / 2)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (delta) {\n\t\t\t// account for shape rotation when writing text:\n\t\t\tdelta.rot(next.rotation)\n\t\t\tconst { x, y } = next\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tx: x - delta.x,\n\t\t\t\ty: y - delta.y,\n\t\t\t\tprops: { ...next.props, w: wB },\n\t\t\t}\n\t\t} else {\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: { ...next.props, w: wB },\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onDoubleClickEdge = (shape: TLTextShape) => {\n\t\t// If the shape has a fixed width, set it to autoSize.\n\t\tif (!shape.props.autoSize) {\n\t\t\treturn {\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: {\n\t\t\t\t\tautoSize: true,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\t// If the shape is scaled, reset the scale to 1.\n\t\tif (shape.props.scale !== 1) {\n\t\t\treturn {\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: {\n\t\t\t\t\tscale: 1,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction getTextSize(editor: Editor, props: TLTextShape['props']) {\n\tconst { font, text, autoSize, size, w } = props\n\n\tconst minWidth = autoSize ? 16 : Math.max(16, w)\n\tconst fontSize = FONT_SIZES[size]\n\n\tconst cw = autoSize\n\t\t? null\n\t\t: // `measureText` floors the number so we need to do the same here to avoid issues.\n\t\t Math.floor(Math.max(minWidth, w))\n\n\tconst result = editor.textMeasure.measureText(text, {\n\t\t...TEXT_PROPS,\n\t\tfontFamily: FONT_FAMILIES[font],\n\t\tfontSize: fontSize,\n\t\tmaxWidth: cw,\n\t})\n\n\t// // If we're autosizing the measureText will essentially `Math.floor`\n\t// // the numbers so `19` rather than `19.3`, this means we must +1 to\n\t// // whatever we get to avoid wrapping.\n\tif (autoSize) {\n\t\tresult.w += 1\n\t}\n\n\treturn {\n\t\twidth: Math.max(minWidth, result.w),\n\t\theight: Math.max(fontSize, result.h),\n\t}\n}\n"], "mappings": "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", "names": [] }