{
  "version": 3,
  "sources": ["../../../src/lib/editor/getSvgJsx.tsx"],
  "sourcesContent": ["import {\n\tTLFrameShape,\n\tTLGroupShape,\n\tTLShape,\n\tTLShapeId,\n\tgetDefaultColorTheme,\n} from '@tldraw/tlschema'\nimport { Fragment, ReactElement } from 'react'\nimport { Editor } from './Editor'\nimport { SvgExportContext, SvgExportContextProvider, SvgExportDef } from './types/SvgExportContext'\nimport { TLSvgOptions } from './types/misc-types'\n\nexport async function getSvgJsx(\n\teditor: Editor,\n\tshapes: TLShapeId[] | TLShape[],\n\topts: TLSvgOptions = {}\n) {\n\tconst ids =\n\t\ttypeof shapes[0] === 'string' ? (shapes as TLShapeId[]) : (shapes as TLShape[]).map((s) => s.id)\n\n\tif (ids.length === 0) return\n\tif (!window.document) throw Error('No document')\n\n\tconst {\n\t\tscale = 1,\n\t\tbackground = false,\n\t\tpadding = editor.options.defaultSvgPadding,\n\t\tpreserveAspectRatio = false,\n\t} = opts\n\n\tconst isDarkMode = opts.darkMode ?? editor.user.getIsDarkMode()\n\tconst theme = getDefaultColorTheme({ isDarkMode })\n\n\t// ---Figure out which shapes we need to include\n\tconst shapeIdsToInclude = editor.getShapeAndDescendantIds(ids)\n\tconst renderingShapes = editor\n\t\t.getUnorderedRenderingShapes(false)\n\t\t.filter(({ id }) => shapeIdsToInclude.has(id))\n\n\t// --- Common bounding box of all shapes\n\tlet bbox = null\n\tif (opts.bounds) {\n\t\tbbox = opts.bounds\n\t} else {\n\t\tfor (const { id } of renderingShapes) {\n\t\t\tconst maskedPageBounds = editor.getShapeMaskedPageBounds(id)\n\t\t\tif (!maskedPageBounds) continue\n\t\t\tif (bbox) {\n\t\t\t\tbbox.union(maskedPageBounds)\n\t\t\t} else {\n\t\t\t\tbbox = maskedPageBounds.clone()\n\t\t\t}\n\t\t}\n\t}\n\n\t// no unmasked shapes to export\n\tif (!bbox) return\n\n\tconst singleFrameShapeId =\n\t\tids.length === 1 && editor.isShapeOfType<TLFrameShape>(editor.getShape(ids[0])!, 'frame')\n\t\t\t? ids[0]\n\t\t\t: null\n\tif (!singleFrameShapeId) {\n\t\t// Expand by an extra 32 pixels\n\t\tbbox.expandBy(padding)\n\t}\n\n\t// We want the svg image to be BIGGER THAN USUAL to account for image quality\n\tconst w = bbox.width * scale\n\tconst h = bbox.height * scale\n\n\ttry {\n\t\tdocument.body.focus?.() // weird but necessary\n\t} catch (e) {\n\t\t// not implemented\n\t}\n\n\tconst defChildren: ReactElement[] = []\n\n\tconst exportDefPromisesById = new Map<string, Promise<void>>()\n\tconst exportContext: SvgExportContext = {\n\t\tisDarkMode,\n\t\taddExportDef: (def: SvgExportDef) => {\n\t\t\tif (exportDefPromisesById.has(def.key)) return\n\t\t\tconst promise = (async () => {\n\t\t\t\tconst element = await def.getElement()\n\t\t\t\tif (!element) return\n\n\t\t\t\tdefChildren.push(<Fragment key={defChildren.length}>{element}</Fragment>)\n\t\t\t})()\n\t\t\texportDefPromisesById.set(def.key, promise)\n\t\t},\n\t}\n\n\tconst unorderedShapeElements = (\n\t\tawait Promise.all(\n\t\t\trenderingShapes.map(async ({ id, opacity, index, backgroundIndex }) => {\n\t\t\t\t// Don't render the frame if we're only exporting a single frame\n\t\t\t\tif (id === singleFrameShapeId) return []\n\n\t\t\t\tconst shape = editor.getShape(id)!\n\n\t\t\t\tif (editor.isShapeOfType<TLGroupShape>(shape, 'group')) return []\n\n\t\t\t\tconst util = editor.getShapeUtil(shape)\n\n\t\t\t\tlet toSvgResult = await util.toSvg?.(shape, exportContext)\n\t\t\t\tlet toBackgroundSvgResult = await util.toBackgroundSvg?.(shape, exportContext)\n\n\t\t\t\tif (!toSvgResult && !toBackgroundSvgResult) {\n\t\t\t\t\tconst bounds = editor.getShapePageBounds(shape)!\n\t\t\t\t\ttoSvgResult = (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\twidth={bounds.w}\n\t\t\t\t\t\t\theight={bounds.h}\n\t\t\t\t\t\t\tfill={theme.solid}\n\t\t\t\t\t\t\tstroke={theme.grey.pattern}\n\t\t\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tlet pageTransform = editor.getShapePageTransform(shape)!.toCssString()\n\t\t\t\tif ('scale' in shape.props) {\n\t\t\t\t\tif (shape.props.scale !== 1) {\n\t\t\t\t\t\tpageTransform = `${pageTransform} scale(${shape.props.scale}, ${shape.props.scale})`\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (toSvgResult) {\n\t\t\t\t\ttoSvgResult = (\n\t\t\t\t\t\t<g key={shape.id} transform={pageTransform} opacity={opacity}>\n\t\t\t\t\t\t\t{toSvgResult}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (toBackgroundSvgResult) {\n\t\t\t\t\ttoBackgroundSvgResult = (\n\t\t\t\t\t\t<g key={`bg_${shape.id}`} transform={pageTransform} opacity={opacity}>\n\t\t\t\t\t\t\t{toBackgroundSvgResult}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\t// Create svg mask if shape has a frame as parent\n\t\t\t\tconst pageMask = editor.getShapeMask(shape.id)\n\t\t\t\tif (pageMask) {\n\t\t\t\t\t// Create a clip path and add it to defs\n\t\t\t\t\tconst pageMaskId = `mask_${shape.id.replace(':', '_')}`\n\t\t\t\t\tdefChildren.push(\n\t\t\t\t\t\t<clipPath key={defChildren.length} id={pageMaskId}>\n\t\t\t\t\t\t\t{/* Create a polyline mask that does the clipping */}\n\t\t\t\t\t\t\t<path d={`M${pageMask.map(({ x, y }) => `${x},${y}`).join('L')}Z`} />\n\t\t\t\t\t\t</clipPath>\n\t\t\t\t\t)\n\n\t\t\t\t\tif (toSvgResult) {\n\t\t\t\t\t\ttoSvgResult = (\n\t\t\t\t\t\t\t<g key={shape.id} clipPath={`url(#${pageMaskId})`}>\n\t\t\t\t\t\t\t\t{toSvgResult}\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tif (toBackgroundSvgResult) {\n\t\t\t\t\t\ttoBackgroundSvgResult = (\n\t\t\t\t\t\t\t<g key={`bg_${shape.id}`} clipPath={`url(#${pageMaskId})`}>\n\t\t\t\t\t\t\t\t{toBackgroundSvgResult}\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst elements = []\n\t\t\t\tif (toSvgResult) {\n\t\t\t\t\telements.push({ zIndex: index, element: toSvgResult })\n\t\t\t\t}\n\t\t\t\tif (toBackgroundSvgResult) {\n\t\t\t\t\telements.push({ zIndex: backgroundIndex, element: toBackgroundSvgResult })\n\t\t\t\t}\n\n\t\t\t\treturn elements\n\t\t\t})\n\t\t)\n\t).flat()\n\n\tawait Promise.all(exportDefPromisesById.values())\n\n\tconst svg = (\n\t\t<SvgExportContextProvider editor={editor} context={exportContext}>\n\t\t\t<svg\n\t\t\t\tpreserveAspectRatio={preserveAspectRatio ? preserveAspectRatio : undefined}\n\t\t\t\tdirection=\"ltr\"\n\t\t\t\twidth={w}\n\t\t\t\theight={h}\n\t\t\t\tviewBox={`${bbox.minX} ${bbox.minY} ${bbox.width} ${bbox.height}`}\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackgroundColor: background\n\t\t\t\t\t\t? singleFrameShapeId\n\t\t\t\t\t\t\t? theme.solid\n\t\t\t\t\t\t\t: theme.background\n\t\t\t\t\t\t: 'transparent',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<defs>{defChildren}</defs>\n\t\t\t\t{unorderedShapeElements.sort((a, b) => a.zIndex - b.zIndex).map(({ element }) => element)}\n\t\t\t</svg>\n\t\t</SvgExportContextProvider>\n\t)\n\n\treturn { jsx: svg, width: w, height: h }\n}\n"],
  "mappings": "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",
  "names": []
}
