| 
					
				 | 
			
			
				@@ -99,6 +99,7 @@ import { mutateElement, newElementWith } from "../element/mutateElement"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { invalidateShapeForElement } from "../renderer/renderElement"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { unstable_batchedUpdates } from "react-dom"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { SceneStateCallbackRemover } from "../scene/globalScene"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { rescalePoints } from "../points"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function withBatchedUpdates< 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   TFunction extends ((event: any) => void) | (() => void) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1801,89 +1802,68 @@ export class App extends React.Component<any, AppState> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             case "n": { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              let points; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              if (element.points.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const len = element.points.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                points = [...element.points].sort((a, b) => a[1] - b[1]) as [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ][]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (let i = 1; i < points.length; ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  const pnt = points[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  pnt[1] -= deltaY / (len - i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const height = element.height - deltaY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if (height <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               mutateElement(element, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                height: element.height - deltaY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                height, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 y: element.y + deltaY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                points, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                points: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  element.points.length > 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ? rescalePoints(1, height, element.points) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    : undefined, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             case "w": { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              let points; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              if (element.points.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const len = element.points.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                points = [...element.points].sort((a, b) => a[0] - b[0]) as [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ][]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (let i = 0; i < points.length; ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  const pnt = points[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  pnt[0] -= deltaX / (len - i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const width = element.width - deltaX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if (width <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // Someday we should implement logic to flip the shape. But for now, just stop. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               mutateElement(element, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                width: element.width - deltaX, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                width, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 x: element.x + deltaX, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                points, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                points: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  element.points.length > 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ? rescalePoints(0, width, element.points) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    : undefined, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             case "s": { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              let points; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              if (element.points.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const len = element.points.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                points = [...element.points].sort((a, b) => a[1] - b[1]) as [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ][]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (let i = 1; i < points.length; ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  const pnt = points[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  pnt[1] += deltaY / (len - i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const height = element.height + deltaY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if (height <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               mutateElement(element, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                height: element.height + deltaY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                points, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                height, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                points: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  element.points.length > 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ? rescalePoints(1, height, element.points) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    : undefined, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             case "e": { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              let points; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              if (element.points.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const len = element.points.length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                points = [...element.points].sort((a, b) => a[0] - b[0]) as [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ][]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (let i = 1; i < points.length; ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  const pnt = points[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  pnt[0] += deltaX / (len - i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const width = element.width + deltaX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if (width <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               mutateElement(element, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                width: element.width + deltaX, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                points, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                width, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                points: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  element.points.length > 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ? rescalePoints(0, width, element.points) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    : undefined, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 |