| 
					
				 | 
			
			
				@@ -14,13 +14,7 @@ import { Drawable, Options } from "roughjs/bin/core"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { RoughSVG } from "roughjs/bin/svg"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { RoughGenerator } from "roughjs/bin/generator"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { SceneState } from "../scene/types"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  SVG_NS, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  distance, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  getFontString, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  getFontFamilyString, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  isRTL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} from "../utils"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { SVG_NS, distance, getFontString, getFontFamilyString } from "../utils"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { isPathALoop } from "../math"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import rough from "roughjs/bin/rough"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -44,11 +38,6 @@ const generateElementCanvas = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const canvas = document.createElement("canvas"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const context = canvas.getContext("2d")!; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // To be able to draw a nested element with RTL, we have to append it to the DOM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  canvas.style.display = "none"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  canvas.id = "nested-canvas-element"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  document.body.appendChild(canvas); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   let canvasOffsetX = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   let canvasOffsetY = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -111,14 +100,12 @@ const drawElementOnCanvas = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     default: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (isTextElement(element)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        context.canvas.setAttribute("dir", isRTL(element.text) ? "rtl" : "ltr"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const font = context.font; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         context.font = getFontString(element); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const fillStyle = context.fillStyle; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         context.fillStyle = element.strokeColor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const textAlign = context.textAlign; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         context.textAlign = element.textAlign as CanvasTextAlign; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // Canvas does not support multiline text by default 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const lines = element.text.replace(/\r\n?/g, "\n").split("\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const lineHeight = element.height / lines.length; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -132,7 +119,7 @@ const drawElementOnCanvas = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (let i = 0; i < lines.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           context.fillText( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             lines[i], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            horizontalOffset, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            0 + horizontalOffset, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             (i + 1) * lineHeight - verticalOffset, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -355,12 +342,6 @@ const drawElementFromCanvas = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   context.rotate(-element.angle); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   context.translate(-cx, -cy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   context.scale(window.devicePixelRatio, window.devicePixelRatio); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Clear the nested element we appended to the DOM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const node = document.querySelector("#nested-canvas-element"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (node && node.parentNode) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    node.parentNode.removeChild(node); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 export const renderElement = ( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -394,12 +375,9 @@ export const renderElement = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     case "draw": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     case "arrow": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     case "text": { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const elementWithCanvas = generateElement(element, generator, sceneState); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (renderOptimizations) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const elementWithCanvas = generateElement( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          element, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          generator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          sceneState, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         drawElementFromCanvas(elementWithCanvas, rc, context, sceneState); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const [x1, y1, x2, y2] = getElementAbsoluteCoords(element); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -509,14 +487,17 @@ export const renderElementToSvg = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const lineHeight = element.height / lines.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const verticalOffset = element.height - element.baseline; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const horizontalOffset = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          element.textAlign === "center" ? element.width / 2 : element.width; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          element.textAlign === "center" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ? element.width / 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            : element.textAlign === "right" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ? element.width 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            : 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const textAnchor = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           element.textAlign === "center" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ? "middle" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             : element.textAlign === "right" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ? "end" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             : "start"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const direction = isRTL(element.text) ? "rtl" : "ltr"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (let i = 0; i < lines.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           const text = svgRoot.ownerDocument!.createElementNS(SVG_NS, "text"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           text.textContent = lines[i]; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -527,7 +508,6 @@ export const renderElementToSvg = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           text.setAttribute("fill", element.strokeColor); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           text.setAttribute("text-anchor", textAnchor); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           text.setAttribute("style", "white-space: pre;"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          text.setAttribute("direction", direction); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           node.appendChild(text); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         svgRoot.appendChild(node); 
			 |