{ "version": 3, "sources": ["../../../../src/lib/shapes/note/NoteShapeUtil.tsx"], "sourcesContent": ["import {\n\tDefaultFontFamilies,\n\tEditor,\n\tRectangle2d,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLNoteShape,\n\tTLOnEditEndHandler,\n\tgetDefaultColorTheme,\n\tnoteShapeMigrations,\n\tnoteShapeProps,\n\ttoDomPrecision,\n} from '@tldraw/editor'\nimport { HyperlinkButton } from '../shared/HyperlinkButton'\nimport { useDefaultColorTheme } from '../shared/ShapeFill'\nimport { TextLabel } from '../shared/TextLabel'\nimport { FONT_FAMILIES, LABEL_FONT_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'\nimport { getFontDefForExport } from '../shared/defaultStyleDefs'\nimport { getTextLabelSvgElement } from '../shared/getTextLabelSvgElement'\n\nconst NOTE_SIZE = 200\n\n/** @public */\nexport class NoteShapeUtil extends ShapeUtil {\n\tstatic override type = 'note' as const\n\tstatic override props = noteShapeProps\n\tstatic override migrations = noteShapeMigrations\n\n\toverride canEdit = () => true\n\toverride hideResizeHandles = () => true\n\toverride hideSelectionBoundsFg = () => true\n\n\tgetDefaultProps(): TLNoteShape['props'] {\n\t\treturn {\n\t\t\tcolor: 'black',\n\t\t\tsize: 'm',\n\t\t\ttext: '',\n\t\t\tfont: 'draw',\n\t\t\talign: 'middle',\n\t\t\tverticalAlign: 'middle',\n\t\t\tgrowY: 0,\n\t\t\turl: '',\n\t\t}\n\t}\n\n\tgetHeight(shape: TLNoteShape) {\n\t\treturn NOTE_SIZE + shape.props.growY\n\t}\n\n\tgetGeometry(shape: TLNoteShape) {\n\t\tconst height = this.getHeight(shape)\n\t\treturn new Rectangle2d({ width: NOTE_SIZE, height, isFilled: true })\n\t}\n\n\tcomponent(shape: TLNoteShape) {\n\t\tconst {\n\t\t\tid,\n\t\t\ttype,\n\t\t\tprops: { color, font, size, align, text, verticalAlign },\n\t\t} = shape\n\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst theme = useDefaultColorTheme()\n\t\tconst adjustedColor = color === 'black' ? 'yellow' : color\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
\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\n\t\t\t\t{'url' in shape.props && shape.props.url && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t)\n\t}\n\n\tindicator(shape: TLNoteShape) {\n\t\treturn (\n\t\t\t\n\t\t)\n\t}\n\n\toverride toSvg(shape: TLNoteShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFontDefForExport(shape.props.font))\n\t\tconst theme = getDefaultColorTheme({ isDarkMode: this.editor.user.isDarkMode })\n\t\tconst bounds = this.editor.getShapeGeometry(shape).bounds\n\n\t\tconst g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n\t\tconst adjustedColor = shape.props.color === 'black' ? 'yellow' : shape.props.color\n\n\t\tconst rect1 = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n\t\trect1.setAttribute('rx', '10')\n\t\trect1.setAttribute('width', NOTE_SIZE.toString())\n\t\trect1.setAttribute('height', bounds.height.toString())\n\t\trect1.setAttribute('fill', theme[adjustedColor].solid)\n\t\trect1.setAttribute('stroke', theme[adjustedColor].solid)\n\t\trect1.setAttribute('stroke-width', '1')\n\t\tg.appendChild(rect1)\n\n\t\tconst rect2 = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n\t\trect2.setAttribute('rx', '10')\n\t\trect2.setAttribute('width', NOTE_SIZE.toString())\n\t\trect2.setAttribute('height', bounds.height.toString())\n\t\trect2.setAttribute('fill', theme.background)\n\t\trect2.setAttribute('opacity', '.28')\n\t\tg.appendChild(rect2)\n\n\t\tconst textElm = getTextLabelSvgElement({\n\t\t\teditor: this.editor,\n\t\t\tshape,\n\t\t\tfont: DefaultFontFamilies[shape.props.font],\n\t\t\tbounds,\n\t\t})\n\n\t\ttextElm.setAttribute('fill', theme.text)\n\t\ttextElm.setAttribute('stroke', 'none')\n\t\tg.appendChild(textElm)\n\n\t\treturn g\n\t}\n\n\toverride onBeforeCreate = (next: TLNoteShape) => {\n\t\treturn getGrowY(this.editor, next, next.props.growY)\n\t}\n\n\toverride onBeforeUpdate = (prev: TLNoteShape, next: TLNoteShape) => {\n\t\tif (\n\t\t\tprev.props.text === next.props.text &&\n\t\t\tprev.props.font === next.props.font &&\n\t\t\tprev.props.size === next.props.size\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\treturn getGrowY(this.editor, next, prev.props.growY)\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\nfunction getGrowY(editor: Editor, shape: TLNoteShape, prevGrowY = 0) {\n\tconst PADDING = 17\n\n\tconst nextTextSize = editor.textMeasure.measureText(shape.props.text, {\n\t\t...TEXT_PROPS,\n\t\tfontFamily: FONT_FAMILIES[shape.props.font],\n\t\tfontSize: LABEL_FONT_SIZES[shape.props.size],\n\t\tmaxWidth: NOTE_SIZE - PADDING * 2,\n\t})\n\n\tconst nextHeight = nextTextSize.h + PADDING * 2\n\n\tlet growY: number | null = null\n\n\tif (nextHeight > NOTE_SIZE) {\n\t\tgrowY = nextHeight - NOTE_SIZE\n\t} else {\n\t\tif (prevGrowY) {\n\t\t\tgrowY = 0\n\t\t}\n\t}\n\n\tif (growY !== null) {\n\t\treturn {\n\t\t\t...shape,\n\t\t\tprops: {\n\t\t\t\t...shape.props,\n\t\t\t\tgrowY,\n\t\t\t},\n\t\t}\n\t}\n}\n"], "mappings": "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", "names": [] }