drawfn 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts","../src/renderer.ts","../src/history.ts","../src/tools/base-tool.ts","../src/geometry.ts","../src/tools/select-tool.ts","../src/tools/pan-tool.ts","../src/tools/pen-tool.ts","../src/tools/rectangle-tool.ts","../src/tools/ellipse-tool.ts","../src/tools/arrow-tool.ts","../src/tools/text-tool.ts","../src/tools/image-tool.ts","../src/tools/node-tool.ts","../src/tools/tool-manager.ts","../src/drawfn.ts"],"names":["getStroke"],"mappings":"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","file":"index.js","sourcesContent":["import type { Point, Bounds, Element, Camera } from './types';\n\nexport function generateId(): string {\n return `e_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\nexport function screenToCanvas(\n screenPoint: Point,\n camera: Camera,\n canvas: HTMLCanvasElement\n): Point {\n const rect = canvas.getBoundingClientRect();\n const x = (screenPoint.x - rect.left - camera.x) / camera.zoom;\n const y = (screenPoint.y - rect.top - camera.y) / camera.zoom;\n return { x, y };\n}\n\nexport function canvasToScreen(\n canvasPoint: Point,\n camera: Camera\n): Point {\n return {\n x: canvasPoint.x * camera.zoom + camera.x,\n y: canvasPoint.y * camera.zoom + camera.y,\n };\n}\n\nexport function getElementBounds(element: Element): Bounds {\n return {\n x: element.x,\n y: element.y,\n w: element.w,\n h: element.h,\n };\n}\n\nexport function isPointInBounds(point: Point, bounds: Bounds): boolean {\n return (\n point.x >= bounds.x &&\n point.x <= bounds.x + bounds.w &&\n point.y >= bounds.y &&\n point.y <= bounds.y + bounds.h\n );\n}\n\nexport function boundsIntersect(a: Bounds, b: Bounds): boolean {\n return !(\n a.x + a.w < b.x ||\n b.x + b.w < a.x ||\n a.y + a.h < b.y ||\n b.y + b.h < a.y\n );\n}\n\nexport function getViewportBounds(\n camera: Camera,\n canvas: HTMLCanvasElement\n): Bounds {\n const w = canvas.width / camera.zoom;\n const h = canvas.height / camera.zoom;\n return {\n x: -camera.x / camera.zoom,\n y: -camera.y / camera.zoom,\n w,\n h,\n };\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function distance(a: Point, b: Point): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function rotatePoint(point: Point, center: Point, angle: number): Point {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const dx = point.x - center.x;\n const dy = point.y - center.y;\n return {\n x: center.x + dx * cos - dy * sin,\n y: center.y + dx * sin + dy * cos,\n };\n}\n","import type {\n Element,\n Scene,\n Camera,\n FreeDrawElement,\n TextElement,\n ImageElement,\n ArrowElement,\n NodeElement,\n Point,\n} from \"./types\";\nimport { getStroke } from \"perfect-freehand\";\nimport { getViewportBounds, boundsIntersect, getElementBounds } from \"./utils\";\n\nexport type RenderOptions = {\n selectedIds?: Set<string>;\n hoveredId?: string | null;\n marquee?: { start: Point; current: Point } | null;\n};\n\nexport class Renderer {\n private ctx: CanvasRenderingContext2D;\n private canvas: HTMLCanvasElement;\n private imageCache: Map<string, HTMLImageElement | ImageBitmap> = new Map();\n private getImageBitmap?: (src: string) => Promise<ImageBitmap>;\n\n constructor(\n canvas: HTMLCanvasElement,\n getImageBitmap?: (src: string) => Promise<ImageBitmap>\n ) {\n this.canvas = canvas;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Failed to get 2D context\");\n this.ctx = ctx;\n this.getImageBitmap = getImageBitmap;\n }\n\n render(scene: Scene, options: RenderOptions = {}): void {\n const { camera, background, elements } = scene;\n const { selectedIds = new Set(), hoveredId = null } = options;\n\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n this.ctx.fillStyle = background.color;\n this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n\n if (background.grid) {\n this.renderGrid(camera, background.grid);\n }\n\n this.ctx.save();\n this.ctx.translate(camera.x, camera.y);\n this.ctx.scale(camera.zoom, camera.zoom);\n\n const viewport = getViewportBounds(camera, this.canvas);\n\n for (const element of elements) {\n if (element.locked && !selectedIds.has(element.id)) continue;\n\n const bounds = getElementBounds(element);\n if (!boundsIntersect(viewport, bounds)) continue;\n\n this.renderElement(element);\n\n if (selectedIds.has(element.id)) {\n this.renderSelectionBox(element, camera);\n } else if (hoveredId === element.id) {\n this.renderHoverHighlight(element);\n }\n }\n\n this.ctx.restore();\n\n // Render marquee selection if active\n if (options.marquee) {\n this.renderMarquee(options.marquee, camera);\n }\n }\n\n private renderGrid(\n camera: Camera,\n grid: { size: number; color: string; alpha: number }\n ): void {\n const { size, color, alpha } = grid;\n this.ctx.save();\n\n const startX = Math.floor(-camera.x / camera.zoom / size) * size;\n const startY = Math.floor(-camera.y / camera.zoom / size) * size;\n const endX = startX + this.canvas.width / camera.zoom + size;\n const endY = startY + this.canvas.height / camera.zoom + size;\n\n this.ctx.strokeStyle = color;\n this.ctx.globalAlpha = alpha;\n this.ctx.lineWidth = 1 / camera.zoom;\n\n this.ctx.beginPath();\n for (let x = startX; x < endX; x += size) {\n const screenX = x * camera.zoom + camera.x;\n this.ctx.moveTo(screenX, 0);\n this.ctx.lineTo(screenX, this.canvas.height);\n }\n for (let y = startY; y < endY; y += size) {\n const screenY = y * camera.zoom + camera.y;\n this.ctx.moveTo(0, screenY);\n this.ctx.lineTo(this.canvas.width, screenY);\n }\n this.ctx.stroke();\n\n this.ctx.restore();\n }\n\n private renderElement(element: Element): void {\n this.ctx.save();\n this.ctx.globalAlpha = element.opacity;\n\n if (element.rotation !== 0) {\n const cx = element.x + element.w / 2;\n const cy = element.y + element.h / 2;\n this.ctx.translate(cx, cy);\n this.ctx.rotate(element.rotation);\n this.ctx.translate(-cx, -cy);\n }\n\n switch (element.type) {\n case \"freedraw\":\n this.renderFreedraw(element);\n break;\n case \"rectangle\":\n this.renderRectangle(element);\n break;\n case \"ellipse\":\n this.renderEllipse(element);\n break;\n case \"arrow\":\n this.renderArrow(element);\n break;\n case \"text\":\n this.renderText(element);\n break;\n case \"image\":\n this.renderImage(element);\n break;\n case \"node\":\n this.renderNode(element);\n break;\n }\n\n this.ctx.restore();\n }\n\n private renderFreedraw(element: FreeDrawElement): void {\n if (element.points.length === 0) return;\n\n const options = {\n size: element.style?.size ?? element.strokeWidth * 2,\n thinning: element.style?.thinning ?? 0.5,\n smoothing: element.style?.smoothing ?? 0.5,\n streamline: element.style?.streamline ?? 0.5,\n taperStart: element.style?.taperStart ?? 0,\n taperEnd: element.style?.taperEnd ?? 0,\n simulatePressure: true,\n };\n\n const points = element.points.map((p) => [p[0], p[1], p[2] ?? 0.5]);\n const stroke = getStroke(points, options);\n\n this.ctx.fillStyle = element.stroke;\n this.ctx.beginPath();\n this.ctx.moveTo(stroke[0][0] + element.x, stroke[0][1] + element.y);\n for (let i = 1; i < stroke.length; i++) {\n this.ctx.lineTo(stroke[i][0] + element.x, stroke[i][1] + element.y);\n }\n this.ctx.closePath();\n this.ctx.fill();\n }\n\n private renderRectangle(element: Element): void {\n this.ctx.fillStyle = element.fill;\n this.ctx.strokeStyle = element.stroke;\n this.ctx.lineWidth = element.strokeWidth;\n\n if (element.fill !== \"transparent\") {\n this.ctx.fillRect(element.x, element.y, element.w, element.h);\n }\n if (element.strokeWidth > 0) {\n this.ctx.strokeRect(element.x, element.y, element.w, element.h);\n }\n }\n\n private renderEllipse(element: Element): void {\n this.ctx.fillStyle = element.fill;\n this.ctx.strokeStyle = element.stroke;\n this.ctx.lineWidth = element.strokeWidth;\n\n const cx = element.x + element.w / 2;\n const cy = element.y + element.h / 2;\n const rx = element.w / 2;\n const ry = element.h / 2;\n\n this.ctx.beginPath();\n this.ctx.ellipse(cx, cy, rx, ry, 0, 0, Math.PI * 2);\n\n if (element.fill !== \"transparent\") {\n this.ctx.fill();\n }\n if (element.strokeWidth > 0) {\n this.ctx.stroke();\n }\n }\n\n private renderArrow(element: ArrowElement): void {\n if (element.points.length < 2) return;\n\n this.ctx.strokeStyle = element.stroke;\n this.ctx.fillStyle = element.stroke;\n this.ctx.lineWidth = element.strokeWidth;\n\n this.ctx.beginPath();\n this.ctx.moveTo(\n element.points[0][0] + element.x,\n element.points[0][1] + element.y\n );\n for (let i = 1; i < element.points.length; i++) {\n this.ctx.lineTo(\n element.points[i][0] + element.x,\n element.points[i][1] + element.y\n );\n }\n this.ctx.stroke();\n\n if (element.head === \"triangle\") {\n const last = element.points[element.points.length - 1];\n const prev = element.points[element.points.length - 2];\n const angle = Math.atan2(last[1] - prev[1], last[0] - prev[0]);\n const headLen = 10;\n\n this.ctx.beginPath();\n this.ctx.moveTo(last[0] + element.x, last[1] + element.y);\n this.ctx.lineTo(\n last[0] + element.x - headLen * Math.cos(angle - Math.PI / 6),\n last[1] + element.y - headLen * Math.sin(angle - Math.PI / 6)\n );\n this.ctx.lineTo(\n last[0] + element.x - headLen * Math.cos(angle + Math.PI / 6),\n last[1] + element.y - headLen * Math.sin(angle + Math.PI / 6)\n );\n this.ctx.closePath();\n this.ctx.fill();\n }\n }\n\n private renderText(element: TextElement): void {\n this.ctx.fillStyle = element.fill;\n this.ctx.strokeStyle = element.stroke;\n this.ctx.font = `${element.fontSize}px ${element.fontFamily}`;\n this.ctx.textAlign = element.align;\n\n const x = element.x + (element.align === \"center\" ? element.w / 2 : 0);\n const y = element.y + element.fontSize;\n\n if (element.fill !== \"transparent\") {\n this.ctx.fillText(element.text, x, y);\n }\n if (element.strokeWidth > 0) {\n this.ctx.lineWidth = element.strokeWidth;\n this.ctx.strokeText(element.text, x, y);\n }\n }\n\n private renderImage(element: ImageElement): void {\n const cached = this.imageCache.get(element.src);\n if (cached) {\n this.ctx.drawImage(cached, element.x, element.y, element.w, element.h);\n } else {\n this.loadImage(element.src);\n this.ctx.fillStyle = \"#f3f4f6\";\n this.ctx.fillRect(element.x, element.y, element.w, element.h);\n }\n }\n\n private renderNode(element: NodeElement): void {\n const radius = 8;\n\n this.ctx.fillStyle = element.fill;\n this.ctx.strokeStyle = element.stroke;\n this.ctx.lineWidth = element.strokeWidth;\n\n this.ctx.beginPath();\n this.ctx.roundRect(element.x, element.y, element.w, element.h, radius);\n if (element.fill !== \"transparent\") {\n this.ctx.fill();\n }\n if (element.strokeWidth > 0) {\n this.ctx.stroke();\n }\n\n if (element.preview?.title) {\n this.ctx.fillStyle = element.stroke;\n this.ctx.font = \"14px sans-serif\";\n this.ctx.textAlign = \"left\";\n this.ctx.fillText(element.preview.title, element.x + 12, element.y + 24);\n }\n }\n\n private renderSelectionBox(element: Element, camera: Camera): void {\n // Normalize sizes by zoom for consistent appearance\n const strokeWidth = 2 / camera.zoom;\n const dashPattern = 4 / camera.zoom;\n const handleSize = 6 / camera.zoom;\n const padding = 2 / camera.zoom;\n const rotateHandleDistance = 20 / camera.zoom;\n const rotateHandleRadius = 4 / camera.zoom;\n\n this.ctx.strokeStyle = \"#3b82f6\";\n this.ctx.lineWidth = strokeWidth;\n this.ctx.setLineDash([dashPattern, dashPattern]);\n this.ctx.strokeRect(\n element.x - padding,\n element.y - padding,\n element.w + padding * 2,\n element.h + padding * 2\n );\n this.ctx.setLineDash([]);\n\n this.ctx.fillStyle = \"#ffffff\";\n this.ctx.strokeStyle = \"#3b82f6\";\n this.ctx.lineWidth = 1 / camera.zoom;\n\n const { x, y, w, h } = element;\n\n const handles = [\n { x: x, y: y },\n { x: x + w, y: y },\n { x: x, y: y + h },\n { x: x + w, y: y + h },\n { x: x + w / 2, y: y },\n { x: x + w / 2, y: y + h },\n { x: x + w, y: y + h / 2 },\n { x: x, y: y + h / 2 },\n ];\n\n for (const handle of handles) {\n this.ctx.fillRect(\n handle.x - handleSize / 2,\n handle.y - handleSize / 2,\n handleSize,\n handleSize\n );\n this.ctx.strokeRect(\n handle.x - handleSize / 2,\n handle.y - handleSize / 2,\n handleSize,\n handleSize\n );\n }\n\n // Rotation handle\n this.ctx.beginPath();\n this.ctx.arc(\n x + w / 2,\n y - rotateHandleDistance,\n rotateHandleRadius,\n 0,\n Math.PI * 2\n );\n this.ctx.fill();\n this.ctx.stroke();\n\n // Rotation handle connector line\n this.ctx.beginPath();\n this.ctx.moveTo(x + w / 2, y);\n this.ctx.lineTo(x + w / 2, y - rotateHandleDistance + rotateHandleRadius);\n this.ctx.stroke();\n }\n\n private renderHoverHighlight(element: Element): void {\n this.ctx.strokeStyle = \"#93c5fd\";\n this.ctx.lineWidth = 1;\n this.ctx.strokeRect(\n element.x - 1,\n element.y - 1,\n element.w + 2,\n element.h + 2\n );\n }\n\n private renderMarquee(\n marquee: { start: Point; current: Point },\n camera: Camera\n ): void {\n const minX = Math.min(marquee.start.x, marquee.current.x);\n const minY = Math.min(marquee.start.y, marquee.current.y);\n const maxX = Math.max(marquee.start.x, marquee.current.x);\n const maxY = Math.max(marquee.start.y, marquee.current.y);\n const width = maxX - minX;\n const height = maxY - minY;\n\n this.ctx.save();\n this.ctx.translate(camera.x, camera.y);\n this.ctx.scale(camera.zoom, camera.zoom);\n\n // Draw semi-transparent fill\n this.ctx.fillStyle = \"rgba(59, 130, 246, 0.1)\";\n this.ctx.fillRect(minX, minY, width, height);\n\n // Draw dashed border\n this.ctx.strokeStyle = \"#3b82f6\";\n this.ctx.lineWidth = 1.5 / camera.zoom;\n this.ctx.setLineDash([5 / camera.zoom, 5 / camera.zoom]);\n this.ctx.strokeRect(minX, minY, width, height);\n this.ctx.setLineDash([]);\n\n this.ctx.restore();\n }\n\n private async loadImage(src: string): Promise<void> {\n if (this.imageCache.has(src)) return;\n\n try {\n if (this.getImageBitmap) {\n const bitmap = await this.getImageBitmap(src);\n this.imageCache.set(src, bitmap);\n } else {\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = src;\n });\n this.imageCache.set(src, img);\n }\n } catch (error) {\n console.error(\"Failed to load image:\", src, error);\n }\n }\n}\n","import type { Scene } from './types';\n\nexport type HistoryState = {\n scene: Scene;\n timestamp: number;\n};\n\nexport class History {\n private past: HistoryState[] = [];\n private future: HistoryState[] = [];\n private maxSize: number;\n\n constructor(maxSize = 50) {\n this.maxSize = maxSize;\n }\n\n push(scene: Scene): void {\n this.past.push({\n scene: JSON.parse(JSON.stringify(scene)),\n timestamp: Date.now(),\n });\n if (this.past.length > this.maxSize) {\n this.past.shift();\n }\n this.future = [];\n }\n\n undo(currentScene: Scene): Scene | null {\n if (this.past.length === 0) return null;\n\n this.future.push({\n scene: JSON.parse(JSON.stringify(currentScene)),\n timestamp: Date.now(),\n });\n\n const state = this.past.pop()!;\n return state.scene;\n }\n\n redo(currentScene: Scene): Scene | null {\n if (this.future.length === 0) return null;\n\n this.past.push({\n scene: JSON.parse(JSON.stringify(currentScene)),\n timestamp: Date.now(),\n });\n\n const state = this.future.pop()!;\n return state.scene;\n }\n\n canUndo(): boolean {\n return this.past.length > 0;\n }\n\n canRedo(): boolean {\n return this.future.length > 0;\n }\n\n clear(): void {\n this.past = [];\n this.future = [];\n }\n}\n","import type { ToolContext } from \"../types\";\n\nexport abstract class BaseTool {\n abstract name: string;\n protected isActive = false;\n\n activate(opts?: any): void {\n this.isActive = true;\n }\n\n deactivate(): void {\n this.isActive = false;\n }\n\n handlePointerDown(\n e: PointerEvent,\n context: ToolContext,\n selectedIds: Set<string>\n ): void {}\n\n handlePointerMove(e: PointerEvent, context: ToolContext): void {}\n\n handlePointerUp(e: PointerEvent, context: ToolContext): void {}\n\n handleKeyDown(e: KeyboardEvent, context: ToolContext): void {}\n}\n","import type { Element, Point, Bounds } from \"./types\";\nimport { rotatePoint } from \"./utils\";\n\n/**\n * Get the four corners of an element's oriented bounding box\n */\nexport function getOBBCorners(element: Element): [Point, Point, Point, Point] {\n const { x, y, w, h, rotation } = element;\n\n if (rotation === 0) {\n // Fast path for non-rotated elements\n return [\n { x, y },\n { x: x + w, y },\n { x: x + w, y: y + h },\n { x, y: y + h },\n ];\n }\n\n const center = { x: x + w / 2, y: y + h / 2 };\n const corners: [Point, Point, Point, Point] = [\n { x, y },\n { x: x + w, y },\n { x: x + w, y: y + h },\n { x, y: y + h },\n ];\n\n return corners.map((corner) => rotatePoint(corner, center, rotation)) as [\n Point,\n Point,\n Point,\n Point,\n ];\n}\n\n/**\n * Check if a point is inside an element's oriented bounding box\n */\nexport function isPointInOBB(point: Point, element: Element): boolean {\n const { x, y, w, h, rotation } = element;\n\n if (rotation === 0) {\n // Fast path for non-rotated elements (AABB)\n return point.x >= x && point.x <= x + w && point.y >= y && point.y <= y + h;\n }\n\n // For rotated elements, inverse rotate the point and check against AABB\n const center = { x: x + w / 2, y: y + h / 2 };\n const rotated = rotatePoint(point, center, -rotation);\n\n return (\n rotated.x >= x && rotated.x <= x + w && rotated.y >= y && rotated.y <= y + h\n );\n}\n\n/**\n * Get the axis-aligned bounding box that contains the rotated element\n */\nexport function getOBBBounds(element: Element): Bounds {\n if (element.rotation === 0) {\n return {\n x: element.x,\n y: element.y,\n w: element.w,\n h: element.h,\n };\n }\n\n const corners = getOBBCorners(element);\n const xs = corners.map((c) => c.x);\n const ys = corners.map((c) => c.y);\n\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n const maxX = Math.max(...xs);\n const maxY = Math.max(...ys);\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\n/**\n * Check if a point is within a certain distance of a line segment\n */\nexport function isPointNearLine(\n point: Point,\n start: Point,\n end: Point,\n tolerance: number\n): boolean {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const length = Math.sqrt(dx * dx + dy * dy);\n\n if (length === 0) return false;\n\n // Calculate distance from point to line\n const t = Math.max(\n 0,\n Math.min(\n 1,\n ((point.x - start.x) * dx + (point.y - start.y) * dy) / (length * length)\n )\n );\n const projection = {\n x: start.x + t * dx,\n y: start.y + t * dy,\n };\n\n const distance = Math.sqrt(\n Math.pow(point.x - projection.x, 2) + Math.pow(point.y - projection.y, 2)\n );\n\n return distance <= tolerance;\n}\n\n/**\n * Check if a point is inside a polygon (for freedraw hit testing)\n */\nexport function isPointInPolygon(point: Point, polygon: Point[]): boolean {\n if (polygon.length < 3) return false;\n\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i].x;\n const yi = polygon[i].y;\n const xj = polygon[j].x;\n const yj = polygon[j].y;\n\n const intersect =\n yi > point.y !== yj > point.y &&\n point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\n\n if (intersect) inside = !inside;\n }\n\n return inside;\n}\n","import { BaseTool } from \"./base-tool\";\nimport type { Element, Point, ToolContext } from \"../types\";\nimport { screenToCanvas, isPointInBounds, getElementBounds } from \"../utils\";\nimport { isPointInOBB } from \"../geometry\";\n\ntype HandleType =\n | \"nw\"\n | \"ne\"\n | \"sw\"\n | \"se\"\n | \"n\"\n | \"s\"\n | \"e\"\n | \"w\"\n | \"rotate\"\n | null;\n\nexport class SelectTool extends BaseTool {\n name = \"select\";\n private dragStart: Point | null = null;\n private dragElementId: string | null = null;\n private dragHandle: HandleType = null;\n private initialBounds: { x: number; y: number; w: number; h: number } | null =\n null;\n\n // Marquee selection state\n private marqueeStart: Point | null = null;\n private marqueeCurrent: Point | null = null;\n private isMarqueeActive = false;\n\n // Double-click detection for text editing\n private lastClickTime = 0;\n private lastClickPoint: Point | null = null;\n private lastClickedElementId: string | null = null;\n\n handlePointerDown(\n e: PointerEvent,\n context: ToolContext,\n selectedIds: Set<string>\n ): void {\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n for (const id of selectedIds) {\n const element = scene.elements.find((el) => el.id === id);\n if (!element) continue;\n\n const handle = this.getHandleAtPoint(element, point, scene.camera.zoom);\n if (handle) {\n context.recordHistory();\n this.dragStart = point;\n this.dragElementId = element.id;\n this.dragHandle = handle;\n this.initialBounds = {\n x: element.x,\n y: element.y,\n w: element.w,\n h: element.h,\n };\n return;\n }\n }\n\n for (let i = scene.elements.length - 1; i >= 0; i--) {\n const element = scene.elements[i];\n\n // Use rotation-aware hit testing\n if (isPointInOBB(point, element)) {\n // Check for double-click on text elements\n const now = Date.now();\n const isDoubleClick =\n this.lastClickedElementId === element.id &&\n now - this.lastClickTime < 300 &&\n this.lastClickPoint &&\n Math.abs(point.x - this.lastClickPoint.x) < 5 &&\n Math.abs(point.y - this.lastClickPoint.y) < 5;\n\n if (isDoubleClick && element.type === \"text\") {\n // Trigger text editing\n const drawfn = context.getDrawfn();\n if (drawfn.editTextElement) {\n drawfn.editTextElement(element.id);\n }\n return;\n }\n\n // Update click tracking\n this.lastClickTime = now;\n this.lastClickPoint = point;\n this.lastClickedElementId = element.id;\n\n context.recordHistory();\n this.dragStart = point;\n this.dragElementId = element.id;\n this.dragHandle = null;\n\n if (!selectedIds.has(element.id)) {\n if (!e.shiftKey) {\n selectedIds.clear();\n }\n selectedIds.add(element.id);\n }\n return;\n }\n }\n\n // No element hit - start marquee selection\n if (!e.shiftKey) {\n selectedIds.clear();\n }\n this.marqueeStart = point;\n this.marqueeCurrent = point;\n this.isMarqueeActive = true;\n }\n\n handlePointerMove(e: PointerEvent, context: ToolContext): void {\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n // Handle marquee selection\n if (this.isMarqueeActive && this.marqueeStart) {\n this.marqueeCurrent = point;\n return;\n }\n\n // Handle element drag/resize\n if (!this.dragStart || !this.dragElementId) return;\n\n if (this.dragHandle && this.initialBounds) {\n this.handleResize(point, this.dragHandle, context);\n } else {\n const dx = point.x - this.dragStart.x;\n const dy = point.y - this.dragStart.y;\n\n const element = scene.elements.find((el) => el.id === this.dragElementId);\n if (element) {\n context.updateElement(this.dragElementId, {\n x: element.x + dx,\n y: element.y + dy,\n });\n }\n\n this.dragStart = point;\n }\n }\n\n handlePointerUp(e: PointerEvent, context: ToolContext): void {\n // Handle marquee selection completion\n if (this.isMarqueeActive && this.marqueeStart && this.marqueeCurrent) {\n const selection = context.getSelection();\n const elementsInMarquee = this.getElementsInMarquee(context);\n\n if (e.shiftKey) {\n // Add to selection\n elementsInMarquee.forEach((id) => selection.add(id));\n } else {\n // Replace selection\n selection.clear();\n elementsInMarquee.forEach((id) => selection.add(id));\n }\n\n this.marqueeStart = null;\n this.marqueeCurrent = null;\n this.isMarqueeActive = false;\n return;\n }\n\n // Handle element drag/resize completion\n this.dragStart = null;\n this.dragElementId = null;\n this.dragHandle = null;\n this.initialBounds = null;\n }\n\n getMarquee(): { start: Point; current: Point } | null {\n if (this.isMarqueeActive && this.marqueeStart && this.marqueeCurrent) {\n return { start: this.marqueeStart, current: this.marqueeCurrent };\n }\n return null;\n }\n\n private getElementsInMarquee(context: ToolContext): string[] {\n if (!this.marqueeStart || !this.marqueeCurrent) return [];\n\n const scene = context.getScene();\n const minX = Math.min(this.marqueeStart.x, this.marqueeCurrent.x);\n const minY = Math.min(this.marqueeStart.y, this.marqueeCurrent.y);\n const maxX = Math.max(this.marqueeStart.x, this.marqueeCurrent.x);\n const maxY = Math.max(this.marqueeStart.y, this.marqueeCurrent.y);\n\n const elementsInBounds: string[] = [];\n\n for (const element of scene.elements) {\n // Check if element's center point is within marquee bounds\n const centerX = element.x + element.w / 2;\n const centerY = element.y + element.h / 2;\n\n if (\n centerX >= minX &&\n centerX <= maxX &&\n centerY >= minY &&\n centerY <= maxY\n ) {\n elementsInBounds.push(element.id);\n }\n }\n\n return elementsInBounds;\n }\n\n private getHandleAtPoint(\n element: Element,\n point: Point,\n zoom: number\n ): HandleType {\n const handleSize = 8 / zoom;\n const { x, y, w, h, rotation } = element;\n\n // Define handles in local (unrotated) coordinates\n const localHandles = [\n { type: \"nw\" as HandleType, x: x, y: y },\n { type: \"ne\" as HandleType, x: x + w, y: y },\n { type: \"sw\" as HandleType, x: x, y: y + h },\n { type: \"se\" as HandleType, x: x + w, y: y + h },\n { type: \"n\" as HandleType, x: x + w / 2, y: y },\n { type: \"s\" as HandleType, x: x + w / 2, y: y + h },\n { type: \"e\" as HandleType, x: x + w, y: y + h / 2 },\n { type: \"w\" as HandleType, x: x, y: y + h / 2 },\n { type: \"rotate\" as HandleType, x: x + w / 2, y: y - 20 / zoom },\n ];\n\n // If element is rotated, rotate handle positions\n const handles: Array<{ type: HandleType; x: number; y: number }> =\n rotation !== 0\n ? localHandles.map((handle) => {\n const center = { x: x + w / 2, y: y + h / 2 };\n const rotated = this.rotatePoint(\n { x: handle.x, y: handle.y },\n center,\n rotation\n );\n return { type: handle.type, x: rotated.x, y: rotated.y };\n })\n : localHandles;\n\n for (const handle of handles) {\n const dist = Math.sqrt(\n Math.pow(point.x - handle.x, 2) + Math.pow(point.y - handle.y, 2)\n );\n if (dist < handleSize) {\n return handle.type;\n }\n }\n\n return null;\n }\n\n private rotatePoint(point: Point, center: Point, angle: number): Point {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const dx = point.x - center.x;\n const dy = point.y - center.y;\n return {\n x: center.x + dx * cos - dy * sin,\n y: center.y + dx * sin + dy * cos,\n };\n }\n\n private handleResize(\n point: Point,\n handle: HandleType,\n context: ToolContext\n ): void {\n if (!this.dragElementId || !this.initialBounds || !this.dragStart) return;\n\n const dx = point.x - this.dragStart.x;\n const dy = point.y - this.dragStart.y;\n\n let updates: Partial<Element> = {};\n\n switch (handle) {\n case \"nw\":\n updates = {\n x: this.initialBounds.x + dx,\n y: this.initialBounds.y + dy,\n w: Math.max(10, this.initialBounds.w - dx),\n h: Math.max(10, this.initialBounds.h - dy),\n };\n break;\n case \"ne\":\n updates = {\n y: this.initialBounds.y + dy,\n w: Math.max(10, this.initialBounds.w + dx),\n h: Math.max(10, this.initialBounds.h - dy),\n };\n break;\n case \"sw\":\n updates = {\n x: this.initialBounds.x + dx,\n w: Math.max(10, this.initialBounds.w - dx),\n h: Math.max(10, this.initialBounds.h + dy),\n };\n break;\n case \"se\":\n updates = {\n w: Math.max(10, this.initialBounds.w + dx),\n h: Math.max(10, this.initialBounds.h + dy),\n };\n break;\n case \"n\":\n updates = {\n y: this.initialBounds.y + dy,\n h: Math.max(10, this.initialBounds.h - dy),\n };\n break;\n case \"s\":\n updates = {\n h: Math.max(10, this.initialBounds.h + dy),\n };\n break;\n case \"e\":\n updates = {\n w: Math.max(10, this.initialBounds.w + dx),\n };\n break;\n case \"w\":\n updates = {\n x: this.initialBounds.x + dx,\n w: Math.max(10, this.initialBounds.w - dx),\n };\n break;\n case \"rotate\":\n const cx = this.initialBounds.x + this.initialBounds.w / 2;\n const cy = this.initialBounds.y + this.initialBounds.h / 2;\n const angle = Math.atan2(point.y - cy, point.x - cx);\n updates = { rotation: angle };\n break;\n }\n\n if (Object.keys(updates).length > 0) {\n context.updateElement(this.dragElementId, updates);\n }\n }\n}\n","import { BaseTool } from \"./base-tool\";\nimport type { Point, ToolContext } from \"../types\";\n\nexport class PanTool extends BaseTool {\n name = \"pan\";\n private dragStart: Point | null = null;\n\n handlePointerDown(e: PointerEvent, context: ToolContext): void {\n this.dragStart = { x: e.clientX, y: e.clientY };\n }\n\n handlePointerMove(e: PointerEvent, context: ToolContext): void {\n if (!this.dragStart) return;\n\n const dx = e.clientX - this.dragStart.x;\n const dy = e.clientY - this.dragStart.y;\n\n const camera = context.getCamera();\n context.getDrawfn().setCamera({\n x: camera.x + dx,\n y: camera.y + dy,\n });\n\n this.dragStart = { x: e.clientX, y: e.clientY };\n }\n\n handlePointerUp(e: PointerEvent, context: ToolContext): void {\n this.dragStart = null;\n }\n}\n","import { BaseTool } from \"./base-tool\";\nimport type { FreeDrawElement, Point, ToolContext } from \"../types\";\nimport { generateId, screenToCanvas } from \"../utils\";\n\nexport class PenTool extends BaseTool {\n name = \"pen\";\n private currentElement: FreeDrawElement | null = null;\n private currentElementId: string | null = null;\n private currentPoints: [number, number, number?][] = [];\n\n handlePointerDown(e: PointerEvent, context: ToolContext): void {\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n context.recordHistory();\n\n this.currentPoints = [[point.x, point.y, e.pressure || 0.5]];\n\n this.currentElement = {\n id: generateId(),\n type: \"freedraw\",\n x: point.x,\n y: point.y,\n w: 1,\n h: 1,\n rotation: 0,\n stroke: \"#000000\",\n fill: \"transparent\",\n strokeWidth: 2,\n opacity: 1,\n points: [],\n style: {\n size: 4,\n thinning: 0.5,\n smoothing: 0.5,\n streamline: 0.5,\n },\n };\n\n this.currentElementId = context.addElement(this.currentElement);\n }\n\n handlePointerMove(e: PointerEvent, context: ToolContext): void {\n if (!this.currentElement || !this.currentElementId) return;\n\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n this.currentPoints.push([\n point.x - this.currentElement.x,\n point.y - this.currentElement.y,\n e.pressure || 0.5,\n ]);\n\n const xs = this.currentPoints.map((p) => p[0]);\n const ys = this.currentPoints.map((p) => p[1]);\n const w = Math.max(...xs) - Math.min(...xs);\n const h = Math.max(...ys) - Math.min(...ys);\n\n context.updateElement(this.currentElementId, {\n points: this.currentPoints,\n w,\n h,\n });\n }\n\n handlePointerUp(e: PointerEvent, context: ToolContext): void {\n this.currentElement = null;\n this.currentElementId = null;\n this.currentPoints = [];\n }\n}\n","import { BaseTool } from \"./base-tool\";\nimport type { RectangleElement, Point, ToolContext } from \"../types\";\nimport { generateId, screenToCanvas } from \"../utils\";\n\nexport class RectangleTool extends BaseTool {\n name = \"rectangle\";\n private startPoint: Point | null = null;\n private currentElementId: string | null = null;\n\n handlePointerDown(e: PointerEvent, context: ToolContext): void {\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n this.startPoint = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n context.recordHistory();\n\n const element: RectangleElement = {\n id: generateId(),\n type: \"rectangle\",\n x: this.startPoint.x,\n y: this.startPoint.y,\n w: 0,\n h: 0,\n rotation: 0,\n stroke: \"#000000\",\n fill: \"transparent\",\n strokeWidth: 2,\n opacity: 1,\n };\n\n this.currentElementId = context.addElement(element);\n }\n\n handlePointerMove(e: PointerEvent, context: ToolContext): void {\n if (!this.startPoint || !this.currentElementId) return;\n\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n let w = point.x - this.startPoint.x;\n let h = point.y - this.startPoint.y;\n\n if (e.shiftKey) {\n const size = Math.max(Math.abs(w), Math.abs(h));\n w = w >= 0 ? size : -size;\n h = h >= 0 ? size : -size;\n }\n\n const updates: any = {};\n\n if (w < 0) {\n updates.x = this.startPoint.x + w;\n updates.w = -w;\n } else {\n updates.x = this.startPoint.x;\n updates.w = w;\n }\n\n if (h < 0) {\n updates.y = this.startPoint.y + h;\n updates.h = -h;\n } else {\n updates.y = this.startPoint.y;\n updates.h = h;\n }\n\n context.updateElement(this.currentElementId, updates);\n }\n\n handlePointerUp(e: PointerEvent, context: ToolContext): void {\n if (this.currentElementId) {\n const scene = context.getScene();\n const element = scene.elements.find(\n (el) => el.id === this.currentElementId\n );\n if (element && (element.w < 1 || element.h < 1)) {\n context.removeElement(this.currentElementId);\n }\n }\n\n this.startPoint = null;\n this.currentElementId = null;\n }\n}\n","import { BaseTool } from \"./base-tool\";\nimport type { EllipseElement, Point, ToolContext } from \"../types\";\nimport { generateId, screenToCanvas } from \"../utils\";\n\nexport class EllipseTool extends BaseTool {\n name = \"ellipse\";\n private startPoint: Point | null = null;\n private currentElementId: string | null = null;\n\n handlePointerDown(e: PointerEvent, context: ToolContext): void {\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n this.startPoint = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n context.recordHistory();\n\n const element: EllipseElement = {\n id: generateId(),\n type: \"ellipse\",\n x: this.startPoint.x,\n y: this.startPoint.y,\n w: 0,\n h: 0,\n rotation: 0,\n stroke: \"#000000\",\n fill: \"transparent\",\n strokeWidth: 2,\n opacity: 1,\n };\n\n this.currentElementId = context.addElement(element);\n }\n\n handlePointerMove(e: PointerEvent, context: ToolContext): void {\n if (!this.startPoint || !this.currentElementId) return;\n\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n let w = point.x - this.startPoint.x;\n let h = point.y - this.startPoint.y;\n\n if (e.shiftKey) {\n const size = Math.max(Math.abs(w), Math.abs(h));\n w = w >= 0 ? size : -size;\n h = h >= 0 ? size : -size;\n }\n\n const updates: any = {};\n\n if (w < 0) {\n updates.x = this.startPoint.x + w;\n updates.w = -w;\n } else {\n updates.x = this.startPoint.x;\n updates.w = w;\n }\n\n if (h < 0) {\n updates.y = this.startPoint.y + h;\n updates.h = -h;\n } else {\n updates.y = this.startPoint.y;\n updates.h = h;\n }\n\n context.updateElement(this.currentElementId, updates);\n }\n\n handlePointerUp(e: PointerEvent, context: ToolContext): void {\n if (this.currentElementId) {\n const scene = context.getScene();\n const element = scene.elements.find(\n (el) => el.id === this.currentElementId\n );\n if (element && (element.w < 1 || element.h < 1)) {\n context.removeElement(this.currentElementId);\n }\n }\n\n this.startPoint = null;\n this.currentElementId = null;\n }\n}\n","import { BaseTool } from \"./base-tool\";\nimport type { ArrowElement, Point, ToolContext } from \"../types\";\nimport { generateId, screenToCanvas } from \"../utils\";\n\nexport class ArrowTool extends BaseTool {\n name = \"arrow\";\n private points: [number, number][] = [];\n private currentElementId: string | null = null;\n\n handlePointerDown(e: PointerEvent, context: ToolContext): void {\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n context.recordHistory();\n\n this.points = [[point.x, point.y]];\n\n const element: ArrowElement = {\n id: generateId(),\n type: \"arrow\",\n x: point.x,\n y: point.y,\n w: 0,\n h: 0,\n rotation: 0,\n stroke: \"#000000\",\n fill: \"transparent\",\n strokeWidth: 2,\n opacity: 1,\n points: [[0, 0]],\n head: \"triangle\",\n };\n\n this.currentElementId = context.addElement(element);\n }\n\n handlePointerMove(e: PointerEvent, context: ToolContext): void {\n if (!this.currentElementId || this.points.length === 0) return;\n\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n const startX = this.points[0][0];\n const startY = this.points[0][1];\n\n let arrowPoints: [number, number][] = [\n [0, 0],\n [point.x - startX, point.y - startY],\n ];\n\n const minX = Math.min(0, point.x - startX);\n const minY = Math.min(0, point.y - startY);\n const maxX = Math.max(0, point.x - startX);\n const maxY = Math.max(0, point.y - startY);\n\n arrowPoints = arrowPoints.map(([x, y]) => [x - minX, y - minY]) as [\n number,\n number,\n ][];\n\n context.updateElement(this.currentElementId, {\n x: startX + minX,\n y: startY + minY,\n w: maxX - minX,\n h: maxY - minY,\n points: arrowPoints,\n });\n }\n\n handlePointerUp(e: PointerEvent, context: ToolContext): void {\n if (this.currentElementId) {\n const scene = context.getScene();\n const element = scene.elements.find(\n (el) => el.id === this.currentElementId\n );\n if (element && (element.w < 1 || element.h < 1)) {\n context.removeElement(this.currentElementId);\n }\n }\n\n this.points = [];\n this.currentElementId = null;\n }\n}\n","import { BaseTool } from \"./base-tool\";\nimport type { TextElement, Point, ToolContext } from \"../types\";\nimport { generateId, screenToCanvas } from \"../utils\";\n\nexport class TextTool extends BaseTool {\n name = \"text\";\n private overlayRoot: HTMLElement | null = null;\n private activeTextarea: HTMLTextAreaElement | null = null;\n private activeElementId: string | null = null;\n private activeContext: ToolContext | null = null;\n\n constructor(overlayRoot?: HTMLElement) {\n super();\n this.overlayRoot = overlayRoot || document.body;\n }\n\n handlePointerDown(e: PointerEvent, context: ToolContext): void {\n if (this.activeTextarea && this.activeContext) {\n this.commitText(this.activeContext);\n }\n\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n context.recordHistory();\n\n const element: TextElement = {\n id: generateId(),\n type: \"text\",\n x: point.x,\n y: point.y,\n w: 200,\n h: 40,\n rotation: 0,\n stroke: \"#000000\",\n fill: \"#000000\",\n strokeWidth: 0,\n opacity: 1,\n text: \"\",\n fontFamily: \"sans-serif\",\n fontSize: 16,\n align: \"left\",\n };\n\n this.activeElementId = context.addElement(element);\n this.activeContext = context;\n\n this.showTextInput(canvas, context, element);\n }\n\n editElement(id: string, canvas: HTMLCanvasElement, scene: any): void {\n const element = scene.elements.find((el: any) => el.id === id);\n if (!element || element.type !== \"text\") return;\n\n // Create a temporary context for editing\n // Note: This is a simplified approach - in production you'd want proper context\n this.activeElementId = id;\n\n // Show text input for existing element\n const textarea = document.createElement(\"textarea\");\n const rect = canvas.getBoundingClientRect();\n\n const screenX = element.x * scene.camera.zoom + scene.camera.x + rect.left;\n const screenY = element.y * scene.camera.zoom + scene.camera.y + rect.top;\n\n Object.assign(textarea.style, {\n position: \"fixed\",\n left: `${screenX}px`,\n top: `${screenY}px`,\n width: `${element.w * scene.camera.zoom}px`,\n minHeight: `${element.h * scene.camera.zoom}px`,\n font: `${element.fontSize * scene.camera.zoom}px ${element.fontFamily}`,\n color: element.fill,\n background: \"transparent\",\n border: \"2px solid #3b82f6\",\n outline: \"none\",\n resize: \"none\",\n padding: \"4px\",\n zIndex: \"10000\",\n });\n\n textarea.value = element.text;\n textarea.focus();\n textarea.select(); // Select all text for easy editing\n\n this.activeTextarea = textarea;\n if (this.overlayRoot) {\n this.overlayRoot.appendChild(textarea);\n }\n\n // Handle blur to commit changes\n const handleBlur = () => {\n if (this.activeTextarea && this.activeElementId) {\n element.text = this.activeTextarea.value;\n this.activeTextarea.remove();\n this.activeTextarea = null;\n this.activeElementId = null;\n }\n };\n\n textarea.addEventListener(\"blur\", handleBlur);\n }\n\n private showTextInput(\n canvas: HTMLCanvasElement,\n context: ToolContext,\n element: TextElement\n ): void {\n if (!this.overlayRoot) return;\n\n const scene = context.getScene();\n const textarea = document.createElement(\"textarea\");\n const rect = canvas.getBoundingClientRect();\n\n const screenX = element.x * scene.camera.zoom + scene.camera.x + rect.left;\n const screenY = element.y * scene.camera.zoom + scene.camera.y + rect.top;\n\n Object.assign(textarea.style, {\n position: \"fixed\",\n left: `${screenX}px`,\n top: `${screenY}px`,\n width: `${element.w * scene.camera.zoom}px`,\n minHeight: `${element.h * scene.camera.zoom}px`,\n font: `${element.fontSize * scene.camera.zoom}px ${element.fontFamily}`,\n color: element.fill,\n background: \"transparent\",\n border: \"2px solid #3b82f6\",\n outline: \"none\",\n resize: \"none\",\n padding: \"4px\",\n zIndex: \"10000\",\n });\n\n textarea.value = element.text;\n textarea.focus();\n\n this.activeTextarea = textarea;\n this.overlayRoot.appendChild(textarea);\n\n const handleClickOutside = (e: MouseEvent) => {\n if (e.target !== textarea) {\n this.commitText(context);\n document.removeEventListener(\"click\", handleClickOutside);\n }\n };\n\n textarea.addEventListener(\"blur\", () => {\n this.commitText(context);\n document.removeEventListener(\"click\", handleClickOutside);\n });\n\n setTimeout(() => {\n document.addEventListener(\"click\", handleClickOutside);\n }, 0);\n }\n\n private commitText(context: ToolContext): void {\n if (!this.activeTextarea || !this.activeElementId) return;\n\n const text = this.activeTextarea.value;\n\n if (text.trim() === \"\") {\n context.removeElement(this.activeElementId);\n } else {\n context.updateElement(this.activeElementId, { text });\n }\n\n this.activeTextarea.remove();\n this.activeTextarea = null;\n this.activeElementId = null;\n this.activeContext = null;\n }\n\n deactivate(): void {\n if (this.activeTextarea) {\n this.activeTextarea.remove();\n this.activeTextarea = null;\n }\n this.activeElementId = null;\n this.activeContext = null;\n super.deactivate();\n }\n}\n","import { BaseTool } from \"./base-tool\";\nimport type { ImageElement, ToolContext } from \"../types\";\nimport { generateId, screenToCanvas } from \"../utils\";\n\nexport type ImageToolOptions = {\n src: string;\n naturalW?: number;\n naturalH?: number;\n};\n\nexport class ImageTool extends BaseTool {\n name = \"image\";\n private pendingImage: ImageToolOptions | null = null;\n\n activate(opts?: ImageToolOptions): void {\n super.activate(opts);\n if (opts?.src) {\n this.pendingImage = opts;\n }\n }\n\n handlePointerDown(e: PointerEvent, context: ToolContext): void {\n if (!this.pendingImage) return;\n\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n context.recordHistory();\n\n const w = this.pendingImage.naturalW || 200;\n const h = this.pendingImage.naturalH || 150;\n\n const element: ImageElement = {\n id: generateId(),\n type: \"image\",\n x: point.x - w / 2,\n y: point.y - h / 2,\n w,\n h,\n rotation: 0,\n stroke: \"#000000\",\n fill: \"transparent\",\n strokeWidth: 0,\n opacity: 1,\n src: this.pendingImage.src,\n naturalW: this.pendingImage.naturalW,\n naturalH: this.pendingImage.naturalH,\n };\n\n context.addElement(element);\n this.pendingImage = null;\n }\n}\n","import { BaseTool } from \"./base-tool\";\nimport type { NodeElement, ToolContext } from \"../types\";\nimport { generateId, screenToCanvas } from \"../utils\";\n\nexport type NodeToolOptions = {\n nodeId: string;\n nodeType?: string;\n variant?: \"bookmark\" | \"embed\" | \"card\";\n preview?: {\n title?: string;\n icon?: string;\n excerpt?: string;\n };\n};\n\nexport class NodeTool extends BaseTool {\n name = \"node\";\n private pendingNode: NodeToolOptions | null = null;\n\n activate(opts?: NodeToolOptions): void {\n super.activate(opts);\n if (opts?.nodeId) {\n this.pendingNode = opts;\n }\n }\n\n handlePointerDown(e: PointerEvent, context: ToolContext): void {\n if (!this.pendingNode) return;\n\n const canvas = e.target as HTMLCanvasElement;\n const scene = context.getScene();\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n scene.camera,\n canvas\n );\n\n context.recordHistory();\n\n const element: NodeElement = {\n id: generateId(),\n type: \"node\",\n x: point.x - 120,\n y: point.y - 60,\n w: 240,\n h: 120,\n rotation: 0,\n stroke: \"#2563eb\",\n fill: \"#eff6ff\",\n strokeWidth: 1,\n opacity: 1,\n nodeId: this.pendingNode.nodeId,\n nodeType: this.pendingNode.nodeType,\n variant: this.pendingNode.variant || \"bookmark\",\n preview: this.pendingNode.preview,\n };\n\n context.addElement(element);\n this.pendingNode = null;\n }\n}\n","import type { ToolName, ToolContext } from \"../types\";\nimport { BaseTool } from \"./base-tool\";\nimport { SelectTool } from \"./select-tool\";\nimport { PanTool } from \"./pan-tool\";\nimport { PenTool } from \"./pen-tool\";\nimport { RectangleTool } from \"./rectangle-tool\";\nimport { EllipseTool } from \"./ellipse-tool\";\nimport { ArrowTool } from \"./arrow-tool\";\nimport { TextTool } from \"./text-tool\";\nimport { ImageTool } from \"./image-tool\";\nimport { NodeTool } from \"./node-tool\";\n\nexport class ToolManager {\n private tools: Map<ToolName, BaseTool> = new Map();\n private currentTool: ToolName = \"select\";\n private drawfn: any;\n\n constructor(drawfn: any, overlayRoot?: HTMLElement) {\n this.drawfn = drawfn;\n\n this.tools.set(\"select\", new SelectTool());\n this.tools.set(\"pan\", new PanTool());\n this.tools.set(\"pen\", new PenTool());\n this.tools.set(\"rectangle\", new RectangleTool());\n this.tools.set(\"ellipse\", new EllipseTool());\n this.tools.set(\"arrow\", new ArrowTool());\n this.tools.set(\"text\", new TextTool(overlayRoot));\n this.tools.set(\"image\", new ImageTool());\n this.tools.set(\"node\", new NodeTool());\n }\n\n setTool(tool: ToolName, opts?: any): void {\n const currentTool = this.tools.get(this.currentTool);\n currentTool?.deactivate();\n\n this.currentTool = tool;\n\n const newTool = this.tools.get(tool);\n newTool?.activate(opts);\n }\n\n getCurrentTool(): ToolName {\n return this.currentTool;\n }\n\n handlePointerDown(\n e: PointerEvent,\n context: ToolContext,\n selectedIds: Set<string>\n ): void {\n const tool = this.tools.get(this.currentTool);\n tool?.handlePointerDown(e, context, selectedIds);\n }\n\n handlePointerMove(e: PointerEvent, context: ToolContext): void {\n const tool = this.tools.get(this.currentTool);\n tool?.handlePointerMove(e, context);\n }\n\n handlePointerUp(e: PointerEvent, context: ToolContext): void {\n const tool = this.tools.get(this.currentTool);\n tool?.handlePointerUp(e, context);\n }\n\n handleKeyDown(e: KeyboardEvent, context: ToolContext): void {\n const tool = this.tools.get(this.currentTool);\n tool?.handleKeyDown(e, context);\n }\n\n getTool(name: ToolName): BaseTool | undefined {\n return this.tools.get(name);\n }\n\n getMarquee(): {\n start: { x: number; y: number };\n current: { x: number; y: number };\n } | null {\n if (this.currentTool === \"select\") {\n const selectTool = this.tools.get(\"select\") as any;\n return selectTool?.getMarquee?.() || null;\n }\n return null;\n }\n}\n","import type {\n Scene,\n Element,\n Camera,\n ToolName,\n DrawfnEvent,\n DrawfnEventMap,\n Point,\n ToolContext,\n Bounds,\n} from \"./types\";\nimport { Renderer } from \"./renderer\";\nimport { History } from \"./history\";\nimport { generateId, screenToCanvas, getElementBounds } from \"./utils\";\nimport { ToolManager } from \"./tools/tool-manager\";\nimport { getOBBBounds } from \"./geometry\";\nimport { getStroke } from \"perfect-freehand\";\n\nexport type DrawfnOptions = {\n canvas: HTMLCanvasElement;\n overlayRoot?: HTMLElement;\n getImageBitmap?: (src: string) => Promise<ImageBitmap>;\n\n // Nucleus integration hooks\n onNodeClick?: (nodeId: string, element: Element) => void;\n getNodePreview?: (\n nodeId: string\n ) => Promise<{ title?: string; description?: string; icon?: string }>;\n};\n\nexport class Drawfn {\n private canvas: HTMLCanvasElement;\n private renderer: Renderer;\n private history: History;\n private toolManager: ToolManager;\n private scene: Scene;\n private listeners: Map<DrawfnEvent, Set<(...args: any[]) => void>> =\n new Map();\n private rafId: number | null = null;\n private needsRender = false;\n private selectedIds: Set<string> = new Set();\n private hoveredId: string | null = null;\n\n // Space-to-pan state\n private isSpacePressed = false;\n private toolBeforeSpace: ToolName | null = null;\n\n // Nucleus integration callbacks\n private onNodeClick?: (nodeId: string, element: Element) => void;\n private getNodePreview?: (\n nodeId: string\n ) => Promise<{ title?: string; description?: string; icon?: string }>;\n\n constructor(options: DrawfnOptions) {\n this.canvas = options.canvas;\n this.renderer = new Renderer(this.canvas, options.getImageBitmap);\n this.history = new History();\n this.toolManager = new ToolManager(this, options.overlayRoot);\n\n this.scene = this.createEmptyScene();\n\n // Initialize Nucleus integration callbacks\n this.onNodeClick = options.onNodeClick;\n this.getNodePreview = options.getNodePreview;\n\n this.setupEventListeners();\n this.scheduleRender();\n }\n\n private createEmptyScene(): Scene {\n return {\n version: 1,\n id: generateId(),\n elements: [],\n camera: { x: 0, y: 0, zoom: 1 },\n background: {\n color: \"#ffffff\",\n grid: { size: 16, color: \"#e5e7eb\", alpha: 0.6 },\n },\n };\n }\n\n load(scene: Scene): void {\n this.scene = JSON.parse(JSON.stringify(scene));\n this.selectedIds.clear();\n this.history.clear();\n this.scheduleRender();\n }\n\n loadScene(sceneData: any): boolean {\n try {\n // Validate scene structure\n if (!sceneData || typeof sceneData !== \"object\") {\n console.error(\"Invalid scene data: not an object\");\n return false;\n }\n\n // Validate version compatibility\n const version = sceneData.version || \"1.0.0\";\n if (!this.isVersionCompatible(version)) {\n console.warn(\n `Scene version ${version} may not be fully compatible with current version`\n );\n }\n\n // Validate and sanitize elements\n const elements = Array.isArray(sceneData.elements)\n ? (sceneData.elements\n .map((el: any) => this.sanitizeElement(el))\n .filter((el: Element | null) => el !== null) as Element[])\n : [];\n\n // Create scene with defaults\n const loadedScene: Scene = {\n version: this.scene.version,\n id: sceneData.id || generateId(),\n elements,\n camera: this.sanitizeCamera(sceneData.camera),\n background: this.sanitizeBackground(sceneData.background),\n };\n\n this.scene = loadedScene;\n this.selectedIds.clear();\n this.history.clear();\n this.scheduleRender();\n\n return true;\n } catch (error) {\n console.error(\"Failed to load scene:\", error);\n return false;\n }\n }\n\n private isVersionCompatible(version: string): boolean {\n const [major] = version.split(\".\").map(Number);\n const currentVersion = String(this.scene.version);\n const [currentMajor] = currentVersion.split(\".\").map(Number);\n return major === currentMajor;\n }\n\n private sanitizeElement(element: any): Element | null {\n if (!element || typeof element !== \"object\") return null;\n if (!element.type || !element.id) return null;\n\n const validTypes = [\n \"freedraw\",\n \"rectangle\",\n \"ellipse\",\n \"arrow\",\n \"text\",\n \"image\",\n \"node\",\n ];\n if (!validTypes.includes(element.type)) {\n console.warn(`Unknown element type: ${element.type}`);\n return null;\n }\n\n // Ensure required base properties\n return {\n ...element,\n id: element.id || generateId(),\n x: typeof element.x === \"number\" ? element.x : 0,\n y: typeof element.y === \"number\" ? element.y : 0,\n w: typeof element.w === \"number\" ? element.w : 100,\n h: typeof element.h === \"number\" ? element.h : 100,\n rotation: typeof element.rotation === \"number\" ? element.rotation : 0,\n stroke: typeof element.stroke === \"string\" ? element.stroke : \"#000000\",\n fill: typeof element.fill === \"string\" ? element.fill : \"transparent\",\n strokeWidth:\n typeof element.strokeWidth === \"number\" ? element.strokeWidth : 2,\n opacity: typeof element.opacity === \"number\" ? element.opacity : 1,\n } as Element;\n }\n\n private sanitizeCamera(camera: any): Camera {\n if (!camera || typeof camera !== \"object\") {\n return { x: 0, y: 0, zoom: 1 };\n }\n return {\n x: typeof camera.x === \"number\" ? camera.x : 0,\n y: typeof camera.y === \"number\" ? camera.y : 0,\n zoom:\n typeof camera.zoom === \"number\"\n ? Math.max(0.1, Math.min(5, camera.zoom))\n : 1,\n };\n }\n\n private sanitizeBackground(background: any): Scene[\"background\"] {\n const defaultBg = {\n color: \"#ffffff\",\n grid: { size: 16, color: \"#e5e7eb\", alpha: 0.6 },\n };\n\n if (!background || typeof background !== \"object\") {\n return defaultBg;\n }\n\n return {\n color:\n typeof background.color === \"string\"\n ? background.color\n : defaultBg.color,\n grid:\n background.grid && typeof background.grid === \"object\"\n ? {\n size:\n typeof background.grid.size === \"number\"\n ? background.grid.size\n : 16,\n color:\n typeof background.grid.color === \"string\"\n ? background.grid.color\n : \"#e5e7eb\",\n alpha:\n typeof background.grid.alpha === \"number\"\n ? background.grid.alpha\n : 0.6,\n }\n : defaultBg.grid,\n };\n }\n\n getScene(): Scene {\n return JSON.parse(JSON.stringify(this.scene));\n }\n\n clear(): void {\n this.scene = this.createEmptyScene();\n this.selectedIds.clear();\n this.history.clear();\n this.scheduleRender();\n }\n\n add(element: Element): string {\n const id = element.id || generateId();\n const el = { ...element, id } as Element;\n\n this.recordHistory();\n this.scene.elements.push(el);\n this.emit(\"elementAdded\", el);\n this.scheduleRender();\n\n return id;\n }\n\n update(id: string, patch: Partial<Element>): void {\n const index = this.scene.elements.findIndex((el) => el.id === id);\n if (index === -1) return;\n\n this.recordHistory();\n this.scene.elements[index] = {\n ...this.scene.elements[index],\n ...patch,\n } as Element;\n this.emit(\"elementUpdated\", this.scene.elements[index]);\n this.scheduleRender();\n }\n\n remove(id: string): void {\n const index = this.scene.elements.findIndex((el) => el.id === id);\n if (index === -1) return;\n\n this.recordHistory();\n this.scene.elements.splice(index, 1);\n this.selectedIds.delete(id);\n this.emit(\"elementRemoved\", id);\n this.scheduleRender();\n }\n\n bringToFront(id: string): void {\n const index = this.scene.elements.findIndex((el) => el.id === id);\n if (index === -1) return;\n\n this.recordHistory();\n const [element] = this.scene.elements.splice(index, 1);\n this.scene.elements.push(element);\n this.scheduleRender();\n }\n\n sendToBack(id: string): void {\n const index = this.scene.elements.findIndex((el) => el.id === id);\n if (index === -1) return;\n\n this.recordHistory();\n const [element] = this.scene.elements.splice(index, 1);\n this.scene.elements.unshift(element);\n this.scheduleRender();\n }\n\n setTool(tool: ToolName, opts?: any): void {\n this.toolManager.setTool(tool, opts);\n }\n\n getTool(): ToolName {\n return this.toolManager.getCurrentTool();\n }\n\n setCamera(camera: Partial<Camera>): void {\n this.scene.camera = { ...this.scene.camera, ...camera };\n this.emit(\"cameraChanged\", this.scene.camera);\n this.scheduleRender();\n }\n\n getCamera(): Camera {\n return { ...this.scene.camera };\n }\n\n screenToCanvas(point: Point): Point {\n return screenToCanvas(point, this.scene.camera, this.canvas);\n }\n\n undo(): void {\n const prevScene = this.history.undo(this.scene);\n if (prevScene) {\n this.scene = prevScene;\n this.selectedIds.clear();\n this.emitHistoryChanged();\n this.scheduleRender();\n }\n }\n\n redo(): void {\n const nextScene = this.history.redo(this.scene);\n if (nextScene) {\n this.scene = nextScene;\n this.selectedIds.clear();\n this.emitHistoryChanged();\n this.scheduleRender();\n }\n }\n\n editTextElement(id: string): void {\n const element = this.scene.elements.find((el) => el.id === id);\n if (!element || element.type !== \"text\") return;\n\n // Switch to text tool\n this.setTool(\"text\");\n\n // Get the text tool and call its editElement method\n const textTool = this.toolManager.getTool(\"text\") as any;\n if (textTool && textTool.editElement) {\n textTool.editElement(id, this.canvas, this.scene);\n }\n }\n\n async exportPNG(opts?: {\n padding?: number;\n scale?: number;\n transparent?: boolean;\n selectedOnly?: boolean;\n fitContent?: boolean;\n }): Promise<Blob> {\n const padding = opts?.padding ?? 20;\n const scale = opts?.scale ?? 2;\n const transparent = opts?.transparent ?? false;\n const selectedOnly = opts?.selectedOnly ?? false;\n const fitContent = opts?.fitContent ?? false;\n\n // Determine which elements to export\n const elementsToExport = selectedOnly\n ? this.scene.elements.filter((el) => this.selectedIds.has(el.id))\n : this.scene.elements;\n\n // Calculate canvas size\n let canvasWidth = this.canvas.width;\n let canvasHeight = this.canvas.height;\n let offsetX = 0;\n let offsetY = 0;\n\n if (fitContent && elementsToExport.length > 0) {\n const bounds = this.getContentBounds(elementsToExport);\n canvasWidth = (bounds.w + padding * 2) * scale;\n canvasHeight = (bounds.h + padding * 2) * scale;\n offsetX = -(bounds.x - padding);\n offsetY = -(bounds.y - padding);\n }\n\n const tempCanvas = document.createElement(\"canvas\");\n tempCanvas.width = canvasWidth * (fitContent ? 1 : scale);\n tempCanvas.height = canvasHeight * (fitContent ? 1 : scale);\n const ctx = tempCanvas.getContext(\"2d\")!;\n\n ctx.scale(scale, scale);\n\n if (fitContent) {\n ctx.translate(offsetX, offsetY);\n }\n\n if (!transparent) {\n ctx.fillStyle = this.scene.background.color;\n ctx.fillRect(\n fitContent ? -offsetX : 0,\n fitContent ? -offsetY : 0,\n fitContent ? canvasWidth / scale : this.canvas.width,\n fitContent ? canvasHeight / scale : this.canvas.height\n );\n }\n\n // Create temporary scene with only elements to export\n const exportScene: Scene = {\n ...this.scene,\n elements: elementsToExport,\n };\n\n const tempRenderer = new Renderer(tempCanvas);\n tempRenderer.render(exportScene);\n\n return new Promise((resolve, reject) => {\n tempCanvas.toBlob((blob) => {\n if (blob) resolve(blob);\n else reject(new Error(\"Failed to export PNG\"));\n }, \"image/png\");\n });\n }\n\n private getContentBounds(elements: Element[]): Bounds {\n if (elements.length === 0) {\n return { x: 0, y: 0, w: 800, h: 600 };\n }\n\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n\n for (const element of elements) {\n // Use OBB bounds for rotated elements\n const bounds =\n element.rotation !== 0\n ? getOBBBounds(element)\n : getElementBounds(element);\n\n minX = Math.min(minX, bounds.x);\n minY = Math.min(minY, bounds.y);\n maxX = Math.max(maxX, bounds.x + bounds.w);\n maxY = Math.max(maxY, bounds.y + bounds.h);\n }\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n }\n\n async exportSVG(opts?: {\n padding?: number;\n scale?: number;\n }): Promise<string> {\n const padding = opts?.padding ?? 20;\n const scale = opts?.scale ?? 1;\n\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${this.canvas.width * scale}\" height=\"${this.canvas.height * scale}\" viewBox=\"0 0 ${this.canvas.width} ${this.canvas.height}\">`;\n svg += `<rect width=\"100%\" height=\"100%\" fill=\"${this.scene.background.color}\"/>`;\n\n for (const element of this.scene.elements) {\n svg += this.elementToSVG(element);\n }\n\n svg += \"</svg>\";\n return svg;\n }\n\n private elementToSVG(element: Element): string {\n let transform = \"\";\n if (element.rotation !== 0) {\n const cx = element.x + element.w / 2;\n const cy = element.y + element.h / 2;\n transform = ` transform=\"rotate(${(element.rotation * 180) / Math.PI} ${cx} ${cy})\"`;\n }\n\n const commonAttrs = `opacity=\"${element.opacity}\" stroke=\"${element.stroke}\" stroke-width=\"${element.strokeWidth}\" fill=\"${element.fill}\"${transform}`;\n\n switch (element.type) {\n case \"rectangle\":\n return `<rect x=\"${element.x}\" y=\"${element.y}\" width=\"${element.w}\" height=\"${element.h}\" ${commonAttrs}/>`;\n\n case \"ellipse\":\n const cx = element.x + element.w / 2;\n const cy = element.y + element.h / 2;\n return `<ellipse cx=\"${cx}\" cy=\"${cy}\" rx=\"${element.w / 2}\" ry=\"${element.h / 2}\" ${commonAttrs}/>`;\n\n case \"text\":\n const textEl = element as any;\n return `<text x=\"${element.x}\" y=\"${element.y + textEl.fontSize}\" font-family=\"${textEl.fontFamily}\" font-size=\"${textEl.fontSize}\" ${commonAttrs}>${this.escapeXml(textEl.text)}</text>`;\n\n case \"freedraw\": {\n const freedraw = element as any;\n if (freedraw.points.length === 0) return \"\";\n\n const points = freedraw.points.map((p: any) => [\n p[0],\n p[1],\n p[2] ?? 0.5,\n ]);\n const stroke = getStroke(points, {\n size: freedraw.style?.size ?? element.strokeWidth * 2,\n thinning: freedraw.style?.thinning ?? 0.5,\n smoothing: freedraw.style?.smoothing ?? 0.5,\n streamline: freedraw.style?.streamline ?? 0.5,\n simulatePressure: true,\n });\n\n let pathData = `M ${stroke[0][0] + element.x} ${stroke[0][1] + element.y}`;\n for (let i = 1; i < stroke.length; i++) {\n pathData += ` L ${stroke[i][0] + element.x} ${stroke[i][1] + element.y}`;\n }\n pathData += \" Z\";\n\n return `<path d=\"${pathData}\" fill=\"${element.stroke}\" opacity=\"${element.opacity}\"${transform}/>`;\n }\n\n case \"arrow\": {\n const arrow = element as any;\n if (arrow.points.length < 2) return \"\";\n\n let pathData = `M ${arrow.points[0][0] + element.x} ${arrow.points[0][1] + element.y}`;\n for (let i = 1; i < arrow.points.length; i++) {\n pathData += ` L ${arrow.points[i][0] + element.x} ${arrow.points[i][1] + element.y}`;\n }\n\n let svg = `<path d=\"${pathData}\" stroke=\"${element.stroke}\" stroke-width=\"${element.strokeWidth}\" fill=\"none\" opacity=\"${element.opacity}\"${transform}/>`;\n\n if (arrow.head === \"triangle\") {\n const last = arrow.points[arrow.points.length - 1];\n const prev = arrow.points[arrow.points.length - 2];\n const angle = Math.atan2(last[1] - prev[1], last[0] - prev[0]);\n const headLen = 10;\n\n const tip = [last[0] + element.x, last[1] + element.y];\n const left = [\n tip[0] - headLen * Math.cos(angle - Math.PI / 6),\n tip[1] - headLen * Math.sin(angle - Math.PI / 6),\n ];\n const right = [\n tip[0] - headLen * Math.cos(angle + Math.PI / 6),\n tip[1] - headLen * Math.sin(angle + Math.PI / 6),\n ];\n\n svg += `<polygon points=\"${tip[0]},${tip[1]} ${left[0]},${left[1]} ${right[0]},${right[1]}\" fill=\"${element.stroke}\" opacity=\"${element.opacity}\"${transform}/>`;\n }\n\n return svg;\n }\n\n case \"image\": {\n const img = element as any;\n return `<image x=\"${element.x}\" y=\"${element.y}\" width=\"${element.w}\" height=\"${element.h}\" href=\"${this.escapeXml(img.src)}\" opacity=\"${element.opacity}\"${transform}/>`;\n }\n\n case \"node\": {\n const node = element as any;\n let svg = `<rect x=\"${element.x}\" y=\"${element.y}\" width=\"${element.w}\" height=\"${element.h}\" rx=\"8\" ${commonAttrs}/>`;\n if (node.preview?.title) {\n svg += `<text x=\"${element.x + 12}\" y=\"${element.y + 24}\" font-family=\"sans-serif\" font-size=\"14\" fill=\"${element.stroke}\">${this.escapeXml(node.preview.title)}</text>`;\n }\n return svg;\n }\n\n default:\n return \"\";\n }\n }\n\n private escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n }\n\n on<E extends DrawfnEvent>(\n event: E,\n handler: (...args: DrawfnEventMap[E]) => void\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n\n return () => {\n this.listeners.get(event)?.delete(handler);\n };\n }\n\n private emit<E extends DrawfnEvent>(\n event: E,\n ...args: DrawfnEventMap[E]\n ): void {\n this.listeners.get(event)?.forEach((handler) => handler(...args));\n }\n\n private emitHistoryChanged(): void {\n this.emit(\"historyChanged\", {\n canUndo: this.history.canUndo(),\n canRedo: this.history.canRedo(),\n });\n }\n\n private recordHistory(): void {\n this.history.push(this.scene);\n this.emitHistoryChanged();\n }\n\n private createToolContext(): ToolContext {\n return {\n addElement: (element: Element) => this.add(element),\n updateElement: (id: string, patch: Partial<Element>) =>\n this.update(id, patch),\n removeElement: (id: string) => this.remove(id),\n recordHistory: () => this.recordHistory(),\n getScene: () => this.getScene(),\n getCamera: () => this.getCamera(),\n getDrawfn: () => this,\n getSelection: () => this.selectedIds,\n };\n }\n\n private setupEventListeners(): void {\n this.canvas.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.addEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.addEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.addEventListener(\"wheel\", this.handleWheel);\n window.addEventListener(\"keydown\", this.handleKeyDown);\n window.addEventListener(\"keyup\", this.handleKeyUp);\n }\n\n private handlePointerDown = (e: PointerEvent): void => {\n this.emit(\"pointerDown\", e);\n const context = this.createToolContext();\n this.toolManager.handlePointerDown(e, context, this.selectedIds);\n this.scheduleRender();\n };\n\n private handlePointerMove = (e: PointerEvent): void => {\n this.emit(\"pointerMove\", e);\n const context = this.createToolContext();\n this.toolManager.handlePointerMove(e, context);\n this.scheduleRender();\n };\n\n private handlePointerUp = (e: PointerEvent): void => {\n this.emit(\"pointerUp\", e);\n const context = this.createToolContext();\n this.toolManager.handlePointerUp(e, context);\n this.scheduleRender();\n };\n\n private handleWheel = (e: WheelEvent): void => {\n e.preventDefault();\n\n const delta = e.deltaY * -0.001;\n const oldZoom = this.scene.camera.zoom;\n const newZoom = Math.max(0.1, Math.min(5, oldZoom + delta));\n\n // Get the point in canvas coordinates before zoom\n const point = screenToCanvas(\n { x: e.clientX, y: e.clientY },\n this.scene.camera,\n this.canvas\n );\n\n // Update zoom\n this.scene.camera.zoom = newZoom;\n\n // Adjust camera position to keep the point under cursor stable\n // Formula: newCamera = point - (point - oldCamera) * (newZoom / oldZoom)\n const zoomRatio = newZoom / oldZoom;\n this.scene.camera.x = point.x - (point.x - this.scene.camera.x) * zoomRatio;\n this.scene.camera.y = point.y - (point.y - this.scene.camera.y) * zoomRatio;\n\n this.emit(\"cameraChanged\", this.scene.camera);\n this.scheduleRender();\n };\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n // Space-to-pan modality\n if (e.key === \" \" && !this.isSpacePressed && e.target === this.canvas) {\n e.preventDefault();\n this.isSpacePressed = true;\n this.toolBeforeSpace = this.getTool();\n this.setTool(\"pan\");\n this.canvas.style.cursor = \"grab\";\n return;\n }\n\n if (e.key === \"Delete\" || e.key === \"Backspace\") {\n this.selectedIds.forEach((id) => this.remove(id));\n } else if ((e.metaKey || e.ctrlKey) && e.key === \"z\") {\n e.preventDefault();\n if (e.shiftKey) {\n this.redo();\n } else {\n this.undo();\n }\n } else if ((e.metaKey || e.ctrlKey) && e.key === \"y\") {\n e.preventDefault();\n this.redo();\n } else {\n const context = this.createToolContext();\n this.toolManager.handleKeyDown(e, context);\n }\n };\n\n private handleKeyUp = (e: KeyboardEvent): void => {\n // Release space-to-pan\n if (e.key === \" \" && this.isSpacePressed) {\n this.isSpacePressed = false;\n if (this.toolBeforeSpace) {\n this.setTool(this.toolBeforeSpace);\n this.toolBeforeSpace = null;\n }\n this.canvas.style.cursor = \"default\";\n }\n };\n\n private scheduleRender(): void {\n this.needsRender = true;\n if (this.rafId !== null) return;\n\n this.rafId = requestAnimationFrame(() => {\n if (this.needsRender) {\n // Get marquee state from select tool if active\n const marquee = this.toolManager.getMarquee();\n\n this.renderer.render(this.scene, {\n selectedIds: this.selectedIds,\n hoveredId: this.hoveredId,\n marquee,\n });\n this.needsRender = false;\n }\n this.rafId = null;\n });\n }\n\n destroy(): void {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n this.canvas.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.removeEventListener(\"wheel\", this.handleWheel);\n window.removeEventListener(\"keydown\", this.handleKeyDown);\n window.removeEventListener(\"keyup\", this.handleKeyUp);\n this.listeners.clear();\n }\n\n getSelectedIds(): string[] {\n return Array.from(this.selectedIds);\n }\n\n setSelection(ids: string[]): void {\n this.selectedIds = new Set(ids);\n this.emit(\"selectionChanged\", ids);\n this.scheduleRender();\n }\n\n getElements(): Element[] {\n return [...this.scene.elements];\n }\n\n getElementById(id: string): Element | undefined {\n return this.scene.elements.find((el) => el.id === id);\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "drawfn",
3
+ "version": "0.0.1",
4
+ "description": "Cross-framework drawing canvas library for brainstorming and simple sketching",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/index.cjs",
8
+ "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "build:watch": "tsup --watch",
23
+ "clean": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"",
24
+ "lint": "tsc --noEmit",
25
+ "test": "vitest",
26
+ "test:watch": "vitest watch"
27
+ },
28
+ "engines": {
29
+ "node": ">=18.18.0"
30
+ },
31
+ "keywords": [
32
+ "drawing",
33
+ "canvas",
34
+ "whiteboard",
35
+ "sketch",
36
+ "brainstorm"
37
+ ],
38
+ "author": "21n",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git+https://github.com/21nCo/super-functions.git",
42
+ "directory": "drawfn/core"
43
+ },
44
+ "bugs": {
45
+ "url": "https://github.com/21nCo/super-functions/issues"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "sideEffects": false,
51
+ "superfunctions": {
52
+ "initFunction": "drawFn",
53
+ "schemaVersion": 1,
54
+ "namespace": "drawfn"
55
+ },
56
+ "dependencies": {
57
+ "perfect-freehand": "^1.2.2"
58
+ },
59
+ "devDependencies": {
60
+ "@types/node": "^20.0.0",
61
+ "jsdom": "^24.0.0",
62
+ "tsup": "^8.5.0",
63
+ "typescript": "^5.3.0",
64
+ "vitest": "^3.2.4"
65
+ }
66
+ }